[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ninsert_final_newline = true\n\n[*.json]\nindent_style = space\nindent_size = 4\n\n[*.schema]\nindent_style = space\nindent_size = 4\n"
  },
  {
    "path": ".gitattributes",
    "content": "###############################################################################\r\n# Set default behavior to automatically normalize line endings.\r\n###############################################################################\r\n* text=crlf\r\n\r\n###############################################################################\r\n# Set default behavior for command prompt diff.\r\n#\r\n# This is need for earlier builds of msysgit that does not have it on by\r\n# default for csharp files.\r\n# Note: This is only used by command line\r\n###############################################################################\r\n#*.cs     diff=csharp\r\n\r\n###############################################################################\r\n# Set the merge driver for project and solution files\r\n#\r\n# Merging from the command prompt will add diff markers to the files if there\r\n# are conflicts (Merging from VS is not affected by the settings below, in VS\r\n# the diff markers are never inserted). Diff markers may cause the following \r\n# file extensions to fail to load in VS. An alternative would be to treat\r\n# these files as binary and thus will always conflict and require user\r\n# intervention with every merge. To do so, just uncomment the entries below\r\n###############################################################################\r\n#*.sln       merge=binary\r\n#*.csproj    merge=binary\r\n#*.vbproj    merge=binary\r\n#*.vcxproj   merge=binary\r\n#*.vcproj    merge=binary\r\n#*.dbproj    merge=binary\r\n#*.fsproj    merge=binary\r\n#*.lsproj    merge=binary\r\n#*.wixproj   merge=binary\r\n#*.modelproj merge=binary\r\n#*.sqlproj   merge=binary\r\n#*.wwaproj   merge=binary\r\n\r\n###############################################################################\r\n# behavior for image files\r\n#\r\n# image files are treated as binary by default.\r\n###############################################################################\r\n#*.jpg   binary\r\n#*.png   binary\r\n#*.gif   binary\r\n\r\n###############################################################################\r\n# diff behavior for common document formats\r\n# \r\n# Convert binary document formats to text before diffing them. This feature\r\n# is only available from the command line. Turn it on by uncommenting the \r\n# entries below.\r\n###############################################################################\r\n#*.doc   diff=astextplain\r\n#*.DOC   diff=astextplain\r\n#*.docx  diff=astextplain\r\n#*.DOCX  diff=astextplain\r\n#*.dot   diff=astextplain\r\n#*.DOT   diff=astextplain\r\n#*.pdf   diff=astextplain\r\n#*.PDF   diff=astextplain\r\n#*.rtf   diff=astextplain\r\n#*.RTF   diff=astextplain\r\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# Lines starting with '#' are comments.\n# Each line is a file pattern followed by one or more owners.\n\n# More details are here: https://help.github.com/articles/about-codeowners/\n\n# The '*' pattern is global owners.\n\n# Order is important. The last matching pattern has the most precedence.\n# The folders are ordered as follows:\n\n# In each subsection folders are ordered first by depth, then alphabetically.\n# This should make it easy to add new rules without breaking existing ones.\n\n# Global rule:\n* @microsoft/botframework-sdk"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bot-framework-bug.md",
    "content": "---\nname: Bug\nabout: Report a new Bot Framework bug.\ntitle: \"\"\nlabels: \"needs-triage, bug\"\nassignees: \"\"\n---\n\n### [Github issues](https://github.com/microsoft/botframework-sdk) should be used for bugs and feature requests. Use [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) for general \"how-to\" questions. \n\n## Version\nWhat package version of the SDK are you using.\n\n## Describe the bug\nGive a clear and concise description of what the bug is.\n\n## To Reproduce\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n## Expected behavior\nGive a clear and concise description of what you expected to happen.\n\n## Screenshots\nIf applicable, add screenshots to help explain your problem.\n\n## Additional context\nAdd any other context about the problem here.\n\n## Tracking Status\n\n**Dotnet SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Javascript SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Python SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Java SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Samples** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Docs** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Tools** [TODO]()\n- [ ] PR\n- [ ] Merged"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bot-framework-feature-request.md",
    "content": "---\nname: Feature Request\nabout: Create a new Bot Framework feature request.\ntitle: \"\"\nlabels: \"needs-triage, feature-request\"\nassignees: \"\"\n---\n\n## This is not for asking questions or filing bugs\n\nTo get help with an issue with your bot\n* [\"How To\"](https://stackoverflow.com/help/how-to-ask) questions should be submitted on [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework).\n\nTo file an issue against a component please go to the components repo\n* [Create Azure Bot Framework Service or Channel issue](https://github.com/Microsoft/botframework-services/issues/new/choose)\n* [Create Bot Builder Tools issue](https://github.com/Microsoft/botbuilder-tools/issues/new/choose)\n* [Create Bot Builder SDK V3 (.NET or Javascript) issue](https://github.com/Microsoft/botbuilder-V3/issues/new/choose)\n* [Create Bot Builder SDK V4 .NET issue](https://github.com/Microsoft/botbuilder-dotnet/issues/new/choose)\n* [Create Bot Builder SDK V4 Javascript issue](https://github.com/Microsoft/botbuilder-js/issues/new/choose)\n* [Create Bot Builder SDK V4 Java issue](https://github.com/Microsoft/botbuilder-java/issues/new/choose)\n* [Create Bot Builder SDK V4 Python issue](https://github.com/Microsoft/botbuilder-python/issues/new/choose)\n\n## Issue\n\n*Describe the issue you are addressing*\n\n## Proposed change\n\n*Describe the proposed solution*\n\n## Component Impact \n\n*Describe which components need to be updated*\n\n## Customer Impact \n\n*Describe the impact on customers*\n\n## Tracking Status\n\n**Dotnet SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Javascript SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Python SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Java SDK** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Samples** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Docs** [TODO]()\n- [ ] PR\n- [ ] Merged\n\n**Tools** [TODO]()\n- [ ] PR\n- [ ] Merged\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "Fixes #<!-- If this addresses a specific issue, please provide the issue number here -->\n\n## Proposed Changes\n<!-- Please discuss the changes you have worked on. What do the changes do; why is this PR needed? -->\n<!-- You must demonstrate that the code works. Include screenshots of the code in action -->\n\n  - \n  -\n  -\n\n\n## Testing\n<!-- If you are adding a new feature to a library, you must include tests for your new code. -->"
  },
  {
    "path": ".github/issue_template.md",
    "content": "## This is not for asking questions or filing bugs\n\nTo get help with an issue with your bot\n* [\"How To\"](https://stackoverflow.com/help/how-to-ask) questions should be submitted on [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) where there is a robust community to help you\n\nTo file an issue against a component please go to the components repo\n* [Create Azure Bot Framework Service or Channel issue](https://github.com/Microsoft/botframework-services/issues/new/choose)\n* [Create Bot Builder Tools issue](https://github.com/Microsoft/botbuilder-tools/issues/new/choose)\n* [Create Bot Builder SDK V3 (.NET or Javascript) issue](https://github.com/Microsoft/botbuilder-V3/issues/new/choose)\n* [Create Bot Builder SDK V4 .NET issue](https://github.com/Microsoft/botbuilder-dotnet/issues/new/choose)\n* [Create Bot Builder SDK V4 Javascript issue](https://github.com/Microsoft/botbuilder-js/issues/new/choose)\n* [Create Bot Builder SDK V4 Java issue](https://github.com/Microsoft/botbuilder-java/issues/new/choose)\n* [Create Bot Builder SDK V4 Python issue](https://github.com/Microsoft/botbuilder-python/issues/new/choose)\n\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\necf/\nrcf/\n\nbones/\n.vs/\n.vscode/\n.config/\n\n# Python virtual environments\n**/*env/\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nResources:\n\n- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)\n- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\n- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns\n"
  },
  {
    "path": "Common/Telemetry/README.md",
    "content": "\n\n# Telemetry Analytics\n\nBot Analytics provides telemetry for analyzing conversation activities.\n\n## Requirements\n\nTo enable bot analytics: \n\n* [Add Telemetry](https://aka.ms/AddBotTelemetry) via Application Insights in the Bot Code\n* [Enable Application Insights](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-resources-app-insights-keys?view=azure-bot-service-4.0) on Azure Bot Service\n\nOnce active, basic visualization is available out of the box on Azure Bot Service. In addition, one can deploy and customize more advanced analytics views. \n\n## Conversation Health Dashboard\n\nThe Conversation Health Dashboard template presents analytics view of bot conversation activity. \n\n<TBD: Are there 2 templates? PBI & AppInsights? Need to describe and provide instructions for both>\n\n### Instructions\n\n<TBD: how to customize and deploy>\n\n\n\n## See Also\n\n* [Analyze Bot Telemetry](https://aka.ms/AnalyzeBotTelemetry) : Learn how to analyze Application Insights log analytics data.\n* See [Azure ARM templates](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal) Documentation\n\n"
  },
  {
    "path": "Common/Transcripts/CoreExtensionsTests/ConversationStateTest.chat",
    "content": "bot=bot\nuser=user\n\nuser:start test\nbot:bot message\nuser:set foo\nuser:read\nbot:value:foo\nuser:delete\nuser:read\nbot:value:\nuser:set bar\nuser:set test\nuser:read\nbot:value:test\nuser:read\nbot:value:test\nuser:delete\nuser:read\nbot:value:"
  },
  {
    "path": "Common/Transcripts/CoreExtensionsTests/CustomStateTest.chat",
    "content": "bot=bot\nuser=user\n\nuser:start test\nbot:bot message\nuser:set foo\nuser:read\nbot:value:foo\nuser:delete\nuser:read\nbot:value:\nuser:set bar\nuser:set test\nuser:read\nbot:value:test\nuser:read\nbot:value:test\nuser:delete\nuser:read\nbot:value:"
  },
  {
    "path": "Common/Transcripts/CoreExtensionsTests/UserStateTest.chat",
    "content": "bot=bot\nuser=user\n\nuser:start test\nbot:bot message\nuser:set foo\nuser:read\nbot:value:foo\nuser:delete\nuser:read\nbot:value:\nuser:set bar\nuser:set test\nuser:read\nbot:value:test\nuser:read\nbot:value:test\nuser:delete\nuser:read\nbot:value:"
  },
  {
    "path": "Common/Transcripts/CoreTests/BotAdapted_Bracketing.chat",
    "content": "bot=bot\nuser=user\n\nbot:before message\nbot:conversationUpdate\nbot:after message\nuser:use middleware\nbot:before message\nbot:using middleware\nbot:after message\nuser:catch exception\nbot:before message\nbot:generating exception\nbot:Caught: exception to catch\n\n"
  },
  {
    "path": "Common/Transcripts/DialogsTests/AttachmentPrompt.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: please add an attachment.\nUser: [Attachment=ContentAttachment.json]\nBot: some content"
  },
  {
    "path": "Common/Transcripts/DialogsTests/ChoicePrompt.chat",
    "content": "user=user\nbot=bot\n\nuser: Hello!\nbot: favorite color? (1) red, (2) green, or (3) blue\nuser: red\nbot: Bot received the choice 'red'.\n\nuser: Hello!\nbot: favorite color? (1) red, (2) green, or (3) blue\nuser: 3\nbot: Bot received the choice 'blue'.\n\nuser: Hello!\nbot: favorite color? (1) red, (2) green, or (3) blue\nuser: cat\nbot: I didn't catch that. Select a color from the list. (1) red, (2) green, or (3) blue\nuser: green\nbot: Bot received the choice 'green'."
  },
  {
    "path": "Common/Transcripts/DialogsTests/ConfirmPrompt.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: Please confirm.\nUser: hello\nBot: Please confirm, say 'yes' or 'no' or something like that.\nUser: no\nBot: Not confirmed.\n\nUser: hello\nBot: Please confirm.\nUser: yes\nBot: Confirmed.\n"
  },
  {
    "path": "Common/Transcripts/DialogsTests/ContentAttachment.json",
    "content": "\"some content\""
  },
  {
    "path": "Common/Transcripts/DialogsTests/DateTimePrompt.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: What date would you like?\nUser: cat\nBot: Sorry, but that is not a date. What date would you like?\nUser: 31 February 2018\nBot: Timex:'2018-02-31' Value:'not resolved'\n\nUser: hello\nBot: What date would you like?\nUser: 5th December 2018 at 9am\nBot: Timex:'2018-12-05T09' Value:'2018-12-05 09:00:00'"
  },
  {
    "path": "Common/Transcripts/DialogsTests/NumberPrompt.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: Enter a number.\nUser: hello\nBot: You must enter a valid positive number less than 100.\nUser: 150\nBot: You must enter a valid positive number less than 100.\nUser: 64\nBot: Bot received the number '64'.\n\nUser: hello\nBot: Enter a number.\nUser: One\nBot: Bot received the number '1'."
  },
  {
    "path": "Common/Transcripts/DialogsTests/TextPrompt.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: Enter some text.\nUser: hi\nBot: Make sure the text is greater than three characters.\nUser: hello\nBot: Bot received the text 'hello'."
  },
  {
    "path": "Common/Transcripts/DialogsTests/Waterfall.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: step1\nUser: hello\nBot: step2\nUser: hello\nBot: step3"
  },
  {
    "path": "Common/Transcripts/DialogsTests/WaterfallNested.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: step1\nBot: step1.1\nUser: hello\nBot: step1.2\nUser: hello\nBot: step2\nBot: step2.1\nUser: hello\nBot: step2.2"
  },
  {
    "path": "Common/Transcripts/DialogsTests/WaterfallPrompt.chat",
    "content": "user=User\nbot=Bot\n\nUser: hello\nBot: step1\nBot: Enter a number.\nUser: hello again\nBot: It must be a number\nUser: 42\nBot: Thanks for '42'\nBot: step2\nBot: Enter a number.\nUser: apple\nBot: It must be a number\nUser: orange\nBot: It must be a number\nUser: 64\nBot: Thanks for '64'\nBot: step3"
  },
  {
    "path": "Common/Transcripts/LuisTests/LuisMiddleware.chat",
    "content": "user=User\nbot=Bot\n\nuser:test\nbot:default message\nuser:add imax theater to my upcoming events\nbot:intent:Calendar_Add\nuser:display weekend plans\nbot:intent:Calendar_Find\nuser:test\nbot:default message"
  },
  {
    "path": "Common/Transcripts/QnATests/QnAMiddleware.chat",
    "content": "user=User\nbot=Bot\n\nuser:random text\nbot:default message\nuser:hi\nbot:hello\nuser:test\nbot:message\nuser:tests\nbot:message\nuser:custom random text\nbot:default message\n"
  },
  {
    "path": "Common/Transcripts/README.md",
    "content": "# Bot Builder SDK v4 - Transcript Files\n\nThis folder contains the transcript files (.chat files) used in BotBuilder-v4 for testing several components and guarantee the same behavior between the different platform (.NET, NodeJS, Python, Java).\n\n## BotBuilder Developer writing new transcript-based tests\n\n1. Clone/Fork the [BotBuilder repository](https://github.com/Microsoft/BotBuilder).\n\n2. Create a branch and place the new transcripts in the [Common\\Transcripts folder](https://github.com/southworkscom/BotBuilder/tree/botbuilder-v4-transcripts/Common/Transcripts) (this can be done locally without actually pushing changes at this stage)\n\n3. Write code and create new tests. Set the `BOTBUILDER_TRANSCRIPTS_LOCATION` Environment var pointing to the local repo / transcript folder.\n\n    E.g.:\n\n    ```shell\n    # On *nix:\n    export BOTBUILDER_TRANSCRIPTS_LOCATION=~/projects/BotBuilder/Common/Transcripts\n    ```\n\n\n    ```Batchfile\n    REM On Windows:\n    SET BOTBUILDER_TRANSCRIPTS_LOCATION=C:\\Projects\\BotBuilder\\Common\\Transcripts\n    ```\n\n4. Run the transcript tests from the platform repository. The code will look into the BOTBUILDER_TRANSCRIPTS_LOCATION folder for all files.\n\n    E.g.:\n\n    ```\n    cd transcripts\n    npm run test\n    ```\n\n## Pushing changes to BotBuilder Repos\n\n1. Create a PR to the [BotBuilder repository](https://github.com/Microsoft/BotBuilder) with the new transcripts.\n\n2. Once the transcripts PR is merged, create a PR to the BotBuilder's platform repository with the code updates and tests.\n"
  },
  {
    "path": "Common/Transcripts/TranslationTests/LocaleConvertToEnglish.chat",
    "content": "user=User\nbot=Bot\n\nuser:set language fr-ca\nuser:Set a meeting on 2018-10-04\nbot:message: Set a meeting on 10/4/2018\nuser:set language fr-fr\nuser:Set a meeting on 26/08/2018\nbot:message: Set a meeting on 8/26/2018\nuser:set language en-us\nuser:Set a meeting on 05/29/2018\nbot:message: Set a meeting on 05/29/2018\n"
  },
  {
    "path": "Common/Transcripts/TranslationTests/TranslateToEnglish.chat",
    "content": "user=User\nbot=Bot\n\nuser:set language es-es\nuser:Hola\nbot:message: Hello\nuser:set language fr-fr\nuser:Salut\nbot:message: Hello\nuser:set language en-us\nuser:Hello\nbot:message: Hello\n"
  },
  {
    "path": "Common/Transcripts/TranslationTests/TranslateToUserLanguage.chat",
    "content": "user=User\nbot=Bot\n\nuser:set language es-es\nuser:Hola\nbot:mensaje: Hola\nuser:set language fr-fr\nuser:Salut\nbot:message: Bonjour\nuser:set language en-us\nuser:Hello\nbot:message: Hello\n"
  },
  {
    "path": "Common/badges/BotBuilderBadge.md",
    "content": "[![BotBuilder](\nhttps://img.shields.io/badge/Powered%20By-BotBuilder-blue.svg?colorA=black&label=Powered%20By&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJtYXN0ZXItYXJ0Ym9hcmQiIHZpZXdCb3g9IjAgMCAxNDAwIDk4MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNDAwIDk4MDsiIHdpZHRoPSIxNDAwcHgiIGhlaWdodD0iOTgwcHgiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDYxLjI1MDAwMzgxNDY5NzI2NiwgMCwgMCwgNjEuMjUwMDAzODE0Njk3MjY2LCAyMDkuOTk5OTY4NDY0NjY0LCAtMC4wMDAwMDEwMTc3NTc5OTUyMTQxOTY5KSI%2BPHRpdGxlPmljX2JvdF9mcmFtZXdvcms8L3RpdGxlPjxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPjxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI%2BPHBhdGggZD0iTSA3LjI4IDggQSAwLjczIDAuNzMgMCAwIDEgNi41NSA4LjczIEEgMC43MyAwLjczIDAgMCAxIDUuODIgOCBBIDAuNzMgMC43MyAwIDAgMSA2LjU1IDcuMjcgQSAwLjczIDAuNzMgMCAwIDEgNy4yOCA4IFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSAxMC4xOCA4IEEgMC43MyAwLjczIDAgMCAxIDkuNDUgOC43MyBBIDAuNzMgMC43MyAwIDAgMSA4LjcyIDggQSAwLjczIDAuNzMgMCAwIDEgOS40NSA3LjI3IEEgMC43MyAwLjczIDAgMCAxIDEwLjE4IDggWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNIDYuOTcwMDAwMjY3MDI4ODA5IDExLjc3MDAwMDQ1Nzc2MzY3MiBMIDMuMjAwMDAwMDQ3NjgzNzE2IDggTCA2Ljk3MDAwMDI2NzAyODgwOSA0LjIzMDAwMDAxOTA3MzQ4NiBMIDYuMjg5OTk5OTYxODUzMDI3IDMuNTM5OTk5OTYxODUzMDI3MyBMIDEuODMwMDAwMDQyOTE1MzQ0MiA4IEwgNi4yODk5OTk5NjE4NTMwMjcgMTIuNDYwMDAwMDM4MTQ2OTczIEwgNi45NzAwMDAyNjcwMjg4MDkgMTEuNzcwMDAwNDU3NzYzNjcyIFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgTCA5LjcxMDAwMDAzODE0Njk3MyAxMi40NjAwMDAwMzgxNDY5NzMgTCAxNC4xNzAwMDAwNzYyOTM5NDUgOCBMIDkuNzEwMDAwMDM4MTQ2OTczIDMuNTM5OTk5OTYxODUzMDI3MyBMIDkuMDI5OTk5NzMyOTcxMTkxIDQuMjMwMDAwMDE5MDczNDg2IEwgMTIuODAwMDAwMTkwNzM0ODYzIDggTCA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNOCwwYTgsOCwwLDEsMCw4LDhBOCw4LDAsMCwwLDgsMFpNOCwxNWE3LDcsMCwxLDEsNy03QTcsNywwLDAsMSw4LDE1WiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48L2c%2BPC9nPjwvZz48L3N2Zz4%3D)](https://github.com/Microsoft/BotBuilder)\n\nMarkdown\n```\n[![BotBuilder](\nhttps://img.shields.io/badge/Powered%20By-BotBuilder-blue.svg?colorA=black&label=Powered%20By&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJtYXN0ZXItYXJ0Ym9hcmQiIHZpZXdCb3g9IjAgMCAxNDAwIDk4MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNDAwIDk4MDsiIHdpZHRoPSIxNDAwcHgiIGhlaWdodD0iOTgwcHgiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDYxLjI1MDAwMzgxNDY5NzI2NiwgMCwgMCwgNjEuMjUwMDAzODE0Njk3MjY2LCAyMDkuOTk5OTY4NDY0NjY0LCAtMC4wMDAwMDEwMTc3NTc5OTUyMTQxOTY5KSI%2BPHRpdGxlPmljX2JvdF9mcmFtZXdvcms8L3RpdGxlPjxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPjxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI%2BPHBhdGggZD0iTSA3LjI4IDggQSAwLjczIDAuNzMgMCAwIDEgNi41NSA4LjczIEEgMC43MyAwLjczIDAgMCAxIDUuODIgOCBBIDAuNzMgMC43MyAwIDAgMSA2LjU1IDcuMjcgQSAwLjczIDAuNzMgMCAwIDEgNy4yOCA4IFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSAxMC4xOCA4IEEgMC43MyAwLjczIDAgMCAxIDkuNDUgOC43MyBBIDAuNzMgMC43MyAwIDAgMSA4LjcyIDggQSAwLjczIDAuNzMgMCAwIDEgOS40NSA3LjI3IEEgMC43MyAwLjczIDAgMCAxIDEwLjE4IDggWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNIDYuOTcwMDAwMjY3MDI4ODA5IDExLjc3MDAwMDQ1Nzc2MzY3MiBMIDMuMjAwMDAwMDQ3NjgzNzE2IDggTCA2Ljk3MDAwMDI2NzAyODgwOSA0LjIzMDAwMDAxOTA3MzQ4NiBMIDYuMjg5OTk5OTYxODUzMDI3IDMuNTM5OTk5OTYxODUzMDI3MyBMIDEuODMwMDAwMDQyOTE1MzQ0MiA4IEwgNi4yODk5OTk5NjE4NTMwMjcgMTIuNDYwMDAwMDM4MTQ2OTczIEwgNi45NzAwMDAyNjcwMjg4MDkgMTEuNzcwMDAwNDU3NzYzNjcyIFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgTCA5LjcxMDAwMDAzODE0Njk3MyAxMi40NjAwMDAwMzgxNDY5NzMgTCAxNC4xNzAwMDAwNzYyOTM5NDUgOCBMIDkuNzEwMDAwMDM4MTQ2OTczIDMuNTM5OTk5OTYxODUzMDI3MyBMIDkuMDI5OTk5NzMyOTcxMTkxIDQuMjMwMDAwMDE5MDczNDg2IEwgMTIuODAwMDAwMTkwNzM0ODYzIDggTCA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNOCwwYTgsOCwwLDEsMCw4LDhBOCw4LDAsMCwwLDgsMFpNOCwxNWE3LDcsMCwxLDEsNy03QTcsNywwLDAsMSw4LDE1WiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48L2c%2BPC9nPjwvZz48L3N2Zz4%3D)](https://github.com/Microsoft/BotBuilder)\n```"
  },
  {
    "path": "Contributing.md",
    "content": "# Instructions for Contributing Code\r\n\r\n## Contributing bug fixes and features\r\n\r\nThe Bot Framework team is currently accepting contributions in the form of bug fixes and new \r\nfeatures. Any submission must have an issue tracking it in the issue tracker that has\r\n been approved by the Bot Framework team. Your pull request should include a link to \r\n the bug that you are fixing. If you've submitted a PR for a bug, please post a \r\n comment in the bug to avoid duplication of effort.\r\n\r\n## Legal\r\n\r\nIf your contribution is more than 15 lines of code, you will need to complete a Contributor \r\nLicense Agreement (CLA). Briefly, this agreement testifies that you are granting us permission\r\n to use the submitted change according to the terms of the project's license, and that the work\r\n  being submitted is under appropriate copyright.\r\n\r\nPlease submit a Contributor License Agreement (CLA) before submitting a pull request. \r\nYou may visit https://cla.azure.com to sign digitally. Alternatively, download the \r\nagreement ([Microsoft Contribution License Agreement.docx](https://www.codeplex.com/Download?ProjectName=typescript&DownloadId=822190) or\r\n [Microsoft Contribution License Agreement.pdf](https://www.codeplex.com/Download?ProjectName=typescript&DownloadId=921298)), sign, scan, \r\n and email it back to <cla@microsoft.com>. Be sure to include your github user name along with the agreement. Once we have received the \r\n signed CLA, we'll review the request. \r\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Microsoft\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Orchestrator/README.md",
    "content": "# Orchestrator\n\nConversational AI applications today are built using disparate technologies to fulfill language understanding (LU) needs, such as [LUIS][1] and [QnA Maker][2]. Often, conversational AI applications are also built by accessing subsequent [skills][3], each of which handle a specific conversation topic and can be built using different LU technologies. Hence, conversational AI applications typically require LU to route an incoming user request to an appropriate skill or to dispatch to a specific sub-component.\n\nOrchestrator is an LU solution optimized for conversational AI applications. It is built ground-up to run locally with your bot. See the [technical overview][18] for additional details.\n\n## Scenarios\n\n**Routing**: For bots, Orchestrator can replace the [LUIS Dispatch tool][5]. You can use Orchestrator instead of Dispatch to arbitrate between multiple [LUIS][1] and [QnA Maker][2] applications. With Orchestrator, you are likely to see:\n\n- Improved classification accuracy.\n- Higher resilience to data imbalance across your LUIS and QnA Maker authoring data.\n- Ability to correctly dispatch from relatively little authoring data.\n\n**Intent recognition**: You can use Orchestrator as an intent recognizer with [adaptive dialogs][6] to route user input to an appropriate skill or sub-component.\n\n**Entity extraction** is currently experimental and not yet for production use.\n\n## Authoring experience\n\nOrchestrator can be used in different development environments:\n\n- [Bot Framework SDK][24]: Orchestrator can be integrated into your code project by replacing LUIS for intent recognition, such as for skill delegation or dispatching to subsequent language understanding services. See the [SDK integration](#sdk-integration) section for more information. <!--We don't yet document Orchestrator in the SDK docs. Do we need to?-->\n- [Bot Framework Composer][19]: Orchestrator can be selected as a recognizer within Bot Framework Composer. At this point there are limitations to using Orchestrator in Composer, primarily around importing of existing models and tuning recognition performance. (To use Orchestrator, enable the feature flag in your Composer settings.) See the [Composer integration](#composer-integration) section for more information.\n\nIn most cases, the [Bot Framework CLI][7] is required to prepare and optimize the model for your domain. The [BF Orchestrator command usage][23] page describes how to create, evaluate, and use an Orchestrator model. This diagram illustrates the first part of that process. <!--The diagram leaves off steps 4 and 5.-->\n\n<p align=\"center\">\n  <img width=\"350\" src=\"./docs/media/authoring.png\" />\n</p>\n\n**Note**: To use the CLI, first install the [Bot Framework CLI][7].\n\nSee the [BF Orchestrator command usage][23] page for instructions on how to create and optimize the language model for your bot.\n\n## SDK integration\n\nTo use Orchestrator in place of Dispatch in an existing bot:\n\n- Create an _Orchestrator recognizer_ and provide it the path to the base model and your snapshot.\n- Use the recognizer's _recognize_ method to recognize user input.\n\n### In a C\\# bot\n\n- Install the `Microsoft.Bot.Builder.AI.Orchestrator` NuGet package.\n- Install the latest supported version of the [Visual C++ redistributable package](https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads).\n\n```csharp\nusing Microsoft.Bot.Builder.AI.Orchestrator;\n\n// Get Model and Snapshot path.\nstring modelPath = Path.GetFullPath(OrchestratorConfig.ModelPath);\nstring snapshotPath = Path.GetFullPath(OrchestratorConfig.SnapshotPath);\n\n// Create OrchestratorRecognizer.\nOrchestratorRecognizer orc = new OrchestratorRecognizer()\n{\n    ModelPath = modelPath,\n    SnapshotPath = snapshotPath\n};\n\n// Recognize user input.\nvar recoResult = await orc.RecognizeAsync(turnContext, cancellationToken);\n```\n\n### In a JavaScript bot\n\n- Install the `botbuilder-ai-orchestrator` npm package to your bot.\n\n```javascript\nconst { OrchestratorRecognizer } = require('botbuilder-ai-orchestrator');\n\n// Create OrchestratorRecognizer.\nconst dispatchRecognizer = new OrchestratorRecognizer().configure({\n            modelPath: process.env.ModelPath,\n            snapshotPath: process.env.SnapShotPath\n});\n// To recognize user input\nconst recoResult = await dispatchRecognizer.recognize(context);\n```\n\n## Composer integration\n\nOrchestrator can be used as recognizer in [Bot Framework Composer][19]. \n\nIn general, to specify Orchestrator as a dialog recognizer:\n\n1. Select **Orchestrator** in the **Recognizer Type** drop-down menu for your bot.\n2. Review, evaluate and adjust examples in language data as you would normally for LUIS to ensure recognition quality. \n\nThis enables basic intent recognition. For more advanced scenarios follow the steps above to import and tune up routing quality. For more information about recognizers in Composer, see the discussion of [recognizers](https://docs.microsoft.com/composer/concept-dialog#recognizer) with respect to dialogs in Composer.  Please make sure to follow the latest up-to-date instructions in [Composer documentation][25]\n\n### Model Versions \nComposer is using the pre-selected default base models. With the CLI one can download & use alternate models. To force Composer to use different models, one can specify in the bot advanced settings as follows.\n\nThe user can change the model by adding the following to appsettings.json:\n\n```\n\"orchestrator\": {\n    \"model\": {\n      \"en_intent\": \"pretrained.20200924.microsoft.dte.00.03.en.onnx\",\n      \"multilingual_intent\": \"pretrained.20200924.microsoft.dte.00.03.multilingual.onnx\"\n    }\n  }\n ```\nIf this section is blank or unreadable, we simply use the Orchestrator defaults. If the model is not in the supported Orchestrator list, we throw an error message.\n\nSee more on models [here][20].\n\n## Limitations\n\n* Orchestrator is limited to intents only. Entity definitions are ignored and no entity extraction is performed during recognition.\n\n## Platform Support\nOrchestrator supports the following platforms.\n\n### OS Support\nMacOS v10.14 / v10.15\nUbuntu 18 / 20\nWindows 10\n\n### Language Support\nNodejs v10, v12, v14\nC# .NET Standard 2.1\nC# .NET Core 3.1\n\n\n## Additional Reading\n\n- [Tech overview][18]\n- [API reference][14]\n- [Roadmap](./docs/Overview.md#Roadmap)\n- [BF CLI Orchestrator commands][11]\n- [C# samples][12]\n- [NodeJS samples][13]\n- [BF Orchestrator Command Usage][23]\n\nSee the [School skill navigator](https://github.com/microsoft/BotBuilder-Samples/tree/main/composer-samples/csharp_dotnetcore/projects/OrchestratorSchoolNavigator) for an example of using Orchestrator commandlets to improve the quality of a .lu training set and using Composer to build a bot from examples in .lu format.\n\n[1]:https://luis.ai\n[2]:https://qnamaker.ai\n[3]:https://docs.microsoft.com/en-us/azure/bot-service/skills-conceptual\n[4]:https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)\n[5]:https://docs.microsoft.com/azure/bot-service/bot-builder-tutorial-dispatch?tabs=cs\n[6]:https://aka.ms/adaptive-dialogs\n[7]:https://github.com/microsoft/botframework-cli\n[8]:https://github.com/microsoft/botframework-cli/tree/main/packages/luis#bf-luisversionexport\n[9]:https://github.com/microsoft/botframework-cli/tree/main/packages/luis#bf-luisconvert\n[10]:https://github.com/microsoft/botframework-cli/tree/main/packages/qnamaker#bf-qnamakerkbexport\n[11]:https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator\n[12]:https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/14.nlp-with-orchestrator\n[13]:https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/javascript_nodejs/14.nlp-with-orchestrator\n[14]:https://aka.ms/bforchestratorapi\n[16]:https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator#bf-orchestratorcreate\n[18]:./docs/Overview.md\n[19]: https://docs.microsoft.com/composer/introduction\n[20]: https://aka.ms/NLRModels \"Natural Language Representation Models\"\n[21]:https://docs.microsoft.com/azure/bot-service/file-format/bot-builder-lu-file-format \"LU file format\"\n[22]:./docs/BFOrchestratorReport.md \"report interpretation\"\n[23]: ./docs/BFOrchestratorUsage.md \"BF Orchestrator command usage\"\n[24]:https://docs.microsoft.com/azure/bot-service/index-bf-sdk\n[25]: https://github.com/microsoft/BotFramework-Composer/blob/main/docs/preview%20features/orchestrator.md \"Composer integration instructions\""
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/README.md",
    "content": "# Improve Language Model with BF CLI\n\nThe following sample illustrates how to evaluate and improve a simple language model using the Orchestrator report. You may adopt this process simply by editing the [demo.cmd](./demo.cmd) script to use your language model files.\n\n## Prerequisites\n\n* [Bot Framework CLI][5]\n* [Bot Framework CLI Orchestrator plugin][1] \n* An understanding of [Orchestrator][6] feature usage.\n\n## Walkthrough\n\nThe following files make up this illustration:\n\n```\ndemo.cmd: Script run evaluation and produces report\ncommon.lu: Bot Language Model LU\ncommon.test.lu: A test set containing examples not present in  original LU\ncommon.fixed.lu: A corrected Language Model based on evaluation run\n```\n\nAssume a bot with a simple language model in [common.lu](./common.lu) file as follows:\n\n```\n# Help\n- help\n- i need help\n- please help\n- can you please help\n- what do you do\n- what is this bot for\n\n\n# BuySurface\n- How can I buy {ProductType=Surface PRO}\n- I want to buy {ProductType=Surface PRO}\n- I want to buy {ProductType=Surface laptop}\n- Can I buy {ProductType=Surface PRO} online\n\n# USConstitution\n- Tell me about the US Constitution\n- US Constitution\n- Info on the Constitution\n- tell me about the Constitution\n- constitution knowledgebase\n- constitution faq\n- what do you know about the constitution\n- The united states constitution\n\n# Restart\n- restart\n- reset\n- start over\n- menu\n- top menu\n\n# Finance\n- pay my bills\n- transfer funds\n- what's my balance\n- get $500 cash\n\n# LUIS\n- luis\n\n# Orchestrator\n- Orchestrator\n- Orch\n\n```\n\nThis evaluation examines how the Orchestrator engine can generalize language understanding from a few examples to include phrases never seen before. Hence, for proper language evaluation, the test file [common.test.lu](./common.test.lu) should contain utterances not present in the original \"training\" set:\n\n```\n# Help\n- help\n- do you have help\n- any assistance in this bot?\n\n# BuySurface\n- Looking for a computer made by MSFT\n- what kind of MS products do you have?\n\n# USConstitution\n- Where can I read our founding fathers famous document?\n- Is there an analysis of the bill of rights?\n- What is that proclamation thing?\n\n# Restart\n- reset\n- go to the beginning\n\n# Finance\n- can i pay with credit card?\n- do you use Zelle?\n- what is my bank borrowing limit?\n\n# LUIS\n- Language Understanding Inteligent Service\n\n# Orchestrator\n- Conductor\n\n```\n\nNext, run the [demo.cmd](./demo.cmd) script.  \n\nIn first run you need to download the Orchestrator basemodel so execute ```demo.cmd getmodel``` which will download the model and run the test. Consequent runs can reuse the same basemodel (hint: see ```bf orchestrator:basemodel:list``` for alternate models). Also, if you wish to compare to [LUIS](https://luis.ai) results, edit the script with your LUIS application info.\n\nThis will produce a report in report folder such as follows:\n\n![Before Correction](./reportbefore.png)\n\nNotice how 5 utterances were misclassified.  For example ```do you use Zelle?``` was classified as *Help* (with low score of 0.2998) instead of *Finance*. Also, note that what led to this misclassification is that the nearest example scored 0.5669 under the *Help* label. \n\nThe observation shows that the concepts for those misclassified utterances are not present in the original  common.lu language model. To correct, we'll add representative examples in the original common.lu file. Note how we don't add the exact utterances, only representative examples:\n\n![Compared LU](./comparedLU.png)\n\nThe corrected file is available for reference as [common.fixed.lu](./common.fixed.lu). You may copy it over the common.lu.\n\nNow, re-run the test ```demo.cmd``` and view the resulting report:\n\n\n\n![Report After](./reportafter.png)\n\n## Summary\n\nThis walkthrough showed how to improve your bot's language model before ever deploying it. It uses BF CLI to test the language model, and use the resulting report to correct the language model. One should construct a language model with as many examples representing expected user utterances. However, it also illustrates how one does not need to account for all utterance permutations, rather only to present concepts within those utterances. The Orchestrator engine generalizes and can accurately detect similar utterances. \n\n## Additional Reading\n\n- [Orchestrator Documentation][6]\n- [BF CLI Orchestrator Command Usage][4]\n- [Report Interpretation][3]\n- [LU File Format][2]\n\n\n\n[1]: https://aka.ms/bforchestratorcli\t\"Orchestrator Plugin\"\n[2]: https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0\t\"LU file format\"\n[3]: https://aka.ms/bforchestratorreport \"report interpretation\"\n[4]: https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/BFOrchestratorUsage.md \"BF Orchestrator usage\"\n[5]: https://github.com/microsoft/botframework-cli\n[6]: https://aka.ms/bf-orchestrator\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/common.fixed.lu",
    "content": "# Help\n- help\n- i need help\n- please help\n- can you please help\n- what do you do\n- what is this bot for\n\n\n# BuySurface\n- How can I buy {ProductType=Surface PRO}\n- I want to buy {ProductType=Surface PRO}\n- I want to buy {ProductType=Surface laptop}\n- Can I buy {ProductType=Surface PRO} online\n- Types of MS products?\n\n# USConstitution\n- Tell me about the US Constitution\n- US Constitution\n- Info on the Constitution\n- tell me about the Constitution\n- constitution knowledgebase\n- constitution faq\n- what do you know about the constitution\n- The united states constitution\n\n# Restart\n- restart\n- reset\n- start over\n- menu\n- top menu\n\n# Finance\n- pay my bills\n- transfer funds\n- what's my balance\n- get $500 cash\n- use Zelle\n- borrowing limits?\n\n# LUIS\n- luis\n- Language Understanding\n\n# Orchestrator\n- Orchestrator\n- Orch\n- Conductor organizer\n\n"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/common.lu",
    "content": "# Help\n- help\n- i need help\n- please help\n- can you please help\n- what do you do\n- what is this bot for\n\n\n# BuySurface\n- How can I buy {ProductType=Surface PRO}\n- I want to buy {ProductType=Surface PRO}\n- I want to buy {ProductType=Surface laptop}\n- Can I buy {ProductType=Surface PRO} online\n\n# USConstitution\n- Tell me about the US Constitution\n- US Constitution\n- Info on the Constitution\n- tell me about the Constitution\n- constitution knowledgebase\n- constitution faq\n- what do you know about the constitution\n- The united states constitution\n\n# Restart\n- restart\n- reset\n- start over\n- menu\n- top menu\n\n# Finance\n- pay my bills\n- transfer funds\n- what's my balance\n- get $500 cash\n\n# LUIS\n- luis\n\n# Orchestrator\n- Orchestrator\n- Orch\n\n"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/common.test.lu",
    "content": "# Help\n- help\n- do you have help\n- any assistance in this bot?\n\n\n# BuySurface\n- Looking for a computer made by MSFT\n- what kind of MS products do you have?\n\n# USConstitution\n- Where can I read our founding fathers famous document?\n- Is there an analysis of the bill of rights?\n- What is that proclamation thing?\n\n# Restart\n- reset\n- go to the beginning\n\n# Finance\n- can i pay with credit card?\n- do you use Zelle?\n- what is my bank borrowing limit?\n\n\n# LUIS\n- Language Understanding Inteligent Service\n\n# Orchestrator\n- Conductor\n\n"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/demo.cmd",
    "content": "@echo off\n@echo ORCHESTRATOR EVALUATION DEMO\n\n@rem set SEED for different test sets\nset SEED=common\nset BLU=generated\\%SEED%.blu \nset LUFILE=%SEED%.lu\n@rem test file contains sample utterances that are not in main LU file.\nset TESTFILE=%SEED%.test.lu\n@rem proper test\n@rem set TESTFILE=%SEED%.test.lu\n\n\nset LUISKEY=\nset LUISAPP=\nset LUISHOST=\n\nset SKIPLUIS=0\nset QUERYRUN=0\n\nif \"%LUISKEY%\" == \"\" (\n  @echo Skipping comparison with LUIS. Fill in LUIS info to compare results.\n  set SKIPLUIS=1\n)\n\n@rem set QUERY to run a single utterance test\nset QUERY=\"what is the american declaration of independence?\"\n\nif \"%1\" == \"qonly\" (\n  set QUERYRUN=1\n  goto QUERYONLY\n)\n\n@rem model folder needs to be downloaded only once.\nif \"%1\" == \"getmodel\" (\n  if EXIST model rd /s /q model\n)\n\n@echo cleaning folders\nif EXIST report (\nrd /s /q report && md report\n)\nif EXIST generated (\n  rd /s /q generated && md generated\n)\n\n\n@rem Only need to retrieve model once\nIF NOT EXIST .\\model (\n@rem see bf orchestrator:basemodel:get --help to get the non-default model \n@rem see available models via bf orchestrator:basemodel:list\n  @echo getting base model\n  md model\n  call bf orchestrator:basemodel:get  --out model\n)\n@echo Create orchestrator snapshot .blu file\ncall bf orchestrator:create --model model --out %BLU% --in %LUFILE%\n\n@echo running orchestrator test to generate a report (see report folder) \ncall bf orchestrator:test --in %BLU% --model ./model  --out report --test %TESTFILE%\n\nif \"%SKIPLUIS%\" == \"0\" (\n  @echo running LUIS test...\n  call bf luis:test --subscriptionKey %LUISKEY% --endpoint %LUISHOST% --appId %LUISAPP% --in %TESTFILE% --out report/luisresult.txt\n)\n\n:QUERYONLY\n@rem Illustrates how to query for only a single utterance. Edit %QUERY% above.\nif \"%QUERYRUN%\" == \"1\" (\n\n  echo Orchestrator single utterance query:\n  echo bf orchestrator:query --in %BLU% --model model --query %QUERY%\n  call bf orchestrator:query --in %BLU% --model model --query %QUERY%\n\n\n  if \"%SKIPLUIS%\" == \"0\" (\n    echo LUIS single utterance query:\n    echo bf luis:application:query --appId LUISAPP --endpoint LUISHOST --subscriptionKey LUISKEY --query %QUERY%\n    call bf luis:application:query --appId %LUISAPP% --endpoint %LUISHOST% --subscriptionKey %LUISKEY% --query %QUERY%\n  )\n)\n\n:DONE\n\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/.gitignore",
    "content": "# Assets generated by luis:build, luis:cross-train\n**/model\n**/[Gg]enerated\n**/*.blu\n*.json\n**/*.targets\n**/*.props\n**/*.cache\n*.dgspec.json"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/AdapterWithErrorHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Bot.Builder.TraceExtensions;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class AdapterWithErrorHandler : BotFrameworkHttpAdapter\n    {\n        public AdapterWithErrorHandler(IConfiguration configuration, ILogger<BotFrameworkHttpAdapter> logger, ConversationState conversationState = null)\n            : base(configuration, logger)\n        {\n            OnTurnError = async (turnContext, exception) =>\n            {\n                // Log any leaked exception from the application.\n                logger.LogError(exception, $\"[OnTurnError] unhandled error : {exception.Message}\");\n\n                // Send a message to the user\n                await turnContext.SendActivityAsync(\"The bot encountered an error or bug.\");\n                await turnContext.SendActivityAsync(\"To run this sample make sure you have the LUIS and QnA models deployed.\");\n                await turnContext.SendActivityAsync(\"To continue to run this bot, please fix the bot source code.\");\n\n                if (conversationState != null)\n                {\n                    try\n                    {\n                        // Delete the conversationState for the current conversation to prevent the\n                        // bot from getting stuck in a error-loop caused by being in a bad state.\n                        // ConversationState should be thought of as similar to \"cookie-state\" in a Web pages.\n                        await conversationState.DeleteAsync(turnContext);\n                    }\n                    catch (Exception e)\n                    {\n                        logger.LogError(e, $\"Exception caught on attempting to Delete ConversationState : {e.Message}\");\n                    }\n                }\n\n                // Send a trace activity, which will be displayed in the Bot Framework Emulator\n                await turnContext.TraceActivityAsync(\"OnTurnError Trace\", exception.Message, \"https://www.botframework.com/schemas/error\", \"TurnError\");\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/BotServices.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.Bot.Builder.AI.Luis;\nusing Microsoft.Bot.Builder.AI.Orchestrator;\nusing Microsoft.Bot.Builder.AI.QnA;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class BotServices : IBotServices\n    {\n        public BotServices(IConfiguration configuration, OrchestratorRecognizer dispatcher)\n        {\n            // Read the setting for cognitive services (LUIS, QnA) from the appsettings.json\n            // If includeApiResults is set to true, the full response from the LUIS api (LuisResult)\n            // will be made available in the properties collection of the RecognizerResult\n            LuisHomeAutomationRecognizer = CreateLuisRecognizer(configuration, \"LuisHomeAutomationAppId\");\n            LuisWeatherRecognizer = CreateLuisRecognizer(configuration, \"LuisWeatherAppId\");\n\n            Dispatch = dispatcher;\n\n            SampleQnA = new QnAMaker(new QnAMakerEndpoint\n            {\n                KnowledgeBaseId = configuration[\"QnAKnowledgebaseId\"],\n                EndpointKey = configuration[\"QnAEndpointKey\"],\n                Host = configuration[\"QnAEndpointHostName\"]\n            });\n        }\n\n        public OrchestratorRecognizer Dispatch { get; private set; }\n        \n        public QnAMaker SampleQnA { get; private set; }\n        \n        public LuisRecognizer LuisHomeAutomationRecognizer { get; private set; }\n\n        public LuisRecognizer LuisWeatherRecognizer { get; private set; }\n\n        private LuisRecognizer CreateLuisRecognizer(IConfiguration configuration, string appIdKey)\n        {\n            var luisApplication = new LuisApplication(\n                configuration[appIdKey],\n                configuration[\"LuisAPIKey\"],\n                configuration[\"LuisAPIHostName\"]);\n\n            // Set the recognizer options depending on which endpoint version you want to use.\n            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3\n            var recognizerOptions = new LuisRecognizerOptionsV2(luisApplication)\n            {\n                IncludeAPIResults = true,\n                PredictionOptions = new LuisPredictionOptions()\n                {\n                    IncludeAllIntents = true,\n                    IncludeInstanceData = true\n                }\n            };\n\n            return new LuisRecognizer(recognizerOptions);\n        }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Bots/DispatchBot.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime.Models;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Schema;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class DispatchBot : ActivityHandler\n    {\n        private ILogger<DispatchBot> _logger;\n        private IBotServices _botServices;\n\n        public DispatchBot(IBotServices botServices, ILogger<DispatchBot> logger)\n        {\n            _logger = logger;\n            _botServices = botServices;\n        }\n\n        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            var dc = new DialogContext(new DialogSet(), turnContext, new DialogState());\n            // Top intent tell us which cognitive service to use.\n            var allScores = await _botServices.Dispatch.RecognizeAsync(dc, (Activity)turnContext.Activity, cancellationToken);\n            var topIntent = allScores.Intents.First().Key;\n\n            // Detected entities which could be used to help with intent dispatching, for example, when top intent score is too low or\n            // when there are multiple top intents with close scores.\n            var entities = allScores.Entities.Children().Where(t => t.Path != \"$instance\");\n            \n            // Next, we call the dispatcher with the top intent.\n            await DispatchToTopIntentAsync(turnContext, topIntent, cancellationToken);\n        }\n\n        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)\n        {\n            const string WelcomeText = \"Type a greeting, or a question about the weather to get started.\";\n\n            foreach (var member in membersAdded)\n            {\n                if (member.Id != turnContext.Activity.Recipient.Id)\n                {\n                    await turnContext.SendActivityAsync(MessageFactory.Text($\"Welcome to Dispatch bot {member.Name}. {WelcomeText}\"), cancellationToken);\n                }\n            }\n        }\n\n        private async Task DispatchToTopIntentAsync(ITurnContext<IMessageActivity> turnContext, string intent, CancellationToken cancellationToken)\n        {\n            switch (intent)\n            {\n                case \"HomeAutomation\":\n                    await ProcessHomeAutomationAsync(turnContext, cancellationToken);\n                    break;\n                case \"Weather\":\n                    await ProcessWeatherAsync(turnContext, cancellationToken);\n                    break;\n                case \"QnAMaker\":\n                    await ProcessSampleQnAAsync(turnContext, cancellationToken);\n                    break;\n                default:\n                    _logger.LogInformation($\"Dispatch unrecognized intent: {intent}.\");\n                    await turnContext.SendActivityAsync(MessageFactory.Text($\"Dispatch unrecognized intent: {intent}.\"), cancellationToken);\n                    break;\n            }\n        }\n\n        private async Task ProcessHomeAutomationAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"ProcessHomeAutomationAsync\");\n\n            // Retrieve LUIS result for HomeAutomation.\n            var recognizerResult = await _botServices.LuisHomeAutomationRecognizer.RecognizeAsync(turnContext, cancellationToken);\n            var result = recognizerResult.Properties[\"luisResult\"] as LuisResult;\n\n            var topIntent = result.TopScoringIntent.Intent; \n            \n            await turnContext.SendActivityAsync(MessageFactory.Text($\"HomeAutomation top intent {topIntent}.\"), cancellationToken);\n            await turnContext.SendActivityAsync(MessageFactory.Text($\"HomeAutomation intents detected:\\n\\n{string.Join(\"\\n\\n\", result.Intents.Select(i => i.Intent))}\"), cancellationToken);\n            if (result.Entities.Count > 0)\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text($\"HomeAutomation entities were found in the message:\\n\\n{string.Join(\"\\n\\n\", result.Entities.Select(i => i.Entity))}\"), cancellationToken);\n            }\n        }\n\n        private async Task ProcessWeatherAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"ProcessWeatherAsync\");\n\n            // Retrieve LUIS result for Weather.\n            var recognizerResult = await _botServices.LuisWeatherRecognizer.RecognizeAsync(turnContext, cancellationToken);\n            var result = recognizerResult.Properties[\"luisResult\"] as LuisResult;\n            var topIntent = result.TopScoringIntent.Intent;\n\n            await turnContext.SendActivityAsync(MessageFactory.Text($\"ProcessWeather top intent {topIntent}.\"), cancellationToken);\n            await turnContext.SendActivityAsync(MessageFactory.Text($\"ProcessWeather Intents detected::\\n\\n{string.Join(\"\\n\\n\", result.Intents.Select(i => i.Intent))}\"), cancellationToken);\n            if (result.Entities.Count > 0)\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text($\"ProcessWeather entities were found in the message:\\n\\n{string.Join(\"\\n\\n\", result.Entities.Select(i => i.Entity))}\"), cancellationToken);\n            }\n        }\n\n        private async Task ProcessSampleQnAAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"ProcessSampleQnAAsync\");\n\n            var results = await _botServices.SampleQnA.GetAnswersAsync(turnContext);\n            if (results.Any())\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text(results.First().Answer), cancellationToken);\n            }\n            else\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text(\"Sorry, could not find an answer in the Q and A system.\"), cancellationToken);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/HomeAutomation.lu",
    "content": "\n> LUIS application information\n> !# @app.name = Home Automation\n> !# @app.desc = Home Automation LUIS application - Bot Builder Samples\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 4.0.0\n> !# @app.tokenizerVersion = 1.0.0\n\n\n> # Intent definitions\n\n## ControlDevice\n- {@Room=breezeway} on please\n- change {@deviceProperty=temperature} to seventy two degrees\n- {@Device=coffee bar} on please\n- decrease {@deviceProperty=temperature} for me please\n- dim {@Room=kitchen} {@Device=lights} to 25 .\n- {@Device=fish pond} off please\n- {@Device=fish pond} on please\n- {@Device=illuminate} please\n- {@Room=living room} {@Device=lamp} on please\n- {@Room=living room} {@Device=lamps} off please\n- lock the {@Device=doors} for me please\n- lower your {@deviceProperty=volume}\n- make {@Device=camera 1} off please\n- make some {@Device=coffee}\n- play {@Device=dvd}\n- set {@Device=lights} out in {@Room=bedroom}\n- set {@Device=lights} to {@deviceProperty=bright}\n- set {@Device=lights} to {@deviceProperty=concentrate}\n- shut down my work {@Device=computer}\n- snap switch {@Device=fan} fifty percent\n- start {@Room=master bedroom} {@Device=light}.\n- {@Room=theater} on please\n- turn {@Device=dimmer} off\n- turn off {@Device=ac} please\n- turn off {@Room=foyer} {@Device=lights}\n- turn off {@Room=living room} {@Device=light}\n- turn off {@Device=staircase}\n- turn off venice {@Device=lamp}\n- turn on {@Room=bathroom} {@Device=heater}\n- turn on {@Device=external speaker}\n- turn on {@Room=kitchen} {@Device=faucet}\n- turn on {@Device=light} in {@Room=bedroom}\n- turn on my {@Room=bedroom} {@Device=lights}.\n- turn on the {@Room=furnace room} {@Device=lights}\n- turn on the internet in my {@Room=bedroom} please\n- turn on {@Device=thermostat} please\n- turn the {@Device=fan} to high\n- turn {@Device=thermostat} on 70.\n- {@Device_PatternAny} off [please]\n- {@Device_PatternAny} in {Room_PatternAny} on [please]\n- turn on {@Device_PatternAny} in {Room_PatternAny}\n- turn off {@Device_PatternAny} in {Room_PatternAny}\n- {@Device_PatternAny} in {Room_PatternAny} off [please]\n- {@Device_PatternAny} on [please]\n- turn on {@Device_PatternAny}\n\n\n## None\n\n\n> # Entity definitions\n\n@ ml Device\n\n@ ml deviceProperty\n\n@ ml Room\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt number\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n@ list Operation = \n\t- off :\n\t\t- turn off\n\t\t- switch off\n\t\t- lock\n\t\t- out\n\t\t- shut down\n\t\t- stop\n\t- on :\n\t\t- turn on\n\t\t- switch on\n\t\t- unlock\n\t\t- un lock\n\t\t- boot up\n\t\t- start\n\n\n> # RegEx entities\n\n\n> # Pattern.Any entities\n\n@ patternany Device_PatternAny\n@ patternany Room_PatternAny\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/QnAMaker.qna",
    "content": "﻿# ? hi\n```\nhello\n```\n\n# ? greetings\n- good morning\n- good evening\n```\nHello!\n```\n\n# ? What are you?\n- What?\n- What do you do?\n- Who are you?\n- What is your name?\n- What should I call you?\n```\nI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using Orchestrator.\n```"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/Weather.lu",
    "content": "\n> LUIS application information\n> !# @app.name = Weather\n> !# @app.desc = Weather LUIS application - Bot Builder Samples\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 4.0.0\n\n\n> # Intent definitions\n\n## Get Weather Condition\n- current weather ?\n- do {@Location=florida} residents usually need ice scrapers\n- get {@Location=florence} temperature in september\n- get for me the weather conditions in {@Location=sonoma county}\n- get the daily temperature {@Location=greenwood indiana}\n- get the weather at {@Location=saint george utah}\n- how much rain does {@Location=chambersburg} get a year\n- show average rainfall for {@Location=boise}\n- temperature of {@Location=delhi} in celsius please\n- was last year about this time as wet as it is now in the {@Location=south} ?\n- what is the rain volume in {@Location=sonoma county} ?\n- what to wear in march in {@Location=california}\n- what's the weather like in {@Location=minneapolis}\n- weather in {@Location_PatternAny}\n- how's the weather in {@Location_PatternAny}\n- current weather in {@Location_PatternAny}\n\n\n## Get Weather Forecast\n- forecast in celcius\n- get the forcast for me\n- i want to know the temperature at {@Location=death valley}\n- provide me by {@Location=toronto} weather please\n- show me the forecast at {@Location=alabama}\n- soliciting today's weather\n- what is the weather in {@Location=redmond} ?\n- what is the weather today at 10 day {@Location=durham} ?\n- what will the weather be tomorrow in {@Location=new york} ?\n- what's the weather going to be like in {@Location=hawaii} ?\n- will it be raining in {@Location=ranchi}\n- will it rain this weekend\n- will it snow today\n- what's the forecast for next week in {@Location_PatternAny}\n- show me the forecast for {@Location_PatternAny}\n- what's the forecast for {@Location_PatternAny}\n\n\n## None\n\n\n> # Entity definitions\n\n@ ml Location\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n> # Pattern.Any entities\n\n@ patternany Location_PatternAny\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Controllers/BotController.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    [Route(\"api/messages\")]\n    [ApiController]\n    public class BotController : ControllerBase\n    {\n        private IBotFrameworkHttpAdapter _adapter;\n        private IBot _bot;\n\n        public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)\n        {\n            _adapter = adapter;\n            _bot = bot;\n        }\n\n        [HttpPost]\n        public async Task PostAsync()\n        {\n            // Delegate the processingg of the HTTP POST to the adapter.\n            // The adapter will invoke the bot.\n            await _adapter.ProcessAsync(Request, Response, _bot);\n        }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/IBotServices.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.Bot.Builder.AI.Luis;\nusing Microsoft.Bot.Builder.AI.Orchestrator;\nusing Microsoft.Bot.Builder.AI.QnA;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public interface IBotServices\n    {\n        LuisRecognizer LuisHomeAutomationRecognizer { get; }\n        \n        LuisRecognizer LuisWeatherRecognizer { get; }\n\n        OrchestratorRecognizer Dispatch { get; }\n        \n        QnAMaker SampleQnA { get; }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/OrchestratorConfig.cs",
    "content": "﻿namespace Microsoft.BotBuilderSamples\n{\n    public class OrchestratorConfig\n    {\n        public string SnapshotFile { get; set; }\n        \n        public string ModelFolder { get; set; }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateWebHostBuilder(args).Build().Run();\n        }\n\n        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .ConfigureLogging((logging) =>\n                {\n                    logging.AddDebug();\n                    logging.AddConsole();\n                })\n                .UseStartup<Startup>();\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/README.md",
    "content": "# NLP with Orchestrator\n\nBot Framework v4 NLP with Orchestrator (with entity recognition) bot sample\n\nThis bot has been created using [Bot Framework](https://dev.botframework.com), it shows how to create a bot that relies on multiple [LUIS.ai](https://www.luis.ai) and [QnAMaker.ai](https://www.qnamaker.ai) models for natural language processing (NLP).\n\nUse the Orchestrator dispatch model in cases when:\n\n- Your bot consists of multiple language modules (LUIS + QnA) and you need assistance in routing user's utterances to these modules in order to integrate the different modules into your bot.\n- Create a text classification model from text files.\n\n## Overview\n\nThis bot uses Orchestrator to route user utterances to multiple LUIS models and QnA maker services to support multiple conversational scenarios.  This bot sample also demonstrates using Orchestrator for entity recognition.\n\n## Prerequisites\n\n| OS      | Version             | Architectures   |\n| ------- | ------------------- | --------------- |\n| Windows | 10 (1607+)          | ia32 (x86), x64 |\n| MacOS   | 10.15+              | x64             |\n| Linux   | Ubuntu 18.04, 20.04 | x64             |\n\nThis sample **requires** prerequisites in order to run.\n- Install latest supported version of [Visual C++ Redistributable](https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads)\n\n- Install latest [Bot Framework Emulator](https://github.com/microsoft/BotFramework-Emulator/releases)\n\n- [.NET Core SDK](https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=3.1.0&arch=x64&rid=win10-x64) version 3.1\n  \n  ```bash\n  > dotnet --version\n  ```\n  \n- Node v14\n \n  ```bash\n  > node -v \n  ```\n    \n- Install BF CLI with Orchestrator plugin\n    \n    ```bash\n    > npm i -g @microsoft/botframework-cli\n    ```\n    Make sure bf orchestrator command is working and shows all available orchestrator commands\n    ```bash\n    > bf orchestrator\n    ```\n\n## To try this bot sample\n\n- Clone the repository\n    ```bash\n    > git clone https://github.com/microsoft/botbuilder-samples.git\n    ```\n    \n- CD Orchestrator\\Samples\\dotnet\\nlp-with-entities\n    ```bash\n    > cd Orchestrator\\Samples\\dotnet\\nlp-with-entities\n    ```\n    \n- Configure the LUIS applications (HomeAutomation and Weather) required for this sample.\n    - Get your [LUIS authoring key](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/luis-concept-keys)\n    ```bash\n    > bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>\n    ```\n    - Update application settings in `./appsettings.json`.  \n    \n- Configure the QnA Maker KB required for this sample.\n    - Get your [QnA Maker Subscription key](https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/how-to/set-up-qnamaker-service-azure#create-a-new-qna-maker-service)\n    ```bash\n    > bf qnamaker:build --in CognitiveModels --subscriptionKey <YOUR-KEY> --botName <YOUR-BOT-NAME>\n    ```\n    - Update kb information in `./appsettings.json`\n    \n- Configure Orchestrator to route utterances to LUIS/QnA language services set up above\n    - Download Orchestrator intent and entity base models\n    ```bash\n    > mkdir model\n    > bf orchestrator:basemodel:get --out ./model\n    > bf orchestrator:basemodel:get --versionId pretrained.20210218.microsoft.dte.00.06.bert_example_ner.en.onnx --out ./model/entity\n    ```\n    - Create the Orchestrator snapshot\n    ```bash\n    > mkdir generated\n    > bf orchestrator:create --hierarchical --in ./CognitiveModels --out ./generated --model ./model --entityModel ./model/entity\n    ```\n    The *hierarchical* flag creates top level intents in the snapshot file derived from the .lu/.qna file names in the input folder.   As a result,  the example utterances are mapped to *HomeAutomation*, *QnAMaker* and *Weather* intents/labels.\n    The optional *entityModel* parameter provides path to a pretrained base model for named entity recognition and will be used to compute entity embeddings for Orchestrator snapshot file.\n\n    - Verify appsettings.json has the following:\n\n       ```\n      \"Orchestrator\": {\n          \"ModelFolder\": \".\\\\model\",\n          \"SnapshotFile\": \".\\\\generated\\\\orchestrator.blu\"\n      }\n      ```\n    \n- Run the bot from a terminal or from Visual Studio, choose option A or B.\n    A) From a terminal\n\n    ```bash\n    > cd samples\\csharp_dotnetcore\\14.nlp-with-orchestrator\n    > dotnet run\n    ```\n    B) Or from Visual Studio\n    - Launch Visual Studio\n    - File -> Open -> Project/Solution\n    - Navigate to `Orchestrator` folder\n    - Select `OrchestratorSamples.sln` file\n    - Right click on `01.dispatch-bot` project in the solution and 'Set as Startup Project'\n    - Press `F5` to run the project\n\n## Connect to the bot using Bot Framework Emulator\n\n- Launch Bot Framework Emulator\n- File -> Open Bot\n- Enter a Bot URL of `http://localhost:3978/api/messages`\n- Try entering several utterances related to home automation, weather or some chit chat.  Some examples:\n    - set lights to bright\n    - good morning\n    - how is the weather in seattle\n\n## Further reading\n- [Dispatch Migration Example](https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/DispatchMigrationExample.md)\n- [Bot Framework Documentation](https://docs.botframework.com)\n- [BF Orchestrator Command Usage](https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/BFOrchestratorUsage.md)\n- [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0)\n- [Activity processing](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-activity-processing?view=azure-bot-service-4.0)\n- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)\n- [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0)\n- [.NET Core CLI tools](https://docs.microsoft.com/en-us/dotnet/core/tools/?tabs=netcore2x)\n- [Azure CLI](https://docs.microsoft.com/cli/azure/?view=azure-cli-latest)\n- [Azure Portal](https://portal.azure.com)\n- [Channels and Bot Connector Service](https://docs.microsoft.com/en-us/azure/bot-service/bot-concepts?view=azure-bot-service-4.0)\n\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.IO;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Orchestrator;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Startup\n    {\n        public Startup(IConfiguration configuration)\n        {\n            OrchestratorConfig = configuration.GetSection(\"Orchestrator\").Get<OrchestratorConfig>();\n        }\n\n        public OrchestratorConfig OrchestratorConfig { get; }\n\n        // This method gets called by the runtime. Use this method to add services to the container.\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);\n\n            // Create the Bot Framework Adapter with error handling enabled.\n            services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();\n\n            services.AddSingleton<OrchestratorRecognizer>(InitializeOrchestrator());\n\n            // Create the bot services (LUIS, QnA) as a singleton.\n            services.AddSingleton<IBotServices, BotServices>();\n\n            // Create the bot as a transient.\n            services.AddTransient<IBot, DispatchBot>();\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n        {\n            if (env.IsDevelopment())\n            {\n                app.UseDeveloperExceptionPage();\n            }\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseWebSockets()\n                .UseRouting()\n                .UseAuthorization()\n                .UseEndpoints(endpoints =>\n                {\n                    endpoints.MapControllers();\n                });\n        }\n\n        private OrchestratorRecognizer InitializeOrchestrator()\n        {\n            string modelFolder = Path.GetFullPath(OrchestratorConfig.ModelFolder);\n            string snapshotFile = Path.GetFullPath(OrchestratorConfig.SnapshotFile);\n            OrchestratorRecognizer orc = new OrchestratorRecognizer()\n            {\n                ModelFolder = modelFolder,\n                SnapshotFile = snapshotFile\n            };\n            return orc;\n        }\n    }\n}\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/nlp-with-entities.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <Platforms>x64</Platforms>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Remove=\"orchestrator.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"generated\\\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Bot.Builder.AI.Luis\" Version=\"4.14.1\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.AI.Orchestrator\" Version=\"4.14.1\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.AI.QnA\" Version=\"4.14.1\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.14.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Content Update=\"appsettings.json\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Update=\"model\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Update=\"**\\*.lu\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Update=\"**\\*.dialog\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Update=\"**\\*.lg\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/wwwroot/default.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Dispatch bot sample with Orchestrator</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n        .header-inner-container::after {\n            content: \"\";\n            clear: both;\n            display: table;\n        }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1{\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n           height: 32px;\n           width: 571px;\n           color: #808080;\n           font-family: \"Segoe UI\";\n           font-size: 24px;\n           font-weight: 200;\n           line-height: 32px;\n           padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n        .how-to-build-section>h3 {\n            font-size: 16px;\n            font-weight: 600;\n            letter-spacing: 0.35px;\n            line-height: 22px;\n            margin: 0 0 24px 0;\n            text-transform: uppercase;\n        }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n        .step-container dl {\n            border-left: 1px solid #A0A0A0;\n            display: block;\n            padding: 0 24px;\n            margin: 0;\n        }\n\n        .step-container dl>dt::before {\n            background-color: white;\n            border: 1px solid #A0A0A0;\n            border-radius: 100%;\n            content: '';\n            left: 47px;\n            height: 11px;\n            position: absolute;\n            width: 11px;\n        }\n\n        .step-container dl>.test-bullet::before {\n            background-color: blue;\n        }\n\n        .step-container dl>dt {\n            display: block;\n            font-size: inherit;\n            font-weight: bold;\n            line-height: 20px;\n        }\n\n        .step-container dl>dd {\n            font-size: inherit;\n            line-height: 20px;\n            margin-left: 0;\n            padding-bottom: 32px;\n        }\n\n        .step-container:last-child dl {\n            border-left: 1px solid transparent;\n        }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n        .ctaLink:focus {\n            outline: 1px solid #00bcf2;\n        }\n\n        .ctaLink:hover {\n            text-decoration: underline;\n        }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n        .step-icon>div {\n            height: 30px;\n            width: 30px;\n            background-repeat: no-repeat;\n        }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container>div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl>dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };\n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">NLP With Dispatch Sample</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">You can test your bot in the Bot Framework Emulator<br />\n                by connecting to http://localhost:3978/api/messages.</div>\n            <div class=\"main-text download-the-emulator\"><a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-download-emulator\"\n                    target=\"_blank\">Download the Emulator</a></div>\n            <div class=\"main-text\">Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\" target=\"_blank\">Azure\n                    Bot Service</a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:</div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "Orchestrator/docs/BFOrchestratorInteractive.md",
    "content": "\r\n# Interactive\r\n\r\n[BF Orchestrator CLI][1] has an \"interactive\" command which enables a user to\r\ndynamically interact with an Orchestrator base language model (see examples in [Start an interactive session without a training set](#start-an-interactive-session-without-a-training-set)) and\r\nimprove the accuracy of an existing language model (see examples in [Start an interactive session with a training set](#start-an-interactive-session-with-a-training-set)) through some CLI commandlets.\r\n\r\nDuring an interactive session, the command loads an Orchestrator base model\r\ninto memory and manage several input cache variables that can be used by\r\nensuing commandlets for maintaining the base model's example set. These variables include:\r\n\r\n- **\"current\" utterance**       -- A cache for storing an utterance that can be used by several commandlets\r\n                              for interacting with an Orchestrator model.\r\n- **\"current\" intent labels**   -- A cache for storing an array of intent labels that can be used by several\r\n                              commandlet for interacting with an Orchestrator model.\r\n- **\"new\" intent labels**       -- Another cache for storing an array of intent labels, which were mainly\r\n                              used for changing an utterance's intent labels within an Orchestrator model.\r\n\r\n## Scenarios\r\n\r\n### Start an interactive session without a training set\r\n\r\nAn Orchestrator user can launch the interactive command without a training set.\r\nDuring an session, the user can interactively add utterance examples, revise them, remove them,\r\nvalidate and create an evaluation report, etc..\r\n\r\n#### Argument setup\r\n\r\nBelow is a command snippet for a user to start the interactive command with two arguments:\r\n\r\n    - \"--model\"     -- folder pointing to an Orchestrator base model\r\n    - \"--out\"       -- out folder for validation evaluation reports.\r\n\r\n```\r\n> set ORCHESTRATOR_MODEL=<Orchestrator base model folder>\r\n> set EVALUATING_OUTPUT=<Evaluation report output folder>\r\n> bf orchestrator:interactive --out=%EVALUATING_OUTPUT% --model=%ORCHESTRATOR_MODEL%\r\n```\r\n\r\nAfter executing the command snippet, the command enters an interactive session shown below:\r\n```\r\n> \"Current\" utterance:          \"\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Cache an utterance\r\n\r\nThe user can then use the 'u' commandlet to enter an utterance and cache it into the \"current\" utterance\r\nvariable. Below is what happened after a user enters \"hi\" as a new utterance using the 'u' commandlet.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > hi\r\n> \"Current\" utterance:          \"hi\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Cache an intent label\r\n\r\nThen the user can issue the 'i' commandlet to enter a new intent label and cache it into the \"current\"\r\nintent label variable. Notice that Orchestrator supports an utterance with multiple labels, so the \r\nintent variable cache is actually an array for holding multiple intent labels associated with\r\nthe \"current\" utterance. \r\nBelow is what happened after a user enter \"greeting\" as a new intent label using the 'i' commandlet.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > i\r\nPlease enter a \"current\" intent label > greeting\r\n> \"Current\" utterance:          \"hi\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Add example to Orchestrator core\r\n\r\nAfter a user enter \"hi\" and \"greeting\" during the interactive session, she/he can add this example to\r\nthe Orchestrator core. It will become part of the example set Orchestrator core uses for\r\npredicting the intent for new queries. In a sense, this new example was added to a \"training\" set\r\nfor a supervised machine learning model.\r\nThe commandlet for adding a new example is 'a'.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'hi' has been added to '[\r\n    \"greeting\"\r\n]'\r\n> \"Current\" utterance:          \"hi\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Show statistics of the example set\r\n\r\nOnce a user has entered a sufficient amount of intent/utterance examples into Orchestrator core,\r\nshe/he can then use the 's' commandlet to show some statistics of the example set.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 1\r\n}\r\n> Total #examples:1\r\n> \"Current\" utterance:          \"hi\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Add examples to current cached intent label\r\n\r\nA user can enter more intent/utterance examples.\r\nBelow is what happened if the user enters and added two more utterances (\"hello\" and \"good morning\")\r\nfor the same \"greeting\" intents. \r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > hello\r\n> \"Current\" utterance:          \"hello\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'hello' has been added to '[\r\n    \"greeting\"\r\n]'\r\n> \"Current\" utterance:          \"hello\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > good morning\r\n> \"Current\" utterance:          \"good morning\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'good morning' has been added to '[\r\n    \"greeting\"\r\n]'\r\n> \"Current\" utterance:          \"good morning\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Add example for a new intent label\r\n\r\nA user can also enter some utterances with different intents.\r\nBelow is what happened if a user enters a new utterance \"good bye\" with \r\na new intent \"farewell.\" However the user forgot to clear the current intent labels, so\r\nthe \"good bye\" intent is actually associated with two intents (\"greeting,farewell\").\r\nEven though this is not completely wrong semantically, but a user can always\r\nclear the intent variable cache (with the 'ci' commandlet). Remember that the utterance and intents have\r\nnot been added to Orchestrator core yet.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > good bye\r\n> \"Current\" utterance:          \"good bye\"\r\n> \"Current\" intent label array: \"greeting\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > i\r\nPlease enter a \"current\" intent label > farewell\r\n> \"Current\" utterance:          \"good bye\"\r\n> \"Current\" intent label array: \"greeting,farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Clear intent label cache\r\n\r\nThe commandlet to clear the intent label cache is 'ci'.\r\nBelow is what happened if the user clear the intent label variable cache.\r\nSimilarly, the utterance variable cache can be cleared by the 'cu' commandlet.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > ci\r\n> \"Current\" utterance:          \"good bye\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\nThe user can then reenter the \"farewell\" intent into the cache and add it to Orchestrator core:\r\n```\r\nPlease enter a commandlet, \"h\" for help > i\r\nPlease enter a \"current\" intent label > farewell\r\n> \"Current\" utterance:          \"good bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'good bye' has been added to '[\r\n    \"farewell\"\r\n]'\r\n> \"Current\" utterance:          \"good bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\nAfter a while, a user can re-issue the 's' commandlet and see the label utterance tabulation:\r\nFrom the session below, we can see that there are three utterances for the \"greeting\" intent,\r\nand one for the \"farewell\" intent.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 1\r\n}\r\n> Total #examples:4\r\n> \"Current\" utterance:          \"good bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Make prediction\r\n\r\nAfter there are some intent/utterance entered to Orchestrator core, the user can use\r\nOrchestrator core to make some prediction.\r\nBelow is what happened if \"bye\" is entered as the \"Current\" utterance and use the 'p'\r\ncommandlet for an prediction. Orchestrator core responded with a prediction\r\nof the \"farewell\" intent, a high score of 0.977, and the closest example within the \r\n\"farewell\" intent, \"good bye\".\r\nOn the other hand, the \"greeting\" intent was predicted with a score of 0.691 and\r\nthe closest example was \"good morning.\"\r\n\r\n```\r\nPlease enter an utterance > bye\r\n> \"Current\" utterance:          \"bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > p\r\n> Prediction:\r\n[\r\n    {\r\n        \"closest_text\": \"good bye\",\r\n        \"score\": 0.977452505191936,\r\n        \"label\": {\r\n            \"name\": \"farewell\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 3,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    },\r\n    {\r\n        \"closest_text\": \"good morning\",\r\n        \"score\": 0.6907451700060104,\r\n        \"label\": {\r\n            \"name\": \"greeting\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 3,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    }\r\n]\r\n> \"Current\" utterance:          \"bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Hints on new intent label needed\r\n\r\nThe same utterance, intent, add, predict commandlets can be repeated for a user\r\nto build a sizeable example set within Orchestrator core.\r\nA user try out some new utterance, such as \"wake me up at 10AM\" and he/she can\r\nsee the prediction based on the two existing intent labels.\r\nAs we can see for the prediction, the prediction scores are fairly low, 0.322 and 0.275.\r\nThe low scores indicate that this new utterance may need a new intent label.\r\n\r\n```\r\nPlease enter an utterance > wake me up at 10AM\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > p\r\n> Prediction:\r\n[\r\n    {\r\n        \"closest_text\": \"good morning\",\r\n        \"score\": 0.322484918357831,\r\n        \"label\": {\r\n            \"name\": \"greeting\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 18,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    },\r\n    {\r\n        \"closest_text\": \"good bye\",\r\n        \"score\": 0.2750571664975262,\r\n        \"label\": {\r\n            \"name\": \"farewell\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 18,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    }\r\n]\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\nBelow is what happened if the user enter a new intent label and add the\r\n\"wake me up at 10AM\" utterances to Ochestrator core.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > ci\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > i\r\nPlease enter a \"current\" intent label > alarm\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'wake me up at 10AM' has been added to '[\r\n    \"alarm\"\r\n]'\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\nAs we can see from issuing the 's' commandlet, now we have one more intents.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 1,\r\n    \"alarm\": 1\r\n}\r\n> Total #examples:5\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Evaluate the example set\r\n\r\nAfter a while, the user can use the 'v' commandlet to evaluate the example set.\r\nBelow is what happened after issuing the 'v' commandlet.\r\nThe user can open the evaluation report file and review the progress thus far.\r\nSince there are very few examples per intent, and the valuation is done in\r\nleave-one-out cross validation (LOOCV), so the report does not look good.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > v\r\n> Leave-one-out cross validation is done and reports generated in 'experiment_evaluating_PrebuildDomain\\orchestrator_predicting_set_summary.html'\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Remove utterance\r\n\r\nHowever, if the user feels that the \"wake me up at 10AM\" is not what this chatbot is concerned with,\r\nshe/he can remove the utterance using the 'r' commandlet. The 'r' commandlet call Orchestrator core\r\nto remove the intent and utterance example currently cached.\r\nOn the other hand, the user can reference the evaluation report and pick out the utterance\r\nexample and cache it into the \"current\" variables.\r\nBelow is what happened that the user issue the 'vm' (validation/misclassified) commandlet and\r\nenter an index '2' for the No. 2 utterance and put it and its intent to the \"Current\" cache.\r\nSimilarly a user can issue the 'va' (validation/ambiguous), 'vl' (validation/low-confidence), and\r\nthe 'vd' (validation/duplicates) commands to pick up the utterance and intent examples and cache them\r\ninto the variables.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > vm\r\nPlease enter an index from the Misclassified report > 2\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\nBelow is what happened after issuing the 'r' commandlet to remove the \"wake me up at 10AM\"\r\nutterance. Since there is only one utterance for the \"alarm\" intent, the whole intent is\r\neliminated. However, a user can simply issue the 'rl' commandlet to eliminate an intent label\r\nwith all of its utterances.\r\nNow there are two intent left in the Orchestrator core.\r\n```\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > r\r\n> Utterance 'wake me up at 10AM' has been removed from '[\r\n    \"alarm\"\r\n]'\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 1\r\n}\r\n> Total #examples:4\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Detailed configuration information\r\n\r\nFor more detailed configuration information for Orchestrator, a user can issue the 'd' commandlet.\r\nBelow is what happened after a user issue the 'd' commandlet, where\r\nthere are several threshold used for the 'v' commandlet during creating an evaluation report.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > d\r\n> Ambiguous closeness:           0.2\r\n> Low-confidence closeness:      0.5\r\n> Multi-label threshold:         1\r\n> Unknown-label threshold:       0.3\r\n> Obfuscation flag:              false\r\n> Orchestrator configuration:    {\r\n    \"CDF\": \"{\\\"zero\\\":0.400000,\\\"unknown\\\":0.700000,\\\"one\\\":1.000000}\",\r\n    \"EmbedderVersion\": 1,\r\n    \"Framework\": \"onnx\",\r\n    \"Layers\": 6,\r\n    \"MinRequiredCoreVersion\": \"1.0.0\",\r\n    \"ModelFile\": \"D:\\\\testsBfCliOrchestrator\\\\_model\\\\model_bert_6l\\\\model.onnx\",\r\n    \"ModelType\": \"dte_bert\",\r\n    \"Name\": \"pretrained.20200924.microsoft.dte.00.06.en.onnx\",\r\n    \"Publisher\": \"Microsoft\",\r\n    \"Version\": \"pretrained.20200924.microsoft.dte.00.06.en.onnx\",\r\n    \"VocabFile\": \"D:\\\\testsBfCliOrchestrator\\\\_model\\\\model_bert_6l\\\\vocab.txt\",\r\n    \"ignore_same_example\": true,\r\n    \"knn_k\": 3,\r\n    \"nlr_path\": \"D:\\\\testsBfCliOrchestrator\\\\_model\\\\model_bert_6l\",\r\n    \"use_compact_embeddings\": true,\r\n    \"use_gap\": false,\r\n    \"use_unknown\": true\r\n}\r\n> Current label-index map: {\r\n    \"farewell\": 0,\r\n    \"greeting\": 1\r\n}\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n- The \"Ambiguous closeness\" threshold is currently set to 0.2, which means if an utterance\r\n  is correctly predicted, but there are some other intent with a score close to 80% of the\r\n  ground-truth intent label, then that close utterance will be listed as an \"ambiguous\" prediction\r\n  in the evaluation report.\r\n\r\n- The \"Low-confidence\" threshold is default to 0.5, which means that if an utterance's ground-truth\r\n  intent label is predicted to have the highest score, but the score is lower than 0.5, then\r\n  this utterance will be listed as \"low confidence\"\r\n\r\n- The \"Unknown-label\" threshold is default to 0.3, which means that if the highest predicted\r\n  intent score is lower than 0.3, then Orchestrator will simply declare that the intent is unknown.\r\n\r\n- A user can use the 'vo' commandlet to set the \"obfuscate\" flag,\r\n  so that the 'v' commandlet can create an evaluation report with all the intent and utterances obfuscated.\r\n  An obfuscated report only show some metadata of the example set without any intent or utterance\r\n  disclosed, so that the report might be shareable for benchmark and comparison purpose.\r\n  The 'd' commandlet also list some internal information of the base model and settings used by \r\n  Orchestrator core. These information can be used for debugging purpose.\r\n  These thresholds can be reset using the 'vat', 'vlt', 'vmt' and 'vut' commandlets.\r\n\r\n#### Create a new snapshot (.BLU) file\r\n\r\nAfter a user has reached a milestone, she/he can create a new snapshot (.BLU) file using the 'n' command.\r\nIn the future, the user can run an interactive session preloaded with this new snapshot file and\r\nkeep refining the intent and utterance examples.\r\nBelow is what happened after the running the 'n' command and the location of the new snapshot file.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > n\r\n> A new snapshot has been saved to 'experiment_evaluating_PrebuildDomain\\orchestrator_predicting_snapshot_set.blu'\r\n> \"Current\" utterance:          \"wake me up at 10AM\"\r\n> \"Current\" intent label array: \"alarm\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Exit the session\r\n\r\nAt the end, a user can enter the 'q' commandlet to exit the session.\r\n\r\n### Start an interactive session with a training set\r\n\r\nSince there is already a .blu snapshot file from the last session, a user can\r\nuse the interactive command to continue refining the example set by using the \"--in\" argument.\r\n\r\n#### Argument setup\r\n\r\n```\r\n> set ORCHESTRATOR_MODEL=<Orchestrator base model folder>\r\n> set EVALUATING_OUTPUT=<Evaluation report output folder>\r\n> bf orchestrator:interactive --out=%EVALUATING_OUTPUT% --model=%ORCHESTRATOR_MODEL% --in=%EVALUATING_OUTPUT%\\orchestrator_predicting_snapshot_set.blu\r\n```\r\n\r\n#### Show statistics of the example set\r\n\r\nAfter a new interactive session, the user can issue the 's' commandlet and take a look\r\nof the intent/utterance distribution.\r\n\r\n```\r\n> \"Current\" utterance:          \"\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 1\r\n}\r\n> Total #examples:4\r\n> \"Current\" utterance:          \"\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Make predictions on utterances\r\n\r\nThe user can try out some more utterances.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > bye bye\r\n> \"Current\" utterance:          \"bye bye\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > p\r\n> Prediction:\r\n[\r\n    {\r\n        \"closest_text\": \"good bye\",\r\n        \"score\": 0.9852574345531401,\r\n        \"label\": {\r\n            \"name\": \"farewell\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 7,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    },\r\n    {\r\n        \"closest_text\": \"good morning\",\r\n        \"score\": 0.7110401992969432,\r\n        \"label\": {\r\n            \"name\": \"greeting\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 7,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    }\r\n]\r\n> \"Current\" utterance:          \"bye bye\"\r\n> \"Current\" intent label array: \"\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Add examples to existing language model\r\n\r\nThe predicted intent label was \"farewell\" with a very high score of 0.985. However,\r\nsuppose it's a low score, then the user can improve model\r\nby adding the utterance into the example set.\r\nBelow is what happened after the \"bye bye\" utterance is added.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > i\r\nPlease enter a \"current\" intent label > farewell\r\n> \"Current\" utterance:          \"bye bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'bye bye' has been added to '[\r\n    \"farewell\"\r\n]'\r\n> \"Current\" utterance:          \"bye bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 2\r\n}\r\n> Total #examples:5\r\n> \"Current\" utterance:          \"bye bye\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\nBelow is what happened when a user enters a new utterance \"good day\" and\r\nmakes a prediction of it.\r\nAs we can see that the prediction scores for the \"greeting\" and \"farewell\" intents are both very high and close.\r\nThe user then added the \"good day\" utterance to the \"farewell\" intent.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > good day\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > p\r\n> Prediction:\r\n[\r\n    {\r\n        \"closest_text\": \"good morning\",\r\n        \"score\": 0.8536692972984349,\r\n        \"label\": {\r\n            \"name\": \"greeting\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 8,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    },\r\n    {\r\n        \"closest_text\": \"good bye\",\r\n        \"score\": 0.8114553301042285,\r\n        \"label\": {\r\n            \"name\": \"farewell\",\r\n            \"label_type\": 1,\r\n            \"span\": {\r\n                \"length\": 8,\r\n                \"offset\": 0\r\n            }\r\n        }\r\n    }\r\n]\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > a\r\n> Utterance 'good day' has been added to '[\r\n    \"farewell\"\r\n]'\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 3\r\n}\r\n> Total #examples:6\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Relabel utterances\r\n\r\nHowever, the user may later decide to change the intent for \"good day\" from \"farewell\" to \"greeting\".\r\nShe/he can them use the 'ni' commandlet to enter \"greeting\" into the \"New\" intent label\r\ncache. After that, the user can issue the 'c' commandlet to change the intent label for \"good day\".\r\nAs we can see below, the label/utterance distribution has changed afterward.\r\nNotice that the user can use the 'cni' commandlet to clear the \"New\" intent label cache.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 3,\r\n    \"farewell\": 3\r\n}\r\n> Total #examples:6\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"\"\r\nPlease enter a commandlet, \"h\" for help > ni\r\nPlease enter a \"new\" intent label > greeting\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"greeting\"\r\nPlease enter a commandlet, \"h\" for help > c\r\n> Utterance 'good day' has been moved from '[\r\n    \"farewell\"\r\n]' to '[\r\n    \"greeting\"\r\n]'\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"greeting\"\r\nPlease enter a commandlet, \"h\" for help > s\r\n> Per-label #examples: {\r\n    \"greeting\": 4,\r\n    \"farewell\": 2\r\n}\r\n> Total #examples:6\r\n> \"Current\" utterance:          \"good day\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"greeting\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n#### Check existence of an utterance in the language model\r\n\r\nAlso, the user can enter an utterance and see if it's in the Orchestrator Core's example set or not\r\nusing the 'f' commandlet.\r\nBelow is what happened when a user tries to find out if \"good evening\" is in the example set of not.\r\n\r\n```\r\nPlease enter a commandlet, \"h\" for help > u\r\nPlease enter an utterance > good evening\r\n> \"Current\" utterance:          \"good evening\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"greeting\"\r\nPlease enter a commandlet, \"h\" for help > f\r\n> The \"current\" utterance 'good evening' is not in the model.\r\n> \"Current\" utterance:          \"good evening\"\r\n> \"Current\" intent label array: \"farewell\"\r\n> \"New\"     intent label array: \"greeting\"\r\nPlease enter a commandlet, \"h\" for help >\r\n```\r\n\r\n## List of interactive commandlets\r\nAt any time, if a user needs to reference help messages for the many commandlets, he/she can issue\r\nthe 'h' command for a brief help page on all the commandlets.\r\nBelow is the list of the commandlets that can be issued during a 'interactive' session.\r\n\r\n### 'h' - help command\r\n    h   - print the help messages with short description of each command\r\n\r\n### 'q' - quit command\r\n    q   - quit\r\n\r\n### 'd' - display command\r\n    d   - display the utterance, intent label array input caches, Orchestrator config,\r\n          and the label-index map\r\n\r\n### 's' - statistics command\r\n    s   - show label-utterance statistics of the model examples\r\n\r\n### 'u' - utterance command\r\n    u   - enter a new utterance and save it as the \"current\" utterance input\r\n\r\n### 'cu' - clear utterance variable command\r\n    cu  - clear the \"current\" utterance input cache\r\n\r\n### 'i' - intent variable command\r\n    i   - enter an intent and add it to the \"current\" intent label array input\r\n          (can be an index for retrieving a label from the label-index map)\r\n\r\n### 'ci' - clear intent variable command\r\n    ci  - clear the \"current\" intent label array input cache\r\n\r\n### 'ni' - new intent command\r\n    ni  - enter an intent and add it to the \"new\" intent label array input\r\n          (can be an index for retrieving a label from the label-index map)\r\n\r\n### 'cni' - clear new intent command\r\n    cni - clear the \"new\" intent label array input cache\r\n\r\n### 'f' - find command\r\n    f   - find the \"current\" utterance if it is already in the model example set\r\n\r\n### 'p' - predict command\r\n    p   - make a prediction on the \"current\" utterance input\r\n\r\n### 'v' - validate command\r\n    v   - validate the model and save analyses (validation report) to\r\n          \"experiment_predicting_va\\orchestrator_predicting_set_summary.html\"\r\n\r\n### 'vd' - utterance/labels retrieval command (from the Duplicates section of the validation report)\r\n    vd  - reference a validation Duplicates report\r\n          (previously generated by the \"v\" command) and enter an index\r\n          for retrieving utterance/intents into \"current\"\r\n\r\n### 'va' - utterance/labels retrieval command (from the Ambiguous section of the validation report)\r\n    va  - reference a validation Ambiguous report\r\n          (previously generated by the \"v\" command) and enter an index\r\n          for retrieving utterance/intents into \"current\"\r\n\r\n### 'vm' - utterance/labels retrieval command (from the Misclassified section of the validation report)\r\n    vm  - reference a validation Misclassified report and enter an index\r\n          (previously generated by the \"v\" command)\r\n          for retrieving utterance/intents into \"current\"\r\n\r\n### 'vl' - utterance/labels retrieval command (from the Low Confidence section of the validation report)\r\n    vl  - reference a validation LowConfidence report\r\n          (previously generated by the \"v\" command) and enter an index\r\n          for retrieving utterance/intents into \"current\"\r\n\r\n### 'vat' - ambiguous threshold command\r\n    vat - enter a new validation-report ambiguous closeness threshold\r\n\r\n### 'vlt' - low-confidence threshold command\r\n    vlt - enter a new validation-report low-confidence threshold\r\n\r\n### 'vmt' - multi-label threshold command\r\n    vmt - enter a new multi-label threshold\r\n\r\n### 'vut' - unknown label threshold command\r\n    vut - enter a new unknown-label threshold\r\n\r\n### 'vo' - obfuscate command\r\n    vo  - enter a boolean for obfuscating labels/utterances or not in evaluation reports\r\n          generated by the \"v\" command'\r\n\r\n### 'a' - add command\r\n    a   - add the \"current\" utterance and intent labels to the model example set\r\n\r\n### 'r' - remove command\r\n    r   - remove the \"current\" utterance and intent labels from the model example set\r\n\r\n### 'c' - change command\r\n    c   - remove the \"current\" utterance's intent labels and then\r\n          add it with the \"new\" intent labels to the model example set\r\n\r\n### 'rl' - remove label command\r\n    rl  - remove the \"current\" intent labels from the model example set\r\n\r\n### 'n' - new snapshot command\r\n    n   - create a new snapshot of model examples and save it to\r\n          \"experiment_predicting_va\\orchestrator_predicting_training_set.blu\"\r\n\r\n## References\r\n\r\n- [BF Orchestrator CLI](https://aka.ms/bforchestratorcli)\r\n\r\n[1]:https://aka.ms/bforchestratorcli\t\"BF Orchestrator CLI\"\r\n"
  },
  {
    "path": "Orchestrator/docs/BFOrchestratorReport.md",
    "content": "# Report Interpretation\r\n\r\nThe [BF Orchestrator CLI][1] has a \"test\" command for evaluating the performance of an Orchestrator snapshot file (with .blu extension). A snapshot is composed of natural language representation base model (see [models][3]) along with a set of examples provided in a label file (typically a [.lu file][4]). The snapshot file is used in Bot Framework to detect intents from user utterances. \r\n\r\nIn order to achieve high quality natural language processing (e.g. intent detection), it is necessary to assess and refine the quality of the model. This is much simplified in Orchestrator because of its use of pre-trained models. The optimization cycle is required in order to account for human language variations. \r\nLearn more about Machine Learning evaluation methodology in the [References](# references) section below.\r\n\r\nTo interpret the report, use the following guidance to actions to improve the snapshot file:\r\n- Incase utterances are the same or semantically similar, mrerge the two intent labels.\r\n- If the utterances are not semantically similar, split an intent's utterance pool and create a new intent label.\r\n- It the utterance are semantically close to a different intent label, change the intent label.\r\n- Rephrase an utterance and make it semantically closer to other utterances labled with the same intent.\r\n- Add more utterances to an intent label as the intent's utterance pool could be too scarce.\r\n- Remove some utterances from an intent label if there were too many utterances label to it.\r\n\r\n# Report Organization\r\n\r\nThe test command thus produces a folder with HTML report and a few supporting artifacts as follows:\r\n\r\n- orchestrator_testing_set_ground_truth_instances.json: test instance ground-truth file in JSON format.\r\n- orchestrator_testing_set_labels.txt: intent labels in a plain text file.\r\n- orchestrator_testing_set_prediction_instances.json: test instance prediction file in JSON format.\r\n- orchestrator_testing_set_scores.txt: test instance prediction file in a plain TSV format.\r\n- orchestrator_testing_set_summary.html: report summary in HTML format\r\n\r\nThe report summary contains several sections as follows:\r\n\r\n## Intent / Utterance Statistics\r\n\r\nThis section contains label and utterance distributions.\r\n\r\nIt has two statistical sections, one for labels, the other utterances. Attached is an example rendition of the section.\r\n\r\n- Label statistics\r\n- Utterance statistics\r\n\r\n![Evaluation Report Intent/Utterance Statistics](media/EvaluationReportTabVaIntentUtteranceStatistics.png)\r\n\r\n### Label statistics\r\n\r\nLabel statistics lists the number of utterances labeled to each label. Additional metrics include utterance prevalence (ratio) for every label. The distributions can give Orchestrator users an overall view of the labels and utterances, and whether the distributions are skewed and emphasize too much on some labels, but not others. A machine learn model may learn more from a label (intent) with more instances (utterances) labeled to it. Thus, a developer can check this table and see if some intents needs more utterances in the snapshot file.\r\n\r\n### Utterance statistics\r\n\r\nOn the other hand, utterance statistics focus on the #label distribution by the utterances. Some utterances are labeled with more than one intents, which might not be desirable and could be a bug. This table reflects the distribution of multi-label utterances.\r\nFrom the above screen snapshot, we can see that there are two utterances labeled twice with distinct labels. Those multi-label utterances will be listed in the next section and the owner can decide to remove the duplicates from the snapshot file.\r\n\r\n## Utterance Duplicates\r\n\r\nSometimes some dataset might contain utterances tagged with the same labels multiple times.\r\nThe report also lists this redundancy.\r\nThis section has two sub-sections:\r\n\r\n- Multi-label utterances and their labels\r\n- Duplicate utterance and label pairs\r\n\r\nThey report on utterances with duplicate or multiple labels. A duplicate utterance is detected when it is present more than once in a snapshot file. Sometimes some dataset might even contain utterances tagged with the same labels multiple times.\r\n\r\nThe report also lists the redundancy of label/utterance pairs. Orchestrator will deduplicate such redundancy.\r\nPlease see the attached screen snapshot as an example.\r\n\r\n![Evaluation Report Utterance Duplicates](media/EvaluationReportTabVaUtteranceDuplicates.png)\r\n\r\n## Ambiguous\r\n\r\nThis section reports on utterances with ambiguous predictions. For an evaluation utterance, if an Orchestrator model correctly predicts its intent label, then it's a true positive instance. Every intent label will be predicted with a score, which is essentially the probability or confidence for that label prediction. The predicted intent usually is the one with the highest score. If the Orchestrator model also makes some other high-score prediction close to that of the correctly predicted label, then we call such a prediction \"ambiguous.\"\r\n\r\nIn this section, the report lists all the utterances with an ambiguous prediction in a table.\r\nThe table has several columns:\r\n\r\n- Utterance         -- the utterance\r\n- Labels            -- the true labels for the utterance\r\n- Predictions       -- the labels predicted by the Orchestrator model\r\n- Close Predictions -- some other labels predicted with a close, high score to that of the predicted label. \r\n\r\nBesides the prediction score, the report also shows the closest example to the utterance\r\nwithin the label's utterance set.\r\nBelow is a screen snapshot of an ambiguous report:\r\n\r\n![Evaluation Report Ambiguous](media/EvaluationReportTabVaAmbiguous.png)\r\n\r\nAmbiguous utterances can be a sign of overlapping intent labels. In another word, two intent labels may have their utterance pools semantically close to each other. In the example report about, the utterance \"what my events today\" was correctly predicted with the Calendar intent label and the closest example is\r\n\"What is on my calendar today\". However the FAQ3 intent was also predicted with a high school and the closest example from that intent is \"What's going on today.\" From these two closest example, one can remove the latter from the FAQ3 intent as it is now more specific to the Calendar intent, then just a FAQ example.\r\n\r\n## Misclassified\r\n\r\nThis section reports on utterances with incorrect predictions. A misclassified predication is one where an Orchestrator model falsely predicts its intent label. Usually the label with the highest prediction score is chosen as the predicted label, but it can be different from the ground-truth label for the utterance.\r\n\r\nSimilar to the last section, the report also lists the prediction and ground-truth labels with\r\ntheir prediction scores and closest examples. Below is a screen snapshot of the misclassified report. A user can also follow the utterances list and decide to update their intent labels and or rephrase the utterances themselves.\r\n\r\n![Evaluation Report Misclassified](media/EvaluationReportTabVaMisclassified.png)\r\n\r\n## Low Confidence\r\n\r\nThis section reports on predictions that scored too low to be considered \"confident\" intent detection.\r\n\r\nSometimes a prediction may be predicted correctly with the highest scores among all labels, but the score is very low, lower than a threshold. We call such predictions low confidence.\r\nNotice that there are several default thresholds used to guide producing the report sections thus far. Usually an Orchestrator user can just predict a label with the highest score, but he/she can also utilize some thresholds for a fine-tuned prediction in a chat bot's dialog logic.\r\n\r\nJust like the last sections, the report lists the prediction and ground-truth labels with their prediction scores and closest examples. Also like the previous sections, the utterances listed in this section can guide a user how to improve the snapshot file.\r\n\r\n![Evaluation Report Low Confidence](media/EvaluationReportTabVaLowConfidence.png)\r\n\r\n## Metrics\r\n\r\nThe Metrics section is an advanced report that contains analytics that is common in Machine Learning evaluation methodologies.\r\n\r\nAdvanced machine-learning practitioners may analyze the overall model performance expressed in machine learning metrics. In this section, the report calculates some common metrics in two sections:\r\n\r\n- Confusion matrix metrics\r\n- Average confusion matrix metrics\r\n\r\n![Evaluation Report Metrics](media/EvaluationReportTabVaMetrics.png)\r\n\r\n### Confusion matrix metrics\r\n\r\nIn this table, the Orchestrator CLI test command reads an evaluation set with ground-truth labels. An evaluation set contains a collection of utterances and their labels. It then calls the Orchestrator base model and makes a prediction for every utterance in the set and generate predicted labels for every utterance. It then compares the predicted labels against the ground-truth labels and creates a table of per-label binary confusion matrices.\r\n\r\nFor a binary confusion matrix, there are four cells:\r\n    - #True Positives (TP)\r\n        - #False Positives (FP)\r\n        - #False Neagatives (FN)\r\n        - #True Negatives (TN)\r\n\r\nFor a label, if it exists in an utterance's ground-truth label set as well as in the predicted label set,\r\nthen that utterance is a TP for the label.\r\nIf the label only exists in the utterance's predicted label set, then it's a false positive.\r\nIf the label only exists in the utterance's ground-truth set, then it's a false negative.\r\nIf the label does not exist in either the ground-truth or predicted set, then it's a true negative.\r\n\r\nBy the way, for entity extraction, as a label contains an entity name, entity offset in an utterance and its length,\r\nthere can be numerous true negatives, since there are limitless combinations of the entity attributes\r\nnot in the ground-truth or the predicted sets.\r\nThus, for intent prediction evaluation, all four cells are used to calculate confusion matrix metrics,\r\nbut only the first three are used for entity-extraction evaluation.\r\n\r\nUsing just the first three cells of a binary confusion matrix,\r\nthe Orchestrator \"test\" command can then calculate some\r\nmore sophisticated metrics, including\r\n\r\n    - Precision     - TP / (TP + FP)\r\n    - Recall        - TP / (TP + FN)\r\n    - F1            - harmonic mean of precision and recall\r\n\r\nThese three metrics do not use TN, but the simple accuracy metric need all 4 cells, including TN.\r\n\r\nFor details of many confusion matrix metrics, please reference [Wikipedia: Confusion matrix][2].\r\n\r\n### Average confusion matrix metrics\r\n\r\nSince Orchestrator can evaluate multiple labels, one confusion matrix for each, there can be many\r\nmetrics for detailed analysis. For reporting and KPI purpose, it would be great to aggregate all\r\nthese metrics for an overall metric and model performance.\r\n\r\nThere are many nuanced ways to aggregate confusion matrix metrics. For comparing models, it's critical\r\nto compare based on a consistent formula. Please reference the [BF Orchestrator CLI][1] readme page for advanced CLI usage details.\r\n\r\n## Thresholds\r\n\r\nThis evaluation report is created using several thresholds that they can also be useful in building chat bot logic. These thresholds can be reset through environment variables listed below:\r\n\r\n- ambiguousClosenessThreshold: default to 0.2, which means that if there are labels predicted to have a score close to within 20% of the top and corrected predicted label, then this utterance is ambiguously predicted.\r\n- lowConfidenceScoreThreshold: default to 0.5, which means that if the top predicted score is lower than 0.5, then the prediction is considered low confidence.\r\n- multiLabelPredictionThreshold: default to 1, which means that the report will predict only one label. However, if the threshold is lower than 1, then every label with a predicted score higher than that will be predicted. This threshold is usually used for multi-label, multi-intent scenarios.\r\n- unknownLabelPredictionThreshold:default to 0.3, which means that the evaluation process will consider a prediction UNKNOWN if the score is lower than that threshold.\r\n\r\n## References\r\n\r\n- [BF Orchestrator CLI](https://aka.ms/bforchestratorcli)\r\n- [Wikipedia: Confusion matrix](https://en.wikipedia.org/wiki/Confusion_matrix)\r\n- [Wikipedia: Training, validation, and test sets](https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets)\r\n- [Machine Learning Mastery](https://machinelearningmastery.com/difference-test-validation-datasets/).\r\n\r\n[1]:https://aka.ms/bforchestratorcli\t\"BF Orchestrator CLI\"\r\n[2]:https://en.wikipedia.org/wiki/Confusion_matrix\t\"Wikipedia: Confusion matrix\"\r\n[3]:https://aka.ms/nlrmodels\t\"NLR Models\"\r\n[4]:https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0 \".LU format\"\r\n[5]: https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator#bf-orchestratortest \"bf orchestrator:test\"\r\n"
  },
  {
    "path": "Orchestrator/docs/BFOrchestratorUsage.md",
    "content": "# BF Orchestrator Command Usage\n\n[BF Orchestrator Command ][1] is used to manage Orchestrator language understanding assets - retrieve, create, evaluate, and tune Orchestrator models to be used in bot development. Typical use is for intent routing to the appropriate language service, LUIS or QnA Maker for additional language tasks such as entity extraction or answer retrieval. This use was previously enabled by use of the legacy *dispatch* CLI. In addition, intent routing can be used to delegate conversations to a backend bot skill. Entity recognition is on the roadmap as a future capability.\n\n## Primary Scenario\n\nThe mainstream bot language recognition development cycle with Orchestrator is generally as follows:\n\n1. Create Intent label / utterance examples file in [.lu format][2]  (will be referred to as the *label file*). \n2. Download base model.\n3. Combine the label file .lu from (1) with the base model from (2) to create a .blu file (will be referred to as the *snapshot* file). \n4. Test and refine quality of utterance to intent recognition.\n5. Integrate Orchestrator language recognizer in your bot.\n\n## Steps\n\nWe will use the primary workflow to illustrate how to use Orchestrator commands for full development cycle.\n\n### 1. Create Intent label / utterance examples file in [.lu format][2]\n\nIf you are developing a new language model, simply refer to [Language understanding][8] documentation to author label files. Depending on how you plan to design your bot, you may use a single label file corresponding to a single snapshot file for the entire bot or multiple pairs, each for every adaptive dialog where you plan to use Orchestrator as a recognizer. \n\nIn case of **migration from legacy dispatch**, simply add LUIS app(s) or QnAMaker kb(s) as Orchestrator data sources.  Refer to the Dispatch migration documentation [here][11] for more information.\n\nExample:\n```\n> bf orchestrator:add -t luis --id <luis-app-id> --endpoint <luis-endpoint> -k <luis-subscription-key> -v <luis-app-version> --routingName l_<luis-app-name>\n> bf orchestrator:add -t qna --id <kb-id> -k <qna-subscription-key> --routingName q_<kb-name>\n```\n\n### 2. Download base model\n\nCreate a new folder, say *models*, and download the default base model using: \n\n```\nbf orchestrator:basemodel:get --out ./models\n```\n\nout parameter is optional.  If not specified, base model files will be downloaded to the current working directory.\n\nSee also the ```orchestrator:basemodel:list``` command if you wish to download and experiment with different base models.  (see descriptions [here][4] ).\n\n### 3. Combine the label file .lu from (1) with the base model from (2) to create a .blu file\n\nThere are two ways to create Orchestrator snapshot file(s), depending on the usage scenarios:\n\n- **To route utterances to LUIS/QnA language services**\n\n  Use ```bf orchestrator:create``` command to combine the base model with the label file(s) to create snapshot file for use by the orchestrator recognizer. If using a single folder, create it prior, say *generated*, and specify it in --out parameter:\n\n  ```\n  bf orchestrator:create --model <base model folder> --in <label file/folder> --out <generated folder> --hierarchical\n  ```\n\n  The create command generates a single Orchestrator snapshot file as output.  If folder is specified as input, it scans the subfolder hierarchy for .lu/.json/.tsv/.qna files and combine all utterances/labels found into the snapshot file.  \n  The *hierarchical* flag creates top level intents in the snapshot file derived from the .lu/.json/.tsv/.qna file names in the input folder.  This is useful to create a routing mechanism for further processing by subsequent skills or language services.\n  \n  In case of **migration from legacy dispatch**, runs orchestrate:create after orchestrator:add commands from (1).   If LUIS app(s) or QnA Maker kb(s) have been updated, add the **--refresh** flag to orchestrator:create command so latest application models will be downloaded to be used to create Orchestrator snapshot file.\n  \n  Example:\n  \n  ```\n  > bf orchestrator:create \n  ```\n  \n  \n  \n  If you have previously used Dispatch CLI to create LUIS based Dispatch application, you could use .dispatch file (created by Dispatch CLI) as input to orchestrator:create command and skip step (1)  above.\n  \n  Example:\n  \n  ```\n  > bf orchestrator:create --in c:\\LuisDispatchBot.dispatch\n  ```\n  \n  \n  \n- **To recognize intent from incoming user utterance (entity recognition is TBD)**\n\n  Use ```bf orchestrator:create``` command to combine the base model with the label file(s) to create snapshot file for use by the orchestrator recognizer. If using a single folder, create it prior, say *generated*, and specify it in --out parameter:\n\n  ```\n  bf orchestrator:create --model <base model folder> --in <label file/folder> --out <generated folder>\n  ```\n\n  \n\n### 4. Test and refine quality of utterance to intent recognition\n\nCreate a label .lu file with test data set of utterances. Run the following command to generate report for your language model\n\n```\nbf orchestrator:test --in <snapshot file> --model <base model file> --out <report folder> --test <test data file>\n```\n\nSee also [bf orchestrator test](https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator#bf-orchestratortest) for full command line options.\n\nSee also [Report Interpretation][6] for how to use the report to fine tune your language model. \n\nYou can improve your language model by adding or revising examples directly from [.lu][2] files, or interactively by using ```bf orchestrator:interactive``` command (see also [Interactive Command][7]).\n\n### 5. Integrate Orchestrator language recognizer in your bot\n\nOnce satisfied with your language model performance, it is time to integrate the model in your bot by specifying Orchestrator as the recognizer. Depending on the flavor of solution there are several methods to hook up Orchestrator. \n\nSee the specific variations for your solution below.\n\n##### Composer Scenario\n\nIt is possible to specify  Orchestrator as a dialog recognizer in [Bot Framework Composer][5].  To use Orchestrator in Composer:\n\n1. Enable Orchestrator feature in Composer's Application Settings.\n2. Select Orchestrator in the recognizer dropdown menu.\n3. Review, evaluate and adjust examples in language data as you would normally for LUIS / Orchestrator to ensure recognition quality.\n\nSee the [School skill navigator](https://github.com/microsoft/BotBuilder-Samples/tree/main/composer-samples/csharp_dotnetcore/projects/OrchestratorSchoolNavigator) bot sample for more. \n\n\n\n##### Non-Adaptive (V4) Scenario\n\nThe example [NLP with Orchestrator](https://github.com/microsoft/BotBuilder-Samples/tree/main/experimental/orchestrator/csharp_dotnetcore/01.dispatch-bot#nlp-with-orchestrator) illustrates how to use Orchestrator's recognizer in code using the scenario of migrating from legacy dispatch solution.\n\n\n\n##### Declarative Dialog Scenario\n\nThe best example of declarative use is by inspecting the assets (.dialog files)  produced by Bot Framework Composer.\n\n\n\n## Advanced Command\n\nThe advanced language recognition development cycle assumes some level understand of machine learning concepts and interactive iterations over the language example definition and potentially evaluation of different models.\n\nFor the advanced scenario please refer to the [Interactive Command][7] page.\n\n## Report Interpretation\n\nA particularly important step in tuning your language model is testing and evaluating your language model performance. Orchestrator command produces detailed report to assist in optimizing the language model.\n\nSee [Report Interpretation][6] for more.\n\n## References\n\n- [Orchestrator][1]\n- [Language Understanding][3]\n- [Composer][5]\n- [Natural Language Representation Models][4]\n- [Wikipedia: Training, validation, and test sets][9]\n- [Machine Learning Mastery][10]\n\n\n\n[1]:https://aka.ms/bforchestratorcli\t\"BF Orchestrator CLI\"\n[2]:https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0 \"LU File Format\"\n[3]:https://docs.microsoft.com/en-us/composer/concept-language-understanding \"Language Understanding\"\n[4]:https://aka.ms/nlrmodels \"Orchestrator Base Models\"\n[5]:https://docs.microsoft.com/en-us/composer/introduction \"Composer\"\n[6]:https://aka.ms/bforchestratorreport \"Orchestrator Report\"\n[7]:https://aka.ms/bforchestratorinteractive \"Orchestrator Interactive Command\"\n[8]:https://docs.microsoft.com/en-us/composer/concept-language-understanding \"Language understanding\"\n[9]:https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets \"ML testing\"\n[10]:https://machinelearningmastery.com/difference-test-validation-datasets/ \"Machine Learning Mastery\"\n[11]:https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/DispatchMigrationExample.md \"Dispatch Migration\"\n\n\n\n\n\n\n"
  },
  {
    "path": "Orchestrator/docs/DispatchMigrationExample.md",
    "content": "# Example Migration from LUIS Dispatch to Orchestrator\n\nThe following article describes how to migrate a legacy *dispatch* based solution to [Orchestrator][3] routing.\n\nIn  [NLP With Dispatch][2] C# Sample we use LUIS as the top intent arbitrator to redirect intent processing to subsequent language understanding services, LUIS and QnAMaker.  Recall that the top routing was performed by using *dispatch* CLI to create a language model combining the subsequent LUIS and QnAMaker models, and creating an aggregate top LUIS application to be used in the bot logic to further delegate utterances to the detected language service. \n\nHere, we will modify that sample to use Orchestrator in place of the top LUIS arbitrator as follows:\n\n\n\n<p align=\"center\">\n  <img width=\"450\" src=\"./media/dispatch-logic-flow.png\" />\n</p>\n\n\n\n\n# Prerequisites\n\n* Complete the [NLP With Dispatch][2] C# Sample to serve as the starting point.\n  * Have access to create & use [LUIS][4] and [QnAMaker][5] services.\n  * See [Dispatch Sample documentation][1] for full details.\n* Install [BF CLI][6]\n* Bot project must target x64 platform\n* Install latest supported version of [Visual C++ runtime](https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads)\n\n\n\n# Migration Walkthrough\n\nStart with fully working  [NLP With Dispatch][2] C# Sample including all language artifacts (output of dispatch CLI). \n\n\n\n## Prepare\n* Add your LUIS application language model(s) and/or QnA Maker knowledge bases(s) as Orchestrator data sources\n\n```\n> md CognitiveModels\n@rem -v <luis-app-version> is optional, default to 0.1\n@rem --routingName is optional, default to l_<luis-app-name> found in the exported lu file\n@rem sample luis-endpoint: https://westus.api.cognitive.microsoft.com\n> bf orchestrator:add -t luis --id <luis-app-id> --endpoint <luis-endpoint> -k <luis-subscription-key> -v <luis-app-version> --routingName l_<luis-app-name>\n\n@rem --routingName is optional, default to q_<kb-id>\n> bf orchestrator:add -t qna --id <kb-id> -k <qna-subscription-key> --routingName q_<kb-name>\n```\n\n* Add the ```Microsoft.Bot.Builder.AI.Orchestrator``` assembly and dependencies to your project from nuget package manager.\n\n## Create Orchestrator Language model\n\n* Get Orchestrator base model\n\n* Create Orchestrator snapshot with your previously exported LUIS application language model(s) and/or QnA Maker knowledgebase(s).\n\n  Example:\n\n```\n> md model\n> bf orchestrator:basemodel:get --out model\n\n> md generated\n> bf orchestrator:create --in CognitiveModels --model model --out generated\n\"Processing c:\\\\...\\\\CognitiveModels\\\\datasources\\\\l_<luis-app-name>.lu...\\n\"\n\"Processing c:\\\\...\\\\CognitiveModels\\\\datasources\\\\q_<kb-name>.qna...\\n\"\n\"Snapshot written to c:\\\\...\\\\generated\\\\Orchestrator.blu\"\n```\n\n* If you have previously used [**Dispatch CLI tool**][8] to create and refresh LUIS based Dispatch application, you could simply pass in path to the **.dispatch** file (created by Dispatch CLI tool) to bf:orchestrator:create command and skip the bf:orchestrator:add steps above.\n\n  Example:\n\n  ```\n  > md generated\n  > cd CognitiveModels\n  > bf orchestrator:create --in c:\\\\LuisDispatchBot.dispatch --model model --out ..\\\\generated\n  \"Processing c:\\\\...\\\\CognitiveModels\\\\datasources\\\\l_<luis-app-name>.lu...\\n\"\n  \"Processing c:\\\\...\\\\CognitiveModels\\\\datasources\\\\q_<kb-name>.qna...\\n\"\n  \"Snapshot written to c:\\\\...\\\\generated\\\\Orchestrator.blu\"\n  ```\n\n- To refresh *Orchestrator snapshot* with latest changes from your LUIS application(s) or QnAMaker knowledge base(s),  simply rerun the bf orchestrator:create command above or run the following command from the same directory previous create command was run from.\n\n  Example:\n\n  ```\n  > bf orchestrator:create --refresh\n  \"Processing c:\\\\...\\\\CognitiveModels\\\\datasources\\\\l_<luis-app-name>.lu...\\n\"\n  \"Processing c:\\\\...\\\\CognitiveModels\\\\datasources\\\\q_<kb-name>.qna...\\n\"\n  \"Snapshot written to c:\\\\...\\\\generated\\\\Orchestrator.blu\"\n  ```\n\n\n\n## Modify Settings\n\n* Inspect your LUIS and QnAMaker configurations and modify ```appsettings.json```  so as to specify the two subsequent LUIS applications.\n\n* Add configuration for the top Orchestrator arbitrator (i.e. the new dispatcher)\n\n  ```\n  {\n    \"Logging\": {\n      \"LogLevel\": {\n        \"Default\": \"Warning\"\n      }\n    },\n  \n    \"MicrosoftAppId\": \"\",\n    \"MicrosoftAppPassword\": \"\",\n  \n    \"QnAKnowledgebaseId\": \"--same as in original sample--\",\n    \"QnAEndpointKey\": \"--same as in original sample--\",\n    \"QnAEndpointHostName\": \"--same as in original sample--\",\n  \n    \"LuisHomeAutomationAppId\": \"--pick from generated NLPDispatchSample14.dispatch--\",\n    \"LuisWeatherAppId\": \"--pick from generated NLPDispatchSample14.dispatch--\",\n    \"LuisAPIKey\": \"--same as in original sample--\",\n    \"LuisAPIHostName\": \"Old: westus. New: https://westus.api.cognitive.microsoft.com/\",\n  \n    \"Orchestrator\": {\n      \"ModelPath\": \".\\\\model\",\n      \"SnapshotPath\": \".\\\\generated\\\\Orchestrator.blu\"\n    },\n  \n    \"AllowedHosts\": \"*\"\n  }\n  ```\n\n\n\n## Modify Startup Configuration\n\n* The new ```Startup.cs``` file shall include Orchestrator initialization.\n* Modify ```(I)BotService.cs``` to expose Orchestrator as dispatch.\n* Add class for Orchestrator configuration settings.\n\n**Startup.cs**\n\n```\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.IO;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Orchestrator;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Startup\n    {\n\n        public OrchestratorConfig OrchestratorConfig { get; }\n\n        public Startup(IConfiguration configuration)\n        {\n            OrchestratorConfig = configuration.GetSection(\"Orchestrator\").Get<OrchestratorConfig>();\n        }\n\n\n        // This method gets called by the runtime. Use this method to add services to the container.\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddControllers().AddNewtonsoftJson();\n\n            // Create the Bot Framework Adapter with error handling enabled.\n            services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();\n\n            services.AddSingleton<OrchestratorRecognizer>(InitializeOrchestrator());\n\n            // Create the bot services (Orchestrator, LUIS, QnA) as a singleton.\n            services.AddSingleton<IBotServices, BotServices>();\n\n            // Create the bot as a transient.\n            services.AddTransient<IBot, DispatchBot>();\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n        {\n            if (env.IsDevelopment())\n            {\n                app.UseDeveloperExceptionPage();\n            }\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseRouting()\n                .UseAuthorization()\n                .UseEndpoints(endpoints =>\n                {\n                    endpoints.MapControllers();\n                });\n\n            // app.UseHttpsRedirection();\n        }\n\n\n        private OrchestratorRecognizer InitializeOrchestrator()\n        {\n            string modelPath = Path.GetFullPath(OrchestratorConfig.ModelPath);\n            string snapshotPath = Path.GetFullPath(OrchestratorConfig.SnapshotPath);\n            OrchestratorRecognizer orc = new OrchestratorRecognizer()\n            {\n                ModelPath = modelPath,\n                SnapshotPath = snapshotPath\n            };\n            return orc;\n        }\n\n    }\n}\n\n```\n\n\n\n**IBotServices.cs**\n\n```\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.Bot.Builder.AI.Luis;\nusing Microsoft.Bot.Builder.AI.Orchestrator;\nusing Microsoft.Bot.Builder.AI.QnA;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public interface IBotServices\n    {\n        LuisRecognizer LuisHomeAutomationRecognizer { get; }\n        LuisRecognizer LuisWeatherRecognizer { get; }\n\n        OrchestratorRecognizer Dispatch { get; }\n        QnAMaker SampleQnA { get; }\n    }\n}\n```\n\n\n\n**BotServices.cs**\n\n```\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.Bot.Builder.AI.Luis;\nusing Microsoft.Bot.Builder.AI.Orchestrator;\nusing Microsoft.Bot.Builder.AI.QnA;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class BotServices : IBotServices\n    {\n\n        public OrchestratorRecognizer Dispatch { get; private set; }\n        public QnAMaker SampleQnA { get; private set; }\n        public LuisRecognizer LuisHomeAutomationRecognizer { get; private set; }\n        public LuisRecognizer LuisWeatherRecognizer { get; private set; }\n\n        public BotServices(IConfiguration configuration, OrchestratorRecognizer dispatcher)\n        {\n            // Read the setting for cognitive services (LUIS, QnA) from the appsettings.json\n            // If includeApiResults is set to true, the full response from the LUIS api (LuisResult)\n            // will be made available in the properties collection of the RecognizerResult\n            LuisHomeAutomationRecognizer = CreateLuisRecognizer(configuration, \"LuisHomeAutomationAppId\");\n            LuisWeatherRecognizer = CreateLuisRecognizer(configuration, \"LuisWeatherAppId\");\n\n            Dispatch = dispatcher;\n\n            SampleQnA = new QnAMaker(new QnAMakerEndpoint\n            {\n                KnowledgeBaseId = configuration[\"QnAKnowledgebaseId\"],\n                EndpointKey = configuration[\"QnAEndpointKey\"],\n                Host = configuration[\"QnAEndpointHostName\"]\n            });\n        }\n\n        private LuisRecognizer CreateLuisRecognizer(IConfiguration configuration, string appIdKey)\n        {\n            var luisApplication = new LuisApplication(\n                configuration[appIdKey],\n                configuration[\"LuisAPIKey\"],\n                configuration[\"LuisAPIHostName\"]);\n\n            // Set the recognizer options depending on which endpoint version you want to use.\n            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3\n            var recognizerOptions = new LuisRecognizerOptionsV2(luisApplication)\n            {\n                IncludeAPIResults = true,\n                PredictionOptions = new LuisPredictionOptions()\n                {\n                    IncludeAllIntents = true,\n                    IncludeInstanceData = true\n                }\n            };\n\n            return new LuisRecognizer(recognizerOptions);\n        }\n\n    }\n}\n\n```\n\n\n\n**OrchestratorConfig.cs**\n\n```\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class OrchestratorConfig\n{\n        public string SnapshotPath { get; set; }\n        public string ModelPath { get; set; }\n    }\n}\n\n```\n\n\n\n## Modify Bot Logic\n\n\n\n**Bots\\DispatchBot.cs**\n\n```\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Authentication;\nusing Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime.Models;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Schema;\nusing Microsoft.BotFramework.Orchestrator;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class DispatchBot : ActivityHandler\n    {\n        private readonly ILogger<DispatchBot> _logger;\n        private readonly IBotServices _botServices;\n\n        public DispatchBot(IBotServices botServices, ILogger<DispatchBot> logger)\n        {\n            _logger = logger;\n            _botServices = botServices;\n        }\n\n        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n\n            // Top intent tell us which cognitive service to use.\n            var allScores = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);\n            // var topIntent = allScores.Intents.First().Key;\n             var topIntent = allScores.GetTopScoringIntent();\n             string Intent = topIntent.intent;\n\n\n            \n            // Next, we call the dispatcher with the top intent.\n            await DispatchToTopIntentAsync(turnContext, Intent, allScores, cancellationToken);\n        }\n\n        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)\n        {\n            const string WelcomeText = \"Type a greeting, or a question about the weather to get started.\";\n\n            foreach (var member in membersAdded)\n            {\n                if (member.Id != turnContext.Activity.Recipient.Id)\n                {\n                    await turnContext.SendActivityAsync(MessageFactory.Text($\"**NLP with Orchestrator Sample**\\n\\n{WelcomeText}\"), cancellationToken);\n                }\n            }\n        }\n\n        private async Task DispatchToTopIntentAsync(ITurnContext<IMessageActivity> turnContext, string intent, RecognizerResult recognizerResult, CancellationToken cancellationToken)\n        {\n            string props;\n\n            switch (intent)\n            {\n                case \"l_HomeAutomation\":\n                    props = GetRecognizerProperties(\"Home Automation\", recognizerResult.Properties);\n                    await turnContext.SendActivityAsync(MessageFactory.Text(props), cancellationToken);\n                    await ProcessHomeAutomationAsync(turnContext, cancellationToken);\n                    break;\n                case \"l_Weather\":\n                    props = GetRecognizerProperties(\"Weather\", (Dictionary<string, object>)recognizerResult.Properties);\n                    await turnContext.SendActivityAsync(MessageFactory.Text(props), cancellationToken);\n                    await ProcessWeatherAsync(turnContext, cancellationToken);\n                    break;\n                case \"q_sample-qna\":\n                    props = GetRecognizerProperties(\"QnAMaker\", (Dictionary<string, object>)recognizerResult.Properties);\n                    await turnContext.SendActivityAsync(MessageFactory.Text(props), cancellationToken);\n                    await ProcessSampleQnAAsync(turnContext, cancellationToken);\n                    break;\n                default:\n                    _logger.LogInformation($\"Dispatch unrecognized intent: {intent}.\");\n                    await turnContext.SendActivityAsync(MessageFactory.Text($\"Dispatch unrecognized intent: {intent}.\"), cancellationToken);\n                    break;\n            }\n        }\n\n        private async Task ProcessHomeAutomationAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"ProcessHomeAutomationAsync\");\n\n            // Retrieve LUIS result for HomeAutomation.\n            var recognizerResult = await _botServices.LuisHomeAutomationRecognizer.RecognizeAsync(turnContext, cancellationToken);\n            var result = recognizerResult.Properties[\"luisResult\"] as LuisResult;\n\n            var topIntent = result.TopScoringIntent.Intent;\n\n            await turnContext.SendActivityAsync(MessageFactory.Text($\"HomeAutomation top intent: {topIntent}.\\n\\n\"), cancellationToken);\n            // await turnContext.SendActivityAsync(MessageFactory.Text($\"HomeAutomation intents detected\\n\\n{string.Join(\"\\n\\n* \", result.Intents.Select(i => i.Intent))}\"), cancellationToken);\n            if (result.Entities.Count > 0)\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text($\"HomeAutomation entities were found in the message:\\n\\n{string.Join(\"\\n\\n* \", result.Entities.Select(i => i.Entity))}\"), cancellationToken);\n            }\n        }\n\n        private async Task ProcessWeatherAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"ProcessWeatherAsync\");\n\n            // Retrieve LUIS result for Weather.\n            var recognizerResult = await _botServices.LuisWeatherRecognizer.RecognizeAsync(turnContext, cancellationToken);\n            var result = recognizerResult.Properties[\"luisResult\"] as LuisResult;\n            var topIntent = result.TopScoringIntent.Intent;\n\n            await turnContext.SendActivityAsync(MessageFactory.Text($\"ProcessWeather top intent: {topIntent}.\\n\\n\"), cancellationToken);\n            await turnContext.SendActivityAsync(MessageFactory.Text($\"ProcessWeather Intents detected:\\n\\n{string.Join(\"\\n\\n* \", result.Intents.Select(i => i.Intent))}\"), cancellationToken);\n            if (result.Entities.Count > 0)\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text($\"ProcessWeather entities were found in the message:\\n\\n{string.Join(\"\\n\\n* \", result.Entities.Select(i => i.Entity))}\"), cancellationToken);\n            }\n        }\n\n\n        private string GetRecognizerProperties(string Domain, IDictionary<string, object> recognizerResult)\n        {\n            StringBuilder resultString = new StringBuilder();\n\n            resultString.Append($\"**Dispatch: {Domain}**\\n\\nProperties:\\n\\n\");\n\n            IList<BotFramework.Orchestrator.Result> result = (IList < BotFramework.Orchestrator.Result >)recognizerResult[\"result\"];\n            for (var i = 0; i < result.Count; i++)\n            {\n                BotFramework.Orchestrator.Result r = result[i];\n                resultString.Append($\"---\\n\\n* Closest Text: {r.ClosestText}\\n\\n\");\n                resultString.Append($\"* Label: {r.Label.Name}\\n\\n\");\n                resultString.Append($\"* Score: {r.Score}\\n\\n\");\n            }\n\n            return resultString.ToString();\n        }\n\n\n        private async Task ProcessSampleQnAAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"ProcessSampleQnAAsync\");\n\n            var results = await _botServices.SampleQnA.GetAnswersAsync(turnContext);\n            if (results.Any())\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text(results.First().Answer), cancellationToken);\n            }\n            else\n            {\n                await turnContext.SendActivityAsync(MessageFactory.Text(\"Sorry, could not find an answer in the Q and A system.\"), cancellationToken);\n            }\n        }\n    }\n}\n\n```\n\n\n\n # Summary\n\nCompile and run. The sample will use Orchestrator to arbitrate (\"dispatch\") to the corresponding language service, LUIS or QnAMaker which will process the intent and respond to the user.\n\n\n\n\n# References\n* [NLP With Dispatch Sample][2]\n* [Dispatch Sample documentation][1]\n\n[1]:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-dispatch?view=azure-bot-service-4.0&tabs=cs \"Legacy dispatch MSDocs\"\n[2]:https://github.com/microsoft/BotBuilder-Samples/tree/f6af59378a89864754ef36822c4352aad648f426/samples/csharp_dotnetcore/14.nlp-with-dispatch\n[3]:https://aka.ms/bf-orchestrator \"Orchestrator\"\n[4]:https://luis.ai \"LUIS\"\n[5]:https://qnamaker.ai \"QnAMaker\"\n[6]:https://github.com/microsoft/botframework-cli \"BF CLI\"\n[7]:https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator \"Orchestrator plugin\"\n[8]:https://github.com/microsoft/botbuilder-tools/tree/master/packages/Dispatch \"Dispatch CLI\"\n"
  },
  {
    "path": "Orchestrator/docs/FAQ.md",
    "content": "# Frequently Asked Questions\n\n### What are the primary scenarios supported by Orchestrator?\nPrimary scenario currently supported is routing/dispatching (intent only).  We are working on supporting entities extraction for future releases.\n\n\n### Can Orchestrator be used from Composer?\nYes.  Follow documentation [here][13] to use Orchestrator as recognizer in Composer.\n\n### Can you use both Orchestrator and LUIS in the same bot?\nYes, definitely.  You could use Orchestrator (OrchestratorRecognizer) to route incoming utterances to the right child applications (i.e., LUISRecognizer, QnAMakerRecognizer).\n\n\n### What are the guidelines for when Orchestrator correctly predicts incoming utterance for sub intent (app/skill) but the sub app fails to return the right intent?\nWe recommend tuning the sub app models (i.e. LUIS/QnAMaker/Orchestrator) using the recommended best practices for the app.  \n- To improve LUIS model, follow instructions [here][1].\n- To improve QnAMaker kb, follow guidelines [here][2].  \n- To improve Orchestrator, follow guidelines [here][3].\n\n\n### Which languages will be supported in Orchestrator multilingual models?\nOrchestrator multilingual models currently supports 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH).  See [Orchestrator base models][14] for more information on specific models.  We are constantly looking to expand the number of supported languages and if a language is not yet supported, Azure translation could be used to translate incoming utterance to English first before passing it to Orchestrator.  \n\n### Does Orchestrator replace LUIS Dispatch?\nLUIS based [Dispatch][5] is on the path to be deprecated, although the exact timeline is not yet finalized.  Now is a good time to start evaluating Orchestrator as an alternative to Dispatch.\n\n### Does Orchestrator support entity extraction?\nEntity extraction is not yet generally available, however, a simple named entity recognition could be enabled.  See [NLP with entities sample][15] for instructions to enable entity recognition using Orchestrator.\n\n### Does Orchestrator support LUIS patterns and what is the current workaround?  \nNot at the moment.  Expanding LUIS patterns as Orchestrator examples is the recommended workaround, i.e. for pattern \"do {stuff}\", add a few examples to the intent of the pattern, \"do clean up\", \"do homework\", etc.  Another alternative is to convert LUIS pattern into examples with entity, i.e.  \"do {@stuff=clean up}\", \"do {@stuff=homework}\".  See [NLP with entities sample][15] for instructions to enable entity recognition using Orchestrator.\n\n### What is the guidelines in choosing Orchestrator vs LUIS?\nWe recommend evaluating each solution against your data and see which performs better.  Both LUIS based [Dispatch CLI][5] and [BF Orchestrator CLI][6] come with a command to evaluate training and test data.\n\n### Could you combine Orchestrator to predict intent and LUIS for entity?\nUnfortunately not.  However, Orchestrator Recognizer could take external entity recognizers.  Look [here][7] for supported entity recognizers.\n\n### How do you migrate from Dispatch solution to Orchestrator solution?\n[BF Orchestrator CLI][6] comes with commands similar to [Dispatch CLI][5] commands.  bf orchestrator:create command also takes existing .dispatch file generated from Dispatch CLI for easy migration.  See [Dispatch Migration][12] documentation for more information.\n\n### References\n* [Orchestrator][8]\n* [Composer][9]\n* [LUIS][10]\n* [QnAMaker][11]\n\n[1]:https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-how-to-use-dashboard\n[2]:https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/test-knowledge-base?tabs=v1\n[3]:https://github.com/microsoft/botframework-sdk/tree/main/orchestrator/samples/CLI/ModelTuning/README.md\n[4]:https://github.com/pytorch/fairseq/tree/master/examples/xlmr#introduction\n[5]:https://github.com/microsoft/botbuilder-tools/tree/master/packages/Dispatch\n[6]:https://github.com/microsoft/botframework-cli/tree/main/packages/Orchestrator\n[7]:https://github.com/microsoft/botbuilder-dotnet/tree/main/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Recognizers/EntityRecognizers\n[8]:https://aka.ms/bf-orchestrator\n[9]:https://github.com/microsoft/BotFramework-Composer\n[10]:https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis\n[11]:https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/overview\n[12]:https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/DispatchMigrationExample.md\n[13]:https://github.com/microsoft/BotFramework-Composer/blob/main/docs/preview%20features/orchestrator.md\n[14]:https://aka.ms/NLRModels\n[15]:https://github.com/microsoft/botframework-sdk/tree/main/Orchestrator/Samples/dotnet/nlp-with-entities\n\n"
  },
  {
    "path": "Orchestrator/docs/LICENSE.md",
    "content": "# MICROSOFT SOFTWARE LICENSE TERMS\n\nMICROSOFT ORCHESTRATOR FOR AZURE BOT SERVICE\n\nPurpose – For use with Azure Services.\n\n------\n\n**IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE UNITED STATES, PLEASE READ THE “BINDING ARBITRATION AND CLASS ACTION WAIVER” SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED.**\n\n------\n\nThese license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS.\n\n## 1.   INSTALLATION AND USE RIGHTS.\n\n   **a)  General.** You may install and use any number of copies of the software, solely for the purpose stated above and otherwise for your internal business purposes.\n\n   **b)  Third Party Components.** The software may include third party components with separate legal notices or governed by other agreements, as may be described in the ThirdPartyNotices file(s) accompanying the software.\n\n## 2.   DATA. \nThis software may interact with other Microsoft products that collect data that is transmitted to Microsoft. To learn more about how Microsoft processes personal data we collect, please see the Microsoft Privacy Statement at https://go.microsoft.com/fwlink/?LinkId=248681.\n\n## 3.   SCOPE OF LICENSE. \nThe software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to):\n\n  **a)**   work around any technical limitations in the software that only allow you to use it in certain ways;\n\n  **b)**  reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software;\n\n  **c)**   remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software;\n\n  **d)**  use the software in any way that is against the law or to create or propagate malware; or\n\n  **e)**   share, publish, distribute, or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party.\n\n\n\n## 4.   EXPORT RESTRICTIONS. \nYou must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit https://aka.ms/exporting.\n\n## 5.   SUPPORT SERVICES. \nMicrosoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. \n\n## 6.   UPDATES.\nThe software may periodically check for updates and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices.\n\n## 7.   BINDING ARBITRATION AND CLASS ACTION WAIVER. \n**This Section applies if you live in (or, if a business, your principal place of business is in) the United States.**  If you and Microsoft have a dispute, you and Microsoft agree to try for 60 days to resolve it informally. If you and Microsoft can’t, you and Microsoft **agree to binding individual arbitration before the American Arbitration Association under the Federal Arbitration Act (“FAA”)**, and not to sue in court in front of a judge or jury. Instead, a neutral arbitrator will decide. **Class action lawsuits, class-wide arbitrations, private attorney-general actions, and any other proceeding where someone acts in a representative capacity are not allowed; nor is combining individual proceedings without the consent of all parties.** The complete Arbitration Agreement contains more terms and is at https://aka.ms/arb-agreement-4. You and Microsoft agree to these terms.\n\n## 8.   TERMINATION.\nWithout prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts.\n\n## 9.   ENTIRE AGREEMENT.\nThis agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software.\n\n## 10. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. \nIf you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles, except that the FAA governs everything related to arbitration. If you acquired the software in any other country, its laws apply, except that the FAA governs everything related to arbitration. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court (excluding arbitration). If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court (excluding arbitration).\n\n## 11. CONSUMER RIGHTS; REGIONAL VARIATIONS. \nThis agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you:\n\n  **a)   Australia.** You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights.\n\n  **b)  Canada.** If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software.\n\n  **c)   Germany and Austria**.\n\n   - **i.  Warranty.** The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software.\n    \n   - **ii.  Limitation of Liability.** In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law.\n\n   Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called \"cardinal obligations\"). In other cases of slight negligence, Microsoft will not be liable for slight negligence.\n\n## 12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.\n\n## 13. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.\n\n**This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law.**\n\n**It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages.**\n\n \n\n**Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French.**\n\n**Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français.**\n\n**EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues.**\n\n**LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices.**\n\n**Cette limitation concerne:**\n\n**•  tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et**\n\n**•  les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur.**\n\n**Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard.**\n\n**EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas.**\n\n "
  },
  {
    "path": "Orchestrator/docs/LUFormat.md",
    "content": "# LU Format in Orchestrator\n\n\n\nOrchestrator Recognizer is used today only for routing intents to subsequent skills or other language services such as to QnAMaker or LUIS based dialog. A key distinction between Orchestrator and LUIS is that Orchestrator does not process entities. Entities specified in LU file are simply ignored by Orchestrator during language processing. This works because Orchestrator only needs to identify the utterance's intent in order to pass it further to the owning processor per above.  Also, because Orchestrator ignores entities, the user may simply copy,  paste, and merge LU contents from child LUIS dialog or a connected skill to the Orchestrator based dispatcher parent dialog.\n\nTo learn more about LU file format please refer to the original documentation here: [.lu file format - Bot Service | Microsoft Docs](https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0)\n\n"
  },
  {
    "path": "Orchestrator/docs/NLRModels.md",
    "content": "# Prebuilt Language Models\n\nPrebuilt language models have been trained towards more sophisticated tasks for both monolingual as well as multilingual scenarios, including intent prediction and entity extraction. Entity extraction is currently experimental and not yet ready for production use.\n\nThe following prebuilt language models are now available in [versions repository][2].\n\nSee the [References](#references) section for technical descriptions of the AI technology behind the models.\n\n## Default Models\n\n### pretrained.20200924.microsoft.dte.00.06.en.onnx\nThis is a high quality EN-only base model for intent detection that strikes the balance between size, speed and predictive performance. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. This is the default model used if none explicitly specified.\n\n### pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx\nThis is a high quality multilingual base model for intent detection. It's smaller and faster than its 12-layer alternative. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. The model supports in total 100 languages (full list can be found at [XLMR Supported Languages][8]). 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH) are fine-tuned with additional data (performance can be found [here](#multilingual-intent-detection-models-evaluation)). \n\n### pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx (experimental)\nThis is a high quality EN-only base model for entity extraction. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.\n\n## Alternate Models\n\n### pretrained.20200924.microsoft.dte.00.03.en.onnx\nThis is a fast and small EN-only base model for intent detection with sufficient prediction performance. We suggest using this model if speed and memory size is critical to your deployment environment, otherwise consider other options. It is a generic 3-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.\n\n### pretrained.20200924.microsoft.dte.00.12.en.onnx\nThis is a high quality EN-only base model for intent detection, but is larger and slower than other options. It is a 12-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.\n\n### pretrained.20210521.microsoft.dte.01.06.int.en.onnx\nThis is a high quality quantized EN-only base model for intent detection, and it is smaller and faster than other options. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.\n\n### pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx\nThis is a high quality multilingual base model for intent detection. It is a 12-layer pretrained [Transformer][7] model optimized for conversation.\nIts architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. The model supports in total 100 languages (full list can be found at [XLMR Supported Languages][8]). 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH) are fine-tuned with additional data (performance can be found [here](#multilingual-intent-detection-models-evaluation)). \n\n### pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx\nThis is a high quality quantized multilingual base model for intent detection. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. The model supports in total 100 languages (full list can be found at [XLMR Supported Languages][8]). 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH) are fine-tuned with additional data (performance can be found [here](#multilingual-intent-detection-models-evaluation)). \n\n\n## Models Evaluation\nFor a more quantitative comparison analysis of the different models see the following performance characteristics.\n\n### English Intent Detection Models Evaluation\n\n- The following table shows the size & speed performance attributes.\n\n\n|  Model |Base Model   |Layers  |Encoding time per query | Disk Allocation |\n| ------------ | ------------ | ------------ | ------------ | ------------ |\n|pretrained.20200924.microsoft.dte.00.03.en.onnx | BERT | 3  |  ~ 7 ms  | 164M |\n|pretrained.20200924.microsoft.dte.00.06.en.onnx | BERT | 6  |  ~ 14 ms | 261M |\n|pretrained.20200924.microsoft.dte.00.12.en.onnx | BERT | 12 |  ~ 26 ms | 427M |\n|pretrained.20210521.microsoft.dte.01.06.int.en.onnx | BERT | 6 |  ~ 6 ms | 65M |\n\n- \n  The following table shows how accurate is each model relative to provided training sample size using [Snips NLU][4] system, evaluated by **micro-average-accuracy**.\n\n\n|Training samples per intent   |5   |10   |25   |50   |100   |200   |\n| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |------------ |\n|pretrained.20200924.microsoft.dte.00.03.en.onnx |  0.756  | 0.839  | 0.904  | 0.929  | 0.943  | 0.951  |\n|pretrained.20200924.microsoft.dte.00.06.en.onnx |   0.924 | 0.940  | 0.957  |  0.960 |  0.966 | 0.969  |\n|pretrained.20200924.microsoft.dte.00.12.en.onnx |  0.902  |  0.931 |  0.951 | 0.960  |  0.964 |  0.969 |\n|pretrained.20210521.microsoft.dte.01.06.int.en.onnx |  0.917  |  0.939 |  0.951 | 0.958  |  0.963 |  0.965 |\n\n\n### Multilingual Intent Detection Models Evaluation\n- The following table shows the size & speed performance attributes.\n\n| Model                                                        | Base Model | Layers | Encoding time per query | Disk Allocation |\n| ------------------------------------------------------------ | ---------- | ------ | ----------------------- | --------------- |\n| pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx | Unicoder   | 6      | ~ 9 ms                 | 918M            |\n| pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx | Unicoder   | 12     | ~ 16 ms                 | 1.08G           |\n| pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx | Unicoder   | 6     | ~ 4 ms                 | 230M        |\n\n- The following table shows how accurate is each model by training and testing on the same language, evaluated by **micro-average-accuracy** on an internal dataset.\n\n| Model                                                        | de-de | en-us | es-es | es-mx | fr-ca | fr-fr | it-it | ja-jp | pt-br | zh-cn |\n| ------------------------------------------------------------ | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |\n| pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx | 0.638 | 0.785 | 0.662 | 0.760 | 0.723 | 0.661 | 0.701 | 0.786 | 0.735 | 0.805 |\n| pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx | 0.642 | 0.764 | 0.646 | 0.754 | 0.722 | 0.636 | 0.689 | 0.789 | 0.725 | 0.809 |\n| pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx | 0.634 | 0.765 | 0.657 | 0.743 | 0.715 | 0.646 | 0.697 | 0.780 | 0.743 | 0.799 |\n\n- The following table shows how accurate is each model by training on **en-us** and testing on the different languages, evaluated by **micro-average-accuracy** on an internal dataset.\n\n| Model                                                        | de-de | en-us | es-es | es-mx | fr-ca | fr-fr | it-it | ja-jp | pt-br | zh-cn |\n| ------------------------------------------------------------ | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |\n| pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx | 0.495 | 0.785 | 0.530 | 0.621 | 0.560 | 0.518 | 0.546 | 0.663 | 0.568 | 0.687 |\n| pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx | 0.499 | 0.764 | 0.529 | 0.604 | 0.562 | 0.515 | 0.547 | 0.646 | 0.555 | 0.681 |\n| pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx | 0.496 | 0.765 | 0.529 | 0.623 | 0.562 | 0.511 | 0.540 | 0.670 | 0.579 | 0.692 |\n\n### English Entity Extraction Models Evaluation\n\n- The following table shows the size & speed performance attributes.\n\n| Model                                                        | Base Model | Layers | Encoding time per query | Disk Allocation |\n| ------------------------------------------------------------ | ---------- | ------ | ----------------------- | --------------- |\n| pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx | TNLR       | 6      | ~ 29 ms                 | 253M            |\n\n- The following table shows how accurate is each model relative to provided training sample size using [Snips NLU][4] system, evaluated by **macro-average-F1**.\n\n| Training samples per entity type                             | 10    | 20    | 50    | 100   | 200   |\n| ------------------------------------------------------------ | ----- | ----- | ----- | ----- | ----- |\n| pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx | 0.702 | 0.712 | 0.731 | 0.752 | 0.739 |\n\n\n\n\n## License\n\nThe models are released under the following [License Terms][6].\n\n## References\n\n* [UniLMv2 Paper][1]\n* [Base Models Versions Repository][2]\n* [KNN (K nearest neighbors algorithm)][3]\n* [Snips NLU (Natural Language Understanding)][4]\n* [Snips NLU Metrics][5]\n* [Transformer][7]\n* [XLMR Supported Languages][8]\n* [Turing Universal Language Representation model (T-ULRv2)][11]\n* [Microsoft DeBERTa - Blog][9]\n* [Microsoft  AI At Scale][10]\n\n[1]: https://arxiv.org/abs/2002.12804 \"UniLMv2: Pseudo-Masked Language Models for Unified Language Model Pre-Training\"\n[2]: https://aka.ms/nlrversions_0.2\n[3]: https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm\n[4]: https://github.com/snipsco/snips-nlu \"Snips NLU\"\n[5]: https://github.com/snipsco/snips-nlu-metrics \"Snips NLU Metrics\"\n[6]: ./LICENSE.md \"License agreement\"\n[7]: https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)\n[8]: https://github.com/pytorch/fairseq/tree/master/examples/xlmr#introduction\n[9]: https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/ \"Microsoft DeBERTa - Microsoft Blog\"\n[10]: https://innovation.microsoft.com/en-us/exploring-ai-at-scale \"AI at Scale\"\n[11]: https://www.microsoft.com/en-us/research/blog/microsoft-turing-universal-language-representation-model-t-ulrv2-tops-xtreme-leaderboard/ \"Turing Universal Language Representation model\"\n\n\n"
  },
  {
    "path": "Orchestrator/docs/Overview.md",
    "content": "# Technical Overview\n\nThe Orchestrator is a replacement of the [Bot Framework Dispatcher][1] used in chat bots since 2018. It makes the state of the art natural language understanding methods available to bot developers while at the same time making the process of language modeling quick, and not requiring the expertise in [Deep Neural Networks (DNN), Transformers][5], or [Natural Language Processing (NLP)][6]. This work is co-authored with the industry experts in the field and includes some of the top methods used in the [General Language Understanding Evaluation (GLUE)][7] leaderboard. Orchestrator will continue to evolve and adopt the latest advancements in science and in the industry.\n\nOrchestrator enables composability of bots allowing reuse of skills or the entire bots contributed by the community in an easy way without requiring time consuming retraining of the language models. It is our goal to support the community and continue responding to the provided feedback.\n\n## Design Objectives and Highlights\n\nThanks to the community feedback we compiled a list of objectives and requirements which are addressed in the initial release of the Orchestrator. The [Roadmap](###roadmap) section describes the additional work planned in the upcoming releases. \n\n### No [ML][12] or [NLP][6] expertise required\n\nIn the legacy approach so far in order to train a robust language model a significant expertise and time was required to produce a robust model. E.g. the chat bot author would be concerned with proper data distributions, data imbalance, feature-level concerns including generation of various synonym lists etc. When not paying attention to these aspects the final model quality was often poor. With the Orchestrator these aspects are of no concern anymore to the developer and the related expertise is also not required in order to create robust language model (see [Models][21] for evaluation results).\n\n### Minimal or no model training required\n\nBuilding a language model requires multiple iterations of adding or removing training examples followed by training the model and evaluation. This process may take days or even weeks to accomplish satisfactory results. Also, when using the [transformer][5] model for the classification task a classification layer (or layers) are added and trained making this process expensive, time consuming and often requiring GPU.\n\nTo address these concerns, we chose an example-based approach where the language model is defined as a set of labeled examples. In Orchestrator a model example is represented as a vector of numbers (an embedding) obtained from the [transformer model][5] for a given text that the corresponding skills is capable of handling (that's the definition of the application language model in Orchestrator). During runtime a similarity of the new example is calculated comparing it to the existing model examples per skill. The weighted average of *K* closest examples ([KNN algorithm][9]) is taken to determine the classification result. This approach does not require an explicit training step, only calculation of the embeddings for the model examples is done. The operation is performed locally without GPU and without remote server roundtrips.\n\n### Local, fast library, not a remote service\n\nThe Orchestrator core is written in C++ and is available as a library in C#, Node.js and soon Python and Java. The library can be used directly by the bot code (a preferred approach) or can be hosted out-of-proc or on a remote server. Running locally eliminates additional service round trip costs (latency and pricing meters). This is especially helpful when using Orchestrator to dispatch across disparate LU/ QnA services.\n\nAs an example, using the English pretrained language model (pretrained.20200924.microsoft.dte.00.06.en.onnx) is roughly 260 MB, classification of a new example with this initial model takes about 10 milliseconds (depending on the text length). These numbers are for illustration only to give a sense of performance. As we improve the models or include additional languages these numbers will likely change.\n\n### State-of-the-art classification with few training examples\n\nDevelopers often face an issue of a very few training examples available to properly define the language model. With the powerful pre-trained SOTA models used by the Orchestrator this is not a concern anymore. Even just one example for an intent/skill can often go a long way in making quite accurate predictions. For example, a \"Greeting\" intent defined with just one example, \"hello\", can be successfully predicted for examples like \"how are you today\" or \"good morning to you\". The power of the pretrained models and their generalization capabilities using a very few simple (and short) examples is impressive. This ability is often called a \"few-shot learning\" including [\"one-shot learning\"][11] that the Orchestrator also supports. This ability is made possible thanks to the pretrained models that were trained on large data sets and then optimized for conversation also on large data.\n\n### Ability to classify the \"unknown\" intent without additional examples\n\nAnother common challenge that developers face in handling intent classification decisions is determining whether the top scoring intent should be triggered or not. Orchestrator provides a solution for this. Its scores can be interpreted as probabilities calibrated in such way that the score of 0.5 is defined as the maximum score for an \"unknown\" intent selected in a way to balance the precision and recall. If the top intent's score is 0.5 or lower the query/request should be considered of an \"unknown\" intent and should probably trigger a follow up question by the bot. On the other hand, if the score of two intents is above 0.5 then both intents (skills) could be triggered. If the bot is designed to handle only one intent at a time, then the application rules or other priorities could pick the one that gets triggered in this case.\n\nThe classification of the \"unknown\" intent is done without the need for any examples that define the \"unknown\" (often referred to as [\"zero-shot learning\"][10]) which would be challenging to accomplish. It would be hard to accomplish this without the heavily pretrained language model especially that the bot application may be extended in the future with additional skills that were \"unknown\" so far.\n\n### Extend to support Bot Builder Skills\n\nWhile the [Dispatcher's][1] focus was to aid in triggering between multiple [LUIS][3] apps and [QnA Maker][4] KBs the Orchestrator expands this functionality into supporting generic [Bot Builder Skills][2] to allow composability of bot skills. The skills developed and made available by the community may be easily reused and integrated in a new bot with no language model retraining required. Orchestrator provides a toolkit to evaluate this extension identifying ambiguous examples that should be reviewed by the developer. \n\n### Ease of composability\n\nThe language models of skills and even entire bots that are made available by the community can be integrated in a new bot by simply adding their snapshot(s) (see the [API reference][20] for more information). Model snapshots represent skills, group of skills or even entire bots, contain all the language model data required to trigger them. Importing a new model snapshot can be done in runtime and takes just milliseconds. This opens opportunities for interesting scenarios where the model can be modified to emphasize deeper, more specialized skills that are likely to trigger. This flexibility is beneficial in cases of complex dialogs or even for handling the conversation contexts which could include model snapshots.\n\n### Ability to explain the classification results\n\nThe ability to explain classification results could be important in an application. In general, attempting to interpret the results of deep learned models (like [transformers][5]) could be very challenging. Orchestrator enables this by providing the closest example in the model to the one that is evaluated. In a case of misclassification this simple mechanism helps the developer in determining whether a new example should be added that defines a skill or if the existing example in the model was mislabeled. This feature simplifies implementation of [active learning][18] for the bot which can be done by non-experts (the language fluency is only required).\n\n### High performance\n\nThe core of Orchestrator is written in C++. Since its runtime algorithms can be easily vectorized the Orchestrator core takes advantage of the vector operators supported by the mainstream CPUs ([SIMD][13]) without the need for a [GPU][14]. As a result, similarity calculation time during [KNN][9] inference is negligible comparing with other local processing tasks even for largest models.\n\n### Compact models\n\nThe [transformer][5] models in Orchestrator produce embeddings that are relatively large, over 3kB in size per example (size of the embeddings). If these large embeddings were used directly not only this would increase the runtime memory requirement quite significantly but also would add substantial CPU processing costs. A commonly used similarity measure, cosine similarity, with this size of embeddings and KNN processing would add a significant overhead during inference. Instead of this approach, Orchestrator uses a quantization method that shrinks the embeddings to under 100 bytes in size, reducing the processing time over 50 times while preserving the same level of accuracy. This technology is available already in the initial public preview of Orchestrator. \n\n### Runtime flexibility\n\nIt is important to reiterate that the Orchestrator runtime has significantly more flexibility and functionality than a typical [transformer][5] or a generic [ML][12] runtime. In addition to the inference capability the developer has an option to enable the following in the bot code:\n\n*Modify the language model in real-time* - to add additional functionality (expand the language model with additional skills or examples) or perform continuous model improvements using [active learning][18] techniques (specialized tools to assist with active learning will be released in the upcoming releases).\n\n*Modify the language model behavior in real-time* - the runtime parameters can be adjusted without restarting the process or even reloading the model. This includes adjusting how strict the intent triggering is (tradeoff between the [precision and recall][19]) which can be dynamically adjusted depending on the phase in the dialog; or adjusting the resiliency to mislabeled or low quality examples that define the model which is done by modifying the KNN-K value (e.g. a case where the model examples were crowd-sourced and not cleaned up yet or when the model is allowed to be adjusted dynamically by many people or when a skill language model definition was added to the bot and not evaluated yet).\n\nSee more on quantitative model analysis [here][21].\n\n## Roadmap\n\nIn the upcoming releases we are planning to expand Orchestrator in several areas:\n\n### Entity recognition\n\nA commonly requested feature as the part of intent triggering is to provide the \"parameters\" for the triggered intents which are entities recognized in the query text. The Orchestrator interfaces which are already part of the initial preview support handling the recognized entities. This functionality together with the corresponding prebuilt language model(s) will be made available in the upcoming releases.\n\n### Multi-lingual models\n\nAn important extension that will be made in the upcoming releases is the support for multi-lingual models and possibly also specialized international models prioritized by languages supported by other Microsoft offerings.\n\n\n### Possible additional improvements based on community feedback\nAs we collect more feedback from the community, there may be additional areas of improvements that we’ll address in the upcoming releases. We encourage users to submit them through GitHub.\n\n[1]:https://docs.microsoft.com/azure/bot-service/bot-builder-tutorial-dispatch?view=azure-bot-service-4.0&tabs=cs\n[2]:https://docs.microsoft.com/azure/bot-service/bot-builder-skills-overview?view=azure-bot-service-4.0\n[3]:https://www.luis.ai/\n[4]:https://www.qnamaker.ai/\n[5]:https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)\n[6]:https://en.wikipedia.org/wiki/Natural_language_processing\n[7]:https://gluebenchmark.com/leaderboard\n[8]:https://github.com/snipsco/nlu-benchmark\n[9]:https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm\n[10]:https://en.wikipedia.org/wiki/Zero-shot_learning\n[11]:https://en.wikipedia.org/wiki/One-shot_learning\n[12]:https://en.wikipedia.org/wiki/Machine_learning\n[13]:https://en.wikipedia.org/wiki/SIMD\n[14]:https://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units\n[15]:https://onnx.ai/\n[16]:https://en.wikipedia.org/wiki/PyTorch\n[17]:https://en.wikipedia.org/wiki/TensorFlow\n[18]:https://en.wikipedia.org/wiki/Active_learning_(machine_learning)\n[19]:https://en.wikipedia.org/wiki/Precision_and_recall\n[20]:https://docs.microsoft.com/dotnet/api/microsoft.bot.builder.ai.orchestrator?view=botbuilder-dotnet-stable\n[21]:https://aka.ms/nlrversions_0.2\n\n\n"
  },
  {
    "path": "Orchestrator/docs/package/README.md",
    "content": "# Microsoft.Bot.Builder.AI.Orchestrator\n\nEmbedded recognizer package for detecting and routing user intents. \n\n## Getting started\n\nTo use Orchestrator is an intent router:\n\n1. Install this Orchestrator package.\n2. Select it as the dialog recognizer where you want to perform the routing.\n3. Author your LU as you would normally do for **intents only**. \n4. Connect your intents to subsequent handlers such as skills, or LUIS dialogs. \n\n## Notes\n* Orchestrator is highly recommended and is the default recognizer when creating multi-bot solutions or when adding a remote skill. \n* You may use Orchestrator for intent detection only as you would for routing or if entity extraction is not required.\n* Orchestrator does not process entity declarations or does any entity extraction today.\n\n## See Also\n* [Dotnet package sources](https://github.com/microsoft/botbuilder-dotnet/tree/main/libraries/Microsoft.Bot.Builder.AI.Orchestrator)\n* [JS package sources](https://github.com/microsoft/botbuilder-js/tree/main/libraries/botbuilder-ai-orchestrator)\n* [Orchestrator main documentation](https://aka.ms/bf-orchestrator)\n* [Orchestrator in Github](https://github.com/microsoft/botframework-sdk/tree/main/Orchestrator)\n\n## Feedback and issues\n\nIf you encounter any issues with this package, or would like to share any feedback please open an Issue in our [GitHub repository](https://github.com/microsoft/botframework-components/issues/new/choose)."
  },
  {
    "path": "Orchestrator/v0.1/nlr_versions.json",
    "content": "{\n  \"version\": \"0.1\",\n  \"default\": \"pretrained.20200924.microsoft.dte.00.06.en.onnx\",\n  \"models\": {\n    \"pretrained.20200924.microsoft.dte.00.03.en.onnx\": {\n      \"releaseDate\": \"09/24/2020\",\n      \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.03.en.onnx.zip\",\n      \"description\": \"Bot Framework SDK release 4.10 - English Onnx V1.4 3-layer BERT per-token NLR\",\n      \"minSDKVersion\": \"4.10.0\"\n    },\n    \"pretrained.20200924.microsoft.dte.00.06.en.onnx\": {\n      \"releaseDate\": \"09/24/2020\",\n      \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.06.en.onnx.zip\",\n      \"description\": \"Bot Framework SDK release 4.10 - English Onnx V1.4 6-layer BERT per-token NLR\",\n      \"minSDKVersion\": \"4.10.0\"\n    },\n    \"pretrained.20200924.microsoft.dte.00.12.en.onnx\": {\n      \"releaseDate\": \"09/24/2020\",\n      \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.12.en.onnx.zip\",\n      \"description\": \"Bot Framework SDK release 4.10 - English Onnx V1.4 12-layer BERT per-token NLR\",\n      \"minSDKVersion\": \"4.10.0\"\n    }\n  }\n}\n"
  },
  {
    "path": "Orchestrator/v0.1/nlr_versions.schema",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema\",\n    \"$id\": \"https://schemas.botframework.com/schemas/orchestrator/v0.1/nlr_versions.schema\",\n    \"type\": \"object\",\n    \"title\": \"Orchestrator NLR versions schema\",\n    \"description\": \"Orchestrator NLR versions information\",\n    \"default\": {},\n    \"examples\": [\n        {\n            \"version\": \"0.1\",\n            \"models\": {\n                \"1.0.0-pretrained.20200729.microsoft.dte.en.onnx\": {\n                    \"releaseDate\": \"07/29/2020\",\n                    \"modelUri\": \"https://models.botframework.com/models/dte/onnx/1.0.0-pretrained.20200729.microsoft.dte.en.onnx.7z\",\n                    \"description\": \"Bot Framework SDK release 4.10 - English Onnx 3 layer NLR\",\n                    \"minSDKVersion\": \"4.10.0\"\n                },\n                \"1.0.0-pretrained.20200729.microsoft.dte.en.pytorch\": {\n                    \"releaseDate\": \"07/29/2020\",\n                    \"modelUri\": \"https://models.botframework.com/models/dte/pytorch/1.0.0-pretrained.20200729.microsoft.dte.en.pytorch.7z\",\n                    \"description\": \"Bot Framework SDK release 4.10 - English Python NLR\",\n                    \"minSDKVersion\": \"4.10.0\"\n                },\n                \"1.1.0-pretrained.20200819-12l.microsoft.dte.en.onnx\": {\n                    \"releaseDate\": \"08/19/2020\",\n                    \"modelUri\": \"https://models.botframework.com/models/dte/onnx/1.1.0-pretrained.20200819-12l.microsoft.dte.en.onnx.7z\",\n                    \"description\": \"Bot Framework SDK release 4.10 - English Onnx 12 layer NLR\",\n                    \"minSDKVersion\": \"4.10.0\"\n                }\n            }\n        }\n    ],\n    \"required\": [\n        \"version\",\n        \"models\"\n    ],\n    \"properties\": {\n        \"version\": {\n            \"$id\": \"#/properties/version\",\n            \"type\": \"string\",\n            \"title\": \"The version schema\",\n            \"description\": \"Orchestrator NLR schema version\",\n            \"default\": \"\",\n            \"examples\": [\n                \"0.1\"\n            ]\n        },\n        \"models\": {\n            \"$id\": \"#/properties/models\",\n            \"type\": \"object\",\n            \"title\": \"Orchestrator models schema\",\n            \"description\": \"All Orchestrator NLR model\",\n            \"default\": {},\n            \"examples\": [\n                {\n                    \"1.0.0-pretrained.20200729.microsoft.dte.en.onnx\": {\n                        \"releaseDate\": \"07/29/2020\",\n                        \"modelUri\": \"https://models.botframework.com/models/dte/onnx/1.0.0-pretrained.20200729.microsoft.dte.en.onnx.7z\",\n                        \"description\": \"Bot Framework SDK release 4.10 - English Onnx 3 layer NLR\",\n                        \"minSDKVersion\": \"4.10.0\"\n                    },\n                    \"1.0.0-pretrained.20200729.microsoft.dte.en.pytorch\": {\n                        \"releaseDate\": \"07/29/2020\",\n                        \"modelUri\": \"https://models.botframework.com/models/dte/pytorch/1.0.0-pretrained.20200729.microsoft.dte.en.pytorch.7z\",\n                        \"description\": \"Bot Framework SDK release 4.10 - English Python NLR\",\n                        \"minSDKVersion\": \"4.10.0\"\n                    },\n                    \"1.1.0-pretrained.20200819-12l.microsoft.dte.en.onnx\": {\n                        \"releaseDate\": \"08/19/2020\",\n                        \"modelUri\": \"https://models.botframework.com/models/dte/onnx/1.1.0-pretrained.20200819-12l.microsoft.dte.en.onnx.7z\",\n                        \"description\": \"Bot Framework SDK release 4.10 - English Onnx 12 layer NLR\",\n                        \"minSDKVersion\": \"4.10.0\"\n                    }\n                }\n            ],\n            \"required\": [\n                \"1.0.0-pretrained.20200729.microsoft.dte.en.onnx\",\n            ],\n            \"properties\": {\n                \"1.0.0-pretrained.20200729.microsoft.dte.en.onnx\": {\n                    \"$id\": \"#/properties/models/properties/1.0.0-pretrained.20200729.microsoft.dte.en.onnx\",\n                    \"type\": \"object\",\n                    \"title\": \"The 1.0.0-pretrained.20200729.microsoft.dte.en.onnx schema\",\n                    \"description\": \"An explanation about the purpose of this instance.\",\n                    \"default\": {},\n                    \"examples\": [\n                        {\n                            \"releaseDate\": \"07/29/2020\",\n                            \"modelUri\": \"https://models.botframework.com/models/dte/onnx/1.0.0-pretrained.20200729.microsoft.dte.en.onnx.7z\",\n                            \"description\": \"Bot Framework SDK release 4.10 - English Onnx 3 layer NLR\",\n                            \"minSDKVersion\": \"4.10.0\"\n                        }\n                    ],\n                    \"required\": [\n                        \"releaseDate\",\n                        \"modelUri\",\n                        \"description\",\n                        \"minSDKVersion\"\n                    ],\n                    \"properties\": {\n                        \"releaseDate\": {\n                            \"$id\": \"#/properties/models/properties/1.0.0-pretrained.20200729.microsoft.dte.en.onnx/properties/releaseDate\",\n                            \"type\": \"string\",\n                            \"title\": \"Model release date\",\n                            \"description\": \"Model release date\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"07/29/2020\"\n                            ]\n                        },\n                        \"modelUri\": {\n                            \"$id\": \"#/properties/models/properties/1.0.0-pretrained.20200729.microsoft.dte.en.onnx/properties/modelUri\",\n                            \"type\": \"string\",\n                            \"title\": \"Orchestrator model URL\",\n                            \"description\": \"Orchestrator model URL\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"https://models.botframework.com/models/dte/onnx/1.0.0-pretrained.20200729.microsoft.dte.en.onnx.7z\"\n                            ]\n                        },\n                        \"description\": {\n                            \"$id\": \"#/properties/models/properties/1.0.0-pretrained.20200729.microsoft.dte.en.onnx/properties/description\",\n                            \"type\": \"string\",\n                            \"title\": \"Orchestrator model description\",\n                            \"description\": \"Orchestrator model description\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"Bot Framework SDK release 4.10 - English Onnx 3 layer NLR\"\n                            ]\n                        },\n                        \"minSDKVersion\": {\n                            \"$id\": \"#/properties/models/properties/1.0.0-pretrained.20200729.microsoft.dte.en.onnx/properties/minSDKVersion\",\n                            \"type\": \"string\",\n                            \"title\": \"Bot Framework minimum SDK version\",\n                            \"description\": \"Minimum SDK version required to work with this model\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"4.10.0\"\n                            ]\n                        }\n                    },\n                    \"additionalProperties\": true\n                }\n           \"additionalProperties\": true\n        }\n    },\n    \"additionalProperties\": true\n}\n"
  },
  {
    "path": "Orchestrator/v0.2/nlr_versions.json",
    "content": "{\n  \"version\": \"0.2\",\n  \"defaults\": {\n    \"en_intent\": \"pretrained.20200924.microsoft.dte.00.06.en.onnx\",\n    \"multilingual_intent\": \"pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx\",\n    \"en_entity\": \"pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx\"\n  },\n  \"models\": {\n    \"pretrained.20200924.microsoft.dte.00.03.en.onnx\": {\n      \"releaseDate\": \"09/24/2020\",\n      \"modelUri\": \"https://aka.ms/pretrained.20200924.microsoft.dte.00.03.en.onnx\",\n      \"description\": \"Bot Framework SDK release 4.10 - English ONNX V1.4 3-layer per-token intent base model\",\n      \"minSDKVersion\": \"4.10.0\"\n    },\n    \"pretrained.20200924.microsoft.dte.00.06.en.onnx\": {\n      \"releaseDate\": \"09/24/2020\",\n      \"modelUri\": \"https://aka.ms/pretrained.20200924.microsoft.dte.00.06.en.onnx\",\n      \"description\": \"Bot Framework SDK release 4.10 - English ONNX V1.4 6-layer per-token intent base model\",\n      \"minSDKVersion\": \"4.10.0\"\n    },\n    \"pretrained.20200924.microsoft.dte.00.12.en.onnx\": {\n      \"releaseDate\": \"09/24/2020\",\n      \"modelUri\": \"https://aka.ms/pretrained.20200924.microsoft.dte.00.12.en.onnx\",\n      \"description\": \"Bot Framework SDK release 4.10 - English ONNX V1.4 12-layer per-token intent base model\",\n      \"minSDKVersion\": \"4.10.0\"\n    },\n\t\"pretrained.20210521.microsoft.dte.01.06.int.en.onnx\": {\n      \"releaseDate\": \"06/14/2021\",\n      \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20210521.microsoft.dte.01.06.int.en.onnx.zip\",\n      \"description\": \"Bot Framework SDK release 4.10 - English ONNX V1.4 6-layer int per-token intent base model with updated calibration thresholds\",\n      \"minSDKVersion\": \"4.10.0\"\n    },\n\t\"pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx\": {\n      \"releaseDate\": \"02/05/2021\",\n      \"modelUri\": \"https://aka.ms/pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx\",\n      \"description\": \"Bot Framework SDK release 4.12 - Multilingual ONNX V1.4 6-layer per-token intent base model\",\n      \"minSDKVersion\": \"4.12.0\"\n    },\n    \"pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx\": {\n      \"releaseDate\": \"12/10/2020\",\n      \"modelUri\": \"https://aka.ms/pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx\",\n      \"description\": \"Bot Framework SDK release 4.12 - Multilingual ONNX V1.4 12-layer per-token intent base model\",\n      \"minSDKVersion\": \"4.12.0\"\n    },\n\t\"pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx\": {\n      \"releaseDate\": \"06/14/2021\",\n      \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx.zip\",\n      \"description\": \"Bot Framework SDK release 4.12 - Multilingual ONNX V1.4 6-layer int per-token intent base model with updated calibration thresholds\",\n      \"minSDKVersion\": \"4.12.0\"\n    },\n\t\"pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx\": {\n      \"releaseDate\": \"04/01/2021\",\n      \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx.zip\",\n      \"description\": \"(experimental) Bot Framework SDK release 4.14 - English ONNX V1.4 6-layer per-token entity base model\",\n      \"minSDKVersion\": \"4.14.0\"\n    }\n  }\n}\n"
  },
  {
    "path": "Orchestrator/v0.2/nlr_versions.schema",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema\",\n    \"$id\": \"https://schemas.botframework.com/schemas/orchestrator/v0.2/nlr_versions.schema\",\n    \"type\": \"object\",\n    \"title\": \"Orchestrator base model versions schema\",\n    \"description\": \"Orchestrator base model versions information\",\n    \"default\": {},\n    \"examples\": [\n        {\n            \"version\": \"0.2\",\n            \"models\": {\n                \"pretrained.20200924.microsoft.dte.00.06.en.onnx\": {\n                    \"releaseDate\": \"09/24/2020\",\n                    \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.06.en.onnx.zip\",\n                    \"description\": \"Bot Framework SDK release 4.10 - English Onnx V1.4 6-layer per-token intent base model\",\n                    \"minSDKVersion\": \"4.10.0\"\n                }\n            }\n        }\n    ],\n    \"required\": [\n        \"version\",\n        \"models\"\n    ],\n    \"properties\": {\n        \"version\": {\n            \"$id\": \"#/properties/version\",\n            \"type\": \"string\",\n            \"title\": \"The version schema\",\n            \"description\": \"Orchestrator base model schema version\",\n            \"default\": \"\",\n            \"examples\": [\n                \"0.2\"\n            ]\n        },\n        \"models\": {\n            \"$id\": \"#/properties/models\",\n            \"type\": \"object\",\n            \"title\": \"Orchestrator models schema\",\n            \"description\": \"All Orchestrator base model\",\n            \"default\": {},\n            \"examples\": [\n                {\n                    \"pretrained.20200924.microsoft.dte.00.06.en.onnx\": {\n                        \"releaseDate\": \"09/24/2020\",\n                        \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.06.en.onnx.zip\",\n                        \"description\": \"Bot Framework SDK release 4.10 - English Onnx V1.4 6-layer per-token intent base model\",\n                        \"minSDKVersion\": \"4.10.0\"\n                    }\n                }\n            ],\n            \"required\": [\n                \"1.0.0-pretrained.20200729.microsoft.dte.en.onnx\",\n            ],\n            \"properties\": {\n                \"1.0.0-pretrained.20200729.microsoft.dte.en.onnx\": {\n                    \"$id\": \"#/properties/models/properties/1.0.0-pretrained.20200729.microsoft.dte.en.onnx\",\n                    \"type\": \"object\",\n                    \"title\": \"The 1.0.0-pretrained.20200729.microsoft.dte.en.onnx schema\",\n                    \"description\": \"An explanation about the purpose of this instance.\",\n                    \"default\": {},\n                    \"examples\": [\n                        {\n                            \"releaseDate\": \"09/24/2020\",\n                            \"modelUri\": \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.06.en.onnx.zip\",\n                            \"description\": \"Bot Framework SDK release 4.10 - English Onnx V1.4 6-layer per-token intent base model\",\n                            \"minSDKVersion\": \"4.10.0\"\n                        }\n                    ],\n                    \"required\": [\n                        \"releaseDate\",\n                        \"modelUri\",\n                        \"description\",\n                        \"minSDKVersion\"\n                    ],\n                    \"properties\": {\n                        \"releaseDate\": {\n                            \"$id\": \"#/properties/models/properties/pretrained.20200924.microsoft.dte.00.06.en.onnx/properties/releaseDate\",\n                            \"type\": \"string\",\n                            \"title\": \"Model release date\",\n                            \"description\": \"Model release date\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"09/24/2020\"\n                            ]\n                        },\n                        \"modelUri\": {\n                            \"$id\": \"#/properties/models/properties/pretrained.20200924.microsoft.dte.00.06.en.onnx/properties/modelUri\",\n                            \"type\": \"string\",\n                            \"title\": \"Orchestrator model URL\",\n                            \"description\": \"Orchestrator model URL\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"https://models.botframework.com/models/dte/onnx/pretrained.20200924.microsoft.dte.00.06.en.onnx.zip\"\n                            ]\n                        },\n                        \"description\": {\n                            \"$id\": \"#/properties/models/properties/pretrained.20200924.microsoft.dte.00.06.en.onnx/properties/description\",\n                            \"type\": \"string\",\n                            \"title\": \"Orchestrator model description\",\n                            \"description\": \"Orchestrator model description\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"Bot Framework SDK release 4.10 - English Onnx V1.4 6-layer per-token intent base model\"\n                            ]\n                        },\n                        \"minSDKVersion\": {\n                            \"$id\": \"#/properties/models/properties/pretrained.20200924.microsoft.dte.00.06.en.onnx/properties/minSDKVersion\",\n                            \"type\": \"string\",\n                            \"title\": \"Bot Framework minimum SDK version\",\n                            \"description\": \"Minimum SDK version required to work with this model\",\n                            \"default\": \"\",\n                            \"examples\": [\n                                \"4.10.0\"\n                            ]\n                        }\n                    },\n                    \"additionalProperties\": true\n                }\n           \"additionalProperties\": true\n        }\n    },\n    \"additionalProperties\": true\n}\n"
  },
  {
    "path": "README.md",
    "content": "# ARCHIVE NOTICE:\n\nThe Bot Framework SDK is being retired with final long term support ending December 2025. This means that this project will no longer be updated or maintained. Customers using this tool will not be disrupted and bots built with the SDK will continue to function. However, the tool will no longer be supported through service tickets in the Azure portal and will *not* receive any product or feature updates. It will not have any regular non-critical dependency updates.\n\nTo build agents with your choice of AI services, orchestration, and knowledge, consider using the [Microsoft 365 Agents SDK](aka.ms/agents). The Agents SDK is GA and has support for C#, JavaScript or Python. You can learn more about the Agents SDK at aka.ms/agents. If you're looking for a SaaS-based agent platform, consider Microsoft Copilot Studio. If you have an existing bot built with the Bot Framework SDK, you can update your bot to the Agents SDK. You can review the core changes and updates at Bot Framework SDK to Agents SDK migration guidance [here](https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/bf-migration-guidance). Support tickets for the Bot Framework SDK will no longer be serviced as of December 31, 2025.\n\nWe plan to archive this project no later than end of December of 2025.\n\n# ![Bot Framework](./docs/media/BotFrameworkSDK.png)\n\n### [What's new with Bot Framework?](https://docs.microsoft.com/en-us/azure/bot-service/what-is-new?view=azure-bot-service-4.0)\n\nBot Framework provides the most comprehensive experience for building conversation applications.\n\nWith the [Bot Framework SDK](#bot-framework-sdk-v4), developers can build bots that converse free-form or with guided interactions including using simple text or rich cards that contain text, images, and action buttons.\n\nDevelopers can model and build sophisticated conversation using their favorite programming languages including C#, JS, and Python for developers and multi-disciplinary teams to design and build conversational experiences.\n\nCheckout the [Bot Framework ecosystem](#bot-framework-ecosystem) section to learn more about other tooling and services related to the Bot Framework SDK.\n\n## Quicklinks\n| [C# Repo](https://github.com/Microsoft/botbuilder-dotnet)  | [JS Repo](https://github.com/Microsoft/botbuilder-js)  | [Python Repo](https://github.com/Microsoft/botbuilder-python) | [BF CLI](https://github.com/Microsoft/botframework-cli) |\n\n## Bot Framework SDK v4\nThe Bot Framework SDK v4 is an [open source SDK][1a] that enable developers to model and build sophisticated conversation using their favorite programming language.\n\n|   | C#  | JS  | Python |\n|---|:---:|:---:|:------:|\n|Stable Release |[packages][1] | [packages][2] | [packages][3] |\n|Docs | [docs][5] |[docs][5] |[docs][5]  |\n|Samples |[.NET Core][6], [WebAPI][10] |[Node.js][7] , [TypeScript][8], [es6][9]  | [Python][111] |\n\n[1a]:https://github.com/microsoft/botframework-sdk/#readme\n[1]:https://github.com/Microsoft/botbuilder-dotnet/#packages\n[2]:https://github.com/Microsoft/botbuilder-js#packages\n[3]:https://github.com/microsoft/botbuilder-python/#packages\n[5]:https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0\n[6]:https://github.com/Microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore\n[7]:https://github.com/Microsoft/BotBuilder-Samples/tree/main/samples/javascript_nodejs\n[8]:https://github.com/Microsoft/BotBuilder-Samples/tree/main/samples/typescript_nodejs\n[9]:https://github.com/Microsoft/BotBuilder-Samples/tree/main/samples/javascript_es6\n[10]:https://github.com/Microsoft/BotBuilder-Samples/tree/main/samples/csharp_webapi\n[111]:https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/python\n\n## Channels and Adapters\nThere are two ways to connect your bot to a client experience:\n* **Azure Bot Service Channel** - Language and SDK independent support via Azure Bot Service\n* **Bot Framework SDK Adapter** -  A per language Adapter component\n\n| Client          | Azure Channel  | C# Adapter           | JS Adapter        |\n|-----------------|:--------------:|:--------------------:|:-----------------:|\n| Microsoft Teams | [Azure][55abs] |                      |                   |\n| Direct Line     | [Azure][55abs] |                      |                   |\n| Web Chat        | [Azure][55abs] |                      | [Botkit][55bk]    |\n| Skype           | [Azure][55abs] |                      |                   |\n| Email           | [Azure][55abs] |                      |                   |\n| Facebook        | [Azure][55abs] |  [Community][55sdkcsfb]    | [Botkit][55bk]    |\n| Slack           | [Azure][55abs] |  [Community][55sdkcsslack] | [Botkit][55bk]    |\n| Kik             | [Azure][55abs] |                      |                   |\n| Telegram        | [Azure][55abs] |                      |                   |\n| Line            | [Azure][55abs] |                      |                   |\n| GroupMe         | [Azure][55abs] |                      |                   |\n| Twilio (SMS)    | [Azure][55abs] | [Community][55sdkcstwilio] | [Botkit][55bk]    |\n| Alexa Skills    |                | [Community][55cs]    | [Community][55js] |\n| Google Actions  |                | [Community][55cs]    | [Community][55js] |\n| Google Hangouts |                |                      | [Botkit][55bk]    |\n| WebEx           |                | [Community][55sdkcswebex]    | [Botkit][55bk]    |\n| WhatsApp (Infobip)  |            | [Community][55cs]    |                   |\n| Zoom            |                | [Community][55cs]    |                   |\n| RingCentral     |                | [Community][55cs]    |                   |\n| Cortana         | [Azure][55abs] |                      |                   |\n| Console         |                |                      | [Community][55js] |\n\n[55abs]:https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\n[55cs]:https://github.com/BotBuilderCommunity/botbuilder-community-dotnet#adapters\n[55js]:https://github.com/BotBuilderCommunity/botbuilder-community-js#adapters\n[55bk]:https://github.com/howdyai/botkit#readme\n[55sdkcsfb]:https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/libraries/Bot.Builder.Community.Adapters.Facebook\n[55sdkcsslack]:https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/libraries/Bot.Builder.Community.Adapters.Slack\n[55sdkcstwilio]:https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/libraries/Bot.Builder.Community.Adapters.Twilio\n[55sdkcswebex]:https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/libraries/Bot.Builder.Community.Adapters.Webex\n[55sdkpyslack]:https://github.com/microsoft/botbuilder-python/tree/main/libraries/botbuilder-adapters-slack\n\n## Community Open Source Projects\nThe following open source communities make various components available to extend your bot application, including adapters, recognizers, dialogs and middleware.\n\n|                            |       C#       | JavaScript |    Python      |\n|----------------------------|:--------------:|:----------:|:--------------:|\n| [Bot Framework Community][56] | [C#][56dotnet] | [JavaScript][56js] | [Python][56py] |\n| [Botkit][56bk]             |                | [JavaScript][56bk] |                |\n\n[56]:https://github.com/botbuildercommunity#readme\n[56dotnet]:https://github.com/botbuildercommunity/botbuilder-community-dotnet#readme\n[56js]:https://github.com/botbuildercommunity/botbuilder-community-js#readme\n[56py]:https://github.com/botbuildercommunity/botbuilder-community-python#readme\n[56bk]:https://github.com/howdyai/botkit#readme\n\n## Questions and Help\nIf you have questions about Bot Framework SDK or using Azure Bot Service, we encourage you to reach out to the community and Azure Bot Service dev team for help.\n- For questions which fit the Stack Overflow format (\"how does this work?\"), we monitor the both [Azure Bot Service](https://stackoverflow.com/questions/tagged/azure-bot-service) and [Bot Framework](https://stackoverflow.com/questions/tagged/botframework) tags (search [both](https://stackoverflow.com/questions/tagged/azure-bot-service+or+botframework))\n- You can also tweet/follow [@msbotframework](https://twitter.com/msbotframework)\n- Join the conversation on **[Gitter](https://gitter.im/Microsoft/BotBuilder)**.\n\nSee all of the available support options **[here](https://docs.microsoft.com/en-us/bot-framework/resources-support)**.\n\n\n## Issues and feature requests\nWe track functional issues and features asks for the Bot Framework SDK, tools and Azure Bot Service in a variety of locations. If you have found an issue or have a feature request, please submit an issue to the below repositories.\n\n| Item                        | Description                                                                                        | Link                              |\n|-----------------------------|----------------------------------------------------------------------------------------------------|-----------------------------------|\n| SDK v4 .NET                 | core bot runtime for .NET, connectors, middleware, dialogs, prompts, LUIS and QnA                  | [File an issue][70csissues]       |\n| SDK v4 JavaScript           | core bot runtime for Typescript/Javascript, connectors, middleware, dialogs, prompts, LUIS and QnA | [File an issue][70jsissues]       |\n| SDK v4 Python               | core bot runtime for Python, connectors, middleware, dialogs, prompts, LUIS and QnA                | [File an issue][70pyissues]       |\n| Bot Framework CLI           | bot framework cli tools                                                                            | [File an issue][70cliissues]  |\n| Webchat                     | bot framework web chat tool                                                                        | [File an issue][70webchatissues]  |\n\n[70csissues]:https://github.com/Microsoft/botbuilder-dotnet/issues\n[70jsissues]:https://github.com/Microsoft/botbuilder-js/issues\n[70pyissues]:https://github.com/Microsoft/botbuilder-python/issues\n[70cliissues]:https://github.com/Microsoft/botframework-cli/issues\n[70webchatissues]:https://github.com/Microsoft/botframework-webchat/issues\n\n## Prior releases\n\n- Bot Builder v3 SDK has been migrated to the [Bot Framework SDK V3](https://github.com/microsoft/botbuilder-v3) repository. The V3 SDK is retired with final long-term support ending on December 31st, 2019\n\n## Bot Framework ecosystem\n\n- [Azure Bot Service](#Azure-Bot-Service)\n- [Bot Framework Emulator](#Bot-Framework-Emulator)\n- [Bot Framework Web Chat](#Bot-Framework-Web-Chat)\n- [Bot Framework CLI](#Bot-Framework-CLI)\n- [Language Understanding](#Language-Understanding)\n- [QnA Maker](#QnA-Maker)\n- [Dispatch](#Dispatch)\n- [Speech Services](#Speech-Services)\n- [Adaptive cards](#Adaptive-Cards)\n- [Analytics](#Analytics)\n- [Bot Framework Composer](#Bot-Framework-Composer)\n- [Botkit](#Botkit)\n\n### Azure Bot Service\nAzure Bot Service enables you to host intelligent, enterprise-grade bots with complete ownership and control of your data. Developers can register and connect their bots to users on Skype, Microsoft Teams, Cortana, Web Chat, and more. [[Docs][28]]\n\n* **Direct Line JS Client**: If you want to use the Direct Line channel in Azure Bot Service and are not using the WebChat client, the Direct Line JS client can be used in your custom application. [[Readme][30]]\n\n<a name=\"ABS-whats-new\"></a>\n\n* **Direct Line Speech Channel**: We are bringing together the Bot Framework and Microsoft's Speech Services to provide a channel that enables streamed speech and text bi-directionally from the client to the bot application.  To sign up, add the 'Direct Line Speech' channel to your Azure Bot Service.\n\n[27]:https://azure.microsoft.com/en-us/services/bot-service/\n[28]:https://docs.microsoft.com/en-us/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0\n[29]:https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\n[30]:https://github.com/Microsoft/BotFramework-DirectLineJS/blob/main/README.md\n\n* **Better isolation for your Bot - Direct Line App Service Extension** : The Direct Line App Service Extension can be deployed as part of a VNET, allowing IT administrators to have more control over conversation traffic and improved latency in conversations due to reduction in the number of hops. Get started with Direct Line App Service Extension here. A VNET lets you create your own private space in Azure and is crucial to your cloud network as it offers isolation, segmentation, and other key benefits.\n\n### Bot Framework Emulator\nThe [Bot Framework Emulator][60] is a  cross-platform desktop application that allows bot developers to test and debug bots built using the Bot Framework SDK. You can use the Bot Framework Emulator to test bots running locally on your machine or to connect to bots running remotely. [[Download latest][61] | [Docs][62]]\n\n[60]:https://github.com/Microsoft/BotFramework-Emulator#readme\n[61]:https://github.com/Microsoft/BotFramework-Emulator/releases/latest\n[62]:https://docs.microsoft.com/en-us/azure/bot-service/bot-service-debug-emulator?view=azure-bot-service-4.0\n\n### Bot Framework Web Chat\nThe Bot Framework [Web Chat][23] is a highly customizable web-based client chat control for Azure Bot Service that provides the ability for users to interact with your bot directly in a web page. [[Stable release][24] | [Docs][25]  | [Samples][26]]\n\n[23]:https://github.com/Microsoft/BotFramework-WebChat#readme\n[24]:https://www.npmjs.com/package/botframework-webchat\n[25]:https://github.com/Microsoft/BotFramework-WebChat/tree/main/docs\n[26]:https://github.com/Microsoft/BotFramework-WebChat/tree/main/samples\n\n### Bot Framework CLI\nThe Bot Framework CLI Tools hosts the [open source](https://github.com/microsoft/botframework-cli) cross-platform Bot Framework CLI tool, designed to support building robust end-to-end development workflows. The Bot Framework CLI tool replaced the [legacy standalone tools](https://github.com/Microsoft/BotBuilder-Tools) used to manage bots and related services. BF CLI aggregates the collection of cross-platform tools into one cohesive and consistent interface.\n\n### Bot Framework Composer\n[Bot Framework Composer](https://github.com/microsoft/BotFramework-Composer/blob/main/README.md) is an integrated development tool for developers and multi-disciplinary teams to build bots and conversational experiences with the Microsoft Bot Framework. Within this tool, you'll find everything you need to build a sophisticated conversational experience.\n\n### Botkit\n[Botkit][100] is a developer tool and SDK for building chat bots, apps and custom integrations for major messaging platforms. Botkit bots `hear()` triggers, `ask()` questions and `say()` replies. Developers can use this syntax to build dialogs - now cross compatible with the latest version of Bot Framework SDK.\n\nIn addition, Botkit brings with it 6 platform adapters allowing Javascript bot applications to communicate directly with messaging platforms: [Slack][102], [Webex Teams][103], [Google Hangouts][104], [Facebook Messenger][105], [Twilio][106], and [Web chat][107].\n\nBotkit is part of Microsoft Bot Framework and is released under the [MIT Open Source license][101]\n\n[100]:https://github.com/howdyai/botkit#readme\n[101]:https://github.com/howdyai/botkit/blob/main/LICENSE.md\n[102]:https://github.com/howdyai/botkit/tree/main/packages/botbuilder-adapter-slack#readme\n[103]:https://github.com/howdyai/botkit/tree/main/packages/botbuilder-adapter-webex#readme\n[104]:https://github.com/howdyai/botkit/tree/main/packages/botbuilder-adapter-hangouts#readme\n[105]:https://github.com/howdyai/botkit/tree/main/packages/botbuilder-adapter-facebook#readme\n[106]:https://github.com/howdyai/botkit/tree/main/packages/botbuilder-adapter-twilio-sms#readme\n[107]:https://github.com/howdyai/botkit/tree/main/packages/botbuilder-adapter-web#readme\n\n## Related Services\n\n### Language Understanding\nA machine learning-based service to build natural language experiences. Quickly create enterprise-ready, custom models that continuously improve. Language Understanding Service(LUIS) allows your application to understand what a person wants in their own words. [[Docs][31] | [Add language understanding to your bot][32]]\n\n[18]:https://github.com/Microsoft/botbuilder-tools/tree/main/packages/LUIS#readme\n[19]:https://github.com/Microsoft/botbuilder-tools/tree/main/packages/QnAMaker#readme\n[30]:https://www.luis.ai\n[31]:https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/Home\n[32]:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-luis?view=azure-bot-service-4.0&branch=pr-en-us-1325&tabs=csharp\n\n### QnA Maker\n[QnA Maker][33] is a cloud-based API service that creates a conversational, question-and-answer layer over your data. With QnA Maker, you can build, train and publish a simple question and answer bot based on FAQ URLs, structured documents, product manuals or editorial content in minutes. [[Docs][34]  | [Add qnamaker to your bot][35]]\n\n[33]:https://www.qnamaker.ai/\n[34]:https://aka.ms/qnamaker-docs-home\n[35]:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-qna?view=azure-bot-service-4.0&branch=pr-en-us-1325&tabs=cs\n\n### Dispatch\nDispatch tool lets you build language models that allow you to dispatch between disparate components (such as QnA, LUIS and custom code). [[Readme](https://github.com/Microsoft/botbuilder-tools/blob/main/packages/Dispatch#readme)]\n\n### Speech Services\nSpeech Services convert audio to text, perform speech translation and text-to-speech with the unified Speech services. With the speech services, you can integrate speech into your bot, create custom wake words, and author in multiple languages. [[Docs](https://azure.microsoft.com/en-us/services/cognitive-services/speech-services/)]\n\n### Adaptive Cards\n[Adaptive Cards](https://adaptivecards.io) are an open standard for developers to exchange card content in a common and consistent way,\nand are used by Bot Framework developers to create great cross-channel conversatational experiences.\n\n* **Open framework, native performance** - A simple open card format enables an ecosystem of shared tooling, seamless integration between apps, and native cross-platform performance on any device.\n* **Speech enabled from day one** - We live in an exciting era where users can talk to their devices. Adaptive Cards embrace this new world and were designed from the ground up to support these new experiences.\n\n## Contributing\n\nSee our [contributing guidelines](https://github.com/microsoft/botframework-sdk/blob/main/Contributing.md).\n\n## Reporting Security Issues\nSecurity issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) at [secure@microsoft.com](mailto:secure@microsoft.com). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the [MSRC PGP](https://technet.microsoft.com/en-us/security/dn606155) key, can be found in the [Security TechCenter](https://technet.microsoft.com/en-us/security/default).\n\nCopyright (c) Microsoft Corporation. All rights reserved.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "codeql3000.yml",
    "content": "variables:\n  Codeql.Enabled: true"
  },
  {
    "path": "docs/BF Labeling Guide.md",
    "content": "\n# Bot Framework Labeling Guidelines <!-- omit in toc -->\n\nLabels help us organize and prioritize work. We use the same set of labels across the different sections in a repository, such as issues and pull requests. It is important to keep the labels consistent so that we can maintain a standard workflow. Standardized labels also help us query useful data from repos to collect customer feedback for analysis.\n\nThis article describes the naming conventions and categorization guidelines of the labels in the Bot Framework repositories to tag issues and PRs. It also provides guidance on how to use them.\n\nThis document includes:\n\n- [Labels naming conventions and format](#labels-naming-conventions-and-format)\n  - [Wording](#wording)\n  - [Multi-category labels format](#multi-category-labels-format)\n  - [Label usage](#label-usage)\n  - [Label colors](#label-colors)\n- [Label categories](#label-categories)\n  - [Status](#status)\n  - [Area](#area)\n  - [Type](#type)\n  - [Priority](#priority)\n  - [Community](#community)\n  - [Size (proposal)](#size-proposal)\n  - [Automation (proposal)](#automation-proposal)\n- [DRI labels](#dri-labels)\n- [Repo specific labels](#repo-specific-labels)\n- [Release labels](#release-labels)\n\n# Labels naming conventions and format\n\nThere is no official GitHub documentation as to how we should name the labels. This section provides some basic guidelines and examples, which we follow in this article.  \n\n## Wording\n\n- Keep names clear and concise.\n- Keep names short. Use acronyms when necessary and provide a description.\n- Always provide a description for a label so user know when to use them.\n- Multiple-category labels should use sentence case (i.e.: use `Area: Functional tests` instead of `Area: Functional Tests`).\n\n## Multi-category labels format\n\nIn order to be able to parse some labels in reports we use a colon followed by a whitespace (`\": \"`) to separate the categories and subcategories in a label.\n\nThe general format of a multi-category label is:\n\n```bash\nMain category: Some subcategory\n```\n\nThere's no limit to the number of subcategories but it is recommended to avoid creating more than two levels.\n\n## Label usage\n\nSome labels can be applied multiple times to an issue and some others shouldn't. For example, an issue can be labeled as `Area: Adaptive` **and** `Area: Skills` but it should **only** have one priority label `P0` or `P1`. Check the intended usage for each label category in the sections below.\n\nGitHub doesn't provide a way of restricting or validating the labels applied to an issue so this will be a manual check that the person updating the issue should perform.\n\n## Label colors\n\nLabels should use the same colors across repos to improve readability and in most cases, all labels within the same main category should use the same color.\n\n# Label categories\n\nWe use labels to sort and describe issues, pull requests, and more. It is a good practice to categorize the issues with comprehensible types so that we can easily identify them for different purposes.\n\nThis section describes the main label categories being used in the SDK repos:\n\n| Category | Description | Usage | Example |\n|---|---|---|---|\n|[Status](#status)|Describes the status of an issue throughout its lifecycle.| Single |`needs-triage`|\n|[Area](#area)|Defines a functional area or feature of the product for the issue.| Multiple |`Area: Skills`|\n|[Type](#type)|Provides additional information on the issue type.| Single |`bug`|\n|[Priority](#priority)|The priority for the issue.| Single |`P0`|\n|[Community](#community)|Used to describe community related issues.| Single |`Community: Help wanted`|\n|[Size](#size)|Provides an estimate for the level of effort required to resolve the issue.| Single |`Size: M`|\n|[Automation](#automation) | Labels used to trigger GitHub actions and workflows.| Single |`Automation: No parity`|\n|[DRI](#dri)|This is a special set of labels used for DRI tracking and reporting on issues created by customers.| Multiple |`Bot Service`|\n\n## Status\n\nUse these labels for providing information on the progress of the issue. The status label is used to triage and track issues throughout its lifecycle.\n\nColor: This subcategory uses different colors for each label.\n\n| Name | Description | Color | Example |\n|---|---|:-:|:--|\n|Draft| The issue definition is still being worked on and it is not ready to start development.<br/>Once the issue is ready the label should be removed or the status changed to `needs-triage` or `backlog`.| ![#ededed](https://via.placeholder.com/15/ededed/000000?text=+) `#ededed` | `draft` |\n|New| The issue has just been created and it has not been reviewed by the team. <br/>Once the issue is reviewed the label should be removed or changed to `backlog`, `needs-author-feedback` or just closed.| ![#f7ffa3](https://via.placeholder.com/15/f7ffa3/000000?text=+) `#f7ffa3` | `needs-triage` |\n|Needs author information| The issue as described is incomplete or not well understood. It is waiting for further information before it can continue.<br>Keep in mind that the issue author may not always flip the tag back to `needs-team-attention` when it responds so scan the issues periodically to see if the author has responded.| ![#f7ffa3](https://via.placeholder.com/15/f7ffa3/000000?text=+) `#f7ffa3` | `needs-author-feedback` |\n|Needs team information| The issue has a comment from the author and needs SDK Team or service team’s attention.| ![#f7ffa3](https://via.placeholder.com/15/f7ffa3/000000?text=+) `#f7ffa3` | `needs-team-attention` |\n|Backlog| The issue is out of scope for the current iteration but it will be evaluated in a future release. | ![#fbca04](https://via.placeholder.com/15/fbca04/000000?text=+) `#fbca04` | `backlog` |\n|Blocked| Current progress is blocked on something else.<br>Make sure you add a note in the issue history when you apply this tag describing what's blocking it for future reference.| ![#ff8c00](https://via.placeholder.com/15/FF8C00/000000?text=+) `#ff8c00` | `blocked` |\n|Stale| The issue hasn't been updated in a long time and will be automatically closed. | ![#ededed](https://via.placeholder.com/15/ededed/000000?text=+) `#ededed` | `stale` |\n\n### Repo specific labels for status <!-- omit in toc -->\n\nDo not create repo specific labels for this category.\n\n## Area\n\nThese labels are used to map issues to a feature or functional area in the product. This category informs several reports, the labels in this category should only be created by feature and product owners and documented in the table below.\n\nAll the issues assigned to a milestone should have at least one of these labels before they can be worked on.\n\n### Area labels <!-- omit in toc -->\n\nColor: All the labels in this category should use ![#1d76db](https://via.placeholder.com/15/1d76db/000000?text=+) `#1d76db`\n\n| Name | Description | Example |\n|---|---|---|\n|Adaptive| The issue is related to Adaptive dialogs | `Area: Adaptive` |\n|Adaptive Expressions| The issue is related to Adaptive expressions | `Area: Adaptive expressions` |\n|AI-LUIS| The issue is related to LUIS | `Area: AI-LUIS` |\n|AI-Orchestrator| The issue is related to Orchestrator | `Area: AI-Orchestrator` |\n|AI-QnAMaker| THe issue is related to QnA Maker | `Area: AI-QnAMaker` |\n|Authentication| The issue is related to authenticating users (SSO, OAuth, etc.) | `Area: Authentication` |\n|Engineering| Used to categorize internal issues that are related to improving code quality, refactorings, code cleanup, etc. Normally this issues will be also tagged as `technical-debt` or `team-agility` | `Area: Engineering` |\n|Custom Adapters| The issue is related to custom adapters (Twilio, Facebook, etc.) | `Area: Custom adapters` |\n|Docs| Documentation issue (missing needs updates, etc.) | `Area: Docs` |\n|Functional Tests| The issue is related to end to end tests | `Area: Functional tests` |\n|LG| Language generation issues | `Area: LG` |\n|Samples| The issue is related to the product samples | `Area: Samples` |\n|Schema| The issue is related to schemas (bot schemas, skill manifest, etc.) | `Area: Schema` |\n|SDK| General SDK issues that don't clearly map to other areas (e.g.: waterfall dialogs, prompts, middleware, and helper methods).<br/> In general, we use this label when we don't have a clear match to other area.| `Area: SDK` |\n|Skills| The issue is related to skills | `Area: Skills` |\n|Streaming| Issues related to streaming support | `Area: Streaming` |\n|Teams| The issue is related to Teams support | `Area: Teams` |\n|Telemetry| Issues related to telemetry support | `Area: Telemetry` |\n|Testing Framework| Issues related to the bot testing framework | `Area: Testing framework` |\n\n### Repo specific labels for area <!-- omit in toc -->\n\nIt is OK to create repo specific sub categories for area, for example, composer may need `Area: UX design` and BF CLI may need `Area: BF config`.\n\n## Type\n\nUse these labels to describe the type of the issue.\n\nAll the issues assigned to a milestone should have one of these labels before they can be worked on.\n\nColor: This subcategory uses different colors for each label.\n\n| Name | Description | Color | Example |\n|---|---|:-:|:--|\n|Bug| Indicates an unexpected problem or an unintended behavior.| ![#d73a4a](https://via.placeholder.com/15/d73a4a/000000?text=+) `#d73a4a` | `bug` |\n|Feature request|  A request for new functionality or an enhancement to an existing one.| ![#8f31ed](https://via.placeholder.com/15/8f31ed/000000?text=+) `#8f31ed` | `feature-request` |\n|Parity| The issue describes a gap in parity between two or more platforms.| ![#fbca04](https://via.placeholder.com/15/fbca04/000000?text=+) `#fbca04` | `parity` |\n|Technical debt| The issue involves refactoring existing code to make it easier to maintain, follow best practices, improve test coverage, etc.| ![#fbca04](https://via.placeholder.com/15/fbca04/000000?text=+) `#fbca04` | `technical-debt` |\n|Team agility| An issue targeted to reduce friction to the SDK's development process.| ![#fbca04](https://via.placeholder.com/15/fbca04/000000?text=+) `#fbca04` | `team-agility` |\n\n### Repo specific labels for type <!-- omit in toc -->\n\nDo not create repo specific labels for this category.\n\n## Priority\n\nDescribes the priority of the issue. This label is required for any issue that is in scope for an iteration. High priority issues will be addressed first. \n\nAll the issues assigned to a milestone should have one of these labels before they can be worked on.\n\nColor: This subcategory uses different colors for each label.\n\n| Name | Description | Color | Example |\n|---|---|:-:|:--|\n|P0| Must Fix.  Release-blocker | ![#ee0701](https://via.placeholder.com/15/ee0701/000000?text=+) `#ee0701` | `P0` |\n|P1| Painful if we don't fix, won't block releasing | ![#ff8c00](https://via.placeholder.com/15/FF8C00/000000?text=+) `#ff8c00` | `P1` |\n|P2| Nice to have | ![#ffff00](https://via.placeholder.com/15/ffff00/000000?text=+) `#ffff00` | `P2` |\n\n### Repo specific labels for priority <!-- omit in toc -->\n\nDo not create repo specific labels for this category.\n\n## Community\n\nUse these labels to tag issues that involve the community.\n\nColor: All the labels in this category should use ![#874faf](https://via.placeholder.com/15/874faf/000000?text=+) `#874faf`.\n\n| Name | Description | Example |\n|---|---|---|\n|Help wanted| This is a good issue for a contributor to take on and submit a solution | `Community: Help wanted` |\n\n### Repo specific labels for community <!-- omit in toc -->\n\nDo not create repo specific labels for this category.\n\n## Size (proposal)\n\n**Note:** these labels are experimental and may change\n\nUse these to assign an estimated level of effort to resolve an issue and assist with the estimation process.\n\nColor: All the labels in this category should use ![#91e3ea](https://via.placeholder.com/15/91e3ea/000000?text=+) `#91e3ea`.\n\n| Name | Description | Example |\n|---|---|---|\n|Small| The issue is simple and well understood, it will take a day or less to complete | `Size: S` |\n|Medium| The issue is not very complex and it is well understood, it will take 1 to 3 days to complete | `Size: M` |\n|Large| The issue is complex but it is well understood, it will take 4 to 8 days to complete | `Size: L` |\n|Extra Large| The issue is very complex or not very well defined, it will take 9 to 14 days or more to complete. In this case, it is probably better to rethink the issue and break it down in smaller tasks | `Size: XL` |\n\n### Repo specific labels for size <!-- omit in toc -->\n\nDo not create repo specific labels for this category.\n\n## Automation (proposal)\n\n**Note:** these labels are experimental and may change\n\nThese labels are applied to PRs and used to trigger or disable GitHub workflows.\n\nColor: All the labels in this category should use ![#cccccc](https://via.placeholder.com/15/cccccc/000000?text=+) `#cccccc`.\n\n|Name| Description | Example |\n|---|---|:--|\n|no parity| PR does not need to be applied to other languages.<br>**Note:** if you don't apply the `No parity` to a dotnet PR, the automation workflow will generate parity issues in Python, JS and Java.  | `Automation: No parity` |\n|parity with dotnet| The PR needs to be ported to dotnet. | `Automation: Parity with dotnet` |\n|parity with JS| The PR needs to be ported to JS. | `Automation: Parity with JS` |\n|parity with Python| The PR needs to be ported to Python. | `Automation: Parity with Python` |\n|parity with Java| The PR needs to be ported to Java. | `Automation: Parity with Java` |\n\n### Repo specific labels for Automation <!-- omit in toc -->\n\nIt is OK to create repo specific labels for this category to trigger repo specific workflows, just use prefix the label with `Automation:` (e.g.: `Automation: My action`).\n\n# DRI labels\n\nThe DRI labels are used to support the Azure issue management process and track desired SLAs.\n\nThe DRI labels are used when an issue is opened by someone that is not a contributor of the repo.\n\nDRI labels support reporting outside the bot framework repositories and their names don't always follow the standards described above. They should be applied based on the current DRI guide.\n\nIssues created by anyone in the community that is not a collaborator in the repositories will initially be tagged as `customer-reported`.\n\nColor: This subcategory uses different colors for each label.\n\n| Category | Description  | Color | Labels |\n|---|---|:-:|:--|\n|Customer issue| Customer reported issues, this label is automatically applied when the issue is created by anyone that is not a collaborator in the repository.<br>**Note:** do not use this label to create an issue on behalf of a customer, ask the customer to post the issue instead so it can be tracked to the source.| ![#c2e0c6](https://via.placeholder.com/15/c2e0c6/000000?text=+) `#c2e0c6` | `customer-reported` |\n|Service| Required for internal Azure reporting, indicates that the issue is related to the libraries and services managed by the Conversational AI team.<br>Do not change color.| ![#e99695](https://via.placeholder.com/15/e99695/000000?text=+) `#e99695` | `Bot Service` |\n|Type| Indicates what the issue type is.<br>This is a subset of the types defined in the [types category](#type).<br/>Only use `bug`, `question` or `feature-request` for DRI issues.| Multiple | `bug`<br> `question`<br>`feature-request`<br>|\n|Status| This is a subset of the statuses defined in the [status category](#status) and indicates who needs to take the next step.<br>- `needs-triage`: issue needs members of SDK Team to triage.<br>- `needs-team-attention`: the issue has a comment from the author and needs SDK Team or service team’s attention.<br>- `needs-author-feedback`: more info from the issue creator is needed to address the issue.|  ![#f7ffa3](https://via.placeholder.com/15/f7ffa3/000000?text=+) `#f7ffa3` | `needs-triage`<br>`needs-team-attention`<br>`needs-author-feedback`|\n|customer-replied-to| Indicates that the team has replied to the issue reported by the customer.<br>Do not delete.| ![#2683a5](https://via.placeholder.com/15/2683a5/000000?text=+) `#2683a5` | `customer-replied-to` |\n|ExemptFromDailyDRIReport| Use this label to exclude the issue from the DRI report.| ![#bde567](https://via.placeholder.com/15/bde567/000000?text=+) `#bde567` | `ExemptFromDailyDRIReport` |\n\n## Repo specific labels for DRI <!-- omit in toc -->\n\nDo not create repo specific labels for this category.\n\n# Repo specific labels\n\nSome repo owners may need to create custom tags that only apply to a particular platform. This is OK but you must be aware that these tags will be used only in that repo and won't be used in cross repo reporting and tracking.\n\nIt is recommended that you try to use one of the labels described in this document before creating new ones. Less is better.\n\nIf you create repo specific labels, make sure you document the additions on your repo and reference this article.\n\n# Release labels\n\nWe should not use labels to tag releases, we should use GitHub milestones instead. \n"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/BFServiceAndBotDetails/BFServiceAndBotDetails_DiagramSource.md",
    "content": "```mermaid\n\n    sequenceDiagram\n    \n    participant BFS as Bot Framework Service\n    participant Bot\n\n    Note over Bot: \"api/messages\"\n    BFS ->> Bot: HTTP POST Message \"hi\" (Req. 1)\n    activate BFS\n    activate Bot\n        opt REST calls (1)\n            Note over BFS: ReplyToActivity (2)\n            Bot ->> BFS: HTTP POST w/Bot's reply\n            activate Bot\n            activate BFS\n                BFS -->> Bot: { activityId } (3)\n            deactivate BFS\n            deactivate Bot\n\n            Bot ->> BFS: HTTP \n            activate Bot\n            activate BFS\n                BFS -->> Bot: { activityId }\n            deactivate BFS\n            deactivate Bot\n\n            Bot ->> BFS: HTTP \n            activate Bot\n            activate BFS\n                BFS -->> Bot: { activityId }\n            deactivate BFS\n            deactivate Bot\n\n            Bot ->> BFS: HTTP \n            activate Bot\n            activate BFS\n                BFS -->> Bot: { activityId }\n            deactivate BFS\n            deactivate Bot\n            end\n\n        Bot -->> BFS: 200 to Req. 1\n    deactivate Bot\n    deactivate BFS\n```"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/BotFrameworkAdapterFlow/BFAdapterActivityFlow_DiagramSource.md",
    "content": "```mermaid\n\nsequenceDiagram\n\n    participant Channel\n    participant BFS as Bot Framework Service\n    participant CoreSDK as Core BF SDK (1)\n    participant Bot as Bot (2)\n\n    Note left of Channel: Message \"hi\"\n    Channel ->> BFS: Inbound HTTP POST (3)\n    activate Channel\n    activate BFS\n        Note over CoreSDK: \"api/messages\"\n        BFS ->> CoreSDK: HTTP POST (4)\n        activate CoreSDK\n            CoreSDK ->> Bot: OnTurn()\n            activate Bot\n            \n            Note right of Bot: Message: \"Echo: 'hi'\"\n            Bot ->> CoreSDK: SendActivity()\n            activate Bot\n            activate CoreSDK\n        CoreSDK ->> BFS: Outbound HTTP (5)\n        activate BFS\n    BFS ->> Channel: Outbound HTTP (3)\n    activate Channel\n    \n    Channel -->> BFS: Response to Outbound\n    deactivate Channel\n        BFS -->> CoreSDK: Response to Outbound\n        deactivate BFS\n            CoreSDK -->> Bot: Response to Outbound\n            deactivate CoreSDK\n            deactivate Bot\n            Bot -->> CoreSDK: Response to Inbound\n            deactivate Bot\n        CoreSDK -->> BFS: Response to Inbound\n        deactivate CoreSDK\n    BFS -->> Channel: Response to Inbound\n    deactivate BFS\n    deactivate Channel\n```"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/CustomAdapterFlow/BufferingWithCustomAdapter_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n\n    participant Alexa\n    participant SDK as BF SDK\n    participant Bot\n\n    Alexa ->> SDK: HTTP Req. 1\n    activate Alexa\n    activate SDK\n        SDK ->> Bot: process()\n        activate Bot\n\n            opt Buffer until X occurs\n            Bot ->> SDK: \n            activate Bot\n            activate SDK\n                SDK -->> Bot: \n            deactivate SDK\n            deactivate Bot\n           \n            Bot ->> SDK: \n            activate Bot\n            activate SDK\n                SDK -->> Bot: \n            deactivate SDK\n            deactivate Bot\n            \n            Bot ->> SDK: \n            activate Bot\n            activate SDK\n                SDK -->> Bot: \n            deactivate SDK\n            deactivate Bot\n            end\n\n        Bot ->> SDK: X\n        deactivate Bot\n    \n    SDK -->> Alexa: Reply to Req. 1\n    deactivate SDK\n    deactivate Alexa\n```"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/CustomAdapterFlow/CustomAdapterActivityFlow_DiagramSource.md",
    "content": "```mermaid\n\nsequenceDiagram\n\n    participant Channel\n    participant CoreSDK as Core BF SDK (1)\n    participant Bot as Bot (2)\n\n    Note left of Channel: User Message: \"hi\"\n        Channel ->> CoreSDK: Inbound HTTP POST (3)\n        activate Channel\n        activate CoreSDK\n            CoreSDK ->> Bot: OnTurn()\n            activate Bot\n                Note right of Bot: Message: \"Echo: 'hi'\"\n            Bot ->> CoreSDK: SendActivity()\n            activate Bot\n            activate CoreSDK\n        CoreSDK ->> Channel: Outbound HTTP (4)\n        activate Channel\n            \n        Channel -->> CoreSDK: Response to Outbound\n        deactivate Channel\n            CoreSDK -->> Bot: Response to Outbound\n            deactivate CoreSDK\n            deactivate Bot\n\n            Bot -->> CoreSDK: Response to Inbound\n            deactivate Bot\n        CoreSDK -->> Channel: Response to Inbound\n        deactivate CoreSDK\n        deactivate Channel\n```"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/DetailedSdkFlow/DetailedSdkFlow.md",
    "content": "## Activity Flow\n\n### *Modeled after EchoBot example code in ['How bots work'](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&tabs=csharp#bot-logic) documentation.*\n\n![Activity Flow Diagram](./GeneralActivityFlow.svg \"General Activity Flow\")"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/DetailedSdkFlow/DetailedSdkFlow_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n            participant Channel\n            participant BFS as Bot Framework Service\n            participant WebServer as Web Server\n            Note over WebServer: C#: ASP.NET\n            Note over WebServer: JS: Restify or Express\n            participant Connector\n            participant Adapter \n            participant Middleware\n            participant TurnContext\n            participant ActivityHandler\n            participant Bot\n\n            Note left of Channel: User Message, \"Hi\"\n            Note left of Channel: Inbound Message\n            activate Channel\n            Channel ->> BFS: HTTP POST\n            activate BFS\n            Note right of Channel: JSON payload of Activity\n\n            BFS ->> WebServer: HTTP POST\n            activate WebServer\n            Note right of BFS: JSON Payload of Activity\n\n            WebServer ->> Adapter: process() via POST\n            activate Adapter\n            \n            Note right of Adapter: Deserialize Activity\n            Note right of Adapter: Create TurnContext\n            Note right of Adapter: Call Middleware\n            \n            Adapter ->> Middleware: run middleware pipeline\n            activate Middleware\n            loop Uncalled Middleware\n                Middleware ->> Middleware: call next Middleware\n            end\n\n            Middleware ->> ActivityHandler: onTurn()\n            activate ActivityHandler\n            Note over Middleware, ActivityHandler: Call Bot's Turn Handler\n\n            alt is Message\n                    ActivityHandler ->> Bot: onMessage()\n                    activate Bot\n                \n                else is ConversationUpdate\n                    ActivityHandler ->> Bot: onConversationUpdateActivity()\n                \n                else is MessageReaction\n                    ActivityHandler ->> Bot: onMessageReactionActivity()\n                \n                else is Event\n                    ActivityHandler ->> Bot: onEventActivity()\n                \n                else is Unreognized Activity Type\n                    ActivityHandler ->> Bot: onUnrecognizedActivityType()\n            end\n\n            Note right of Bot: Bot Message \"Echo: Hi\"\n            Note right of Bot: Outbound Message\n            Bot ->> TurnContext: sendActivity()\n            activate TurnContext\n\n            TurnContext ->> Middleware: Send Activities Through Callback Pipeline\n\n            loop Uncalled Middleware\n                Middleware ->> Middleware: Call Middleware registered on Send Activities\n            end\n\n            Middleware ->> Adapter: sendActivities(): \n            alt has replyToId\n                Adapter ->> Connector: replyToActivity() \n                activate Connector\n            else no replyToId\n                Adapter ->> Connector: sendToConversation()\n            end\n\n            Connector ->> BFS: Reply to Activity With Http Messages\n\n            BFS ->> Channel: HTTP POST\n\n            Channel -->> Bot: 200 OK to Outbound Message\n            Bot -->> Channel: 200 OK to Inbound Message\n\n            deactivate TurnContext\n            deactivate Bot\n            deactivate ActivityHandler\n            deactivate Middleware\n            deactivate Adapter\n            deactivate WebServer\n            deactivate Connector\n            deactivate BFS\n            deactivate Channel\n   ```"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/GeneralActivityFlow.md",
    "content": "## Activity Flow\n\n### *Modeled after EchoBot example code in ['How bots work'](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&tabs=csharp#bot-logic) documentation.*\n\n![Activity Flow Diagram](./GeneralActivityFlow.svg \"General Activity Flow\")"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/GeneralActivityFlow_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n            participant Channel\n            participant BFS as Bot Framework Service\n            participant WebServer as Web Server\n            Note over WebServer: C#: ASP.NET\n            Note over WebServer: JS: Restify or Express\n            participant Connector\n            participant Adapter \n            participant Middleware\n            participant TurnContext\n            participant ActivityHandler\n            participant Bot\n\n            Note left of Channel: User Message, \"Hi\"\n            Note left of Channel: Inbound Message\n            activate Channel\n            Channel ->> BFS: HTTP POST\n            activate BFS\n            Note right of Channel: JSON payload of Activity\n\n            BFS ->> WebServer: HTTP POST\n            activate WebServer\n            Note right of BFS: JSON Payload of Activity\n\n            WebServer ->> Adapter: process() via POST\n            activate Adapter\n            \n            Note right of Adapter: Deserialize Activity\n            Note right of Adapter: Create TurnContext\n            Note right of Adapter: Call Middleware\n            \n            Adapter ->> Middleware: run middleware pipeline\n            activate Middleware\n            loop Uncalled Middleware\n                Middleware ->> Middleware: call next Middleware\n            end\n\n            Middleware ->> ActivityHandler: onTurn()\n            activate ActivityHandler\n            Note over Middleware, ActivityHandler: Call Bot's Turn Handler\n\n            alt is Message\n                    ActivityHandler ->> Bot: onMessage()\n                    activate Bot\n                \n                else is ConversationUpdate\n                    ActivityHandler ->> Bot: onConversationUpdateActivity()\n                \n                else is MessageReaction\n                    ActivityHandler ->> Bot: onMessageReactionActivity()\n                \n                else is Event\n                    ActivityHandler ->> Bot: onEventActivity()\n                \n                else is Unreognized Activity Type\n                    ActivityHandler ->> Bot: onUnrecognizedActivityType()\n            end\n\n            Note right of Bot: Bot Message \"Echo: Hi\"\n            Note right of Bot: Outbound Message\n            Bot ->> TurnContext: sendActivity()\n            activate TurnContext\n\n            TurnContext ->> Middleware: Send Activities Through Callback Pipeline\n\n            loop Uncalled Middleware\n                Middleware ->> Middleware: Call Middleware registered on Send Activities\n            end\n\n            Middleware ->> Adapter: sendActivities(): \n            alt has replyToId\n                Adapter ->> Connector: replyToActivity() \n                activate Connector\n            else no replyToId\n                Adapter ->> Connector: sendToConversation()\n            end\n\n            Connector ->> BFS: Reply to Activity With Http Messages\n\n            BFS ->> Channel: HTTP POST\n\n            Channel -->> Bot: 200 OK to Outbound Message\n            Bot -->> Channel: 200 OK to Inbound Message\n\n            deactivate TurnContext\n            deactivate Bot\n            deactivate ActivityHandler\n            deactivate Middleware\n            deactivate Adapter\n            deactivate WebServer\n            deactivate Connector\n            deactivate BFS\n            deactivate Channel\n   ```"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/README.md",
    "content": "# Activity Flow in the Bot Framework\n\nThis section contains diagrams that illustrate the participants involved when Activities flows between Channel and Bot.\n\n- [HTTP Protocol](#http-protocol)\n- [Detailed Look into the SDK](#detailed-look-into-the-sdk)\n- [Activity Flow Participants](#activity-flow-participants)\n\n# *HTTP Protocol*\n- [`BotFrameworkAdapter` vs. Custom Adapter](#botframeworkadapter-vs-custom-adapter)\n- [Details of communication between Bot Framework Service and Bot](#details-of-communication-between-Bot-Framework-Service-and-Bot)\n- [Additional Information on Custom Adapters' Protocol]()\n\n# `BotFrameworkAdapter` vs. Custom Adapter\n\nThe following two diagrams illustrate the differences in how an Activity flows from Channel to Bot when using the standard **`BotFrameworkAdapter`** versus using a **customer adapter**.\n\n-  [Communication between a Channel and Bot using the *`BotFrameworkAdapter`*](#communication-between-a-channel-and-bot-using-the-botframeworkadapter)\n-  [Communication between a Channel and Bot using a *customer adapter*](#communication-between-a-channel-and-bot-with-a-customer-adapter)\n\n## **Communication between a Channel and Bot using the *`BotFrameworkAdapter`***\nThe canonical Bot Framework protocol includes communication between the **Channel** (Teams, Cortana, Direct Line Speech, Slack etc.), **Bot Framework Service**, **`BotFrameworkAdapter`**, and the **Bot**.\n\nThe **Bot Framework Service** lives in the cloud and takes on the role of translating the data from multiple Channels into the Bot Framework protocol in a form that your local Bot code can understand (and vice versa going from Bot to Channels). This allows your Bot to communicate with multiple Channels, without having to understand which Channel the data is coming from. You don't need to write several permutations of your Bot specific to *each* Channel, if the Channel is supported in the Service.\n\nThe `BotFrameworkAdapter` passes the Channels' information off in the form of Activities for your Bot to consume.\n\n![BFAdapterActivityFlow](./BotFrameworkAdapterFlow/BFAdapterActivityFlow.svg \"Activity Flow with BotFrameworkAdapter\")\n\n1. Default adapter used in the SDK is the `BotFrameworkAdapter`.\n2. Bot derives from the `ActivityHandler` class from the SDK, which implements `IBot`.\n3. Protocol between Channel & Bot Framework Service:\n    * Exact communication details between Channel and Bot Framework Service varies per channel.\n    * For example, here could be HTTP POST requests, which we illustrate in the diagram, or they could be another kind of REST call.\n4. We *know for certainty* this is an HTTP POST request. \n5. Bot Framework REST API call.\n    * The `BotFrameworkAdapter` creates a `ConnectorClient` that allows the Bot to send Activities to users on Channels configured in ABS.\n    * The `ConnectorClient` speaks with the BF Service, which exposes different endpoints that your bot can call via HTTP request. \n    * Example APIs:\n        * Replying to an Activity will POST to `\"v3/conversations/{conversationId}/activities/{activityId}\"`\n        * Sending to end of conversation will POST to `\"/v3/directline/conversations/{conversationId}/activities\"`\n        * See [Bot Framework REST API reference](https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0) for more details.\n\n## **Communication between a channel and bot with a *customer adapter***\nThe Bot Framework SDK includes more recent work on custom adapters as well, such as for Slack, Facebook, Twilio, etc. \n* The communication between a Channel and a customer adapter is direct, **without the Bot Framework Service cloud layer in between**. \n* The customer adapter itself does the same work as what the Bot Framework Service does, in that it translates the Channel's inbound data to the Bot into a shape that the Bot can consume, and also shapes calls outbound from your Bot to the Channel in a way that the Channel can understand, but with the added bonus of less latency.\n* Additionally, custom adapters may also allow you to have access to more of the 3rd party's native APIs, as the Bot Framework Service might possibly not be as up-to-date in all the latest endpoints the 3rd parties expose.\n* The tradeoffs of using a custom adapter as opposed to the `BotFrameworkAdapter` are:\n    * The one custom adapter only speaks to one Channel (e.g. Slack Adapter can speak to Slack, but not Facebook)\n    * You may have to do more of the heavy lifting. For example, if your bot sends a \"hero card\", the `BotFrameworkAdapter` knows how to translate that hero card into a \"Teams hero card\" that the Teams Channel can consume, but if you use a custom adapter, you may have to do the work of transforming the Bot's \"hero card\" to \"Facebook hero card\".\n\n![CustomAdapterActivityFlow](./CustomAdapterFlow/CustomAdapterActivityFlow.svg \"Activity Flow with Custom Adapter\")\n\n1. Core SDK includes custom adapters (e.g. Slack Adapter, Facebook Adapter, Twilio Adapter, etc.)\n2. Bot derives from `ActivityHandler`, which implements `IBot`\n3. Protocol between Channel & BF SDK:\n    * Exact communication details between Channel and custom adapters in the BF SDK varies per channel.\n    * For example, it could be an HTTP POST request to \"api/facebook\".\n4. REST HTTP calls directly to the 3rd party service's APIs\n    * It *does not* call the Bot Framework Service layer\n\n## Details of communication between Bot Framework Service and Bot\nThe following illustrates a few more details on the communication between the Bot Framework Service and the Bot using the `BotFrameworkAdapter`.\n\n![BFServiceAndBotDetails](./BFServiceAndBotDetails/BFServiceAndBotDetails.svg \"BF Service and Bot Details\")\n\n1. Calls from Bot to the Bot Framework Service are industry-standard REST API calls with JSON over HTTPS.\n2. Example showing Bot calling the Bot Framework Service's `ReplyToActivity` endpoint (`POST v3/conversations/{conversationId}/activities/{activityId}`)\n    * Bot can have 1 call in reply to Req. 1 (for example just Sending \"Echo: 'hi'\" message back) or the bot can have multiple REST calls in response to the Bot Framework Service's Req. 1, as illustrated with the subsequent HTTP calls from the Bot in this diagram.\n3. A `ResourceResponse` that contains an id property which specifies the ID of the Activity that was sent to the Bot.\n\n\n## Custom Adapters Protocol, Continued\n\nCertain Channels communicate with custom adapters, such as Alexa and Slack. It is the custom adapter's job to transform the data received from the Bot into the right shape or enforce the expected protocol flow of the Channel that custom adapter is communitcating with.\n\nFor some channels, like Slack, the Channel follows the \"Russian nesting doll\" shape in it's request-response protocol, as illustrated in the [sequence diagram of Activity Flow using the BF Service and BotFrameworkAdapter](#communication-between-a-channel-and-bot-using-the-botframeworkadapter).\n\nMany channels, however, such as for Alexa, Google, etc., actually follow a different protocol pattern, where the HTTP request is followed by by the HTTP response, with the bot's reply within that HTTP response (i.e. not a separate Bot request that has the Bot's reply, followed by the status code response). To satisfy this common request-reply pattern, some custom adapters will buffer between the customer adapter and Bot, until the entirety of the reply to the the Channel's original request is ready. See diagram below for clarification.\n\n![AlexaAdapter](./CustomAdapterFlow/BufferingWithCustomAdapter.svg)\n\nAbove Alexa channel makes a request to the bot, hitting the custom adapter layer between. The custom adapter and bot buffer the response to the Alexa reuqest until X occurs, when the Bot's reply is ready to be sent with in the HTTP response.\n\n___\n\n# *Detailed look into the SDK*\n\n### *Modeled after the C# EchoBot example code in ['How bots work'](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&tabs=csharp#bot-logic) documentation.*\n\nThis diagram models the flow of an Activity going from Channel to Bot, then back out from Bot to Channel in response, with a high focus on the pieces of the Bot Framework SDK that are involved.\n\n![Activity Flow Diagram](./DetailedSdkFlow/DetailedSdkFlow.svg \"Generalized Activity Flow\")\n\n1. Bots are essentially websites that are hosted in a Web App exposed over HTTP.\n    - For example, your bot receives POST requests to its `\"api/messages\"` endpoint.\n\n2. Calls from Bot to the Bot Framework Service are industry-standard REST API calls with JSON over HTTPS. See [Communication between a Channel and a Bot using the BotFrameworkAdapter](https://github.com/Zerryth/Mermaid/tree/master/MarkdownFiles/ActivityFlow#communication-between-a-channel-and-a-bot-thats-using-botframeworkadapter) and [Communication between Bot Framework Service and Bot](https://github.com/Zerryth/Mermaid/tree/master/MarkdownFiles/ActivityFlow#details-of-communication-between-bot-framework-service-and-bot) for more details.\n    - For example, to Reply to Activity the Bot's Connector will `POST v3/conversations/{conversationId}/activities/{activityId}`.\n\n___\n\n# *Activity Flow Participants*\nBlock diagram of the participants involved in a general Activity flow.\n\n![Higher Level Activity Flow Participants](./ParticipantsInActivityFlow.png \"Higher Level Activity Flow Participants\")"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/AddAuthenticationToYourBotViaABS/DetailedView_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n    \n    subgraph Channel-to-Bot Access\n        Channel --- AAD1([AAD App Registration 1*])\n    end\n    AAD1 -- Secures Channel-To-Bot Access --- BotChannelsRegistration(Bot Channels Registration)\n\n    subgraph Bot to Protected Resource\n        AAD2([AAD App Registration 2**]) --- ProtectedResource{{Protected Resource}}\n    end\n    AAD2 -- OAuth Connection with AAD's client ID, client secret, tenant ID, scopes --- BotChannelsRegistration\n\n    BotChannelsRegistration --- Bot(Bot)\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/AddAuthenticationToYourBotViaABS/HigherLevel_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        Channel --- AAD1([AAD App Registration 1])\n        AAD1  --- Bot(Bot)\n        \n        ProtectedResource{{Protected Resource}} --- AAD2([AAD App Registration 2])\n        AAD2  --- Bot\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_Goal_DiagramSource.md",
    "content": "```mermaid\ngraph LR\n\nUser -- \"#quot;Please check my email#quot;\" --> Bot(Bot)\n\n```\n"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_OAuthFlow_HasTokenInStorage_DiagramSource.md",
    "content": "```mermaid\nsequenceDiagram\n\nparticipant User\nparticipant BFCS as BF Channel Service\nparticipant BFTS as BF Token Service\nNote over BFCS, BFTS: In Azure Bot Service\nparticipant Bot\nparticipant ProtectedResource as Protected Resource\n\n\nUser ->> BFCS: Message Activity \"Please check my email\"\nBFCS ->> Bot: Receives Msg Activity & Determines intent is to check email\nBot ->> BFTS: Do we have Token already? (https://api.botframework.com/api/usertoken/GetToken)\nNote over BFCS, Bot: For the given userId for the OAuth connection setting called GraphConnection\nalt Has Token\n    BFTS -->> Bot: Returns stored Token\nend\n\nBot ->> ProtectedResource: Makes request with Token to Protected Resource\nNote over Bot, ProtectedResource: Calls \"check email\" API\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_OAuthFlow_NoTokenToStart_DiagramSource.md",
    "content": "### Bot does not have token yet, OAuth flow\n\n```mermaid\nsequenceDiagram\n\nparticipant User\nparticipant BFCS as BF Channel Service\nparticipant BFTS as BF Token Service\nparticipant ASAuth as AS *1 Auth Endpoint\nparticipant ASToken as AS Token Endpoint\nNote over ASAuth, ASToken: Authorization Server\nNote over ASAuth, ASToken: e.g. AAD, GitHub, Facebook, etc.\nparticipant Bot\nparticipant ProtectedResource as Protected Resource\n\n\nUser ->> BFCS: Message Activity \"Please check my email\"\nBFCS ->> Bot: Receives Msg Activity & Determines intent is to check email\nBot ->> BFTS: Do we have Token already? (https://api.botframework.com/api/usertoken/GetToken)\nNote over BFTS, Bot: Token for the given userId for the OAuth connection setting called \"GraphConnection\"\n\nalt Does Not Have Token\n    BFTS -->> Bot: Return [Token] NotFound result\n    Note over ASAuth, ASToken: Such as 1st time User interacts w/Bot\nend\n\nBot ->> BFCS: Creates OAuthCard, asks User to sign in\nBFCS ->> BFTS: Create Valid OAuth sign-in URL for request\nBFTS -->> BFCS: Valid sign-in URL added to OAuthCard\nBFCS ->> User: Send Message with OAuthCard that has Sign-In Button\nUser ->> BFCS: User clicks Sign-In button\nBFCS ->> ASAuth: Calls Authorization Server to load Sign-In page/pop-up\nASAuth ->> User: Serves Sign-In page/pop-up\n\nopt Grant Type: Authorization Code *2\n    User ->> ASAuth: User signs in & authorizes Bot\n    ASAuth -->> BFTS: Returns authorization code\n    Note over BFTS, ASToken: https://token.botframework.com/.auth/web/redirect\n    BFTS ->> ASToken: Uses authorization code to obtain Token\n    ASToken -->> BFTS: Returns Token\n    BFTS ->> BFTS: Securely stores Token\n    BFTS -->> Bot: Returns Token\n\nend\n\nBot ->> ProtectedResource: Makes request with Token to access Protected Resource\nNote over Bot, ProtectedResource: Calls \"check email\" API\n\n```\n\n1. Authorization Server (AS).\n    * The AS can be within Azure, such as using AAD as our token provider, or outside of Azure as well, like in the case of using GitHub as the AS.\n2. There are many different authorization grants, or OAuth flows, that detail how exactly how to use the identity of the owner of the protected resource in exchange for an access token (e.g. authorization code, client credentials, device code, refresh token, implicit, etc.)"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/AdapterSavedAsTurnContextMember_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        Adapter -- stored as member in --> TurnContext\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/BotFrameworkAdapterCreatesOAuthClient_DiagramSource.md",
    "content": "#### `BotFrameworkAdapter` Creates `OAuthClient`\n``` mermaid\n    graph LR\n        BotFrameworkAdapter -. with .-> AppCredsFromSetting[AppCredentials from OAuthPromptSettings]\n        BotFrameworkAdapter -. or with .-> AppCredsFromCache[AppCredentials from Adapter's credential cache]\n        BotFrameworkAdapter -. or with .-> builtAppCredentials[newly built AppCredentials]\n        \n        AppCredsFromSetting -->  OAuthClient[creates OAuthClient]\n        AppCredsFromCache -->  OAuthClient\n        builtAppCredentials -->  OAuthClient\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/BotFrameworkAdapterCreatesTokenApiClient_DiagramSource.md",
    "content": "#### `BotFrameworkAdapter` Creates `TokenApiClient`\n``` mermaid\n    graph LR\n        BotFrameworkAdapter -. with .-> AppCredsFromSetting[AppCredentials from OAuthPromptSettings]\n        BotFrameworkAdapter -. or with .-> AppCredentialsMember[\"AppCredentials created on initialization of BotFrameworkAdapter saved in #quot;credentials#quot; member\"]\n        \n        AppCredsFromSetting -->  TokenApiClient[creates TokenApiClient]\n        AppCredentialsMember -->  TokenApiClient\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/BuildAppCredentialsParticipants_DiagramSource.md",
    "content": "#### Participants Involved in Building `AppCredentials`\n\n```mermaid\n    classDiagram\n        BotFrameworkAdapter *-- ICredentialProvider: uses to get password\n        ICredentialProvider <|-- SimpleCredentialProvider: default implementation\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CSharp_AppCredentialsClassDiagram_DiagramSource.md",
    "content": "#### `AppCredentials` Class Diagram\n\n```mermaid\n    classDiagram\n        class ServiceClientCredentials {\n        }\n        <<abstract>> ServiceClientCredentials\n\n        class AppCredentials {\n        }\n        <<abstract>> AppCredentials\n    \n        ServiceClientCredentials <|-- AppCredentials\n\n        AppCredentials --|> MicrosoftAppCredentials\n        MicrosoftAppCredentials --|> MicrosoftGovernmentAppCredentials\n        AppCredentials --|> CertificateAppCredentials\n```\n* `ServiceClientCredentials` is an [MS REST class](https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclientcredentials?view=azure-dotnet)."
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CSharp_OAuthPromptAndTokenProvider_DiagramSource.md",
    "content": "`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ICredentialTokenProvider` to acquire tokens.\n\n```mermaid\n    classDiagram\n        class OAuthPrompt {\n            - OAuthPromptSettings\n            - PromptValidator\n        }\n\n        class BotAdapter {\n        }\n        <<abstract>> BotAdapter\n\n        class IExtendedUserTokenProvider {\n            + GetUserTokenAsync()\n            + GetOauthSignInLinkAsync()\n            + SignOutUserAsync()\n            + GetTokenStatusAsync()\n            + GetAadTokenAsync()\n            + GetSignInResourceAsync()\n            + ExchangeTokenAsync()\n        }\n        <<Interface>> IExtendedUserTokenProvider\n\n        OAuthPrompt o-- IExtendedUserTokenProvider: uses as token provider\n        BotFrameworkAdapter --|> BotAdapter: derives from\n        BotAdapter --o TurnContext: is a member of\n        IExtendedUserTokenProvider <|-- BotFrameworkAdapter\n        BotFrameworkAdapter --> OAuthClient : creates to get tokens\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CSharp_UseAppCredentialsToCreateOAuthClient_DiagramSource.md",
    "content": "#### Use `AppCredentials` to create an `OAuthClient`\n- The `OAuthPrompt`'s `ICredentialTokenProvider` creates an `OAuthClient` to send a request to get a token.\n- You must use `ServiceClientCredentials` in order to initialize an `OAuthClient` instance.\n\n```mermaid\n    graph LR\n        OAuthPrompt -- creates --> OAuthClient -. with .-> ServiceClientCredentials\n        OAuthClient -- to use --> UserToken -- to get --> Token\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CreatingOAuthClientInMoreDetail.md",
    "content": "A more formal flow chart on the logic of creating an `OAuthClient`\n\n#### Creating `OAuthClient` Flow Chart\n![Create OAuthClient Flow Chart](./CreateOAuthClientFlowChart.svg \"Create OAuthClient Flow Chart\")\n\n#### Expanding on 2nd Step - Getting AppCredentials\n![Getting AppCredentials](./SecondStepGettingAppCredentials.svg \"Getting AppCredentials\")"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CreatingOAuthClientInMoreDetail_DiagramSource.md",
    "content": "#### Creating `OAuthClient` Flow Chart\n```mermaid\n    graph TD\n        Start((Start)) --> OAuthScope[get OAuthScope] -- using OAuthScope --> AppCredentials[get AppCredentials] --  using OAuthEndpoint and AppCredentials--> OAuthClient[create and cache OAuthClient] --> End((End))\n```\n\n#### Expanding on 2nd Step - Getting AppCredentials\n``` mermaid\n    graph TD\n        Start((Start)) --> hasAppCredentialsInSettings{OAuthPromptSettings has AppCredentials?}\n        hasAppCredentialsInSettings -- yes --> credsFromSetting[use AppCredentials from settings]\n        hasAppCredentialsInSettings -- no --> cachedCreds{Adapter has cached AppCredentials?}\n\n        cachedCreds -- yes --> returnCachedCreds[return cached AppCredentials]\n        cachedCreds -- no --> buildCredentials[\"BuildCredentialsAsync(), cache, and return \"]\n\n        credsFromSetting --> End((End))\n        returnCachedCreds --> End\n        buildCredentials --> End\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/GetUserTokenSequenceDiagram.md",
    "content": "```mermaid\n    sequenceDiagram\n        participant OAuthPrompt\n        participant BFA as BotFrameworkAdapter\n        participant ICredentialProvider\n\n        OAuthPrompt ->> BFA: .GetUserTokenAsync()\n            BFA ->> BFA: CreateOAuthApiClientAsync()\n            BFA ->> BFA: GetOAuthScope()\n            \n            alt OAuthPromptSetting has credentials\n                BFA ->> BFA: use AppCredentials from OAuthPromptSetting\n                else No credentials in OAuthPromptSetting\n                    BFA ->> BFA: GetAppCredentialsAsync()\n                    alt has cached credentials\n                        BFA ->> BFA: return AppCredentials from cache\n                        \n                        else no cached credentials\n                            Note over BFA: using appId\n                            BFA ->> BFA: BuildCredentialsAsync()\n                            BFA ->> ICredentialProvider: GetAppPasswordAsync()\n                            ICredentialProvider -->> BFA: return app password\n                            BFA ->> BFA: cache AppCredentials\n                            BFA ->> BFA: return AppCredentials *\n                    end\n            end\n\n\n```\n-  `BuildCredentialsAsync()` returns either `MicrosoftAppCredentials` or `MicrosoftGovernmentAppCredentials` type of `AppCredentials`\n    - override this method if you want to derive a different type of `AppCredentials`, such as `CertificateAppCredentials`."
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/JS_AppCredentialsClassDiagram_DiagramSource.md",
    "content": "#### `AppCredentials` Class Diagram\n\n```mermaid\n    classDiagram\n        class ServiceClientCredentials {\n        }\n        <<interface>> ServiceClientCredentials\n\n        class AppCredentials {\n        }\n        <<abstract>> AppCredentials\n    \n        ServiceClientCredentials <|-- AppCredentials\n\n        AppCredentials --|> MicrosoftAppCredentials\n        AppCredentials --|> CertificateAppCredentials\n```\n* `ServiceClientCredentials` is an [ms-rest interface](https://github.com/Azure/ms-rest-js/blob/master/lib/credentials/serviceClientCredentials.ts)."
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/JS_OAuthPromptAndTokenProvider_DiagramSource.md",
    "content": "`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ExtendedUserTokenProvider` to acquire tokens.\n\n```mermaid\n    classDiagram\n        class OAuthPrompt {\n            - OAuthPromptSettings\n            - PromptValidator\n        }\n\n        class BotAdapter {\n        }\n        <<abstract>> BotAdapter\n\n        class ExtendedUserTokenProvider {\n            + getUserToken()\n            + signOutUser()\n            + getSignInLink()\n            + getAadTokens()\n            + getSignInResource()\n            + exchangeToken()\n        }\n\n        OAuthPrompt o-- ExtendedUserTokenProvider: uses as token provider\n        ExtendedUserTokenProvider <|-- BotFrameworkAdapter\n        BotFrameworkAdapter --> TokenApiClient : creates to get tokens\n        BotFrameworkAdapter --|> BotAdapter: derives from\n        BotAdapter --o TurnContext: is a member of\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/JS_UseAppCredentialsToCreateTokenApiClient_DiagramSource.md",
    "content": "#### Use `AppCredentials` to create a `TokenApiClient`\n- The `OAuthPrompt`'s `ExtendedUserTokenProvider` creates a `TokenApiClient` to send a request to get a token.\n- You must use `ServiceClientCredentials` in order to initialize an `TokenApiClient` instance.\n\n```mermaid\n    graph LR\n        OAuthPrompt -- creates --> TokenApiClient -. with .-> ServiceClientCredentials\n        TokenApiClient -- to use --> UserToken -- to get --> TokenResponse.token\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/OAuthClientClassDiagram_DiagramSource.md",
    "content": "#### `OAuthClient` Class Diagram\n\n```mermaid\n    classDiagram\n        class OAuthClient {\n            - OAuthPromptSettings\n            - PromptValidator\n        }\n\n        class ServiceClient {\n        }\n        <<abstract>> ServiceClient\n\n        class IOAuthClient {\n            + BaseUri\n            + SerializationSettings\n            + DeserializationSettings\n            + Credentials\n            + BotSignIn\n            + UserToken\n        }\n\n        OAuthClient --|> ServiceClient: derives from\n        OAuthClient --|> IOAuthClient: implements\n        IOAuthClient --|> IDisposable\n\n        class IUserToken {\n            + GetTokenWithHttpMessagesAsync()\n            + GetAadTokensWithHttpMessagesAsync()\n            + SignOutWithHttpMessagesAsync()\n            + GetTokenStatusWithHttpMessagesAsync()\n        }\n\n        OAuthClient *-- IUserToken: uses to get token\n\n        class UserToken {\n            + GetTokenWithHttpMessagesAsync()\n        }\n\n        IUserToken <|-- UserToken: performs token operations with\n        UserToken --> HttpOperationResponseTokenResponse: receives Task of\n        HttpOperationResponseTokenResponse *-- Token: which has a\n```\n* `HttpOperationResponseTokenResponse` should be `HttpOperationResponse<TokenResponse>` (diagram tool breaks on special chars in class diagram).\n* `ServiceClient` is an [MS REST class](https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclient-1?view=azure-dotnet)."
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/OAuthPromptClassDiagrams.md",
    "content": "Class diagrams and flow charts exlaining the structure of `OAuthPrompt` authentication and authorization in the Bot Framework.\n\n### **Adapter and `TurnContext`**\n\n```mermaid\n    graph LR\n        BotEndpoint[\"#quot;api/messages#quot; endpoint in controller\"] -- calls --> adapter.ProcessActivity[\"ProcessActivity()\"] -- which creates --> TurnContext \n```\n\nOn `TurnContext` Initialization\n```mermaid\n    graph LR\n        Adapter -- stored as member in --> TurnContext\n```\n\n`OAuthPrompt` has various methods* that uses `BotAdapter` within its logic:\n```mermaid\n    graph LR\n    OAuthPrompt -- takes --> BotAdapter -. from .->  TurnContext\n```\n* `OAuthPrompt` methods that use `BotAdapter`: `BeginDialogAsync()`, `GetUserTokenAsync()`, `SignUserOutAsync()`, `SendOAuthCardAsync()`, `RecognizeTokenAsync()`\n\n### **Class Diagrams of `OAuthPrompt` and How It Acquires Tokens**\n- [C#](#c-token-provider-in-oauthprompt)\n- [JS](#js-token-provider-in-oauthprompt)\n\nNote:\n- The class diagrams obscures some of the class properties in order to better highlight the portions related specifically to authentication and authorization.\n- Class diagrams are read from top to bottom (regarding what class the link notes pertain to)\n\n#### **C#: Token Provider in `OAuthPrompt`:**\n\n`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ICredentialTokenProvider` to acquire tokens.\n\n```mermaid\n    classDiagram\n        class OAuthPrompt {\n            - OAuthPromptSettings\n            - PromptValidator\n        }\n\n        class BotAdapter {\n        }\n        <<abstract>> BotAdapter\n\n        class ICredentialTokenProvider {\n            + GetUserTokenAsync()\n            + GetOauthSignInLinkAsync()\n            + SignOutUserAsync()\n            + GetTokenStatusAsync()\n            + GetAadTokenAsync()\n        }\n        <<Interface>> ICredentialTokenProvider\n\n        OAuthPrompt o-- ICredentialTokenProvider: uses as token provider\n        BotFrameworkAdapter --|> BotAdapter: derives from\n        BotAdapter --o TurnContext: is a member of\n        ICredentialTokenProvider <|-- BotFrameworkAdapter\n        BotFrameworkAdapter --> OAuthClient : creates to get tokens\n```\n\n#### Use `AppCredentials` to create an `OAuthClient`\n- The `OAuthPrompt`'s `ICredentialTokenProvider` creates an `OAuthClient` to send a request to get a token.\n- You must use `ServiceClientCredentials` in order to initialize an `OAuthClient` instance.\n\n```mermaid\n    graph LR\n        OAuthPrompt -- creates --> OAuthClient -. with .-> ServiceClientCredentials\n        OAuthClient -- to use --> UserToken -- to get --> Token\n```\n\n#### `AppCredentials` Class Diagram\n\n```mermaid\n    classDiagram\n        class ServiceClientCredentials {\n        }\n        <<abstract>> ServiceClientCredentials\n\n        class AppCredentials {\n        }\n        <<abstract>> AppCredentials\n    \n        ServiceClientCredentials <|-- AppCredentials\n\n        AppCredentials --|> MicrosoftAppCredentials\n        MicrosoftAppCredentials --|> MicrosoftGovernmentAppCredentials\n        AppCredentials --|> CertificateAppCredentials\n```\n* `ServiceClientCredentials` is an [MS REST class](https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclientcredentials?view=azure-dotnet).\n\n#### Participants Involved in Building `AppCredentials`\n\n```mermaid\n    classDiagram\n        BotFrameworkAdapter *-- ICredentialProvider: uses to get password\n        ICredentialProvider <|-- SimpleCredentialProvider: default implementation\n```\n\n#### `BotFrameworkAdapter` Creates `OAuthClient`\n``` mermaid\n    graph LR\n        BotFrameworkAdapter -. with .-> AppCredsFromSetting[AppCredentials from OAuthPromptSettings]\n        BotFrameworkAdapter -. or with .-> AppCredsFromCache[AppCredentials from Adapter's credential cache]\n        BotFrameworkAdapter -. or with .-> builtAppCredentials[newly built AppCredentials]\n        \n        AppCredsFromSetting -->  OAuthClient[creates OAuthClient]\n        AppCredsFromCache -->  OAuthClient\n        builtAppCredentials -->  OAuthClient\n\n```\n\n#### `OAuthClient` Class Diagram\n\n```mermaid\n    classDiagram\n        class OAuthClient {\n            - OAuthPromptSettings\n            - PromptValidator\n        }\n\n        class ServiceClient {\n        }\n        <<abstract>> ServiceClient\n\n        class IOAuthClient {\n            + BaseUri\n            + SerializationSettings\n            + DeserializationSettings\n            + Credentials\n            + BotSignIn\n            + UserToken\n        }\n\n        OAuthClient --|> ServiceClient: derives from\n        OAuthClient --|> IOAuthClient: implements\n        IOAuthClient --|> IDisposable\n\n        class IUserToken {\n            + GetTokenWithHttpMessagesAsync()\n            + GetAadTokensWithHttpMessagesAsync()\n            + SignOutWithHttpMessagesAsync()\n            + GetTokenStatusWithHttpMessagesAsync()\n        }\n\n        OAuthClient *-- IUserToken: uses to get token\n\n        class UserToken {\n            + GetTokenWithHttpMessagesAsync()\n        }\n\n        IUserToken <|-- UserToken: performs token operations with\n        UserToken --> HttpOperationResponseTokenResponse: receives Task of\n        HttpOperationResponseTokenResponse *-- Token: which has a\n```\n* `HttpOperationResponseTokenResponse` should be `HttpOperationResponse<TokenResponse>` (diagram tool breaks on special chars in class diagram).\n* `ServiceClient` is an [MS REST class](https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclient-1?view=azure-dotnet).\n\n#### **JS: Token Provider in `OAuthPrompt`:**\n\n`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ExtendedUserTokenProvider` to acquire tokens.\n\n```mermaid\n    classDiagram\n        class OAuthPrompt\n\n        class BotAdapter {\n        }\n        <<abstract>> BotAdapter\n\n        class ExtendedUserTokenProvider {\n            + getUserToken()\n            + signOutUser()\n            + getSignInLink()\n            + getAadTokens()\n            + getSignInResource()\n            + exchangeToken()\n        }\n\n        OAuthPrompt o-- ExtendedUserTokenProvider: uses as token provider\n        ExtendedUserTokenProvider <|-- BotFrameworkAdapter\n        BotFrameworkAdapter --> TokenApiClient : creates to get tokens\n        BotFrameworkAdapter --|> BotAdapter: derives from\n        BotAdapter --o TurnContext: is a member of\n```\n\n#### Use `AppCredentials` to create a `TokenApiClient`\n- The `OAuthPrompt`'s `ExtendedUserTokenProvider` creates a `TokenApiClient` to send a request to get a token.\n- You must use `ServiceClientCredentials` in order to initialize an `TokenApiClient` instance.\n\n```mermaid\n    graph LR\n        OAuthPrompt -- creates --> TokenApiClient -. with .-> ServiceClientCredentials\n        TokenApiClient -- to use --> UserToken -- to get --> TokenResponse.token\n```\n\n#### `AppCredentials` Class Diagram\n\n```mermaid\n    classDiagram\n        class ServiceClientCredentials {\n        }\n        <<interface>> ServiceClientCredentials\n\n        class AppCredentials {\n        }\n        <<abstract>> AppCredentials\n    \n        ServiceClientCredentials <|-- AppCredentials\n\n        AppCredentials --|> MicrosoftAppCredentials\n        AppCredentials --|> CertificateAppCredentials\n```\n* `ServiceClientCredentials` is an [ms-rest interface](https://github.com/Azure/ms-rest-js/blob/master/lib/credentials/serviceClientCredentials.ts).\n\n#### `TokenApiClient` Class Diagram\n```mermaid\n    classDiagram\n        class TokenApiClient {\n            + botSignIn\n            + userToken\n        }\n\n        class TokenApiClientContext {\n            + baseUri\n            + requestContentType\n            + credentials\n        }\n\n        TokenApiClient --|> TokenApiClientContext: extends\n        TokenApiClientContext --|> ServiceClient: extends\n\n        class UserToken {\n            + getToken()\n        }\n\n        TokenApiClient *-- UserToken: performs token ops with\n        UserToken --> UserTokenGetTokenResponse: receives promise of\n        UserTokenGetTokenResponse *-- TokenResponse: composed of\n        UserTokenGetTokenResponse *-- HttpResponse\n        TokenResponse *-- token: which has a\n```\n\n* `TokenApiClient` and `TokenApiClientContext` are classes generated by auto-rest.\n* `ServiceClient` is an [msrest class](https://github.com/Azure/ms-rest-js/blob/master/lib/serviceClient.ts)."
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/ProcessActivityCreatesTurnContext_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        BotEndpoint[\"#quot;api/messages#quot; endpoint in controller\"] -- calls --> adapter.ProcessActivity[\"ProcessActivity()\"] -- which creates --> TurnContext \n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/TakesAdapterFromTurnContext_DiagramSource.md",
    "content": "`OAuthPrompt` has various methods* that uses `BotAdapter` within its logic:\n```mermaid\n    graph LR\n    OAuthPrompt -- takes --> Adapter -. from .->  TurnContext\n```\n* `OAuthPrompt` methods that use `BotAdapter`: `BeginDialogAsync()`, `GetUserTokenAsync()`, `SignUserOutAsync()`, `SendOAuthCardAsync()`, `RecognizeTokenAsync()`"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/TokenApiClientClassDiagram_DiagramSource.md",
    "content": "#### `TokenApiClient` Class Diagram\n```mermaid\n    classDiagram\n        class TokenApiClient {\n            + botSignIn\n            + userToken\n        }\n\n        class TokenApiClientContext {\n            + baseUri\n            + requestContentType\n            + credentials\n        }\n\n        TokenApiClient --|> TokenApiClientContext: extends\n        TokenApiClientContext --|> ServiceClient: extends\n\n        class UserToken {\n            + getToken()\n        }\n\n        TokenApiClient *-- UserToken: performs token ops with\n        UserToken --> UserTokenGetTokenResponse: receives promise of\n        UserTokenGetTokenResponse *-- TokenResponse: composed of\n        UserTokenGetTokenResponse *-- HttpResponse\n        TokenResponse *-- token: which has a\n```\n* `TokenApiClient` and `TokenApiClientContext` are classes generated by auto-rest.\n* `ServiceClient` is an [msrest class](https://github.com/Azure/ms-rest-js/blob/master/lib/serviceClient.ts)."
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/AuthenticateRequestOverview_DiagramSource.md",
    "content": "### Higher Level View of Channel's Token Authentication in the Bot Framework SDK \n\n```mermaid\n    sequenceDiagram\n        participant WebServer\n        participant Adapter\n        participant JwtTokenValidation\n        participant Bot\n\n        WebServer ->> Adapter: process()\n\n            Note over Adapter: Deserialize Activity\n            Note over Adapter: Grab Auth Header\n\n            Adapter ->> JwtTokenValidation: authenticateRequest()\n                Note over JwtTokenValidation: Validate Token\n                Note over JwtTokenValidation: Trust serviceUrl\n            \n                JwtTokenValidation -->> Adapter: returns ClaimsIdentity if inbound request is successfully authorized\n\n            Note over Adapter: Create ConnectorClient w/AppCredentials\n\n            Adapter ->> Bot: Run Middleware and Bot Logic\n```\n"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/AuthenticateRequest_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n        participant JwtTokenValidation\n        participant ChannelValidation as ChannelValidation *1\n        participant JwtTokenExtractor\n        participant AppCredentials\n        \n        JwtTokenValidation ->> ChannelValidation: identify what Channel is communicating w/Bot\n        activate JwtTokenValidation\n        activate ChannelValidation\n            ChannelValidation -->> JwtTokenValidation: Channel identified\n        deactivate ChannelValidation\n\n        JwtTokenValidation ->> ChannelValidation: run Channel-specific validations\n        activate ChannelValidation\n            ChannelValidation ->> ChannelValidation: get appropriate OpenID metadata document\n            ChannelValidation ->> JwtTokenExtractor: extract and validate Token\n            activate JwtTokenExtractor\n                JwtTokenExtractor ->> JwtTokenExtractor: get public signing key *2\n                JwtTokenExtractor ->> JwtTokenExtractor: verify Token signed w/valid signing algorithm and key\n                JwtTokenExtractor ->> JwtTokenExtractor: validate endorsements *3\n\n                JwtTokenExtractor -->> ChannelValidation: return ClaimsIdentity if Token is valid\n            deactivate JwtTokenExtractor\n            ChannelValidation ->> ChannelValidation: run Channel-specific validations\n            ChannelValidation -->> JwtTokenValidation: return ClaimsIdentity\n        deactivate ChannelValidation\n\n        JwtTokenValidation ->> AppCredentials: trustServiceUrl()\n        activate AppCredentials\n            AppCredentials -->> JwtTokenValidation: host of serviceUrl added to list of trusted hosts\n        deactivate AppCredentials\n        deactivate JwtTokenValidation\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/ChannelActingOnBehalfOfSelf_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n        participant Channel\n        participant Connector\n        participant Bot\n\n        Channel ->> Connector: authenticates and authorizes itself\n        Connector ->> Connector: creates and signs access and identity tokens\n        Connector ->> Channel: returns access and identity tokens\n        Channel ->> Connector: makes request with access token to send Activity\n        Connector ->> Bot: sends Activity with access token\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/ChannelActivingOnBehalfOfUser_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n        participant User\n        participant Channel\n        participant Connector\n        participant Bot\n\n        User ->> Channel: send \"Why hello, Bot!\" to Bot\n        Channel ->> User: requests authorization\n        User ->> Connector: authenticates and authorizes Channel\n        Connector ->> Connector: creates and signs access and identity tokens\n        Connector ->> Channel: returns access and identity tokens\n        Channel ->> Connector: makes request with access token to send message\n        Connector ->> Bot: sends \"Why hello, Bot!\" with access token\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/ChannelToABSLayerToBot_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        Teams --- Connector\n        Slack --- Connector([Connector])\n        Cortana --- Connector\n        WebChat --- Connector\n\n        Connector --- Bot(Bot)\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/HigherLevel_TokenAuthentication_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n        participant WebServer\n        participant Adapter\n        participant JwtTokenValidation\n        participant Bot\n\n        WebServer ->> Adapter: process()\n            Note over Adapter: Deserialize Activity\n            Note over Adapter: Grab Auth Header\n\n            Adapter ->> JwtTokenValidation: authenticateRequest()\n                Note over JwtTokenValidation: Validate Token\n                Note over JwtTokenValidation: Trust serviceUrl\n            \n                JwtTokenValidation -->> Adapter: returns ClaimsIdentity if Token is valid\n\n            Note over Adapter: Create ConnectorClient w/AppCredentials\n\n            Adapter ->> Bot: Run Middleware and Bot Logic\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/JwtTokenValidationClassDiagram_DiagramSource.md",
    "content": "```mermaid\n    classDiagram\n        JwtTokenValidation .. ChannelValidation\n        JwtTokenValidation .. EnterpriseChannelChannelValidation\n        JwtTokenValidation .. EmulatorValidation:  validates Channel with\n        JwtTokenValidation .. SkillValidation\n        JwtTokenValidation .. GovernmentChannelValidation\n        ChannelValidation --> JwtTokenExtractor\n        EnterpriseChannelChannelValidation --> JwtTokenExtractor\n        EmulatorValidation --> JwtTokenExtractor: extracts & validates token with\n        SkillValidation --> JwtTokenExtractor\n        GovernmentChannelValidation --> JwtTokenExtractor\n\n\n        JwtTokenValidation --> AppCredentials: trusts serviceUrl with\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/README.md",
    "content": "# Channel-to-Bot Authentication and Authorization\n\n### *Prerequisite*\nIt is helpful to read the [Authentication](https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication?view=azure-bot-service-3.0#connector-to-bot) documentation before reading this article. This Channel-to-Bot article expands further into the Bot Framework SDK layer details.\n\n___\n\nIn order for Channels and Bots to communicate with each other securely, the framework implements OAuth 2.0 authorization flows with [OpenID Connect](https://openid.net/connect/) authentication. For a Channel to send activities to a Bot, the Bot must receive a Token, detailing that the Channel is *authorized* to send activities to the Bot.\n\n![Channel with Token communicates with Bot](./SimpleChannelWithTokenToBot.svg \"Channel with Token communicates with Bot\")\n\nWhen using the Bot Framework SDK and the default `BotFrameworkAdapter` (i.e. not a custom adapter), the Activity flow includes the Connector layer in between the Channel and Bot. The Connector is part of Azure Bot Service in the cloud, that allows Bots to exhange messages with multiple Channels configured through the Azure portal.\n\n![ChannelsToABSLayerToBot](./ChannelsToABSLayerToBot.svg \"Channels to ABS layer to Bot\")\n\n___\n\n## **Scenario: User Sends a Message from Channel to Bot**\n\n- [Overview of Channel to Bot Auth Flow](#overview-of-channel-to-bot-auth-flow)\n- [Details on Signing in Auth Flows](#details-on-signing-in-auth-flows)\n- [Verifying Tokens from Inbound Requests to Your Bot in the SDK](#verifying-tokens-from-inbound-requests-to-your-bot-in-the-sdk)\n\n### **Overview of Channel to Bot Auth Flow**\n\n*User at Channel sends message to Bot*\n\n![Why Hello Bot!](./WhyHelloBot.svg \"Why Hello Bot!\")\n\nOAuth participants in this scenario:\n- **Channel**: OAuth Client\n- **Connector**: Authorization Server (AS) or Identity Provider (IdP)\n- **Bot**: Protected Resource or the external service the client is trying to access\n\nFor more information on OAuth fundamentals regarding what exactly the components in OAuth flows are, see [Azure Active Directory V2 Protocols documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols).\n\nDepending on the request scenario, the User or the Channel itself first authenticates to the authorization endpoint of the Connector (`\"/oauth2/v2.0/authorize\"`), then authorizes the Channel to send messages to the Bot. To ensure the security of this authorization, the Connector, following [OpenID Connect](https://openid.net/connect/) standards, implements [JSON Object Signing and Encryption](https://www.iana.org/assignments/jose/jose.xhtml) (JOSE) specifications; after the Channel authenticates and authorizes at the Connector, the Connector creates an access token and an identity token, [asymmetrically signing](https://openid.net/specs/openid-connect-core-1_0.html#Signing) both. \n\n*Channel Acting on Behalf of Itself*\n![\"Auth Flow - Channel Acting on Behalf of Self\"](./ChannelActingOnBehalfOfSelf.svg \"Auth Flow - Channel Acting on Behalf of Self\")\n\n*Channel Acting on Behalf of User*\n![Channel Acting on Behalf of User](./ChannelActivingOnBehalfOfUser.svg \"Channel Acting on Behalf of User\")\n\nThe Channel's request hits the Bot's `\"api/messages\"` endpoint, where the SDK verifies the validity of the Token (sent in the Authorization header of the request) before allowing the request to process with the Bot's business logic. \n\n___\n\n### **Details on Signing in Auth Flows**\n- [JWT Anatomy](#jwt-anatomy)\n- [Signing Tokens](#signing-tokens)\n\n#### **JWT Anatomy**\nTokens issued by the Bot Framework in auth flows are structured tokens conforming to [JSON Web Token](https://tools.ietf.org/html/rfc7519) (JWT) formatting. (Conversationally prounounced as \"jot\") . The anatomy of a JWT is: `header.payload.signature`, with the three parts separated by periods. Each value between the periods are Base64URL-encoded. \n\n*JWT Anatomy (Plaintext) - Example of a Token that a Bot Receives on an Inbound Request*\n\n![JWT Anatomy](./JwtAnatomy.png \"JWT Anatomy\")\n\n- **Header** - JSON Object used to describe information about the rest of the token and describes the cryptographic operations applied.\n- **Payload** - JSON Object with a set of claims about the authorization.\n- **Signature** - [JSON Web Signature (JWS)](https://tools.ietf.org/html/draft-jones-json-web-signature-04). Optional.\n\nFor definition on each of the claims, see [Microsoft identity platform access tokens](https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens). Claims in token may vary in different auth flows.\n\nIn order to prevent the token from being maliciously manipulated, the Connector ensures to sign all tokens it issues.\n\n#### **Signing Tokens**\n\n*Participants Involved with the Token's Signature*\n\n![Token Signature Participants](./TokenSignatureParticipants.svg \"Token Signature Participants\")\n\nTo armor tokens from attacks, the Connector [asymmetrically signs](https://openid.net/specs/openid-connect-core-1_0.html#Signing) tokens when it issues them. This essentially means that it uses a *private key* to sign the token, and then the Bot uses the Connector's *public key* to verify the token. To sign, the Connector needs to use a cryptographic algorithm and a key ([JWK](https://tools.ietf.org/html/rfc7517)). For example, using the [RS256](https://tools.ietf.org/html/rfc7518) signature method to sign a JWT with an [RSA key](https://simple.wikipedia.org/wiki/RSA_algorithm).\n\n![Public and Private RSA Keys](./RsaKeys.png \"Public and Private RSA Keys\")\n\nThe Connector publishes [OpenID metadata documents](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata) that describes its token service's configuration. \n\n*OpenID Metadata Snippet*\n\n```json\n{\n    \"authorization_endpoint\": \"https://login.microsoftonline.com/common/oauth2/v2.0/authorize\",\n    \"token_endpoint\": \"https://login.microsoftonline.com/common/oauth2/v2.0/token\",\n    \"token_endpoint_auth_methods_supported\": [\n        \"client_secret_post\",\n        \"private_key_jwt\",\n        \"client_secret_basic\"\n    ],\n    \"jwks_uri\": \"https://login.microsoftonline.com/common/discovery/v2.0/keys\",\n    \"issuer\": \"https://login.microsoftonline.com/{tenantid}/v2.0\",\n    \"id_token_signing_alg_values_supported\": [\"RS256\"],\n    \"userinfo_endpoint\": \"https://graph.microsoft.com/oidc/userinfo\"\n    ...\n}\n```\n\n- Included in this document, is the location of the public keys that the Connector uses to sign JWTs. The location is a well-known, static endpoint (`\"https://login.microsoftonline.com/common/discovery/v2.0/keys\"`). \n- See more information on OpenID metadata document in [Microsoft identity platform and OpenID Connect protocol](https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc#fetch-the-openid-connect-metadata-document).\n\nBack in the JWT's header, it specifies the id of the key (`kid`)--as the Connector can publish multiple public keys--and the signing algorithm (`alg`) used to sign the token, which the Bot uses in its verification process of the signature.\n\n___\n\n### **Verifying Tokens from Inbound Requests to Your Bot in the SDK**\n\n#### Higher Level View of Channel's Token Authentication in the Bot Framework SDK \nWhen a User at a Channel sends your Bot a message, the Bot Framework SDK validates the Token, to ensure the Channel's been authorized to communicate with the Bot first. \n\n![Authentication of the Token sent from Channel](./HigherLevel_TokenAuthentication.svg \"Authentication of the Token sent from Channel\")\n\nThe User's message sent from the Channel comes in as a request via the Bot's \"`api/messages`\" endpoint, where the request gets passed to the Adapter first. At the Adapter, the request is deserialized into an Activity object (a shape that your Bot understands how to consume), and the Channel's Token (sent via request's Authorization header) is checked with the SDK's `JwtTokenValidation`. Only if the Token is valid, will the Channel's request be allowed to reach the Bot's business logic.\n\n#### Inbound Request's Token Authentication Details\n\n`JwtTokenValidation.authenticateRequest()` houses the Bot Framework SDK's OAuth 2.0 and OpenID Connect flow patterns discussed in [Details on Signing in Auth Flows](#details-on-signing-in-auth-flow). First it identifies what Channel is trying to communicate with the Bot to then determine what is the appropriate OpenID metadata document to grab. Using the location specified in the medata document, the SDK will then proceed to get the public key counterpart to the private key that the Connector used to sign the Token. Subsequently, the SDK will ensure that the [Token's claims pass multiple checks](https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-connector-authentication?view=azure-bot-service-3.0#step-4-verify-the-jwt-token) before saving the Token's content in the form of a `ClaimsIdentity`. After obtaining the identity, `authenticateRequest()` also adds the host of the Activity's `serviceUrl` to the list of trusted hosts.\n\n*JwtTokenValidation Class Diagram - Participants in Token Validation*\n\n![JwtTokenValidation Class Diagram](./JwtTokenValidationClassDiagram.svg \"JwtTokenValidation Class Diagram\")\n\n*`authenticateRequest()` Sequence Diagram*\n![JwtTokenValidation.authenticateRequest()](./AuthenticateRequest.svg \"JwtTokenValidation.authenticateRequest()\")\n1. The `ChannelValidation` class in this auth flow depends on what Channel is communicating with the Bot. This class has Channel-specific validations. The appropriate validation class could be:\n    - `ChannelValidation`\n    - `EnterpriseChannelChannelValidation`\n    - `EmulatorValidation`\n    - `SkillValidation`\n    - `GovernmentChannelValidation` (excluding C#)\n\n2. Get Connector's public signing key from location specified in the OpenID metadata document.\n3. Validate endorsements if key specifies that they are needed for the specific Channel that is communicating with Bot.\n"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/SimpleChannelWithTokenToBot_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        Channel -- Token --> Bot(Bot)\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/TokenSignatureParticipants_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n\n        Connector --signs token with --> Private{Private Key}\n\n        Bot -- gets location of Public Key with --> Metadata>OpenID Metadata]\n        Bot([Bot]) --verifies token with --> Public{Public Key}\n        Metadata -. has location of .-> Public\n\n        Connector -- publishes --> Public\n        Connector -- publishes --> Metadata\n\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/WhyHelloBot_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        Channel -- \"#quot;Why hello, Bot!#quot;\" --> Bot(Bot)\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/AuthServerAuthenticatesUser_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n    User -- Authenticates Identity at --> AuthServer[/Authorization Server\\]\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/AuthServerIssuesTokenToBot_DiagramSource.md",
    "content": "```mermaid\n    graph LR\n        AuthServer[/Authorization Server\\] -- Issues Token --> Bot(Bot) -- Makes Request with Token --> ProtectedResource{{Protected Resource}}\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/GiveBotAccessToProtectedResource_DiagramSource.md",
    "content": "```mermaid\n    graph  LR\n    User --> Bot(Bot) -- Token --> ProtectedResource{{Protected Resource}}\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/HighLevelAuthFlowSequenceDiagram_DiagramSource.md",
    "content": "```mermaid\n    sequenceDiagram\n\n    participant User\n    participant Bot\n    participant Azure\n    Note over Azure: Azure AD\n    Note over Azure: BF Token Service\n    Note over Azure: Secure Token Store\n    participant Resource as Protected Resource\n    \n    User ->> Bot: Send an email\n    Bot -->> User: Bot requests authorization * 1\n    User ->> Azure: User authorizes Bot at Azure * 2\n    Azure -->> Bot: Access Token\n    Bot ->> Resource: Bot calls API at Protected Resource to send an email on the User's behalf\n```\n1. The Bot is asking for permission to access the Protected Resource (in this case, the User's email service) on the User's behalf\n2. There are multiple types of OAuth flows that can take place here in order to authenticate the User (owner of the Protected Resource) and authorize the Bot (authorization code, client credentials, etc.). This high-level diagram excludes the various \"OAuth dance\" that could occur here.\n\n3. **OAuth Participants**:\n    - **User**: The User is the owner of the Protected Resource that the OAuth Client wants to access. User normally interacts via Channel or browser.\n    - **OAuth Client**: In this example the Bot is what is known in OAuth as the *OAuth Client*. The OAuth Client is the party who acquires a Token to request access to a Protected Resource on behalf of the resource's owner\n    - **Authorization Server**: The Authorization Server is responsible for validating that the User's identity as the owner of the Protected Resource, as well issuing Tokens to authorized parties (such as to the OAuth Client). The Authorization Server is trusted by the Protected Resource--as in, the Protected Resource trusts Tokens issued by a specific Authorization Server\n    - **Protected Resource**: The external service that the OAuth Client wants to access on behalf of the owner. (i.e. the *resource* that we want to access)\n    "
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/OAuthPrompt_BeginDialog_DiagramSource.md",
    "content": "# `OAuthPrompt.BeginDialogAsync()` Flow\n\n```mermaid\n    graph TD\n        Start((Start)) --> PromptOptions\n        \n        subgraph Initialize State\n            PromptOptions[Persist PromptOptions] --> AttemptCount[Increment Attempt Count]\n            AttemptCount --> Timeout[Persist Prompt Timeout]\n        end\n        \n        Timeout --> GetUserToken{\"adapter.GetUserToken()\"}\n        GetUserToken -- Got Token Successfully--> ReturnToken[End OAuthPrompt and Return Token]\n        GetUserToken -- No Token --> SendOAuthCard[\"SendOAuthCardAsync()\"]\n        SendOAuthCard --> EndOfTurn[Dialog.EndOfTurn]\n\n        ReturnToken --> End((End))\n        EndOfTurn --> End((End))\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/OAuthPrompt_ContinueDialog_DetailedView_DiagramSource.md",
    "content": "## Detailed View\n\n```mermaid\n    graph TD\n        Start((Start)) --> ResponseType{What Type is the Activity?}\n        subgraph Recognize Token\n            ResponseType -- Token Response Event --> TokenResponseActivity[Parse token values from TurnContext]\n            \n            ResponseType -- Teams Invoke --> CreateOAuthClient[Create OAuthClient]\n\n            ResponseType -- Message --> MagicCode[Get Magic Code from Message]\n            MagicCode --> CreateOAuthClient\n            \n            subgraph Use Adapter to Get User Token\n                CreateOAuthClient --> GetUserTokenAsync[Get Token using OAuthClient]\n            end\n\n            GetUserTokenAsync --> TeamsOrMessage{Teams Invoke or Message Activity Type?}\n\n            TeamsOrMessage -- Teams --> TeamsGotTokenCheck{Did adapter successfully get token from ABS?}\n            TeamsGotTokenCheck -- No --> TeamsError[Bot Adapter sends 404 or 500]\n            TeamsGotTokenCheck -- Yes --> TeamsSuccess[Bot Adapter sends 200]\n\n            TeamsOrMessage -- Message --> ReturnRecognizeTokenResult[Return Recognize Token result]\n            TokenResponseActivity --> ReturnRecognizeTokenResult\n            TeamsError --> ReturnRecognizeTokenResult\n            TeamsSuccess --> ReturnRecognizeTokenResult\n        end\n\n        ReturnRecognizeTokenResult --> Timeout{Have we timed out waiting for user to authenticate?}\n        subgraph Check Timeout\n            Timeout -- Yes --> EndDialogNoResult[EndDialog with no result]\n            Timeout -- No --> State[Grab persisted state and options, and increment attempt count +1]\n        end\n\n        subgraph Run Prompt Validator\n            State --> Validate[Validate value from RecognizeToken operations]\n            Validate --> IsValid{Is the recognized result valid?}\n            \n            IsValid -- Yes --> EndDialogReturningValue[EndDialog returning the recognized Token value]\n            IsValid -- No --> HasReprompt{Do we have a Reprompt fallback?}\n\n            HasReprompt -- Yes --> Reprompt\n            HasReprompt -- No --> EndOfTurn[return EndOfTurn]\n        end\n        EndDialogReturningValue --> End((End))\n        Reprompt --> End((End))\n        EndOfTurn --> End((End))\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/OAuthPrompt_ContinueDialog_HigherLevel_DiagramSource.md",
    "content": "# `OAuthPrompt.ContinueDialogAsync()` Flow\n\n## Higher Level\n\n```mermaid\n    graph TD\n    Start((Start)) --> RecognizeToken[Run Token Recognizer and try to get Token]\n    RecognizeToken --> Timeout{Did we time out waiting for user to authenticate?}\n    Timeout -- Yes --> EndDialogNoResult[EndDialog with no result]\n    Timeout -- No --> Validator[Run any Prompt Validators]\n    Validator --> IsValid{Is the Recognized Result valid?}\n    IsValid -- Yes --> EndDialogReturningValue[EndDialog returning the recognized Token value]\n    IsValid -- No --> RepromptOrEndTurn[Reprompt User or End Turn]\n\n    EndDialogNoResult --> End((End))\n    EndDialogReturningValue --> End((End))\n    RepromptOrEndTurn --> End((End))\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/README.md",
    "content": "## `OAuthPrompt` Behavioral Flow Charts\n\n- In order to access a **protected resource**, the **bot** must send the **user** to the **authorization server** or identity provider (in our samples we use AAD)\n- Once user is at AAD, the user must:\n    - Authenticate their identity (they are who they say they are)\n    - Authorize the bot to access the protected resource on the user's behalf (delegating limited power, not the user's entire power, in the form of approving certain scopes)\n        - In the process of designing the bot, you already specified *what scopes (permissions)* the bot would need to perform whatever function that bot was built to do, which are the scopes that the user is prompted to authorize\n        - See [Add authentication to your bot via Azure Bot Service](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0&tabs=csharp) for more detail on scopes\n- Once authenticated and authorized, AAD sends the bot the token needed to access the protected resource\n\nBot Framework's `OAuthPrompt` provides a way to send the User to AAD in order to obtain a token. Bot developers do not have to manage token lifecycles, storage, nor proper redirects in the OAuth flow.\n\n#### `OAuthPrompt.BeginDialogAsync()` Flow\n\n![OAuthPromptBeginDialogFlow](./OAuthPrompt_BeginDialog.svg \"OAuthPrompt.BeginDialogFlow()\")\n\n#### `OAuthPrompt.ContinueDialogAsync()` Flow\n\n*Higher Level*\n\n![HigherLevelOAuthPromptContinueDialogFlow](./OAuthPrompt_ContinueDialog_HigherLevel.svg \"Higher Level OAuthPrompt.ContinueDialogFlow()\")\n\n*Detailed View*\n\n![DetailedViewOAuthPromptContinueDialogFlow](./OAuthPrompt_ContinueDialog_DetailedView.svg \"Detailed View OAuthPrompt.ContinueDialogFlow()\")\n\n"
  },
  {
    "path": "docs/umlDiagrams/Authentication/README.md",
    "content": "# Authentication in Bot Framework\nHow authentication is integrated into the Bot Framework.\n\n- [High Level Authorization Flow Using OAuth 2.0](#high-level-authorization-flow-using-oauth-2.0)\n- [Adding Authentication to Your Bot](#adding-authentication-to-your-bot)\n- [Channel to Bot Authentication and Authorization](#channel-to-bot-authentication-and-authorization)\n- [Architecture of Authentication in Bot Framework](#architecture-of-authentication-in-bot-framework)\n- [`OAuthPrompt`](#oauthprompt-behavioral-flow-charts)\n\n___\n\n## **High Level Authorization Flow Using OAuth 2.0**\n\nWithin Bot Framework, an OAuth flow typically boils down to your **bot** wanting to access a **protected resource** on behalf of the **user** (i.e. the **resource owner**). In order to do this, we must verify that the user is someone who has the authority to access the protected resource, and can in turn also delegate part of their authority to the bot to access the resource.\n\nThe protected resource accepts an access *token* as \"proof\" that the bot has been delegated permission to access it. The token acts as a limited-access key. \n\nThe access token is used, because:\n- It does not expose the user's log-in credentials for the protected resource to the bot\n    - Bot cannot impersonate user\n- Provides scopes (subset of functions or permissions) that the user allows the bot to perform\n    - This thus allows the user to limit the actions the bot can do on his/her behalf\n    - For example, a bot may be granted permission to read your social media contacts, but it cannot send messages to them or delete any of them\n\n**Giving Bot Access to the Proteced Resource**\n\nGoal:\n\n![Giving Bot Access to Protected Resource](./HighLevelAuthFlow/GiveBotAccessToProtectedResource.svg \"Giving Bot Access to Protected Resource\")\n\nAnother participant in the OAuth flow is the **authorization server (AS)** or identity provider (IdP). An Azure Active Directory (AAD) app is an example of an identity provider in the cloud. AAD:\n- Authenticates users\n- Provides access tokens to authorized clients\n\nYou can register AS/IdP to your bot from within Azure Bot Service.\n\nThe protected resource trusts tokens issued from specified authorization servers. (OAuth protocol does not specify how the trust is established between the protected resource and the authorization server, only that it does happen--allowing for flexibility at the same time as mandating what is necessary for security.)\nWhen a user wants the bot to access the protected resource, the bot sends the user to the authorization server to allow the user to authorize the bot to access the resource. Once authorized, the authorization server sends the acess token to the bot. The bot can now use the external service, making sure to include the token in its calls to the resrouce's API.\n\n**Authenticating**\n\n![User Authenticates Identity at Authorization Server](./HighLevelAuthFlow/AuthServerAuthenticatesUser.svg \"User Authenticates Identity at Authorization Server\")\n\n**Issue Token to Authorized Bot and Make Request with Token on Behalf of User**\n\n![Authorization Server Issues Token to Authorized Bot](./HighLevelAuthFlow/AuthServerIssuesTokenToBot.svg \"Auth Server issues Token to Bot\")\n\n\n**High Level View of OAuth Flow in Bot Framework**\n\nSequence diagram of the authentication and authorization flow that takes place when a user asks a bot to send an email on their behalf.\n\n![High Level View Of OAuth Flow In BotFramework](./HighLevelAuthFlow/HighLevelAuthFlowSequenceDiagram.svg)\n\nFor more information on foundational OAuth concepts, see [Azure Active Directory V2 Protocols documentation](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols).\n___\n\n## **Adding Authentication to Your Bot**\nContains diagrams of adding authentication to your bot as described by examples in BF documentation.\n\n*Click to view diagrams of the following articles:*\n- *[User authentication within a conversation](#example-scenario-described-in-user-authentication-within-a-conversation-docs)*\n- *[Add authentciation to your bot via Azure Bot Service](#example-scenario-described-in-add-authentication-to-your-bot-via-azure-bot-service)*\n___\n\n### **Example scenario described in [User authentication within a conversation](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-authentication?view=azure-bot-service-4.0) docs**\n\nIllustrating example in [User authentication within a conversation](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-authentication?view=azure-bot-service-4.0#about-the-bot-framework-token-service), deep diving into the details of OAuth flow with the user, Bot Framework Token Service and the bot.\n\n> \"For example, a bot that can check a user's recent emails, using the Microsoft Graph API, will require an Azure Active Directory user token. At design time, the bot developer would register an Azure Active Directory application with the Bot Framework Token Service (via the Azure Portal), and then configure an OAuth connection setting (named `GraphConnection`) for the bot.\"\n\n#### Goal\n\n![Authentication Docs Example -- Goal](./AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_Goal.svg \"Authentication Docs Example -- Goal\")\n\nIt's helpful to preview the architecture in [this block diagram](../ActivityFlow/README.md#activity-flow-participants) of participants in the flow of an activity and in the [Authenctication doc](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-authentication?view=azure-bot-service-4.0) example before diving into the detailed \"OAuth dance\" in the sequence diagram following.\n\n#### Detailed View\n\n**OAuth Flow - no access token stored in Token Service's Token Storage yet**\n\n![Authentication Doc Example - No Token in Storage](./AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_OAuthFlow_NoTokenToStart.svg \"AuthenticationDocExample - OAuth Flow - No Token in Storage Yet\")\n\n1. Authorization Server (AS).\n    * The AS can be within Azure, such as using AAD as our token provider, or outside of Azure as well, like in the case of using GitHub as the AS.\n2. There are many different authorization grants, or OAuth flows, that detail how exactly how to use the identity of the owner of the protected resource in exchange for an access token (e.g. authorization code, client credentials, device code, refresh token, implicit, etc.)\n\n**OAuth Flow - access token already stored in Token Service's Token Storage**\n\n![Authentication Doc Example - Token in Storage Already](./AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_OAuthFlow_HasTokenInStorage.svg \"AuthenticationDocExample - OAuth Flow - Token in Storage Already\")\n\n___\n### **Example scenario described in [Add authentication to your bot via Azure Bot Service](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0&tabs=csharp)**\n\nThis section diagrams the concepts introduced in the [Add authentication to your bot via Azure Bot Service](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0&tabs=csharp), which is linked in our [authentication samples](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples)' READMEs. \n\n**Higher Level**\n\n![Higher Level - Add authentication to your bot via Azure Bot Service](./AddingAuthenticationToYourBot/AddAuthenticationToYourBotViaABS/HigherLevel.svg \"Higher Level - Add authentication to your bot via Azure Bot Service\")\n\n* AAD is an Identity Provider, used as the authorization server to which:\n    * User authenticates their identity to, and authorizes bot to act on their behalf\n    * If authenticated, then auth server provides the bot with an access token\n* Protected Resource separately sepcifies which auth servers it trusts to issue Tokens\n* Bot can use the token obtained from auth server in its requests to access the protected resource's APIs\n\n**Detailed View**\n\n![\"Detailed View - Add authentication to your bot via Azure Bot Service\"](./AddingAuthenticationToYourBot/AddAuthenticationToYourBotViaABS/DetailedView.svg \"Detailed View - Add authentication to your bot via Azure Bot Service\")\n\n* *Created automatically when creating a Web App Bot in Azure Portal\n* ** Auth Server can be AAD, GitHub, Uber, FB, etc. \n    * Auth Server simply must be a provider that the Protected Resource trusts and can consume Tokens issued from\n\n___\n\n## Channel to Bot Authentication and Authorization\nSee [Channel-to-Bot Authentication and Authorization](./ChannelToBot/README.md).\n\n___\n\n## `OAuthPrompt` Architecture\nClass diagrams and flow charts illustrating the structural components related to authentication using an `OAuthPrompt`.\n\n### **Adapter and `TurnContext`**\n\n![ProcessActivity creates TurnContext](./AuthArchitectureInBotFramework/OAuthPrompt/ProcessActivityCreatesTurnContext.svg \"ProcessActivity creates TurnContext\")\n\nOn `TurnContext` Initialization\n\n![Adapter saved as member on TurnContext](./AuthArchitectureInBotFramework/OAuthPrompt/AdapterSavedAsTurnContextMember.svg \"Adapter saved as member on TurnContext\")\n\n`OAuthPrompt` has various methods* that uses `BotFrameworkAdapter` within its logic:\n\n![Takes Adapter from TurnContext](./AuthArchitectureInBotFramework/OAuthPrompt/TakesAdapterFromTurnContext.svg \"Takes Adapter from TurnContext\")\n\n* Methods in `OAuthPrompt` that use this adapter: `BeginDialogAsync()`, `GetUserTokenAsync()`, `SignUserOutAsync()`, `SendOAuthCardAsync()`, `RecognizeTokenAsync()`\n\n### **Class Diagrams of `OAuthPrompt` and How It Acquires Tokens**\n- [C#](#c-how-oauthprompt-retrieves-a-token)\n- [JS](#js-how-oauthprompt-retrieves-a-token)\n\nNotes:\n- These class diagrams obscure some class properties in order to better highlight the portions related specifically to authentication and authorization.\n- Class diagrams are *read from top to bottom* (regarding the relativity of which class the link notes pertain to)\n\n#### **C#: How `OAuthPrompt` Retrieves a Token:**\n\n`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ICredentialTokenProvider` to acquire tokens.\n\n![OAuthPrompt and Token Provider](./AuthArchitectureInBotFramework/OAuthPrompt/CSharp_OAuthPromptAndTokenProvider.svg \"OAuthPrompt and Token Provider\")\n\n\n#### Use `AppCredentials` to create an `OAuthClient`\n- The `OAuthPrompt`'s `ICredentialTokenProvider` creates an `OAuthClient` to send a request to get a token.\n- You must use `ServiceClientCredentials` in order to initialize an `OAuthClient` instance.\n\n![Use AppCredentials to create OAuthClient](./AuthArchitectureInBotFramework/OAuthPrompt/CSharp_UseAppCredentialsToCreateOAuthClient.svg \"Use AppCredentials to create OAuthClient\")\n\n#### `AppCredentials` Class Diagram\n\n![AppCredentials Class Diagram](./AuthArchitectureInBotFramework/OAuthPrompt/CSharp_AppCredentialsClassDiagram.svg \"AppCredentials Class Diagram\")\n* `ServiceClientCredentials` is an [MS REST class](https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclientcredentials?view=azure-dotnet).\n\n#### Participants Involved in Building `AppCredentials`\n\n![BuildAppCredentials Participants](./AuthArchitectureInBotFramework/OAuthPrompt/BuildAppCredentialsParticipants.svg \"BuildAppCredentials Participants\")\n\n\n#### `BotFrameworkAdapter` Creates `OAuthClient`\n\n![BotFrameworkAdapter creates OAuthClient](./AuthArchitectureInBotFramework/OAuthPrompt/BotFrameworkAdapterCreatesOAuthClient.svg \"BotFrameworkAdapter creates OAuthClient\")\n\nYou can see a more formal flow chart on creating an `OAuthClient` logic [here](./AuthArchitectureInBotFramework/OAuthPrompt/CreatingOAuthClientInMoreDetail.md).\n\n#### `OAuthClient` Class Diagram\n\n![OAuthClient Class Diagram](./AuthArchitectureInBotFramework/OAuthPrompt/OAuthClientClassDiagram.svg \"OAuthClient Class Diagram\")\n* `HttpOperationResponseTokenResponse` should be `HttpOperationResponse<TokenResponse>` (diagram tool breaks on special chars in class diagram).\n* `ServiceClient` is an [MS REST class](https://docs.microsoft.com/en-us/dotnet/api/microsoft.rest.serviceclient-1?view=azure-dotnet).\n\n#### **JS: How `OAuthPrompt` Retrieves a Token:**\n\n`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ExtendedUserTokenProvider` to acquire tokens.\n\n![OAuthPrompt and Token Provider Class Diagram](./AuthArchitectureInBotFramework/OAuthPrompt/JS_OAuthPromptAndTokenProvider.svg \"OAuthPrompt and Token Provider Class Diagram\")\n\n#### Use `AppCredentials` to create a `TokenApiClient`\n- The `OAuthPrompt`'s `ExtendedUserTokenProvider` creates a `TokenApiClient` to send a request to get a token.\n- You must use `ServiceClientCredentials` in order to initialize an `TokenApiClient` instance.\n\n![Use AppCredentials to create a TokenApiClient](./AuthArchitectureInBotFramework/OAuthPrompt/JS_UseAppCredentialsToCreateTokenApiClient.svg \"Use AppCredentials to create a TokenApiClient\")\n\n#### `AppCredentials` Class Diagram\n\n![AppCredentials class diagram](./AuthArchitectureInBotFramework/OAuthPrompt/JS_AppCredentialsClassDiagram.svg \"AppCredentials class diagram\")\n* `ServiceClientCredentials` is an [ms-rest interface](https://github.com/Azure/ms-rest-js/blob/master/lib/credentials/serviceClientCredentials.ts).\n\n#### `BotFrameworkAdapter` Creates `TokenApiClient`\n\n![BotFrameworkAdapter creates TokenApiClient](./AuthArchitectureInBotFramework/OAuthPrompt/BotFrameworkAdapterCreatesTokenApiClient.svg \"BotFrameworkAdapter creates TokenApiClient\")\n\n#### `TokenApiClient` Class Diagram\n\n![TokenApiClient Class Diagram](./AuthArchitectureInBotFramework/OAuthPrompt/TokenApiClientClassDiagram.svg \"TokenApiClient Class Diagram\")\n* `TokenApiClient` and `TokenApiClientContext` are classes generated by auto-rest.\n* `ServiceClient` is an [msrest class](https://github.com/Azure/ms-rest-js/blob/master/lib/serviceClient.ts).\n\n___\n\n## `OAuthPrompt` Behavioral Flow Charts\n\nSee [`OAuthPrompt` Behavioral Flow Charts](./OAuthPrompt/README.md).\n"
  },
  {
    "path": "dri/.gitignore",
    "content": "__pycache__\nbotreport_*\nmembers-do-not-check-in.txt\n"
  },
  {
    "path": "dri/README.md",
    "content": "# Git Stats for Bot Framework\r\n\r\nCommand line tool to view active/aging issues associated with the Bot Framework Github repos.\r\n\r\nRequires Python.\r\n\r\nCurrently performs the following (for repos managed by the Bot Framework):\r\n- Filters out Microsoft employees or vendors\r\n- Count of  **total issues** after `7/1/1019`.\r\n- Issues that don't contain the **`Bot Services`** label.\r\n- Issues that don't contain the **`customer-reported`** label.\r\n- Issues that don't contain the  **`customer-replied-to`** label.\r\n- Issues that are endanger of not being closed within 90 days.\r\n- Outputs to local console and generates a HTML report.\r\n\r\n### Setup\r\n\r\nInstall dependent package **(note: admin mode may be required.)**\r\n\r\n```bash\r\npip install -r requirements.txt\r\n```\r\n### Set your Git Credentials\r\nThis tool uses a personal access token to authenticate with Github.\r\n\r\n- Go to https://github.com/settings/tokens\r\n- Click on \"Generate new token\"\r\n  - Give note like \"Bot DRI tool\"\r\n  - Check the \"`repo`\" check box (and all items underneath)\r\n  - Copy the token value (don't worry you can regen if you forget it)\r\n - On command line:\r\n          Windows: `set GIT_PERSONAL_TOKEN=<your token>`\r\n\r\n          Powershell: `$env:GIT_PERSONAL_TOKEN=\"<your token>\"` (Note the quotes)\r\n\r\n          Linux: `export GIT_PERSONAL_TOKEN=<your token>`\r\n\r\n - To permanently set into your environment variables in Windows:\r\n\r\n          `setx GIT_PERSONAL_TOKEN <your token>`\r\n\r\n### Run\r\n```bash\r\npython report.py\r\n```\r\n  >Note: The first time you run, the Microsoft organizations members will be cached on disk.  This will take **several** minutes.\r\n\r\nSample Output:\r\n```bash\r\nPS D:\\python\\github\\botframework-sdk\\dri> python report.py\r\nBot Framework SDK Github Report\r\n===============================\r\nRepo: microsoft/BotFramework-DirectLine-DotNet:\r\n   Total issues after 2019-07-01 00:00:00 : 0\r\n   No \"Bot Services\": Count: 0\r\n   No \"Customer Reported\": Count: 0\r\n   No \"Customer Replied\": Count: 0\r\n   90-day stale : Customer issues older than 60 days: 0\r\nRepo: microsoft/BotFramework-Composer:\r\n   Total issues after 2019-07-01 00:00:00 : 76\r\n   No \"Bot Services\": Count: 0\r\n   No \"Customer Reported\": Count: 0\r\n   No \"Customer Replied\": Count: 0\r\n   90-day stale : Customer issues older than 60 days: 0\r\n...\r\n```\r\n\r\n\r\n### Care and feeding\r\n\r\nTo filter out people (ie, consultants) which aren't subject to monitoring, edit the `report.py` and add the github alias (all lowercase) to the `MICROSOFT_EMPLOYEES` list.\r\n\r\nTo add new milestones labels (issues with milestone labels are filtered out), edit the `helpers.py` file and add the milestone label to `MILESTONE_LABELS` list.\r\n\r\nEnjoy!\r\n"
  },
  {
    "path": "dri/helpers.py",
    "content": "# Copyright (c) Microsoft Corporation. All rights reserved.\n# Licensed under the MIT License.\n\n\"\"\"\nhelpers.py\n\nPerforms filtering and other git helpers.\n\nSee README.md for details on installing/using.\n\n\"\"\"\n\nimport copy\nimport os\nfrom datetime import datetime, timedelta\n\nBOT_SERVICES_LABEL = 'Bot Services'\nCUSTOMER_REPORTED_LABEL = 'customer-reported'\nSUPPORTABILITY_LABEL = 'supportability'\nCUSTOMER_REPLIED_TO_LABEL = 'customer-replied-to'\nADAPTIVE_LABEL = 'adaptive'\nBUG_LABEL = 'bug'\nEXEMPT_FROM_DAILY_DRI_REPORT_LABEL = 'ExemptFromDailyDRIReport'\nMILESTONE_LABELS = [\n    '4.5',\n    '4.6',\n    '4.7',\n    '4.8',\n    'R7',\n    'R8',\n    'R9',\n    'R10',\n    'R11',\n    'Backlog',\n    'backlog',\n    'feature-request',\n]\n\n# pylint: disable=missing-docstring, line-too-long\n\ndef filter_stale_customer_issues(issue, days_old=60):\n    \"\"\"Filter stale customer issues.\n    Return True if it should filter the issue.\n    \"\"\"\n    if filter_milestone_label(issue):\n        return True\n    return not issue.created_at + timedelta(days=days_old) < datetime.now()\n\ndef last_touched_by_microsoft(issue, microsoft_members) -> bool:\n    comments_paged = issue.get_comments()\n    comment = [msg for msg in comments_paged][-1]\n    assert comment\n    return comment.user.login.strip().lower() in microsoft_members\n\ndef get_msorg_members(github, refresh_in_days=5):\n    \"\"\"Get members of the Microsoft github organization.\n    This is cached in the `members.txt` file.\n    If it gets stale (over `refresh_in_days` old), then refresh it.\n    \"\"\"\n\n    # See if we need to refresh the cache\n    members_fname = './members-do-not-check-in.txt'\n\n    member_updated = datetime.fromtimestamp(os.path.getmtime(members_fname))\\\n        if os.path.exists(members_fname) else datetime.min\n    if datetime.now() - timedelta(days=refresh_in_days) > member_updated:\n        print('Your members cache is out of date.  Refreshing.. (Could take several minutes)')\n        ms_org = github.get_organization('microsoft')\n        members = ms_org.get_members()\n        with open(members_fname, 'w') as member_file:\n            for member in members:\n                member_file.write(f'{member.login}\\n')\n    with open(members_fname, 'r') as member_file:\n        members = member_file.readlines()\n    return [line.strip().lower() for line in members]\n\ndef filter_azure(repo, issue):\n    if repo.lower() == 'azure/azure-cli':\n        for label in issue.labels:\n            if label.name == 'Bot Service':\n                return False\n        return True\n    return False\n\ndef strfdelta(tdelta, fmt):\n    \"\"\"Utility function.  Formats a `timedelta` into human readable string.\"\"\"\n    d = {\"days\": tdelta.days}\n    d[\"hours\"], rem = divmod(tdelta.seconds, 3600)\n    d[\"minutes\"], d[\"seconds\"] = divmod(rem, 60)\n    return fmt.format(**d)\n\ndef add_last_comment(issue, stale_days=10):\n    \"\"\"Takes an issue, adds the last comment time.\n    Filters items, where the last comment is not at least stale_days old.\n    Returns a copy of the issue.\n    \"\"\"\n    comments_paged = issue.get_comments()\n    if comments_paged.totalCount == 0:\n        return None\n    last_comment = ([msg for msg in comments_paged] or [None])[-1]\n    assert last_comment\n    if last_comment.created_at > (datetime.utcnow() - timedelta(days=stale_days)):\n        # Filter items.\n        return None\n    result = copy.copy(issue)\n    result.last_comment = last_comment.created_at\n    return result\n\ndef filter_bot_service_label(issue):\n    return any(label.name == BOT_SERVICES_LABEL for label in issue.labels)\n\ndef filter_customer_reported_label(issue):\n    return any(label.name == CUSTOMER_REPORTED_LABEL for label in issue.labels)\n\ndef filter_customer_replied_label(issue):\n    return any(label.name == CUSTOMER_REPLIED_TO_LABEL for label in issue.labels)\n\ndef filter_adaptive_label(issue):\n    return any(label.name == ADAPTIVE_LABEL for label in issue.labels)\n\ndef filter_exempt_from_dri_label(issue):\n    return any(label.name == EXEMPT_FROM_DAILY_DRI_REPORT_LABEL for label in issue.labels)\n\ndef filter_milestone_label(issue):\n    if any(label.name in MILESTONE_LABELS or label.name == BUG_LABEL for label in issue.labels):\n         return True\n    elif issue.milestone:\n         return True\n    else:\n         return False\n"
  },
  {
    "path": "dri/output.py",
    "content": "# Copyright (c) Microsoft Corporation. All rights reserved.\n# Licensed under the MIT License.\n\n\"\"\"\noutput.py\n\nOutput functions.\n\nSee README.md for details on installing/using.\n\n\"\"\"\n\nfrom datetime import datetime\nfrom colorama import Fore, Style, init\nfrom helpers import strfdelta\nimport jsonpickle\n\n\n# pylint: disable=missing-docstring, line-too-long\n\n# Initialize colorama\ninit(convert=True)\nFILE_NAME = \"botreport_\" + datetime.now().strftime(\"%Y%m%d_%H%M%S\") + \".html\"\nOUTPUT_FILE = open(FILE_NAME, mode=\"w\", encoding=\"utf-8\")\n\n# Overall container for outputing JSON for UI\nclass OuputIssuesJson():\n    def __init__(self):\n        self.repositories = []\n\n    def write_output(self, file_name = \"botreport_\" + datetime.now().strftime(\"%Y%m%d_%H%M%S\") + \".json\"):\n        with open(file_name, mode=\"w\", encoding=\"utf-8\") as json_file:\n            json_file.write(jsonpickle.encode(self, unpicklable=False))\n\n# Repository output format for UI\nclass OutputRepository():\n    def __init__(self, name):\n        self.name = name\n        self.issues = []\n\n# Issue output format for UI\nclass OutputIssue():\n    def __init__(self, tag, issue):\n        self.tag = tag\n        self.issue = issue\n\ndef print_issue(issue):\n    print(f'        {issue.number} : {issue.title}')\n    print(f'             {issue.html_url}')\n\n    OUTPUT_FILE.write(f'<span class=\"tab2\">{issue.number} : <a href=\"{issue.html_url}\" target=\"_blank\">{issue.title}</a></span>')\n    OUTPUT_FILE.write(\"<br/>\")\n\n    # Uncomment if you want to add labels.\n    # add_label(repo, issue, BOT_SERVICES_LABEL)\n\ndef print_status(text, css=''):\n    print(u''+text)\n    has_css = True if (len(css) > 0) else False\n    if has_css:\n        OUTPUT_FILE.write(f\"<span class='{css}'>\")\n    OUTPUT_FILE.write(f\"{text}</br>\")\n    if has_css:\n        OUTPUT_FILE.write(\"</span>\")\n\n\ndef print_stale_issue(issue):\n    print(f'         {issue.number} : {issue.title}')\n    OUTPUT_FILE.write(f'<span class=\"tab2\">{issue.number} : <a href=\"{issue.html_url}\" target=\"_blank\">{issue.title}</a></span>')\n    OUTPUT_FILE.write(\"<br/>\")\n    print_status(f'            Issue Age: {Fore.RED}{strfdelta(datetime.utcnow() - issue.created_at, \"{days} days {hours}:{minutes}:{seconds}\")}{Style.RESET_ALL}','tab3')\n    print_status(f'            Last Comment: {Fore.RED}{strfdelta(datetime.utcnow() - issue.last_comment, \"{days} days {hours}:{minutes}:{seconds}\")}{Style.RESET_ALL}','tab3')\n    print(f'                 {issue.html_url}')\n\ndef print_break():\n    OUTPUT_FILE.write(\"<br/>\")\n\ndef setup_html():\n    OUTPUT_FILE.write(\"<html>\\n<head>\\n<title>Bot Report</title>\\n\")\n    OUTPUT_FILE.write(\"<style type='text/css'>body{ font-family: Helvetica,Arial,sans-serif; }.tab1 { margin-left: 30px; }.tab2 { margin-left: 60px; }.tab3 { margin-left: 90px; }</style>\\n\")\n    OUTPUT_FILE.write(\"</head>\\n<body>\\n\")\n    return OUTPUT_FILE\n"
  },
  {
    "path": "dri/report.py",
    "content": "# Copyright (c) Microsoft Corporation. All rights reserved.\n# Licensed under the MIT License.\n\"\"\"\nreport.py\n\nGenerates report on Bot Framework issues.\n\nSee README.md for details on installing/using.\n\n\"\"\"\nimport os\nimport sys\nfrom datetime import datetime\nfrom github import Github\nfrom colorama import Fore, Style\nfrom output import print_status, print_issue, print_stale_issue, \\\nOUTPUT_FILE, FILE_NAME, OutputRepository, OuputIssuesJson, OutputIssue, \\\nsetup_html\nfrom helpers import get_msorg_members, last_touched_by_microsoft, filter_azure, \\\nfilter_bot_service_label, filter_adaptive_label, filter_customer_replied_label, \\\nfilter_customer_reported_label, filter_stale_customer_issues, add_last_comment, \\\nfilter_milestone_label, filter_exempt_from_dri_label\n\n\nHOW_TO_SET_CREDS = \"\"\"\nTo set your Git credentials:\n    Go to https://github.com/settings/tokens\n    Click on \"Generate new token\"\n     - Give note like \"SDK tool\"\n     - Check the repo (and everything underneath)\n     - Copy the token value (and store in safe place).\n    On command line:\n      Windows: set GIT_PERSONAL_TOKEN=<your token>\n      Powershell: $env:GIT_PERSONAL_TOKEN=\"<your token>\" (Note the quotes)\n      Linux: export GIT_PERSONAL_TOKEN=<your token>\n\n\"\"\"\n\nGIT_PERSONAL_TOKEN = os.getenv('GIT_PERSONAL_TOKEN')\n\nif not GIT_PERSONAL_TOKEN:\n    print(Fore.RED + '\\nYour GIT CREDENTIALS are not set!!\\n' + Style.RESET_ALL)\n    print(HOW_TO_SET_CREDS)\n    sys.exit(2)\n\n# Github Repos being monitored\nREPOS = [\n    'BotFramework-DirectLine-DotNet',\n    'BotBuilder-V3',\n    'BotFramework-sdk',\n    'botbuilder-dotnet',\n    'botbuilder-js',\n    'botbuilder-python',\n    'botbuilder-java',\n    'botbuilder-samples',\n    'botframework-composer',\n    'botframework-samples',\n    'botframework-solutions',\n    'botframework-emulator',\n    'botframework-webchat',\n    'botbuilder-tools',\n    'botframework-directlinejs',\n    'botframework-cli',\n    # 'azure/azure-cli',\n]\n\n# Do not apply user filters to these repos.\nBYPASS_USERFILTER_REPOS = [\n    'botbuilder-tools',\n]\n\n# Github people filtered out (must be lowercase!)\nMICROSFT_EMPLOYEES = [\n    'automationteamva',\n    'awalia13',\n    'omega1119',\n    'Valentyn-Chornovol',\n    'batta32',\n    'bill7zz',\n    'clearab',\n    'gasparacevedozainsouthworks',\n    'gasper-az',\n    'jonathanfingold',\n    'kumar2608',\n    'shikhamishra11',\n    'washingtonkayaker',\n    'yochay', # Not a MSFT employee anymore, but still owner of lots of issues. Adding here until they are cleaned up.\n    'vishwacsena', # Not a MSFT employee anymore, but still owner of lots of issues. Adding here until they are cleaned up.\n    'ryanlengel',\n    'zerryth',\n    'stevkan',\n    'diberry',\n    'anusharavindrar',\n    'diegocardozo94',\n    'v-madhal',\n    'v-kydela',\n    'corinagum',\n    'mrichardson',\n    'mdrichardson',\n    'github-actions[bot]',\n    'zxyanliu',\n]\n\n# When to begin searching for issues.\nSTART_DATE = datetime(2019, 7, 1, 0, 0)\n\n# pylint: disable=line-too-long\ndef main():\n    setup_html()\n    print_status('Bot Framework SDK Github Report')\n    print_status('===============================')\n    g = Github(GIT_PERSONAL_TOKEN)\n\n    # Filter out people associated with Microsoft\n    microsoft_members = get_msorg_members(g) + MICROSFT_EMPLOYEES\n\n    # Output for UI\n    OUTPUT = OuputIssuesJson()\n\n    for repo in REPOS:\n        repo_name = repo if '/' in repo else f'microsoft/{repo}'\n        repo = g.get_repo(repo_name)\n\n        # Output for UI\n        repository_output_element = OutputRepository(repo_name)\n        OUTPUT.repositories.append(repository_output_element)\n\n        # Set state='closed' to find closed issues that weren't tagged properly\n        # Note: repo.get_issues() underlying library appears to have a bug where\n        # `start` and `labels` don't seem to work properly, so we do it manually here.\n        # Super inefficient on the wire!\n        open_issues = [issue for issue in repo.get_issues(state='open')\\\n            if issue.created_at >= START_DATE and not filter_azure(repo_name, issue)]\n        print_status(f'Repo: {repo.full_name}:')\n        print_status(f'   Total open issues after {START_DATE} : {len(open_issues)}', 'tab1')\n\n        # Filter out adaptive issues\n        open_issues = [issue for issue in open_issues if not filter_adaptive_label(issue) and not filter_exempt_from_dri_label(issue)]\n\n        user_filtered = True\n        if repo.name in BYPASS_USERFILTER_REPOS:\n            user_filtered_issues = [issue for issue in open_issues if not issue.pull_request]\n            user_filtered = False\n        else:\n            user_filtered_issues = [issue for issue in open_issues if (not issue.user.login.strip().lower() in \\\n                microsoft_members and not issue.pull_request)]\n\n        if repo_name.lower() != 'azure/azure-cli':\n            no_bs_cr_label = [issue for issue in user_filtered_issues if not filter_bot_service_label(issue) or \\\n                not filter_customer_reported_label(issue)]\n\n            if no_bs_cr_label:\n                print_status(f'   No \"Bot Services/Customer Reported\": Count: {len(no_bs_cr_label)}', 'tab1')\n                for issue in no_bs_cr_label:\n                    if user_filtered or not filter_milestone_label(issue):\n                        print_issue(issue)\n                        repository_output_element.issues.append(OutputIssue(\"no_bot_services\", issue))\n\n            no_crt_label = [issue for issue in user_filtered_issues if not filter_customer_replied_label(issue)]\n            if no_crt_label:\n                print_status(f'   No \"Customer Replied\": Count: {len(no_crt_label)}', 'tab1')\n                for issue in no_crt_label:\n                    if user_filtered in microsoft_members or not filter_milestone_label(issue):\n                        print_issue(issue)\n                        repository_output_element.issues.append(OutputIssue(\"no_customer_reply\", issue))\n\n            # Start looking at stale (untouched with no comments) issues\n            stale_days = 10\n            stale_customer_issues = [add_last_comment(issue, stale_days) \\\n                for issue in user_filtered_issues if not filter_stale_customer_issues(issue, days_old=stale_days)]\n            stale_no_nones = [i for i in stale_customer_issues if i]\n            stale_descending = sorted(stale_no_nones, key=lambda issue: issue.last_comment, reverse=False)\n            if stale_descending:\n                print_status(f'   90-day stale : Customer issues not touched in more than {stale_days} days: Count: {len(stale_descending)}', 'tab1')\n                print_status(f'      Last touched by {Fore.GREEN}CUSTOMER{Style.RESET_ALL}:', 'tab2')\n                for issue in stale_descending:\n                    if last_touched_by_microsoft(issue, microsoft_members):\n                        print_stale_issue(issue)\n                    repository_output_element.issues.append(OutputIssue(\"last_touch_customer\", issue))\n                print_status(f'      Last touched by {Fore.GREEN}MICROSOFT{Style.RESET_ALL}:', 'tab1')\n                for issue in stale_descending:\n                    if not last_touched_by_microsoft(issue, microsoft_members):\n                        print_stale_issue(issue)\n                    repository_output_element.issues.append(OutputIssue(\"last_touch_microsoft\", issue))\n        else:\n            # azure/azure-cli just print active issues.\n            for issue in user_filtered_issues:\n                print_issue(issue)\n                repository_output_element.issues.append(OutputIssue(\"azure_cli\", issue))\n\n    # Write JSON output for UI\n    # OUTPUT.write_output()\n    OUTPUT_FILE.write(\"</body></html>\")\n    OUTPUT_FILE.close()\n\n    if sys.platform == 'win32':\n        os.system('start \"\" \"' + FILE_NAME + '\"')\n    else:\n        os.system('open ' + FILE_NAME)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "dri/requirements.txt",
    "content": "PyGithub>=1.43.8\r\njsonpickle>=1.2\r\ncolorama>=0.4.1\r\nsix>=1.12.0"
  },
  {
    "path": "parsers/LU/ANTLR/LUFileLexer.g4",
    "content": "lexer grammar LUFileLexer;\n\n// fragments\nfragment A: 'a' | 'A';\nfragment B: 'b' | 'B';\nfragment C: 'c' | 'C';\nfragment D: 'd' | 'D';\nfragment E: 'e' | 'E';\nfragment F: 'f' | 'F';\nfragment G: 'g' | 'G';\nfragment H: 'h' | 'H';\nfragment I: 'i' | 'I';\nfragment J: 'j' | 'J';\nfragment K: 'k' | 'K';\nfragment L: 'l' | 'L';\nfragment M: 'm' | 'M';\nfragment N: 'n' | 'N';\nfragment O: 'o' | 'O';\nfragment P: 'p' | 'P';\nfragment Q: 'q' | 'Q';\nfragment R: 'r' | 'R';\nfragment S: 's' | 'S';\nfragment T: 't' | 'T';\nfragment U: 'u' | 'U';\nfragment V: 'v' | 'V';\nfragment W: 'w' | 'W';\nfragment X: 'x' | 'X';\nfragment Y: 'y' | 'Y';\nfragment Z: 'z' | 'Z';\n\nfragment LETTER: 'a'..'z' | 'A'..'Z';\nfragment NUMBER: '0'..'9';\n\nfragment WHITESPACE\n  : ' '|'\\t'|'\\ufeff'|'\\u00a0'\n  ;\n\nfragment UTTERANCE_MARK: '-' | '*' | '+';\n\nWS\n  : WHITESPACE+\n  ;\n\nNEWLINE\n  : '\\r'? '\\n' -> skip\n  ;\n\nQNA_SOURCE_INFO\n  : WS* '>' WS* '!# @qna.pair.source' WS* '=' ~('\\r'|'\\n')+\n  ;\n\nMODEL_INFO\n  : WS* '>' WS* '!#' ~('\\r'|'\\n')+\n  ;\n\nCOMMENT\n  : WS* '>' ~('\\r'|'\\n')* -> skip\n  ;\n\nQNA\n  : '#'+ WS* '?' -> pushMode(QNA_MODE)\n  ;\n\nHASH\n  : '#' -> pushMode(INTENT_NAME_MODE)\n  ;\n\nDASH\n  : UTTERANCE_MARK -> pushMode(LIST_BODY_MODE)\n  ;\n\nDOLLAR\n  : '$' -> pushMode(ENTITY_MODE)\n  ;\n\nAT\n  : '@' -> pushMode(NEW_ENTITY_MODE)\n  ;\n\nIMPORT\n  : '[' ~[\\r\\n[\\]]*? ']' '(' ~[\\r\\n()]*? ')'\n  ;\n\nFILTER_MARK\n  : '**' F I L T E R S ':**'\n  ;\n\nQNA_ID_MARK\n  : '<a' .*? '</a>'\n  ;\n\nMULTI_LINE_TEXT\n  : '```' .*? '```'\n  ;\nPROMPT_MARK\n  : '**' P R O M P T S ':**'\n  ;\n  \nINVALID_TOKEN_DEFAULT_MODE\n  : .\n  ;\n  \nmode NEW_ENTITY_MODE;\n\nWS_IN_NEW_ENTITY\n  : WS -> type(WS)\n  ;\n\nNEWLINE_IN_NEW_ENTITY\n  : '\\r'? '\\n' -> type(NEWLINE), popMode\n  ;\n\nEQUAL\n  : '='\n  ;\n\nCOMMA\n  : ','\n  ;\n\nHAS_ROLES_LABEL\n  : H A S R O L E S?\n  ;\n\nHAS_FEATURES_LABEL\n  : U S E S F E A T U R E S?\n  ;\n\nNEW_ENTITY_TYPE_IDENTIFIER\n  : S I M P L E | L I S T | R E G E X | P R E B U I L T | C O M P O S I T E | M L | P A T T E R N A N Y | P H R A S E L I S T | I N T E N T\n  ;\n\nPHRASE_LIST_LABEL\n  : '(' (~[\\r\\n])* ')'\n  ;\n\nNEW_COMPOSITE_ENTITY\n  : '[' (~[\\r\\n{}[\\]()])* ']'\n  ;\n\nNEW_REGEX_ENTITY\n  : '/' (~[\\r\\n])*\n  ;\n\nNEW_ENTITY_IDENTIFIER\n  : (~[ \\t\\r\\n,;'\"])+\n  ;\n\nNEW_ENTITY_IDENTIFIER_WITH_WS\n  : ('\\'' | '\"') (~[\\t\\r\\n,;'\"])+ ('\\'' | '\"')\n  ;\n\nmode INTENT_NAME_MODE;\n  \nWS_IN_NAME\n  : WS -> type(WS)\n  ;\n\nHASH_IN_NAME\n  : '#' -> type(HASH)\n  ;\n\nNEWLINE_IN_NAME\n  : '\\r'? '\\n' -> skip, popMode\n  ;\n\nIDENTIFIER\n  : (LETTER | NUMBER | '_') (LETTER | NUMBER | '-' | '_')*\n  ;\n\nDOT\n  : '.'\n  ;\n\nmode LIST_BODY_MODE;\n\nWS_IN_LIST_BODY\n  : WS -> type(WS)\n  ;\n\nNEWLINE_IN_LIST_BODY\n  : '\\r'? '\\n' -> type(NEWLINE), popMode\n  ;\n\nESCAPE_CHARACTER\n  : '\\\\' ~[\\r\\n]?\n  ;\n\nEXPRESSION\n  : '{' (~[\\r\\n{}] | ('{' ~[\\r\\n]* '}'))* '}'\n  ;\n\nTEXT\n  : ~[ \\t\\r\\n\\\\]+?\n  ;\n\nmode ENTITY_MODE;\n\nWS_IN_ENTITY\n  : WS -> type(WS)\n  ;\n\nNEWLINE_IN_ENTITY\n  : '\\r'? '\\n' -> skip, popMode\n  ;\n\nCOMPOSITE_ENTITY\n  : '[' (~[\\r\\n{}[\\]()])* ']'\n  ;\n\nREGEX_ENTITY\n  : '/' (~[\\r\\n])*\n  ;\n\nENTITY_TEXT\n  : ~[ \\t\\r\\n:]+\n  ;\n\nCOLON_MARK\n  : ':'\n  ;\n\nmode QNA_MODE;\n\nNEWLINE_IN_QNA\n  : '\\r'? '\\n' -> skip, popMode\n  ;\n\nQNA_TEXT\n  : ~[\\t\\r\\n]+\n  ;"
  },
  {
    "path": "parsers/LU/ANTLR/LUFileParser.g4",
    "content": "parser grammar LUFileParser;\n\noptions { tokenVocab=LUFileLexer; }\n\nfile\n\t: paragraph+? EOF\n\t;\n\nparagraph\n    : newline\n    | nestedIntentSection\n    | simpleIntentSection\n    | entitySection\n    | newEntitySection\n    | importSection\n    | qnaSection\n    | modelInfoSection\n    ;\n\n// Treat EOF as newline to hanle file end gracefully\n// It's possible that parser doesn't even have to handle NEWLINE, \n// but before the syntax is finalized, we still keep the NEWLINE in grammer \nnewline\n    : WS* (NEWLINE | EOF)\n    ;\n\nerrorString\n    : (WS|INVALID_TOKEN_DEFAULT_MODE)+\n    ;\n\nnestedIntentSection\n    : nestedIntentNameLine nestedIntentBodyDefinition\n    ;\n\nnestedIntentNameLine\n    : WS* HASH WS* nestedIntentName\n    ;\n\nnestedIntentName\n    : nameIdentifier (WS|nameIdentifier)*\n    ;\n\nnameIdentifier\n    : IDENTIFIER (DOT IDENTIFIER)*\n    ;\n\nnestedIntentBodyDefinition\n    : subIntentDefinition+\n    ;\n\nsubIntentDefinition\n    : WS* HASH simpleIntentSection\n    ;\n\nsimpleIntentSection\n    : intentDefinition\n    ;\n\nintentDefinition\n\t: intentNameLine intentBody?\n\t;\n\nintentNameLine\n\t: WS* HASH HASH? WS* intentName\n\t;\n\nintentName\n    : nameIdentifier (WS|nameIdentifier)*\n    ;\n\nintentBody\n\t: WS* normalIntentBody\n\t;\n\nnormalIntentBody\n    : WS* ((normalIntentString newline) | errorString)+\n    ;\n\nnormalIntentString\n\t: WS* DASH (WS|TEXT|EXPRESSION|ESCAPE_CHARACTER)*\n\t;\n\nnewEntitySection\n    : newEntityDefinition\n    ;\n\nnewEntityDefinition\n    : newEntityLine newEntityListbody?\n    ;\n\nnewEntityListbody\n    : ((normalItemString newline) | errorString)+\n    ;\n\nnewEntityLine\n    : WS* AT WS* newEntityType? WS* (newEntityName|newEntityNameWithWS)? WS* newEntityRoles? WS* newEntityUsesFeatures? WS* EQUAL? WS* (newCompositeDefinition|newRegexDefinition)? newline\n    ;\n\nnewCompositeDefinition\n    : NEW_COMPOSITE_ENTITY\n    ;\n\nnewRegexDefinition\n    : NEW_REGEX_ENTITY\n    ;\n\nnewEntityType\n    : NEW_ENTITY_TYPE_IDENTIFIER\n    ;\n\nnewEntityRoles\n    : HAS_ROLES_LABEL? WS* newEntityRoleOrFeatures\n    ;\n\nnewEntityUsesFeatures\n    : HAS_FEATURES_LABEL WS* newEntityRoleOrFeatures\n    ;\n\nnewEntityRoleOrFeatures\n    : (NEW_ENTITY_IDENTIFIER|NEW_ENTITY_IDENTIFIER_WITH_WS) (WS* COMMA WS* (NEW_ENTITY_IDENTIFIER|NEW_ENTITY_IDENTIFIER_WITH_WS))*\n    ;\n\nnewEntityName\n    : NEW_ENTITY_IDENTIFIER (WS* PHRASE_LIST_LABEL)?\n    ;\n\nnewEntityNameWithWS\n    : NEW_ENTITY_IDENTIFIER_WITH_WS (WS* PHRASE_LIST_LABEL)?\n    ;\n\nentitySection\n    : entityDefinition\n    ;\n\nentityDefinition\n    : entityLine entityListBody?\n    ;\n    \nentityLine\n    : WS* DOLLAR entityName? COLON_MARK? entityType?\n    ;\n\nentityName\n    : (ENTITY_TEXT|WS)+\n    ;\n\nentityType\n    : (compositeEntityIdentifier|regexEntityIdentifier|ENTITY_TEXT|COLON_MARK|WS)+\n    ;\n\ncompositeEntityIdentifier\n    : COMPOSITE_ENTITY\n    ;\n\nregexEntityIdentifier\n    : REGEX_ENTITY\n    ;\n\nentityListBody\n    : ((normalItemString newline) | errorString)+\n    ;\n\nnormalItemString\n    : WS* DASH (WS|TEXT|EXPRESSION|ESCAPE_CHARACTER)*\n    ;\n\nimportSection\n    : importDefinition\n    ;\n\nimportDefinition\n    : WS* IMPORT WS*\n    ;\n\nqnaSection\n    : qnaDefinition\n    ;\n\nqnaDefinition\n    : qnaSourceInfo? qnaIdMark? qnaQuestion moreQuestionsBody qnaAnswerBody promptSection?\n    ;\n\nqnaSourceInfo\n    : WS* QNA_SOURCE_INFO\n    ;\n\nqnaIdMark\n    : WS* QNA_ID_MARK\n    ;\n    \nqnaQuestion\n    : WS* QNA questionText\n    ;\n\nquestionText\n    : QNA_TEXT*\n    ;\n\nmoreQuestionsBody\n    : WS* ((moreQuestion newline) | errorQuestionString)*\n    ;\n\nmoreQuestion\n    : DASH (WS|TEXT)*\n    ;\n\nerrorQuestionString\n    : (WS|INVALID_TOKEN_DEFAULT_MODE)+\n    ;\n\nqnaAnswerBody\n    : ((filterSection? multiLineAnswer)|(multiLineAnswer filterSection?))\n    ;\n\nfilterSection\n    : WS* FILTER_MARK (filterLine | errorFilterLine)+\n    ;\n\npromptSection\n    : WS* PROMPT_MARK (filterLine | errorFilterLine)+\n    ;\n\nfilterLine\n    : WS* DASH (WS|TEXT)* newline\n    ;\n\nerrorFilterLine\n    : (WS|INVALID_TOKEN_DEFAULT_MODE)+\n    ;\n\nmultiLineAnswer\n    : WS* MULTI_LINE_TEXT\n    ;\n\nmodelInfoSection\n    : modelInfoDefinition\n    ;\n\nmodelInfoDefinition\n    : WS* MODEL_INFO\n    ;"
  },
  {
    "path": "parsers/LU/JS/build/bf-cli-build-test-steps.yml",
    "content": "steps:\n- bash: |\n    short_hash=`git rev-parse --short=7 HEAD`  ## At least 7 digits, more if needed for uniqueness\n    echo \"Full git hash:  $(Build.SourceVersion)\"\n    echo \"Short git hash: $short_hash\"\n    echo \"##vso[task.setvariable variable=short_hash]$short_hash\"  ## Store variable for subsequent steps\n  workingDirectory: $(Build.SourcesDirectory)\n  displayName: Get commit number\n\n- powershell: |\n    $date = (Get-Date).ToString(\"yyyyMMdd\")\n    echo \"##vso[task.setvariable variable=buildDate]$date\"  ## Store variable for subsequent steps\n  displayName: Get formatted date\n\n- bash: |\n    version=`echo \"$(version)\"`\n    _version=`echo \"$(_version)\"`\n    echo \"version:  $version\"\n    echo \"_version:  $_version\"\n    [  -z \"$version\" ] && buildVersion=$_version.$(buildDate).$(short_hash) || buildVersion=$version\n    echo \"buildVersion:  $buildVersion\"\n    echo \"##vso[task.setvariable variable=buildVersion]$buildVersion\"  ## Store variable for subsequent steps\n  workingDirectory: $(Build.SourcesDirectory)\n  displayName: Define Build Version\n\n- task: colinsalmcorner.colinsalmcorner-buildtasks.tag-build-task.tagBuildOrRelease@0\n  displayName: 'Tag Build with version number'\n  inputs:\n    tags: 'Version=$(buildVersion)'\n  continueOnError: true\n\n- task: NodeTool@0\n  displayName: 'Use Node 12.x'\n  inputs:\n    versionSpec: 12.x\n\n- task: Npm@1\n  displayName: 'npm install --global @microsoft/rush'\n  inputs:\n    command: custom\n    verbose: false\n    customCommand: 'install --global @microsoft/rush'\n\n- script: 'rush update'\n  displayName: 'rush update'\n\n- script: 'rush build -p 2'\n  displayName: 'rush build -p 2'\n\n- script: 'rush test'\n  displayName: 'rush test'\n\n- script: 'node ./common/scripts/version-and-pack.js --version $(buildVersion)'\n  displayName: 'Version and Pack'\n\n- task: CopyFiles@2\n  displayName: 'Copy packages to: $(Build.ArtifactStagingDirectory)/drop'\n  inputs:\n    SourceFolder: ./.output\n    Contents: '**/*.tgz'\n    TargetFolder: '$(Build.ArtifactStagingDirectory)/drop'\n    flattenFolders: true\n\n- task: PublishBuildArtifacts@1\n  displayName: 'Publish Artifact: drop'\n  inputs:\n    PathtoPublish: '$(Build.ArtifactStagingDirectory)/drop'\n    ArtifactName: drop\n\n- powershell: 'Get-ChildItem .. -ErrorAction Continue -Recurse -Force | Where {$_.FullName -notlike \"*node_modules*\"}'\n  displayName: 'Dir workspace except node_modules'\n  continueOnError: true\n  condition: succeededOrFailed()"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-azure-devops.yml",
    "content": "#\n# Build Botframework-CLI Azure DevOps bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed via $(Build.BuildNumber)\nname: $(Build.BuildId)\n\npool:\n  name: Hosted Windows 2019 with VS2019\n\npr: none\ntrigger: none\n\nvariables:\n- template: botframework-cli-version.yml  # Template reference ${{ variables.releaseVersion }}\n#  version: define this in Azure, settable at queue time\n\nstages:\n- stage: Build\n  jobs:\n  - job:\n    steps:\n    - script: echo '##vso[task.setvariable variable=_version]${{ variables.releaseVersion }}-devops\n    - template: bf-cli-build-test-steps.yml"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-beta.yml",
    "content": "#\n# Build Botframework-CLI daily bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed via $(Build.BuildNumber)\nname: $(Build.BuildId)\n\npool:\n  name: Hosted Windows 2019 with VS2019\n\npr: none\ntrigger: none\n\nschedules:\n- cron: \"0 7 * * *\"\n  displayName: Daily midnight build for BETA branch (UTC Time)\n  branches:\n    include:\n    - beta\n\nvariables:\n- template: botframework-cli-version.yml  # Template reference ${{ variables.releaseVersion }}\n#  version: define this in Azure, settable at queue time\n\nstages:\n- stage: Build\n  jobs:\n  - job:\n    steps:\n    - script: echo '##vso[task.setvariable variable=_version]${{ variables.releaseVersion }}-beta\n    - template: bf-cli-build-test-steps.yml"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-daily.yml",
    "content": "#\n# Build Botframework-CLI daily bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed via $(Build.BuildNumber)\nname: $(Build.BuildId)\n\npool:\n  name: Hosted Windows 2019 with VS2019\n\npr: none\ntrigger: none\n\nschedules:\n- cron: \"0 7 * * *\"\n  displayName: Daily midnight build (UTC Time)\n  branches:\n    include:\n    - main\n\nvariables:\n- template: botframework-cli-version.yml  # Template reference ${{ variables.releaseVersion }}\n#  version: define this in Azure, settable at queue time\n\nstages:\n- stage: Build\n  jobs:\n  - job:\n    steps:\n    - script: echo '##vso[task.setvariable variable=_version]${{ variables.releaseVersion }}-dev\n    - template: bf-cli-build-test-steps.yml"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-mac.yml",
    "content": "#\n# Build Botframework-CLI on Mac (Linux) agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed via $(Build.BuildNumber)\nname: $(Build.BuildId)\n\npool:\n    vmImage: 'macOS-10.15'\n\npr:\n  branches:\n    include:\n     - main\n  paths:\n    include:\n      - '*'\n    exclude:\n      - README.md\n      - specs/*\n      - PortingMap.md\n      - ToolLifetimeSchedule.md\n      - AzureCli.md\n      - CONTRIBUTING.md\n      - LICENSE\n      - PRIVACY.md\n\nvariables:\n  version: '1.0.0'\n#  version: define this in Azure, settable at queue time\n\nstages:\n- stage: Build\n  jobs:\n  - job:\n    steps:\n    - template: bf-cli-build-test-steps.yml"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-rc.yml",
    "content": "#\n# Build Botframework-CLI RC bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed via $(Build.BuildNumber)\nname: $(Build.BuildId)\n\npool:\n  name: Hosted Windows 2019 with VS2019\n\npr: none\ntrigger: none\n\nvariables:\n- template: botframework-cli-version.yml  # Template reference ${{ variables.releaseVersion }}\n#  version: define this in Azure, settable at queue time\n\nstages:\n- stage: Build\n  jobs:\n  - job:\n    steps:\n    - script: echo '##vso[task.setvariable variable=_version]${{ variables.releaseVersion }}-rc\n    - template: bf-cli-build-test-steps.yml"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-version.yml",
    "content": "variables:\n  releaseVersion: '4.11.0'\n"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli.yml",
    "content": "#\n# Build Botframework-CLI on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed via $(Build.BuildNumber)\nname: $(Build.BuildId)\n\npool:\n  name: Hosted Windows 2019 with VS2019\n\npr:\n  branches:\n    include:\n     - main\n\njobs:\n  - job: CLI\n    variables:\n      buildVersion: '4.10.0-preview.$(Build.BuildId)'\n      _version: ${{coalesce(variables.version, variables.buildVersion)}}\n\n    steps:\n    - task: colinsalmcorner.colinsalmcorner-buildtasks.tag-build-task.tagBuildOrRelease@0\n      displayName: 'Tag Build with version number'\n      inputs:\n        tags: 'Version=$(_version)'\n      continueOnError: true\n\n    - task: NodeTool@0\n      displayName: 'Use Node 12.x'\n      inputs:\n        versionSpec: 12.x\n\n    - task: Npm@1\n      displayName: 'npm install --global @microsoft/rush'\n      inputs:\n        command: custom\n        verbose: false\n        customCommand: 'install --global @microsoft/rush'\n\n    - script: 'rush update'\n      displayName: 'rush update'\n\n    - script: 'rush build -p 2'\n      displayName: 'rush build -p 2'\n\n    - script: 'rush coverage -v'\n      displayName: 'rush coverage -v'\n\n    - bash: 'bash <(curl -s https://codecov.io/bash)'\n      displayName: 'push coverage report to codecov.io - https://codecov.io/github/microsoft/botframework-cli'\n      env:\n        CODECOV_TOKEN: $(TokenForCodecov)\n\n    - powershell: |\n        # If commit Build.SourceVersion exists in Github, we can show a nicer codecov.io URL\n        $result = $(git rev-list HEAD..$(Build.SourceVersion) 2>&1);\n        if ($result -like \"*fatal*\") { $Url = \"https://codecov.io/github/microsoft/botframework-cli\" }\n        else { $Url = \"https://codecov.io/github/microsoft/botframework-cli/commit/$(Build.SourceVersion)\" };\n        Write-Host \"##vso[task.setvariable variable=CodecovUrl;]$Url\"\n      displayName: 'Set CodecovUrl'\n\n    - task: colinsalmcorner.colinsalmcorner-buildtasks.tag-build-task.tagBuildOrRelease@0\n      displayName: 'Tag Build with coverage url'\n      inputs:\n        tags: '$(CodecovUrl)'\n      continueOnError: true\n  \n    - task: PublishCodeCoverageResults@1\n      displayName: 'Populate Code Coverage tab'\n      inputs:\n        codeCoverageTool: 'cobertura' # Options: cobertura, jaCoCo\n        summaryFileLocation: $(System.DefaultWorkingDirectory)/packages/*/coverage/cobertura-coverage.xml\n      continueOnError: true\n\n    - task: CopyFiles@2\n      displayName: 'Copy coverage files to: $(Build.StagingDirectory)/coverage'\n      inputs:\n        SourceFolder: '$(Build.SourcesDirectory)/packages'\n        Contents: '*/coverage/**'\n        TargetFolder: '$(Build.StagingDirectory)/coverage'\n\n    - task: PublishBuildArtifacts@1\n      displayName: 'Publish Artifact: coverage'\n      inputs:\n        PathtoPublish: '$(Build.ArtifactStagingDirectory)/coverage'\n        ArtifactName: coverage\n    \n    - script: 'rush posttest'\n      displayName: 'rush posttest'\n\n    - script: 'node ./common/scripts/version-and-pack.js --version $(_version)'\n      displayName: 'Version and Pack'\n\n    - task: CopyFiles@2\n      displayName: 'Copy packages to: $(Build.ArtifactStagingDirectory)/drop'\n      inputs:\n        SourceFolder: ./.output\n        Contents: '**/*.tgz'\n        TargetFolder: '$(Build.ArtifactStagingDirectory)/drop'\n        flattenFolders: true\n\n    - task: PublishBuildArtifacts@1\n      displayName: 'Publish Artifact: drop'\n      inputs:\n        PathtoPublish: '$(Build.ArtifactStagingDirectory)/drop'\n        ArtifactName: drop\n\n    - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0\n      displayName: 'Component Detection'\n\n    - powershell: 'Get-ChildItem .. -ErrorAction Continue -Recurse -Force | Where {$_.FullName -notlike \"*node_modules*\"}'\n      displayName: 'Dir workspace except node_modules'\n      continueOnError: true\n      condition: succeededOrFailed()\n"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/.npmrc",
    "content": "# Rush uses this file to configure the package registry, regardless of whether the\n# package manager is PNPM, NPM, or Yarn.  Prior to invoking the package manager,\n# Rush will always copy this file to the folder where installation is performed.\n# When NPM is the package manager, Rush works around NPM's processing of\n# undefined environment variables by deleting any lines that reference undefined\n# environment variables.\n#\n# DO NOT SPECIFY AUTHENTICATION CREDENTIALS IN THIS FILE.  It should only be used\n# to configure registry sources.\n\nregistry=https://registry.npmjs.org/\nalways-auth=false\n"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/command-line.json",
    "content": "/**\n * This configuration file defines custom commands for the \"rush\" command-line.\n * For full documentation, please see https://rushjs.io\n */\n{\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json\",\n\n  /**\n   * Custom \"commands\" introduce new verbs for the command-line.  To see the help for these\n   * example commands, try \"rush --help\", \"rush my-bulk-command --help\", or\n   * \"rush my-global-command --help\".\n   */\n  \"commands\": [\n    {\n      \"commandKind\": \"bulk\",\n      \"name\": \"test\",\n      \"summary\": \"Run all tests\",\n      \"description\": \"This runs all tests. NOTE: You must build at least once for tests run. If you modify a dependency and want to test that behavior change, you must also run build. We don't automatically rebuild to optimize for speed of single package development.\",\n      \"enableParallelism\": true,\n      \"allowWarningsInSuccessfulBuild\": true\n    },\n    {\n      \"commandKind\": \"bulk\",\n      \"name\": \"clean\",\n      \"summary\": \"Cleans non-rush content. Use rush unlink/purge/tableflip.\",\n      \"enableParallelism\": true\n    },\n    {\n      \"commandKind\": \"global\",\n      \"name\": \"pack\",\n      \"summary\": \"Create .tgz packages for publishing in CI\",\n      \"description\": \"This doesn't currently work because rush doesn't allow the passing of arbitrary commands like version numbers yet. \\n Use  node ./common/scripts/version-and-pack.js --version X.X.X-tag instead.\",\n      \"shellCommand\": \"node -e \\\"throw new Error(`Not supported yet. \\\\nUse node ./common/scripts/version-and-pack.js --version X.X.X-tag instead`)\\\"\"\n    },\n    /**\n     * Disable parallelism because it makes the results flakier\n     */\n    {\n      \"commandKind\": \"bulk\",\n      \"name\": \"coverage\",\n      \"summary\": \"Run tests with coverage\",\n      \"enableParallelism\": false,\n      \"allowWarningsInSuccessfulBuild\": true\n    },\n    {\n      \"commandKind\": \"bulk\",\n      \"name\": \"doc\",\n      \"summary\": \"Generate documentation\",\n      \"enableParallelism\": true\n    },\n    {\n      \"commandKind\": \"global\",\n      \"name\": \"tableflip\",\n      \"summary\": \"clean everything up\",\n      \"shellCommand\": \"rush unlink & rush purge & npx rimraf ./node_modules ./packages/chatdown/node_modules ./packages/cli/node_modules ./packages/command/node_modules ./packages/config/node_modules ./packages/dialog/node_modules ./packages/lu/node_modules ./packages/luis/node_modules ./packages/qnamaker/node_modules & rush update\",\n      \"safeForSimultaneousRushProcesses\": true\n    },\n    {\n      \"commandKind\": \"bulk\",\n      \"name\": \"posttest\",\n      \"summary\": \"Run all posttest scripts\",\n      \"description\": \"This runs all posttest scrips which perform linting\",\n      \"enableParallelism\": true,\n      \"allowWarningsInSuccessfulBuild\": true\n    }\n    // {\n    //   /**\n    //    * (Required) Determines the type of custom command.\n    //    * Rush's \"bulk\" commands are invoked separately for each project.  Rush will look in\n    //    * each project's package.json file for a \"scripts\" entry whose name matches the\n    //    * command name.  By default, the command will run for every project in the repo,\n    //    * according to the dependency graph (similar to how \"rush build\" works).\n    //    * The set of projects can be restricted e.g. using the \"--to\" or \"--from\" parameters.\n    //    */\n    //   \"commandKind\": \"bulk\",\n    // \n    //   /**\n    //    * (Required) The name that will be typed as part of the command line.  This is also the name\n    //    * of the \"scripts\" hook in the project's package.json file.\n    //    * The name should be comprised of lower case words separated by hyphens or colons. The name should include an\n    //    * English verb (e.g. \"deploy\"). Use a hyphen to separate words (e.g. \"upload-docs\"). A group of related commands\n    //    * can be prefixed with a colon (e.g. \"docs:generate\", \"docs:deploy\", \"docs:serve\", etc).\n    //    */\n    //   \"name\": \"my-bulk-command\",\n    // \n    //   /**\n    //    * (Required) A short summary of the custom command to be shown when printing command line\n    //    * help, e.g. \"rush --help\".\n    //    */\n    //   \"summary\": \"Example bulk custom command\",\n    // \n    //   /**\n    //    * A detailed description of the command to be shown when printing command line\n    //    * help (e.g. \"rush --help my-command\").\n    //    * If omitted, the \"summary\" text will be shown instead.\n    //    *\n    //    * Whenever you introduce commands/parameters, taking a little time to write meaningful\n    //    * documentation can make a big difference for the developer experience in your repo.\n    //    */\n    //   \"description\": \"This is an example custom command that runs separately for each project\",\n    // \n    //   /**\n    //    * By default, Rush operations acquire a lock file which prevents multiple commands from executing simultaneously\n    //    * in the same repo folder.  (For example, it would be a mistake to run \"rush install\" and \"rush build\" at the\n    //    * same time.)  If your command makes sense to run concurrently with other operations,\n    //    * set \"safeForSimultaneousRushProcesses\" to true to disable this protection.\n    //    *\n    //    * In particular, this is needed for custom scripts that invoke other Rush commands.\n    //    */\n    //   \"safeForSimultaneousRushProcesses\": false,\n    // \n    //   /**\n    //    * (Required) If true, then this command is safe to be run in parallel, i.e. executed\n    //    * simultaneously for multiple projects.  Similar to \"rush build\", regardless of parallelism\n    //    * projects will not start processing until their dependencies have completed processing.\n    //    */\n    //   \"enableParallelism\": false,\n    // \n    //   /**\n    //    * Normally projects will be processed according to their dependency order: a given project will not start\n    //    * processing the command until all of its dependencies have completed.  This restriction doesn't apply for\n    //    * certain operations, for example a \"clean\" task that deletes output files.  In this case\n    //    * you can set \"ignoreDependencyOrder\" to true to increase parallelism.\n    //    */\n    //   \"ignoreDependencyOrder\": false,\n    // \n    //   /**\n    //    * Normally Rush requires that each project's package.json has a \"scripts\" entry matching\n    //    * the custom command name.  To disable this check, set \"ignoreMissingScript\" to true;\n    //    * projects with a missing definition will be skipped.\n    //    */\n    //   \"ignoreMissingScript\": false,\n    // \n    //   /**\n    //    * When invoking shell scripts, Rush uses a heuristic to distinguish errors from warnings:\n    //    * - If the shell script returns a nonzero process exit code, Rush interprets this as \"one or more errors\".\n    //    * Error output is displayed in red, and it prevents Rush from attempting to process any downstream projects.\n    //    * - If the shell script returns a zero process exit code but writes something to its stderr stream,\n    //    * Rush interprets this as \"one or more warnings\". Warning output is printed in yellow, but does NOT prevent\n    //    * Rush from processing downstream projects.\n    //    *\n    //    * Thus, warnings do not interfere with local development, but they will cause a CI job to fail, because\n    //    * the Rush process itself returns a nonzero exit code if there are any warnings or errors. This is by design.\n    //    * In an active monorepo, we've found that if you allow any warnings in your master branch, it inadvertently\n    //    * teaches developers to ignore warnings, which quickly leads to a situation where so many \"expected\" warnings\n    //    * have accumulated that warnings no longer serve any useful purpose.\n    //    *\n    //    * Sometimes a poorly behaved task will write output to stderr even though its operation was successful.\n    //    * In that case, it's strongly recommended to fix the task.  However, as a workaround you can set\n    //    * allowWarningsInSuccessfulBuild=true, which causes Rush to return a nonzero exit code for errors only.\n    //    *\n    //    * Note: The default value is false. In Rush 5.7.x and earlier, the default value was true.\n    //    */\n    //   \"allowWarningsInSuccessfulBuild\": false\n    // },\n    // \n    // {\n    //   /**\n    //    * (Required) Determines the type of custom command.\n    //    * Rush's \"global\" commands are invoked once for the entire repo.\n    //    */\n    //   \"commandKind\": \"global\",\n    // \n    //   \"name\": \"my-global-command\",\n    //   \"summary\": \"Example global custom command\",\n    //   \"description\": \"This is an example custom command that runs once for the entire repo\",\n    // \n    //   \"safeForSimultaneousRushProcesses\": false,\n    // \n    //   /**\n    //    * A script that will be invoked using the OS shell. The working directory will be the folder\n    //    * that contains rush.json.  If custom parameters are associated with this command, their\n    //    * values will be appended to the end of this string.\n    //    */\n    //   \"shellCommand\": \"node common/scripts/my-global-command.js\"\n    // }\n  ],\n\n  /**\n   * Custom \"parameters\" introduce new parameters for specified Rush command-line commands.\n   * For example, you might define a \"--production\" parameter for the \"rush build\" command.\n   */\n  \"parameters\": [\n    // {\n    //   /**\n    //    * (Required) Determines the type of custom parameter.\n    //    * A \"flag\" is a custom command-line parameter whose presence acts as an on/off switch.\n    //    */\n    //   \"parameterKind\": \"flag\",\n    // \n    //   /**\n    //    * (Required) The long name of the parameter.  It must be lower-case and use dash delimiters.\n    //    */\n    //   \"longName\": \"--my-flag\",\n    // \n    //   /**\n    //    * An optional alternative short name for the parameter.  It must be a dash followed by a single\n    //    * lower-case or upper-case letter, which is case-sensitive.\n    //    *\n    //    * NOTE: The Rush developers recommend that automation scripts should always use the long name\n    //    * to improve readability.  The short name is only intended as a convenience for humans.\n    //    * The alphabet letters run out quickly, and are difficult to memorize, so *only* use\n    //    * a short name if you expect the parameter to be needed very often in everyday operations.\n    //    */\n    //   \"shortName\": \"-m\",\n    // \n    //   /**\n    //    * (Required) A long description to be shown in the command-line help.\n    //    *\n    //    * Whenever you introduce commands/parameters, taking a little time to write meaningful\n    //    * documentation can make a big difference for the developer experience in your repo.\n    //    */\n    //   \"description\": \"A custom flag parameter that is passed to the scripts that are invoked when building projects\",\n    // \n    //   /**\n    //    * (Required) A list of custom commands and/or built-in Rush commands that this parameter may\n    //    * be used with.  The parameter will be appended to the shell command that Rush invokes.\n    //    */\n    //    \"associatedCommands\": [ \"build\", \"rebuild\" ]\n    // },\n    // \n    // {\n    //   /**\n    //    * (Required) Determines the type of custom parameter.\n    //    * A \"flag\" is a custom command-line parameter whose presence acts as an on/off switch.\n    //    */\n    //   \"parameterKind\": \"choice\",\n    //   \"longName\": \"--my-choice\",\n    //   \"description\": \"A custom choice parameter for the \\\"my-global-command\\\" custom command\",\n    // \n    //   \"associatedCommands\": [ \"my-global-command\" ],\n    // \n    //   /**\n    //    * Normally if a parameter is omitted from the command line, it will not be passed\n    //    * to the shell command. this value will be inserted by default.  Whereas if a \"defaultValue\"\n    //    * is defined, the parameter will always be passed to the shell command, and will use the\n    //    * default value if unspecified.  The value must be one of the defined alternatives.\n    //    */\n    //   \"defaultValue\": \"vanilla\",\n    // \n    //   /**\n    //    * (Required) A list of alternative argument values that can be chosen for this parameter.\n    //    */\n    //   \"alternatives\": [\n    //     {\n    //       /**\n    //        * A token that is one of the alternatives that can be used with the choice parameter,\n    //        * e.g. \"vanilla\" in \"--flavor vanilla\".\n    //        */\n    //       \"name\": \"vanilla\",\n    // \n    //       /**\n    //        * A detailed description for the alternative that can be shown in the command-line help.\n    //        *\n    //        * Whenever you introduce commands/parameters, taking a little time to write meaningful\n    //        * documentation can make a big difference for the developer experience in your repo.\n    //        */\n    //       \"description\": \"Use the vanilla flavor (the default)\"\n    //     },\n    // \n    //     {\n    //       \"name\": \"chocolate\",\n    //       \"description\": \"Use the chocolate flavor\"\n    //     },\n    // \n    //     {\n    //       \"name\": \"strawberry\",\n    //       \"description\": \"Use the strawberry flavor\"\n    //     }\n    //   ]\n    // }\n  ]\n}\n"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/common-versions.json",
    "content": "/**\n * This configuration file specifies NPM dependency version selections that affect all projects\n * in a Rush repo.  For full documentation, please see https://rushjs.io\n */\n{\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json\",\n\n  /**\n   * A table that specifies a \"preferred version\" for a dependency package. The \"preferred version\"\n   * is typically used to hold an indirect dependency back to a specific version, however generally\n   * it can be any SemVer range specifier (e.g. \"~1.2.3\"), and it will narrow any (compatible)\n   * SemVer range specifier.  See the Rush documentation for details about this feature.\n   *\n   * After modifying this field, it's recommended to run \"rush update --full\" so that the package manager\n   * will recalculate all version selections.\n   */\n  \"preferredVersions\": {\n\n    /**\n     * When someone asks for \"^1.0.0\" make sure they get \"1.2.3\" when working in this repo,\n     * instead of the latest version.\n     */\n    // \"some-library\": \"1.2.3\"\n  },\n\n  /**\n   * The \"rush check\" command can be used to enforce that every project in the repo must specify\n   * the same SemVer range for a given dependency.  However, sometimes exceptions are needed.\n   * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be\n   * accepted by \"rush check\" for a given dependency.\n   *\n   * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE\n   * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO).\n   * This design avoids unnecessary churn in this file.\n   */\n   \"allowedAlternativeVersions\": {\n\n    /**\n     * For example, allow some projects to use an older TypeScript compiler\n     * (in addition to whatever \"usual\" version is being used by other projects in the repo):\n     */\n    // \"typescript\": [\n    //   \"~2.4.0\"\n    // ]\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/experiments.json",
    "content": "/**\n * This configuration file allows repo maintainers to enable and disable experimental\n * Rush features. For full documentation, please see https://rushjs.io\n */\n{\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/experiments.schema.json\",\n\n  /**\n    * Rush 5.14.0 improved incremental builds to ignore spurious changes in the pnpm-lock.json file.\n    * This optimization is enabled by default. If you encounter a problem where \"rush build\" is neglecting\n    * to build some projects, please open a GitHub issue. As a workaround you can uncomment this line\n    * to temporarily restore the old behavior where everything must be rebuilt whenever pnpm-lock.json\n    * is modified.\n    */\n   \"legacyIncrementalBuildDependencyDetection\": false\n}\n"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/pnpmfile.js",
    "content": "\"use strict\";\n\n/**\n * When using the PNPM package manager, you can use pnpmfile.js to workaround\n * dependencies that have mistakes in their package.json file.  (This feature is\n * functionally similar to Yarn's \"resolutions\".)\n *\n * For details, see the PNPM documentation:\n * https://pnpm.js.org/docs/en/hooks.html\n *\n * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY TO INVALIDATE\n * ANY CACHED DEPENDENCY ANALYSIS.  After any modification to pnpmfile.js, it's recommended to run\n * \"rush update --full\" so that PNPM will recalculate all version selections.\n */\nmodule.exports = {\n  hooks: {\n    readPackage\n  }\n};\n\n/**\n * This hook is invoked during installation before a package's dependencies\n * are selected.\n * The `packageJson` parameter is the deserialized package.json\n * contents for the package that is about to be installed.\n * The `context` parameter provides a log() function.\n * The return value is the updated object.\n */\nfunction readPackage(packageJson, context) {\n\n  // // The karma types have a missing dependency on typings from the log4js package.\n  // if (packageJson.name === '@types/karma') {\n  //  context.log('Fixed up dependencies for @types/karma');\n  //  packageJson.dependencies['log4js'] = '0.6.38';\n  // }\n\n  return packageJson;\n}\n"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/version-policies.json",
    "content": "/**\n * This is configuration file is used for advanced publishing configurations with Rush.\n * For full documentation, please see https://rushjs.io\n */\n\n /**\n  * A list of version policy definitions.  A \"version policy\" is a custom package versioning\n  * strategy that affets \"rush change\", \"rush version\", and \"rush publish\".  The strategy applies\n  * to a set of projects that are specified using the \"versionPolicyName\" field in rush.json.\n  */\n[\n  // {\n  //   /**\n  //    * (Required) Indicates the kind of version policy being defined (\"lockStepVersion\" or \"individualVersion\").\n  //    *\n  //    * The \"lockStepVersion\" mode specifies that the projects will use \"lock-step versioning\".  This\n  //    * strategy is appropriate for a set of packages that act as selectable components of a\n  //    * unified product.  The entire set of packages are always published together, and always share\n  //    * the same NPM version number.  When the packages depend on other packages in the set, the\n  //    * SemVer range is usually restricted to a single version.\n  //    */\n  //   \"definitionName\": \"lockStepVersion\",\n  // \n  //   /**\n  //    * (Required) The name that will be used for the \"versionPolicyName\" field in rush.json.\n  //    * This name is also used command-line parameters such as \"--version-policy\"\n  //    * and \"--to-version-policy\".\n  //    */\n  //   \"policyName\": \"MyBigFramework\",\n  // \n  //   /**\n  //    * (Required) The current version.  All packages belonging to the set should have this version\n  //    * in the current branch.  When bumping versions, Rush uses this to determine the next version.\n  //    * (The \"version\" field in package.json is NOT considered.)\n  //    */\n  //   \"version\": \"1.0.0\",\n  // \n  //   /**\n  //    * (Required) The type of bump that will be performed when publishing the next release.\n  //    * When creating a release branch in Git, this field should be updated according to the\n  //    * type of release.\n  //    *\n  //    * Valid values are: \"prerelease\", \"release\", \"minor\", \"patch\", \"major\"\n  //    */\n  //   \"nextBump\": \"prerelease\",\n  // \n  //   /**\n  //    * (Optional) If specified, all packages in the set share a common CHANGELOG.md file.\n  //    * This file is stored with the specified \"main\" project, which must be a member of the set.\n  //    *\n  //    * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each\n  //    * package in the set.\n  //    */\n  //   \"mainProject\": \"my-app\"\n  // },\n  // \n  // {\n  //   /**\n  //    * (Required) Indicates the kind of version policy being defined (\"lockStepVersion\" or \"individualVersion\").\n  //    *\n  //    * The \"individualVersion\" mode specifies that the projects will use \"individual versioning\".\n  //    * This is the typical NPM model where each package has an independent version number\n  //    * and CHANGELOG.md file.  Although a single CI definition is responsible for publishing the\n  //    * packages, they otherwise don't have any special relationship.  The version bumping will\n  //    * depend on how developers answer the \"rush change\" questions for each package that\n  //    * is changed.\n  //    */\n  //   \"definitionName\": \"individualVersion\",\n  // \n  //   \"policyName\": \"MyRandomLibraries\",\n  // \n  //   /**\n  //    * (Optional) This can be used to enforce that all packages in the set must share a common\n  //    * major version number, e.g. because they are from the same major release branch.\n  //    * It can also be used to discourage people from accidentally making \"MAJOR\" SemVer changes\n  //    * inappropriately.  The minor/patch version parts will be bumped independently according\n  //    * to the types of changes made to each project, according to the \"rush change\" command.\n  //    */\n  //   \"lockedMajor\": 3,\n  // \n  //   /**\n  //    * (Optional) When publishing is managed by Rush, by default the \"rush change\" command will\n  //    * request changes for any projects that are modified by a pull request. These change entries\n  //    * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates\n  //    * in some other way, set \"exemptFromRushChange\" to true to tell \"rush change\" to ignore the projects\n  //    * belonging to this version policy.\n  //    */\n  //   \"exemptFromRushChange\": false\n  // }\n]\n"
  },
  {
    "path": "parsers/LU/JS/common/scripts/install-run-rush.js",
    "content": "\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where the Rush command may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush\n// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it.\n// An example usage would be:\n//\n//    node common/scripts/install-run-rush.js install\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\nconst path = require(\"path\");\nconst fs = require(\"fs\");\nconst install_run_1 = require(\"./install-run\");\nconst PACKAGE_NAME = '@microsoft/rush';\nconst RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION';\nfunction _getRushVersion() {\n    const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION];\n    if (rushPreviewVersion !== undefined) {\n        console.log(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`);\n        return rushPreviewVersion;\n    }\n    const rushJsonFolder = install_run_1.findRushJsonFolder();\n    const rushJsonPath = path.join(rushJsonFolder, install_run_1.RUSH_JSON_FILENAME);\n    try {\n        const rushJsonContents = fs.readFileSync(rushJsonPath, 'utf-8');\n        // Use a regular expression to parse out the rushVersion value because rush.json supports comments,\n        // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script.\n        const rushJsonMatches = rushJsonContents.match(/\\\"rushVersion\\\"\\s*\\:\\s*\\\"([0-9a-zA-Z.+\\-]+)\\\"/);\n        return rushJsonMatches[1];\n    }\n    catch (e) {\n        throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` +\n            'The \\'rushVersion\\' field is either not assigned in rush.json or was specified ' +\n            'using an unexpected syntax.');\n    }\n}\nfunction _run() {\n    const [nodePath, /* Ex: /bin/node */ scriptPath, /* /repo/common/scripts/install-run-rush.js */ ...packageBinArgs /* [build, --to, myproject] */] = process.argv;\n    // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the\n    // appropriate binary inside the rush package to run\n    const scriptName = path.basename(scriptPath);\n    const bin = scriptName.toLowerCase() === 'install-run-rushx.js' ? 'rushx' : 'rush';\n    if (!nodePath || !scriptPath) {\n        throw new Error('Unexpected exception: could not detect node path or script path');\n    }\n    if (process.argv.length < 3) {\n        console.log(`Usage: ${scriptName} <command> [args...]`);\n        if (scriptName === 'install-run-rush.js') {\n            console.log(`Example: ${scriptName} build --to myproject`);\n        }\n        else {\n            console.log(`Example: ${scriptName} custom-command`);\n        }\n        process.exit(1);\n    }\n    install_run_1.runWithErrorAndStatusCode(() => {\n        const version = _getRushVersion();\n        console.log(`The rush.json configuration requests Rush version ${version}`);\n        return install_run_1.installAndRun(PACKAGE_NAME, version, bin, packageBinArgs);\n    });\n}\n_run();\n//# sourceMappingURL=install-run-rush.js.map"
  },
  {
    "path": "parsers/LU/JS/common/scripts/install-run-rushx.js",
    "content": "\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where the Rush command may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush\n// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the\n// rushx command.\n//\n// An example usage would be:\n//\n//    node common/scripts/install-run-rushx.js custom-command\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\nrequire(\"./install-run-rush\");\n//# sourceMappingURL=install-run-rushx.js.map"
  },
  {
    "path": "parsers/LU/JS/common/scripts/install-run.js",
    "content": "\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where a Node tool may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the specified\n// version of the specified tool (if not already installed), and then pass a command-line to it.\n// An example usage would be:\n//\n//    node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\nconst childProcess = require(\"child_process\");\nconst fs = require(\"fs\");\nconst os = require(\"os\");\nconst path = require(\"path\");\nexports.RUSH_JSON_FILENAME = 'rush.json';\nconst RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER';\nconst INSTALLED_FLAG_FILENAME = 'installed.flag';\nconst NODE_MODULES_FOLDER_NAME = 'node_modules';\nconst PACKAGE_JSON_FILENAME = 'package.json';\n/**\n * Parse a package specifier (in the form of name\\@version) into name and version parts.\n */\nfunction _parsePackageSpecifier(rawPackageSpecifier) {\n    rawPackageSpecifier = (rawPackageSpecifier || '').trim();\n    const separatorIndex = rawPackageSpecifier.lastIndexOf('@');\n    let name;\n    let version = undefined;\n    if (separatorIndex === 0) {\n        // The specifier starts with a scope and doesn't have a version specified\n        name = rawPackageSpecifier;\n    }\n    else if (separatorIndex === -1) {\n        // The specifier doesn't have a version\n        name = rawPackageSpecifier;\n    }\n    else {\n        name = rawPackageSpecifier.substring(0, separatorIndex);\n        version = rawPackageSpecifier.substring(separatorIndex + 1);\n    }\n    if (!name) {\n        throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`);\n    }\n    return { name, version };\n}\n/**\n * As a workaround, _syncNpmrc() copies the .npmrc file to the target folder, and also trims\n * unusable lines from the .npmrc file.  If the source .npmrc file not exist, then _syncNpmrc()\n * will delete an .npmrc that is found in the target folder.\n *\n * Why are we trimming the .npmrc lines?  NPM allows environment variables to be specified in\n * the .npmrc file to provide different authentication tokens for different registry.\n * However, if the environment variable is undefined, it expands to an empty string, which\n * produces a valid-looking mapping with an invalid URL that causes an error.  Instead,\n * we'd prefer to skip that line and continue looking in other places such as the user's\n * home directory.\n *\n * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc()\n */\nfunction _syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder) {\n    const sourceNpmrcPath = path.join(sourceNpmrcFolder, '.npmrc');\n    const targetNpmrcPath = path.join(targetNpmrcFolder, '.npmrc');\n    try {\n        if (fs.existsSync(sourceNpmrcPath)) {\n            let npmrcFileLines = fs.readFileSync(sourceNpmrcPath).toString().split('\\n');\n            npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim());\n            const resultLines = [];\n            // Trim out lines that reference environment variables that aren't defined\n            for (const line of npmrcFileLines) {\n                // This finds environment variable tokens that look like \"${VAR_NAME}\"\n                const regex = /\\$\\{([^\\}]+)\\}/g;\n                const environmentVariables = line.match(regex);\n                let lineShouldBeTrimmed = false;\n                if (environmentVariables) {\n                    for (const token of environmentVariables) {\n                        // Remove the leading \"${\" and the trailing \"}\" from the token\n                        const environmentVariableName = token.substring(2, token.length - 1);\n                        if (!process.env[environmentVariableName]) {\n                            lineShouldBeTrimmed = true;\n                            break;\n                        }\n                    }\n                }\n                if (lineShouldBeTrimmed) {\n                    // Example output:\n                    // \"; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}\"\n                    resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line);\n                }\n                else {\n                    resultLines.push(line);\n                }\n            }\n            fs.writeFileSync(targetNpmrcPath, resultLines.join(os.EOL));\n        }\n        else if (fs.existsSync(targetNpmrcPath)) {\n            // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target\n            fs.unlinkSync(targetNpmrcPath);\n        }\n    }\n    catch (e) {\n        throw new Error(`Error syncing .npmrc file: ${e}`);\n    }\n}\nlet _npmPath = undefined;\n/**\n * Get the absolute path to the npm executable\n */\nfunction getNpmPath() {\n    if (!_npmPath) {\n        try {\n            if (os.platform() === 'win32') {\n                // We're on Windows\n                const whereOutput = childProcess.execSync('where npm', { stdio: [] }).toString();\n                const lines = whereOutput.split(os.EOL).filter((line) => !!line);\n                // take the last result, we are looking for a .cmd command\n                // see https://github.com/microsoft/rushstack/issues/759\n                _npmPath = lines[lines.length - 1];\n            }\n            else {\n                // We aren't on Windows - assume we're on *NIX or Darwin\n                _npmPath = childProcess.execSync('which npm', { stdio: [] }).toString();\n            }\n        }\n        catch (e) {\n            throw new Error(`Unable to determine the path to the NPM tool: ${e}`);\n        }\n        _npmPath = _npmPath.trim();\n        if (!fs.existsSync(_npmPath)) {\n            throw new Error('The NPM executable does not exist');\n        }\n    }\n    return _npmPath;\n}\nexports.getNpmPath = getNpmPath;\nfunction _ensureFolder(folderPath) {\n    if (!fs.existsSync(folderPath)) {\n        const parentDir = path.dirname(folderPath);\n        _ensureFolder(parentDir);\n        fs.mkdirSync(folderPath);\n    }\n}\n/**\n * Create missing directories under the specified base directory, and return the resolved directory.\n *\n * Does not support \".\" or \"..\" path segments.\n * Assumes the baseFolder exists.\n */\nfunction _ensureAndJoinPath(baseFolder, ...pathSegments) {\n    let joinedPath = baseFolder;\n    try {\n        for (let pathSegment of pathSegments) {\n            pathSegment = pathSegment.replace(/[\\\\\\/]/g, '+');\n            joinedPath = path.join(joinedPath, pathSegment);\n            if (!fs.existsSync(joinedPath)) {\n                fs.mkdirSync(joinedPath);\n            }\n        }\n    }\n    catch (e) {\n        throw new Error(`Error building local installation folder (${path.join(baseFolder, ...pathSegments)}): ${e}`);\n    }\n    return joinedPath;\n}\nfunction _getRushTempFolder(rushCommonFolder) {\n    const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME];\n    if (rushTempFolder !== undefined) {\n        _ensureFolder(rushTempFolder);\n        return rushTempFolder;\n    }\n    else {\n        return _ensureAndJoinPath(rushCommonFolder, 'temp');\n    }\n}\n/**\n * Resolve a package specifier to a static version\n */\nfunction _resolvePackageVersion(rushCommonFolder, { name, version }) {\n    if (!version) {\n        version = '*'; // If no version is specified, use the latest version\n    }\n    if (version.match(/^[a-zA-Z0-9\\-\\+\\.]+$/)) {\n        // If the version contains only characters that we recognize to be used in static version specifiers,\n        // pass the version through\n        return version;\n    }\n    else {\n        // version resolves to\n        try {\n            const rushTempFolder = _getRushTempFolder(rushCommonFolder);\n            const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');\n            _syncNpmrc(sourceNpmrcFolder, rushTempFolder);\n            const npmPath = getNpmPath();\n            // This returns something that looks like:\n            //  @microsoft/rush@3.0.0 '3.0.0'\n            //  @microsoft/rush@3.0.1 '3.0.1'\n            //  ...\n            //  @microsoft/rush@3.0.20 '3.0.20'\n            //  <blank line>\n            const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], {\n                cwd: rushTempFolder,\n                stdio: []\n            });\n            if (npmVersionSpawnResult.status !== 0) {\n                throw new Error(`\"npm view\" returned error code ${npmVersionSpawnResult.status}`);\n            }\n            const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString();\n            const versionLines = npmViewVersionOutput.split('\\n').filter((line) => !!line);\n            const latestVersion = versionLines[versionLines.length - 1];\n            if (!latestVersion) {\n                throw new Error('No versions found for the specified version range.');\n            }\n            const versionMatches = latestVersion.match(/^.+\\s\\'(.+)\\'$/);\n            if (!versionMatches) {\n                throw new Error(`Invalid npm output ${latestVersion}`);\n            }\n            return versionMatches[1];\n        }\n        catch (e) {\n            throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`);\n        }\n    }\n}\nlet _rushJsonFolder;\n/**\n * Find the absolute path to the folder containing rush.json\n */\nfunction findRushJsonFolder() {\n    if (!_rushJsonFolder) {\n        let basePath = __dirname;\n        let tempPath = __dirname;\n        do {\n            const testRushJsonPath = path.join(basePath, exports.RUSH_JSON_FILENAME);\n            if (fs.existsSync(testRushJsonPath)) {\n                _rushJsonFolder = basePath;\n                break;\n            }\n            else {\n                basePath = tempPath;\n            }\n        } while (basePath !== (tempPath = path.dirname(basePath))); // Exit the loop when we hit the disk root\n        if (!_rushJsonFolder) {\n            throw new Error('Unable to find rush.json.');\n        }\n    }\n    return _rushJsonFolder;\n}\nexports.findRushJsonFolder = findRushJsonFolder;\n/**\n * Detects if the package in the specified directory is installed\n */\nfunction _isPackageAlreadyInstalled(packageInstallFolder) {\n    try {\n        const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        if (!fs.existsSync(flagFilePath)) {\n            return false;\n        }\n        const fileContents = fs.readFileSync(flagFilePath).toString();\n        return fileContents.trim() === process.version;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Removes the following files and directories under the specified folder path:\n *  - installed.flag\n *  -\n *  - node_modules\n */\nfunction _cleanInstallFolder(rushTempFolder, packageInstallFolder) {\n    try {\n        const flagFile = path.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        if (fs.existsSync(flagFile)) {\n            fs.unlinkSync(flagFile);\n        }\n        const packageLockFile = path.resolve(packageInstallFolder, 'package-lock.json');\n        if (fs.existsSync(packageLockFile)) {\n            fs.unlinkSync(packageLockFile);\n        }\n        const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME);\n        if (fs.existsSync(nodeModulesFolder)) {\n            const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler', `install-run-${Date.now().toString()}`);\n            fs.renameSync(nodeModulesFolder, rushRecyclerFolder);\n        }\n    }\n    catch (e) {\n        throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`);\n    }\n}\nfunction _createPackageJson(packageInstallFolder, name, version) {\n    try {\n        const packageJsonContents = {\n            'name': 'ci-rush',\n            'version': '0.0.0',\n            'dependencies': {\n                [name]: version\n            },\n            'description': 'DON\\'T WARN',\n            'repository': 'DON\\'T WARN',\n            'license': 'MIT'\n        };\n        const packageJsonPath = path.join(packageInstallFolder, PACKAGE_JSON_FILENAME);\n        fs.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2));\n    }\n    catch (e) {\n        throw new Error(`Unable to create package.json: ${e}`);\n    }\n}\n/**\n * Run \"npm install\" in the package install folder.\n */\nfunction _installPackage(packageInstallFolder, name, version) {\n    try {\n        console.log(`Installing ${name}...`);\n        const npmPath = getNpmPath();\n        const result = childProcess.spawnSync(npmPath, ['install'], {\n            stdio: 'inherit',\n            cwd: packageInstallFolder,\n            env: process.env\n        });\n        if (result.status !== 0) {\n            throw new Error('\"npm install\" encountered an error');\n        }\n        console.log(`Successfully installed ${name}@${version}`);\n    }\n    catch (e) {\n        throw new Error(`Unable to install package: ${e}`);\n    }\n}\n/**\n * Get the \".bin\" path for the package.\n */\nfunction _getBinPath(packageInstallFolder, binName) {\n    const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');\n    const resolvedBinName = (os.platform() === 'win32') ? `${binName}.cmd` : binName;\n    return path.resolve(binFolderPath, resolvedBinName);\n}\n/**\n * Write a flag file to the package's install directory, signifying that the install was successful.\n */\nfunction _writeFlagFile(packageInstallFolder) {\n    try {\n        const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        fs.writeFileSync(flagFilePath, process.version);\n    }\n    catch (e) {\n        throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`);\n    }\n}\nfunction installAndRun(packageName, packageVersion, packageBinName, packageBinArgs) {\n    const rushJsonFolder = findRushJsonFolder();\n    const rushCommonFolder = path.join(rushJsonFolder, 'common');\n    const rushTempFolder = _getRushTempFolder(rushCommonFolder);\n    const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`);\n    if (!_isPackageAlreadyInstalled(packageInstallFolder)) {\n        // The package isn't already installed\n        _cleanInstallFolder(rushTempFolder, packageInstallFolder);\n        const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');\n        _syncNpmrc(sourceNpmrcFolder, packageInstallFolder);\n        _createPackageJson(packageInstallFolder, packageName, packageVersion);\n        _installPackage(packageInstallFolder, packageName, packageVersion);\n        _writeFlagFile(packageInstallFolder);\n    }\n    const statusMessage = `Invoking \"${packageBinName} ${packageBinArgs.join(' ')}\"`;\n    const statusMessageLine = new Array(statusMessage.length + 1).join('-');\n    console.log(os.EOL + statusMessage + os.EOL + statusMessageLine + os.EOL);\n    const binPath = _getBinPath(packageInstallFolder, packageBinName);\n    const result = childProcess.spawnSync(binPath, packageBinArgs, {\n        stdio: 'inherit',\n        cwd: process.cwd(),\n        env: process.env\n    });\n    if (result.status !== null) {\n        return result.status;\n    }\n    else {\n        throw result.error || new Error('An unknown error occurred.');\n    }\n}\nexports.installAndRun = installAndRun;\nfunction runWithErrorAndStatusCode(fn) {\n    process.exitCode = 1;\n    try {\n        const exitCode = fn();\n        process.exitCode = exitCode;\n    }\n    catch (e) {\n        console.error(os.EOL + os.EOL + e.toString() + os.EOL + os.EOL);\n    }\n}\nexports.runWithErrorAndStatusCode = runWithErrorAndStatusCode;\nfunction _run() {\n    const [nodePath, /* Ex: /bin/node */ scriptPath, /* /repo/common/scripts/install-run-rush.js */ rawPackageSpecifier, /* qrcode@^1.2.0 */ packageBinName, /* qrcode */ ...packageBinArgs /* [-f, myproject/lib] */] = process.argv;\n    if (!nodePath) {\n        throw new Error('Unexpected exception: could not detect node path');\n    }\n    if (path.basename(scriptPath).toLowerCase() !== 'install-run.js') {\n        // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control\n        // to the script that (presumably) imported this file\n        return;\n    }\n    if (process.argv.length < 4) {\n        console.log('Usage: install-run.js <package>@<version> <command> [args...]');\n        console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io');\n        process.exit(1);\n    }\n    runWithErrorAndStatusCode(() => {\n        const rushJsonFolder = findRushJsonFolder();\n        const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common');\n        const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier);\n        const name = packageSpecifier.name;\n        const version = _resolvePackageVersion(rushCommonFolder, packageSpecifier);\n        if (packageSpecifier.version !== version) {\n            console.log(`Resolved to ${name}@${version}`);\n        }\n        return installAndRun(name, version, packageBinName, packageBinArgs);\n    });\n}\n_run();\n//# sourceMappingURL=install-run.js.map"
  },
  {
    "path": "parsers/LU/JS/common/scripts/version-and-pack.js",
    "content": "// @ts-check\n// Ensure using node 12 because of recursive mkdir\nif (\n    !process.env.GEN_CLDR_DATA_IGNORE_NODE_VERSION &&\n    process.version.split('.')[0] < 'v12'\n) {\n    console.error(`\nYour node version appears to be below v12: ${ process.version}. \nThis script will not run correctly on earlier versions of node. \nSet 'GEN_CLDR_DATA_IGNORE_NODE_VERSION' environment variable to truthy to override`);\n}\n\nconst fs = require('fs');\nconst path = require('path');\nconst cp = require('child_process');\nconst os = require('os');\n\n// from: https://semver.org/\nconst semverRegex = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?$/\nconst npm = (process.platform === 'win32' ? 'npm.cmd' : 'npm');\nconst packDirName = \"./.output\";\nconst packDir = path.join(__dirname, \"../..\", packDirName);\n\nasync function main() {\n    const plog = prettyLogger('version-and-pack', 'main');\n\n    // Extract version from command line\n    const version = extractVersion(process.argv);\n    if (version === undefined) {\n        throw new TypeError(\"You must specifiy --version as an argument\");\n    }\n    if (!semverRegex.test(version)) {\n        throw new RangeError(`Version must match semver V1 format (i.e. X.X.X-label). Received: \"${version}\"`);\n    }\n    plog(`Setting version: ${version}`);\n\n    // Load all modules we care about from rush\n    let projects;\n    try {\n        const rushConfig = require('../../rush.json');\n        projects = rushConfig.projects;\n        plog(\"Loading projects:\");\n        plog(JSON.stringify(projects, null, ' '));\n    } catch (e) {\n        plog(\"Could not load projects from rush.json\");\n        throw e;\n    }\n\n    try {\n        plog(\"Creating output directory: \" + packDir);\n        createIfNotExistSync(packDir);\n    } catch (e) {\n        plog(\"Could not create output directory\");\n        throw e;\n    }\n    for (const project of projects) {\n        plog(\"Bumping version for \" + project.packageName + \" to \" + version);\n        const pathToPackage = path.join(__dirname, \"../../\", project.projectFolder);\n        await exec(npm, ['version', version, '--allow-same-version'], { cwd: pathToPackage });\n\n        plog(\"Updating dependencies in package.json\");\n        const packageJsonPath = path.join(pathToPackage, 'package.json');\n        const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n\n        for (const dep of projects) {\n            if (packageJson.dependencies[dep.packageName]) {\n                plog(\"Updating version in \" + project.packageName + \": \" + dep.packageName + \" -> \" + version);\n                packageJson.dependencies[dep.packageName] = version;\n            }\n        }\n\n        fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, ' ') + '\\n', {\n            encoding: 'utf8'\n        });\n\n        plog(\"Packing \" + project.packageName);\n        const output = await exec(npm, ['pack'], { cwd: pathToPackage });\n        const tgz = parseTgz(output);\n        plog('found tgz: ' + tgz);\n        fs.copyFileSync(path.join(pathToPackage, tgz), path.join(packDir, tgz));\n    }\n\n    plog('Complete');\n}\n\nfunction extractVersion(argv) {\n    for (let i = 1; i < argv.length; i++) {\n        if (argv[i - 1] === '--version') {\n            return argv[i].trim();\n        }\n    }\n}\n\nfunction parseTgz(text) {\n    const lines = text.split('\\n');\n    for (const line of lines) {\n        if (line.endsWith('.tgz')) {\n            return line;\n        }\n    }\n}\n\nasync function exec(command, args, opts) {\n    const stdout = prettyLogger(command, 'stdout');\n    const stderr = prettyLogger(command, 'stderr');\n    const error = prettyLogger(command, 'error');\n\n    return new Promise((resolve, reject) => {\n        const p = cp.spawn(command, args, opts);\n        let buffer = '';\n\n        p.stdout.on('data', data => {\n            buffer += data;\n            stdout(`[${command}][stdout]: ${data}`);\n        });\n\n        p.stderr.on('data', data => {\n            stderr(`[${command}][stderr]: ${data}`);\n        });\n\n        p.on('error', err => {\n            error(err);\n        });\n\n        p.on('close', code => {\n            if (code !== 0) {\n                return reject(new Error(`\"${command} ${args.join(' ')}\" returned unsuccessful error code: ${code}`));\n            } else {\n                resolve(buffer);\n            }\n        });\n    });\n}\n\nfunction createIfNotExistSync(path) {\n    try {\n        fs.mkdirSync(path, { recursive: true });\n    } catch (e) {\n        if (!e.code === 'EEXIST') {\n            throw e;\n        }\n    }\n}\n\nfunction prettyLogger(...labels) {\n    const header = `[${labels.join('][')}]: `;\n    return (content) => {\n        if (typeof content !== 'string') {\n            content = JSON.stringify(content, null, ' ');\n        }\n        const lines = content.split('\\n');\n        lines.forEach((v) => console.log(header + v));\n    };\n}\n\nmain().catch(err => {\n    console.error(err);\n    process.exit(1);\n}).then(() => {\n    process.exit(0);\n});\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/.editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/.gitignore",
    "content": "*-debug.log\n*-error.log\n/.nyc_output\n/dist\n/lib\n/tmp\n/yarn.lock\nnode_modules\n**/.antlr\n**/java_generated\n\nresults"
  },
  {
    "path": "parsers/LU/JS/packages/lu/.nycrc",
    "content": "{\n  \"extension\": [\n    \".ts\",\n    \".js\"\n  ],\n  \"include\": [\n    \"src\"\n  ],\n  \"exclude\": [\n    \"**/node_modules/**\",\n    \"**/tests/**\",\n    \"**/coverage/**\",\n    \"**/*.d.ts\"\n  ],\n  \"reporter\": [\n    \"html\",\n    \"lcov\",\n    \"text\"\n  ],\n  \"all\": true,\n  \"cache\": true,\n  \"extends\": \"@istanbuljs/nyc-config-typescript\",\n  \"check-coverage\": false\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/README.md",
    "content": "\nThis package is intended for Microsoft use only. It is not designed to be consumed as an independent package.\n\n# Consuming @microsoft/bf-lu as a library\n@microsoft/bf-lu can be used within a Node.js application as an imported library. Install locally:\n\n```bash\nnpm install @microsoft/bf-lu --save\n```\n\n# V2 API\n\n## Parsing LU Content\nTo parse LU files, you can use the LUISBuilder class, which returns a LUIS class\n\n```js\nconst Luis = require('@microsoft/bf-lu').V2.Luis\nconst LUISBuilder = require('@microsoft/bf-lu').V2.LuisBuilder\nconst luContent = `# Greeting\n- hi`;\n\nconst luisObject = await LUISBuilder.fromContentAsync(luContent)\n\n// Parsed LUIS object\nconsole.log(JSON.stringify(luisObject, 2, null));\n        \n```\n\n## Validating parsed LU content\n\nYou can use the available validate() function to verify if the parsed LUIS object is valid. This helps catch name conflicts, invalid labelled utterances etc. \n\n```js\nconst LUISBuilder = require('@microsoft/bf-lu').V2.LuisBuilder\nconst exception = require('@microsoft/bf-lu').V2.Exception\nconst luContent = `# Greeting\n- hi`;\n\nconst luisObject = await LUISBuilder.fromLUAsync(luContent)\nluisObject.intents[0].name = \"testIntent123456789012345678901234567890123\"\nluisObject.validate()\n```\n\n## Generating lu content from LUIS JSON\n\nYou can generate lu content from LUIS instance using parseToLuContent() method. Here's an example code snippet. \n\n```js\nconst LUISBuilder = require('@microsoft/bf-lu').V2.LuisBuilder\nconst exception = require('@microsoft/bf-lu').V2.Exception\nconst luContent = `# Greeting\n- hi\n$userName:first=\n-vishwac`;\nconst log = false;\nconst locale = 'en-us';\nasync function parseContent() {\n\n    try {   \n        const luisObject = await LUISBuilder.fromContentAsync(luContent)\n        luisObject.validate()\n        const parsedLuisBackToLu = luisObject.parseToLuContent()\n    } catch (error) {\n        if (error instanceof exception) {\n        // do something specific to this exception\n        } else {\n            console.log(errObj.text);\n        }\n    }\n}\n\nparseContent();\n\n```\n## Translating lu files\n\nYou can take advantage of the [Microsoft text translation API](https://docs.microsoft.com/en-us/azure/cognitive-services/translator/) to automatically machine translate .lu files to one or more than [60+ languages](https://aka.ms/translate-langs) supported by the Microsoft text translation cognitive service.\n\nTo translate lu file content, you can simply use the translate() method in the LU class. Here's a code snippet.\n\n```js\nconst LU = require('@microsoft/bf-lu').V2.LU\nconst luContent = `# Greeting\n- hi\n$userName:first=\n-vishwac`;\nconst targetLanguage = 'de';\nconst subscriptionKey = '<YOUR TEXT TRANSLATION KEY>';\nconst translateComments = true;\nconst translateLinkText = true;\n\nconst luInstance = new LU(luContent)\nawait luInstance.translate(subscriptionKey, targetLanguage, translateComments, translateLinkText)\nconst translatedCode = luInstance.content\n\n```\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/package.json",
    "content": "{\n  \"name\": \"@microsoft/bf-lu-parser\",\n  \"version\": \"1.0.0\",\n  \"author\": \"Microsoft\",\n  \"bugs\": \"https://github.com/microsoft/botframework-cli/issues\",\n  \"main\": \"lib/parser/index.js\",\n  \"browser\": \"lib/parser/composerindex.js\",\n  \"engines\": {\n    \"node\": \">=8.0.0\"\n  },\n  \"files\": [\n    \"/lib\",\n    \"/npm-shrinkwrap.json\"\n  ],\n  \"homepage\": \"https://github.com/microsoft/botframework-cli\",\n  \"license\": \"MIT\",\n  \"repository\": \"https://github.com/microsoft/botframework-cli/tree/main/packages/lu\",\n  \"scripts\": {\n    \"postpack\": \"\",\n    \"posttest\": \"tslint -p test -t stylish\",\n    \"build\": \"tsc -b\",\n    \"clean\": \"rimraf ./.nyc_output ./lib ./package-lock.json ./tsconfig.tsbuildinfo\",\n    \"test\": \"mocha\",\n    \"coverage\": \"nyc npm run test\",\n    \"doc\": \"\",\n    \"doc:readme\": \"\",\n    \"version\": \"npm run doc:readme && git add README.md\"\n  },\n  \"nyc\": {\n    \"exclude\": [\n      \"**/lufile/generated/**\",\n      \"test/**\"\n    ]\n  },\n  \"dependencies\": {\n    \"@azure/cognitiveservices-luis-authoring\": \"4.0.0-preview.1\",\n    \"@azure/ms-rest-azure-js\": \"2.0.1\",\n    \"@types/node-fetch\": \"~2.5.5\",\n    \"antlr4\": \"^4.7.2\",\n    \"chalk\": \"2.4.1\",\n    \"console-stream\": \"^0.1.1\",\n    \"deep-equal\": \"^1.0.1\",\n    \"delay\": \"^4.3.0\",\n    \"fs-extra\": \"^8.1.0\",\n    \"get-stdin\": \"^6.0.0\",\n    \"globby\": \"^10.0.1\",\n    \"intercept-stdout\": \"^0.1.2\",\n    \"lodash\": \"^4.17.19\",\n    \"node-fetch\": \"~2.6.0\",\n    \"semver\": \"^5.5.1\",\n    \"tslib\": \"^1.10.0\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.2.0\",\n    \"@types/lodash\": \"~4.14.159\",\n    \"@types/mocha\": \"^5.2.7\",\n    \"@types/nock\": \"^11.1.0\",\n    \"@types/node\": \"^10.14.15\",\n    \"chai\": \"^4.2.0\",\n    \"mocha\": \"^6.2.2\",\n    \"nock\": \"^11.7.0\",\n    \"nyc\": \"^14.1.1\",\n    \"rimraf\": \"^2.6.3\",\n    \"ts-node\": \"^8.3.0\",\n    \"tslint\": \"^5.18.0\",\n    \"typescript\": \"^3.5.3\",\n    \"uuid\": \"^3.3.3\"\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/index.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport default {}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/composerindex.js",
    "content": "module.exports = {\n    parser: {\n        parseFile: require('./lufile/parseFileContents').parseFile,\n        validateLUISBlob: require('./luis/luisValidator')\n    },\n    sectionHandler: {\n        luParser: require('./lufile/luParser'),\n        sectionOperator: require('./lufile/sectionOperator'),\n        luSectionTypes: require('./utils/enums/lusectiontypes')\n    },\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/converters/helpers/writer.js",
    "content": "const fs = require(\"fs\");\nclass Writer {\n    constructor() {\n        this.indentSize = 4;\n        this.indentLevel = 0;\n        this.outputStream = undefined;\n    }\n    async setOutputStream(outputPath) {\n        const ConsoleStream = require('console-stream');\n        const stream = outputPath ? fs.createWriteStream(outputPath) : ConsoleStream();\n        const streamPromise = new Promise((resolve) => {\n            if (stream instanceof fs.WriteStream) {\n                stream.once('ready', (_fd) => {\n                    this.outputStream = stream;\n                    resolve();\n                });\n            }\n            else {\n                this.outputStream = stream;\n                resolve();\n            }\n        });\n        const timeoutPromise = new Promise((resolve) => {\n            setTimeout(resolve, 2000);\n            this.outputStream = stream;\n        });\n        return Promise.race([streamPromise, timeoutPromise]).then(() => {\n        });\n    }\n    increaseIndentation() {\n        this.indentLevel += this.indentSize;\n    }\n    decreaseIndentation() {\n        this.indentLevel -= this.indentSize;\n    }\n    write(str) {\n        this.outputStream.write(str);\n    }\n    writeLine(str = '') {\n        if (typeof str === 'string') {\n            this.write(str + '\\n');\n        }\n        else {\n            str.forEach(line => {\n                this.write(line + '\\n');\n            });\n        }\n    }\n    writeIndented(str) {\n        let writeFunction = (text) => {\n            for (let index = 0; index < this.indentLevel; index++) {\n                this.write(' ');\n            }\n            this.write(text);\n        };\n        writeFunction.bind(this);\n        if (typeof str === 'string') {\n            writeFunction(str);\n        }\n        else {\n            str.forEach(line => {\n                writeFunction(line);\n            });\n        }\n    }\n    writeLineIndented(lines) {\n        if (typeof lines === 'string') {\n            this.writeIndented(lines + '\\n');\n        }\n        else {\n            lines.forEach(line => {\n                this.writeIndented(line + '\\n');\n            });\n        }\n    }\n    async closeOutputStream() {\n        this.outputStream.end();\n        const streamPromise = new Promise((resolve) => {\n            if (this.outputStream instanceof fs.WriteStream) {\n                this.outputStream.on('finish', (_fd) => {\n                    resolve();\n                });\n            }\n            else {\n                resolve();\n            }\n        });\n        const timeoutPromise = new Promise((resolve) => {\n            setTimeout(resolve, 1000);\n        });\n        return Promise.race([streamPromise, timeoutPromise]).then(() => {\n            this.outputStream = undefined;\n        });\n    }\n}\nmodule.exports = Writer;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/converters/luistocsconverter.js",
    "content": "const parse_multi_platform_luis_1 = require(\"./../luis/propertyHelper\");\nconst LuisGenBuilder = require('./../luis/luisGenBuilder')\nconst exception = require('./../utils/exception');\nconst Writer = require(\"./helpers/writer\");\nconst lodash = require(\"lodash\")\n\nmodule.exports = {\n    writeFromLuisJson: async function(luisJson, className, space, outPath) {\n        const app = LuisGenBuilder.build(luisJson);\n        let writer = new Writer();\n        await writer.setOutputStream(outPath);\n        this.header(space, className, writer);\n        writer.writeLine();\n        this.intents(app.intents, writer);\n        this.entities(app, writer);\n        writer.writeLine();\n        writer.writeLineIndented([\n            '[JsonExtensionData(ReadData = true, WriteData = true)]',\n            'public IDictionary<string, object> Properties {get; set; }'\n        ]);\n        this.converter(className, writer);\n        this.onError(writer);\n        this.topScoringIntent(writer);\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}'); // Class\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}'); // Namespace\n        await writer.closeOutputStream();\n    },\n    header: function(space, className, writer) {\n        writer.writeLine([\n            '// <auto-generated>',\n            '// Code generated by luis:generate:cs',\n            '// Tool github: https://github.com/microsoft/botframework-cli',\n            '// Changes may cause incorrect behavior and will be lost if the code is',\n            '// regenerated.',\n            '// </auto-generated>',\n            'using Newtonsoft.Json;',\n            'using Newtonsoft.Json.Serialization;',\n            'using System;',\n            'using System.Collections.Generic;',\n            'using Microsoft.Bot.Builder;',\n            'using Microsoft.Bot.Builder.AI.Luis;',\n            `namespace ${space}`,\n            '{'\n        ]);\n        writer.increaseIndentation();\n        //Main class\n        writer.writeLineIndented([\n            `public partial class ${className}: IRecognizerConvert`,\n            '{'\n        ]);\n        writer.increaseIndentation();\n        //Text\n        writer.writeLineIndented([\n            '[JsonProperty(\"text\")]',\n            'public string Text;'\n        ]);\n        writer.writeLine();\n        writer.writeLineIndented([\n            '[JsonProperty(\"alteredText\")]',\n            'public string AlteredText;'\n        ]);\n    },\n    intents: function(intents, writer) {\n        writer.writeLineIndented('public enum Intent {');\n        writer.increaseIndentation();\n        const lastIntent = intents.pop();\n        intents.forEach((intent) => {\n            writer.writeLineIndented(`${intent},`);\n        });\n        if (lastIntent) {\n            writer.writeLineIndented(lastIntent);\n        }\n        writer.decreaseIndentation();\n        writer.writeLineIndented([\n            '};',\n            '[JsonProperty(\"intents\")]',\n            'public Dictionary<Intent, IntentScore> Intents;'\n        ]);\n    },\n    entities: function(app, writer) {\n        writer.writeLine();\n        writer.writeLineIndented([\n            'public class _Entities',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        this.writeEntityBlock(app.entities, 'Simple entities', (entity) => {\n            writer.writeLineIndented(this.getEntityWithType(entity));\n        }, writer);\n        this.writeEntityBlock(app.prebuiltEntities, 'Built-in entities', (entities) => {\n            const entityType = entities[0];\n            entities.forEach(entity => {\n                writer.writeLineIndented(this.getEntityWithType(entity, entityType));\n            });\n        }, writer);\n        this.writeEntityBlock(app.closedLists, 'Lists', (entity) => {\n            writer.writeLineIndented(this.getEntityWithType(entity, 'list'));\n        }, writer);\n        this.writeEntityBlock(app.regex_entities, 'Regex entities', (entity) => {\n            writer.writeLineIndented(this.getEntityWithType(entity));\n        }, writer);\n        this.writeEntityBlock(app.patternAnyEntities, 'Pattern.any', (entity) => {\n            writer.writeLineIndented(this.getEntityWithType(entity));\n        }, writer);\n        // Composites\n        if (app.composites.length > 0) {\n            writer.writeLine();\n            writer.writeLineIndented('// Composites');\n            let first = true;\n            app.composites.forEach(composite => {\n                if (first) {\n                    first = false;\n                }\n                else {\n                    writer.writeLine();\n                }\n                writer.writeLineIndented([\n                    `public class _Instance${lodash.upperFirst(composite.compositeName)}`,\n                    '{'\n                ]);\n                writer.increaseIndentation();\n                composite.attributes.forEach(attr => {\n                    writer.writeLineIndented([\n                        `public InstanceData[] ${parse_multi_platform_luis_1.jsonPropertyName(attr)};`\n                    ]);\n                });\n                writer.decreaseIndentation();\n                writer.writeLineIndented([\n                    '}',\n                    `public class ${lodash.upperFirst(composite.compositeName)}Class`,\n                    '{'\n                ]);\n                writer.increaseIndentation();\n                composite.attributes.forEach(attr => {\n                    writer.writeLineIndented(this.getEntityWithType(attr, app.closedLists.includes(attr) ? 'list' : attr));\n\n                });\n                writer.writeLineIndented([\n                    '[JsonProperty(\"$instance\")]',\n                    `public _Instance${lodash.upperFirst(composite.compositeName)} _instance;`\n                ]);\n                writer.decreaseIndentation();\n                writer.writeLineIndented([\n                    '}',\n                    `public ${lodash.upperFirst(composite.compositeName)}Class[] ${composite.compositeName};`\n                ]);\n            });\n        }\n        // Instance\n        writer.writeLine();\n        writer.writeLineIndented([\n            '// Instance',\n            'public class _Instance',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        app.getInstancesList().forEach(instanceData => {\n            writer.writeLineIndented(`public InstanceData[] ${parse_multi_platform_luis_1.jsonPropertyName(instanceData)};`);\n        });\n        writer.decreaseIndentation();\n        writer.writeLineIndented([\n            '}',\n            '[JsonProperty(\"$instance\")]',\n            'public _Instance _instance;'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented([\n            '}',\n            '[JsonProperty(\"entities\")]',\n            'public _Entities Entities;'\n        ]);\n    },\n    getEntityWithType: function(entityNameOrObject, entityType = '') {\n        if (typeof entityNameOrObject === 'object' && 'name' in entityNameOrObject){\n            if ('instanceOf' in entityNameOrObject){\n                entityType = entityNameOrObject.instanceOf\n                entityNameOrObject = entityNameOrObject.name\n            } else if (entityNameOrObject.compositeInstanceOf) {\n                let name = parse_multi_platform_luis_1.jsonPropertyName(entityNameOrObject.name)\n                return `public ${lodash.upperFirst(name)}Class[] ${name};`\n            } else {\n                throw (new exception(\"Invalid LuisGen object: cannot parse entity\"))\n            }\n        }\n        let result = '';\n        switch (entityType) {\n            case 'age':\n                result = 'public Age[]';\n                break;\n            case 'datetimeV2':\n                result = 'public DateTimeSpec[]';\n                break;\n            case 'dimension':\n                result = 'public Dimension[]';\n                break;\n            case 'geographyV2':\n                result = 'public GeographyV2[]';\n                break;\n            case 'list':\n                result = 'public string[][]';\n                break;\n            case 'money':\n                result = 'public Money[]';\n                break;\n            case 'ordinalV2':\n                result = 'public OrdinalV2[]';\n                break;\n            case 'temperature':\n                result = 'public Temperature[]';\n                break;\n            case 'number':\n            case 'ordinal':\n            case 'percentage':\n                result = 'public double[]';\n                break;\n            default:\n                result = 'public string[]';\n        }\n        return result + ` ${parse_multi_platform_luis_1.jsonPropertyName(entityNameOrObject)};`;\n    },\n    converter: function(className, writer) {\n        writer.writeLine();\n        writer.writeLineIndented([\n            'public void Convert(dynamic result)',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        writer.writeLineIndented(\n            `var app = JsonConvert.DeserializeObject<${className}>(`,\n        );\n        writer.increaseIndentation();\n        writer.writeLineIndented(\n            'JsonConvert.SerializeObject('\n        );\n        writer.increaseIndentation();\n        writer.writeLineIndented([\n            'result,',\n            'new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented(')');\n        writer.decreaseIndentation();\n        writer.writeLineIndented([\n            ');',\n            'Text = app.Text;',\n            'AlteredText = app.AlteredText;',\n            'Intents = app.Intents;',\n            'Entities = app.Entities;',\n            'Properties = app.Properties;'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n    },\n    onError: function(writer) {\n        writer.writeLine();\n        writer.writeLineIndented([\n            'private static void OnError(object sender, ErrorEventArgs args)',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        writer.writeLineIndented([\n            '// If needed, put your custom error logic here',\n            'Console.WriteLine(args.ErrorContext.Error.Message);',\n            'args.ErrorContext.Handled = true;'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n    },\n    topScoringIntent: function(writer) {\n        writer.writeLine();\n        writer.writeLineIndented([\n            'public (Intent intent, double score) TopIntent()',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        writer.writeLineIndented([\n            'Intent maxIntent = Intent.None;',\n            'var max = 0.0;',\n            'foreach (var entry in Intents)',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        writer.writeLineIndented([\n            'if (entry.Value.Score > max)',\n            '{'\n        ]);\n        writer.increaseIndentation();\n        writer.writeLineIndented([\n            'maxIntent = entry.Key;',\n            'max = entry.Value.Score.Value;'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n        writer.decreaseIndentation();\n        writer.writeLineIndented([\n            '}',\n            'return (maxIntent, max);'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n    },\n    writeEntityBlock: function(entities, message, logic, writer) {\n        if (entities.length > 0) {\n            if (message !== '') {\n                writer.writeLineIndented(`// ${message}`);\n            }\n            entities.forEach(logic);\n            writer.writeLine();\n        }\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/converters/luistotsconverter.js",
    "content": "const parse_multi_platform_luis_1 = require('./../luis/propertyHelper');\nconst LuisGenBuilder = require('./../luis/luisGenBuilder')\nconst Writer = require('./helpers/writer')\n\nmodule.exports = {\n    writeFromLuisJson: async function(luisJson, className, outPath) {\n        const app = LuisGenBuilder.build(luisJson);\n        let writer = new Writer();\n        writer.indentSize = 2;\n        await writer.setOutputStream(outPath);\n        this.header(writer);\n        this.intents(app, writer);\n        this.entities(app, writer);\n        this.classInterface(className, writer);\n        await writer.closeOutputStream();\n    },\n    header: function(writer) {\n        writer.writeLine([\n            '/**',\n            ' * <auto-generated>',\n            ' * Code generated by luis:generate:ts',\n            ' * Tool github: https://github.com/microsoft/botframework-cli',\n            ' * Changes may cause incorrect behavior and will be lost if the code is',\n            ' * regenerated.',\n            ' * </auto-generated>',\n            ' */',\n            \"import {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\"\n        ]);\n    },\n    intents: function(app, writer) {\n        writer.writeLine();\n        writer.writeLineIndented('export interface GeneratedIntents {');\n        writer.increaseIndentation();\n        app.intents.forEach((intent) => {\n            writer.writeLineIndented(`${parse_multi_platform_luis_1.normalizeName(intent)}: IntentData`);\n        });\n        writer.decreaseIndentation();\n        writer.writeLine('}');\n    },\n    entities: function(app, writer) {\n        // Composite instance and data\n        app.composites.forEach((composite) => {\n            let name = parse_multi_platform_luis_1.normalizeName(composite.compositeName);\n            writer.writeLine();\n            writer.writeLineIndented(`export interface GeneratedInstance${name} {`);\n            writer.increaseIndentation();\n            composite.attributes.forEach((attribute) => {\n                writer.writeLineIndented(`${parse_multi_platform_luis_1.jsonPropertyName(attribute)}?: InstanceData[]`);\n            });\n            writer.decreaseIndentation();\n            writer.writeLineIndented('}');\n            writer.writeLineIndented(`export interface ${name} {`);\n            writer.increaseIndentation();\n            composite.attributes.forEach(attribute => {\n                writer.writeLineIndented(this.getEntityWithType(attribute, this.isList(attribute, app)));\n            });\n            writer.writeLineIndented(`$instance?: GeneratedInstance${name}`);\n            writer.decreaseIndentation();\n            writer.writeLineIndented('}');\n        });\n        writer.writeLine();\n        // Entity instance\n        writer.writeLineIndented('export interface GeneratedInstance {');\n        writer.increaseIndentation();\n        app.getInstancesList().forEach(instance => {\n            writer.writeLineIndented(`${parse_multi_platform_luis_1.jsonPropertyName(instance)}?: InstanceData[]`);\n        });\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n        // Entities\n        writer.writeLine();\n        writer.writeLineIndented('export interface GeneratedEntities {');\n        writer.increaseIndentation();\n        this.writeEntityGroup(app.entities, '// Simple entities', writer);\n        writer.writeLineIndented('// Built-in entities');\n        app.prebuiltEntities.forEach(builtInEntity => {\n            builtInEntity.forEach(entity => {\n                writer.writeLineIndented(this.getEntityWithType(entity));\n            });\n        });\n        writer.writeLine();\n        this.writeEntityGroup(app.closedLists, '// Lists', writer, true);\n        this.writeEntityGroup(app.regex_entities, '// Regex entities', writer);\n        this.writeEntityGroup(app.patternAnyEntities, '// Pattern.any', writer);\n        // Composites\n        writer.writeLineIndented('// Composites');\n        app.composites.forEach(composite => {\n            writer.writeLineIndented(`${composite.compositeName}?: ${composite.compositeName}[]`);\n        });\n        writer.writeLineIndented('$instance: GeneratedInstance');\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n    },\n    classInterface: function(className, writer) {\n        writer.writeLine();\n        writer.writeLineIndented(`export interface ${className} {`);\n        writer.increaseIndentation();\n        writer.writeLineIndented([\n            'text: string',\n            'alteredText?: string',\n            'intents: GeneratedIntents',\n            'entities: GeneratedEntities',\n            '[propName: string]: any'\n        ]);\n        writer.decreaseIndentation();\n        writer.writeLineIndented('}');\n    },\n    writeEntityGroup: function(entityGroup, description, writer, isListType = false) {\n        writer.writeLineIndented(description);\n        entityGroup.forEach(entity => {\n            writer.writeLineIndented(this.getEntityWithType(entity, isListType));\n        });\n        writer.writeLine();\n    },\n    isList: function(entityName, app) {\n        return app.closedLists.includes(entityName);\n    },\n    getEntityWithType: function(entityName, isListType = false) {\n        let result = '';\n        switch (isListType ? 'list' : entityName) {\n            case 'age':\n            case 'dimension':\n            case 'money':\n            case 'temperature':\n                result = '?: NumberWithUnits[]';\n                break;\n            case 'geographyV2':\n                result = '?: GeographyV2[]';\n                break;\n            case 'ordinalV2':\n                result = '?: OrdinalV2[]';\n                break;\n            case 'number':\n            case 'ordinal':\n            case 'percentage':\n                result = '?: number[]';\n                break;\n            case 'datetimeV2':\n                result = '?: DateTimeSpec[]';\n                break;\n            case 'list':\n                result = '?: string[][]';\n                break;\n            default:\n                result = '?: string[]';\n        }\n        return parse_multi_platform_luis_1.jsonPropertyName(entityName) + result;\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/cross-train/confighelper.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = require('fs-extra')\nconst path = require('path')\nconst exception = require('../utils/exception')\nconst retCode = require('../utils/enums/CLI-errors')\nconst fileHelper = require('../../utils/filehelper')\n\nconst dialogExt = '.dialog'\nconst luExt = '.lu'\n\nmodule.exports = {\n  generateConfig: async function (inputFolder, rootDialogFile) {\n    let dialogFiles = []\n    await getDialogFiles(inputFolder, dialogFiles)\n  \n    let rootDialogObject = JSON.parse(await getInputFromFile(rootDialogFile))\n    rootDialogObject.path = rootDialogFile\n    rootDialogObject.isRoot = true\n  \n    let dialogObjects = []\n    for (const dialogFile of dialogFiles) {\n      let dialogObject = JSON.parse(await getInputFromFile(dialogFile))\n      dialogObject.path = dialogFile\n      dialogObjects.push(dialogObject)\n    }\n  \n    const configObject = createConfig(rootDialogObject, dialogObjects, inputFolder)\n  \n    return JSON.stringify(configObject)\n  }\n}\n\nconst getDialogFiles = async function (inputFolder, results) {\n  fs.readdirSync(inputFolder).forEach(async dirContent => {\n    dirContent = path.resolve(inputFolder, dirContent)\n    if (fs.statSync(dirContent).isDirectory()) {\n      await getDialogFiles(dirContent, results)\n    }\n\n    if (fs.statSync(dirContent).isFile()) {\n      if (dirContent.endsWith(dialogExt)) {\n        results.push(dirContent)\n      }\n    }\n  })\n}\n\nconst getInputFromFile = async function (path) {\n  if (path) {\n    try {\n      return await fileHelper.getContentFromFile(path)\n    } catch (error) {\n      throw (new exception(retCode.errorCode.INVALID_INPUT, `Failed to read file: ${error}`))\n    }\n  }\n  return ''\n}\n\nconst createConfig = function (rootDialog, dialogs, configPath) {\n  let result = {}\n\n  const key = createPath(rootDialog.path, configPath)\n  const rootLuPath = rootDialog.path.replace(dialogExt, luExt)\n\n  if (!fs.existsSync(rootLuPath)) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT, `Failed to parse mapping rules config from file system: ${rootLuPath} does not exist. Please provide config file by --config`))\n  }\n\n  rootDialog.triggers.forEach(trigger => {\n    if (trigger.$type && trigger.$type === 'Microsoft.OnIntent') {\n      const actions = trigger.actions || []\n      for (const action of actions) {\n        if (action.$type !== 'Microsoft.BeginDialog') continue\n\n        const dialogName = action.dialog\n        const target = dialogs.find(dialog => path.basename(dialog.path, dialogExt) === dialogName)\n        \n        if (!target) continue\n\n        const relativePath = createPath(target.path, configPath)\n        if (!result[key]) result[key] = { triggers: {} }\n        if (!result[key].triggers[trigger.intent]) {\n          result[key].triggers[trigger.intent] = relativePath\n        } else if (typeof result[key].triggers[trigger.intent] === 'string') {\n          result[key].triggers[trigger.intent] = [result[key].triggers[trigger.intent], relativePath]\n        } else {\n          result[key].triggers[trigger.intent].push(relativePath)\n        }\n\n        result = { ...result, ...createConfig(target, dialogs, configPath) }\n      }\n    }\n  })\n\n  if (rootDialog.isRoot && result[key]) result[key].rootDialog = true\n\n  return result\n}\n\nconst createPath = function (dialogPath, configPath) {\n  const luFilePath = dialogPath.replace('.dialog', '.lu')\n  const relativePath = path.relative(configPath, luFilePath)\n  return relativePath\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/cross-train/cross-train.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = require('fs-extra')\nconst path = require('path')\nconst file = require('../../utils/filehelper')\nconst fileExtEnum = require('../utils/helpers').FileExtTypeEnum\nconst crossTrainer = require('./crossTrainer')\nconst confighelper = require('./confighelper')\n\nmodule.exports = {\n  /**\n   * Generate cross train config based on input folder and root dialog file.\n   * @param {string} inputFolder full path of input lu and qna files folder.\n   * @param {string} rootDialogFile full path of root dialog file.\n   * @returns {string} config object json string.\n   */\n  generateConfig: async function (inputFolder, rootDialogFile) {\n    const configStr = await confighelper.generateConfig(inputFolder, rootDialogFile)\n\n    return configStr\n  },\n\n  /**\n   * Cross train lu and qna files.\n   * @param {string} input full path of input lu and qna files folder.\n   * @param {string} intentName interruption intent name. Default value is _Interruption.\n   * @param {string} config path to config of mapping rules or mapping rules json content itself. If undefined, it will read config.json from input folder.\n   * @param {boolean} verbose verbose to indicate whether log warnings and errors or not when parsing cross-train files.\n   * @returns {luResult: any, qnaResult: any} trainedResult of luResult and qnaResult or undefined if no results.\n   */\n  train: async function (input, intentName, config, verbose) {\n    // Get all related file content.\n    const luContents = await file.getFilesContent(input, fileExtEnum.LUFile)\n    const qnaContents = await file.getFilesContent(input, fileExtEnum.QnAFile)\n    const configContent = config && !fs.existsSync(config) ? {id: path.join(input, 'config.json'), content: config} : await file.getConfigContent(config)\n\n    const configObject = file.getConfigObject(configContent, intentName, verbose)\n\n    const trainedResult = await crossTrainer.crossTrain(luContents, qnaContents, configObject)\n    \n    return trainedResult\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/cross-train/crossTrainer.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst helpers = require('../utils/helpers')\nconst fileExtEnum = require('../utils/helpers').FileExtTypeEnum\nconst luParser = require('../lufile/luParser')\nconst SectionOperator = require('../lufile/sectionOperator')\nconst LUSectionTypes = require('../utils/enums/lusectiontypes')\nconst LUResource = require('../lufile/luResource')\nconst DiagnosticSeverity = require('../lufile/diagnostic').DiagnosticSeverity\nconst fileHelper = require('../../utils/filehelper')\nconst exception = require('../utils/exception')\nconst retCode = require('../utils/enums/CLI-errors')\nconst prebuiltEntityTypes = require('../utils/enums/luisbuiltintypes').consolidatedList\nconst LuisBuilderVerbose = require('./../luis/luisCollate')\nconst Luis = require('./../luis/luis')\nconst qnaBuilderVerbose = require('./../qna/qnamaker/kbCollate')\nconst NEWLINE = require('os').EOL\nconst path = require('path')\nconst QNA_GENERIC_SOURCE = \"custom editorial\"\nconst MAX_QUESTIONS_PER_ANSWER = 1000\n\nmodule.exports = {\n  /**\n   * Do cross training among lu files\n   * @param {any[]} luContents the lu content array whose element includes path and content\n   * @param {any[]} qnaContents the qna content array whose element includes path and content\n   * @param {any} crossTrainConfig cross train json config\n   * @param {any} importResolver import Resolver when resolving import files\n   * @returns {Map<string, LUResource>} map of file id and luResource\n   * @throws {exception} throws errors\n   */\n  crossTrain: async function (luContents, qnaContents, crossTrainConfig, importResolver) {\n    try {\n      let {luObjectArray, qnaObjectArray} = pretreatment(luContents, qnaContents)\n      const {rootIds, triggerRules, intentName, verbose} = crossTrainConfig\n\n      // parse lu content to LUResource object\n      let {fileIdToResourceMap: luFileIdToResourceMap, allEmpty: allLuEmpty} = await parseAndValidateContent(luObjectArray, verbose, importResolver)\n\n      // parse qna content to LUResource object\n      let {fileIdToResourceMap: qnaFileIdToResourceMap, allEmpty: allQnAEmpty} = await parseAndValidateContent(qnaObjectArray, verbose, importResolver)\n\n      if (!allLuEmpty) {\n        // construct resource tree to build the father-children relationship among lu files\n        let resources = constructResoureTree(luFileIdToResourceMap, triggerRules)\n\n        // do lu cross training from roots. One root one core training\n        for (const rootObjectId of rootIds) {\n          if (resources.some(r => r.id.toLowerCase() === rootObjectId.toLowerCase())) {\n            // do cross training for each root at top level\n            const result = luCrossTrain(rootObjectId, resources, qnaFileIdToResourceMap, intentName)\n            for (const res of result) {\n              luFileIdToResourceMap.set(res.id, res.content)\n            }\n          } else {\n            throw (new exception(retCode.errorCode.INVALID_INPUT, `Sorry, root lu file '${rootObjectId}' does not exist`))\n          }\n        }\n      }\n\n      if (!allQnAEmpty) {\n        // do qna cross training with lu files\n        qnaCrossTrain(qnaFileIdToResourceMap, luFileIdToResourceMap, intentName, allLuEmpty)\n      }\n\n      return { luResult: luFileIdToResourceMap, qnaResult: qnaFileIdToResourceMap }\n    } catch (err) {\n      throw (err)\n    }\n  }\n}\n\n/**\n * Contruct resource tree to build the father-children relationship among lu files\n * @param {Map<string, LUResource>} fileIdToLuResourceMap Map of file id and luResource\n * @param {any} triggerRules trigger rules object that indicate the triggering rules from root to dest lu files\n * @returns {any[]} object array of LUResource with id and children properties \n * @throws {exception} throws errors\n */\nconst constructResoureTree = function (fileIdToLuResourceMap, triggerRules) {\n  let resources = []\n  let fileIdsFromInput = Array.from(fileIdToLuResourceMap.keys())\n  let lowerCasefileIdsFromInput = Array.from(fileIdToLuResourceMap.keys()).map(x => x.toLowerCase())\n  let triggerKeys = Object.keys(triggerRules)\n  let lowerCaseTriggerKeys = triggerKeys.map(x => x.toLowerCase())\n\n  for (const fileId of fileIdsFromInput) {\n    let luResource = fileIdToLuResourceMap.get(fileId)\n    let resource = {\n      id: fileId,\n      content: luResource,\n      children: []\n    }\n\n    if (!lowerCaseTriggerKeys.includes(fileId.toLowerCase())) {\n      resources.push(resource)\n      continue\n    }\n\n    let intents = []\n    for (const section of luResource.Sections) {\n      if (section.SectionType === LUSectionTypes.SIMPLEINTENTSECTION\n        || section.SectionType === LUSectionTypes.NESTEDINTENTSECTION) {\n        intents.push(section)\n      }\n    }\n\n    const intentToDestLuFiles = triggerRules[triggerKeys.find(k => k.toLowerCase() === fileId.toLowerCase())]\n    for (const triggerIntent of Object.keys(intentToDestLuFiles)) {\n      if (triggerIntent !== '' && !intents.some(i => i.Name === triggerIntent)) {\n        throw (new exception(retCode.errorCode.INVALID_INPUT, `Sorry, trigger intent '${triggerIntent}' is not found in lu file: ${fileId}`))\n      }\n\n      let destLuFiles = intentToDestLuFiles[triggerIntent]\n      if (typeof destLuFiles === 'string') destLuFiles = [destLuFiles]\n\n      if (destLuFiles.length > 0) {\n        destLuFiles.forEach(destLuFile => {\n          if (destLuFile !== '' && !lowerCasefileIdsFromInput.includes(destLuFile.toLowerCase())) {\n            throw (new exception(retCode.errorCode.INVALID_INPUT, `Sorry, lu file '${destLuFile}' is not found`))\n          } else {\n            resource.children.push({\n              target: fileIdsFromInput.find(x => x.toLowerCase() === destLuFile.toLowerCase()) || '',\n              intent: triggerIntent\n            })\n          }\n        })\n      } else {\n        resource.children.push({\n          target: '',\n          intent: triggerIntent\n        })\n      }\n    }\n\n    resources.push(resource)\n  }\n\n  return resources\n}\n\n/**\n * Lu cross training core function. Do lu cross training from a root to its children once.\n * @param {string} rootResourceId the root resource object id\n * @param {any[]} resources all lu resource object list\n * @param {any[]} qnaFileToResourceMap map of qna file id and resource\n * @param {string} intentName interruption intent name\n * @returns {any[]} updated resource objects\n */\nconst luCrossTrain = function (rootResourceId, resources, qnaFileToResourceMap, intentName) {\n  const idToResourceMap = new Map()\n  for (const resource of resources) {\n    idToResourceMap.set(resource.id, resource)\n  }\n\n  // Parse resources\n  let rootResource = resources.filter(r => r.id.toLowerCase() === rootResourceId.toLowerCase())[0]\n  rootResource.visited = true\n  mergeRootInterruptionToLeaves(rootResource, idToResourceMap, qnaFileToResourceMap, intentName)\n  \n  return Array.from(idToResourceMap.values())\n}\n\nconst mergeRootInterruptionToLeaves = function (rootResource, result, qnaFileToResourceMap, intentName) {\n  if (rootResource.children === undefined || rootResource.length <= 0) return\n\n  rootResource.content = removeDupUtterances(rootResource.content)\n\n  mergeBrothersInterruption(rootResource, result, intentName)\n  for (const child of rootResource.children) {\n    let childResource = result.get(child.target)\n    if (childResource && childResource.visited === undefined) {\n      let rootQnaFileId = rootResource.id.toLowerCase().replace(new RegExp(helpers.FileExtTypeEnum.LUFile + '$'), helpers.FileExtTypeEnum.QnAFile)\n      rootQnaFileId = Array.from(qnaFileToResourceMap.keys()).find(x => x.toLowerCase() === rootQnaFileId)\n      const rootQnaResource = qnaFileToResourceMap.get(rootQnaFileId)\n      const newChildResource = mergeFatherInterruptionToChild(rootResource, rootQnaResource, childResource, intentName)\n      result.set(child.target, newChildResource)\n      newChildResource.visited = true\n      mergeRootInterruptionToLeaves(newChildResource, result, qnaFileToResourceMap, intentName)\n    }\n  }\n}\n\nconst mergeBrothersInterruption = function (resource, result, intentName) {\n  let children = resource.children\n  for (const child of children) {\n    const triggerIntent = child.intent\n    const destLuFile = child.target\n    let intentsWithSameTarget = []\n    if (destLuFile !== '') intentsWithSameTarget = children.filter(c => c.target === destLuFile && c.intent !== '').map(x => x.intent)\n\n    const brotherSections = resource.content.Sections.filter(s => s.Name !== triggerIntent\n      && s.Name !== intentName\n      && (s.SectionType === LUSectionTypes.SIMPLEINTENTSECTION || s.SectionType === LUSectionTypes.NESTEDINTENTSECTION)\n      && children.some(brotherChild => brotherChild.intent === s.Name)\n      && !intentsWithSameTarget.some(intent => intent === s.Name))\n\n    let brotherUtterances = []\n    brotherSections.forEach(s => {\n      if (s.SectionType === LUSectionTypes.SIMPLEINTENTSECTION) {\n        brotherUtterances = brotherUtterances.concat(s.UtteranceAndEntitiesMap.map(u => u.utterance).filter(i => !patternWithPrebuiltEntity(i)))\n      } else {\n        s.SimpleIntentSections.forEach(section => {\n          brotherUtterances = brotherUtterances.concat(section.UtteranceAndEntitiesMap.map(u => u.utterance).filter(i => !patternWithPrebuiltEntity(i)))\n        })\n      }\n    })\n\n    let targetResource = result.get(child.target)\n\n    // Merge direct brother's utterances\n    if (targetResource) {\n      targetResource = mergeInterruptionIntent(brotherUtterances, targetResource, intentName)\n      result.set(targetResource.id, targetResource)\n    }\n  }\n}\n\nconst mergeFatherInterruptionToChild = function (fatherResource, fatherQnaResource, childResource, intentName) {\n  let fatherUtterances = []\n\n  // extract father existing interruption utterances\n  const fatherInterruptions = fatherResource.content.Sections.filter(s => s.Name === intentName)\n  if (fatherInterruptions && fatherInterruptions.length > 0) {\n    const fatherInterruption = fatherInterruptions[0]\n    fatherUtterances = fatherUtterances.concat(fatherInterruption.UtteranceAndEntitiesMap.map(u => u.utterance))\n  }\n\n  // extract corresponding qna questions from father\n  let questions = []\n  if (fatherQnaResource) {\n    const qnaSections = fatherQnaResource.Sections.filter(s => s.SectionType === LUSectionTypes.QNASECTION)\n    qnaSections.forEach(q => questions = questions.concat(q.Questions))\n  }\n\n  fatherUtterances = fatherUtterances.concat(questions)\n  if (fatherUtterances.length > 0) {\n    childResource = mergeInterruptionIntent(fatherUtterances, childResource, intentName)\n  }\n\n  return childResource\n}\n\nconst mergeInterruptionIntent = function (fromUtterances, toResource, intentName) {\n  // remove duplicated utterances in fromUtterances\n  const dedupFromUtterances = Array.from(new Set(fromUtterances))\n  let existingUtterances = extractIntentUtterances(toResource.content).map(u => u.toLowerCase())\n  const toInterruptions = toResource.content.Sections.filter(section => section.Name === intentName)\n  if (toInterruptions && toInterruptions.length > 0) {\n    const toInterruption = toInterruptions[0]\n    // construct new content here\n    let newFileContent = ''\n    dedupFromUtterances.forEach(utterance => {\n      if (!existingUtterances.includes(utterance.toLowerCase())) {\n        newFileContent += '- ' + utterance + NEWLINE\n      }\n    })\n\n    if (newFileContent === '') return toResource\n\n    const existingContent = `# ${toInterruption.Name}${NEWLINE}${toInterruption.Body}`\n    newFileContent = existingContent + NEWLINE + newFileContent\n    let lines = newFileContent.split(/\\r?\\n/)\n    let newLines = []\n    lines.forEach(line => {\n      if (line.trim().startsWith('-')) {\n        newLines.push('- ' + line.trim().slice(1).trim())\n      } else if (line.trim().startsWith('##')) {\n        newLines.push('## ' + line.trim().slice(2).trim())\n      } else if (line.trim().startsWith('#')) {\n        newLines.push('# ' + line.trim().slice(1).trim())\n      }\n    })\n\n    newFileContent = newLines.join(NEWLINE)\n\n    // update section here\n    toResource.content = new SectionOperator(toResource.content).updateSection(toInterruption.Id, newFileContent)\n  } else {\n    // construct new content here\n    const dedupUtterances = dedupFromUtterances.filter(u => !existingUtterances.includes(u.toLowerCase()))\n    if (dedupUtterances && dedupUtterances.length > 0) {\n      let newFileContent = `${NEWLINE}> Source: cross training. Please do not edit these directly!${NEWLINE}# ${intentName}${NEWLINE}- `\n      newFileContent += dedupUtterances.join(`${NEWLINE}- `)\n\n      // add section here\n      // not add the interruption intent if original file is empty\n      if (toResource.content.Content !== '') {\n        toResource.content = new SectionOperator(toResource.content).addSection(newFileContent)\n      }\n    }\n  }\n\n  return toResource\n}\n\nconst removeDupUtterances = function (resource) {\n  let newResource = resource\n  resource.Sections.forEach(s => {\n    if (s.SectionType === LUSectionTypes.SIMPLEINTENTSECTION) {\n      const intentUtterances = s.UtteranceAndEntitiesMap.map(u => u.utterance)\n      const dedupedUtterances = Array.from(new Set(intentUtterances))\n      if (intentUtterances.length > dedupedUtterances.length) {\n        const intentContent = dedupedUtterances.join(NEWLINE + '- ')\n        const newSectionContent = `# ${s.Name}${NEWLINE}- ${intentContent}`\n        newResource = new SectionOperator(newResource).updateSection(s.Id, newSectionContent)\n      }\n    }\n  })\n\n  return newResource\n}\n\nconst extractIntentUtterances = function(resource, intentName) {\n  const intentSections = resource.Sections.filter(s => s.SectionType === LUSectionTypes.SIMPLEINTENTSECTION || s.SectionType === LUSectionTypes.NESTEDINTENTSECTION)\n\n  let intentUtterances = []\n  if (intentName && intentName !== '') {\n    const specificSections = intentSections.filter(s => s.Name === intentName)\n    if (specificSections.length > 0) {\n      intentUtterances = intentUtterances.concat(specificSections[0].UtteranceAndEntitiesMap.map(u => u.utterance))\n    }\n  } else {\n    intentSections.forEach(s => {\n      if (s.SectionType === LUSectionTypes.SIMPLEINTENTSECTION) {\n        intentUtterances = intentUtterances.concat(s.UtteranceAndEntitiesMap.map(u => u.utterance))\n      } else {\n        s.SimpleIntentSections.forEach(section => {\n          intentUtterances = intentUtterances.concat(section.UtteranceAndEntitiesMap.map(u => u.utterance))\n        })\n      }\n  })}\n\n  return intentUtterances\n}\n\n/**\n * do qna cross training with lu files\n * @param {Map<string, LUResource>} qnaFileIdToResourceMap map of qna file id and resource\n * @param {Map<string, LUResource>} luFileIdToResourceMap map of lu file id and resource\n * @param {string} interruptionIntentName interruption intent name\n * @param {boolean} allLuEmpty indicate if all lu files are section empty\n * @throws {exception} throws errors\n */\nconst qnaCrossTrain = function (qnaFileIdToResourceMap, luFileIdToResourceMap, interruptionIntentName, allLuEmpty) {\n  try {\n    for (const qnaObjectId of Array.from(qnaFileIdToResourceMap.keys())) {\n      let luObjectId = qnaObjectId.toLowerCase().replace(new RegExp(helpers.FileExtTypeEnum.QnAFile + '$'), helpers.FileExtTypeEnum.LUFile)\n      let fileName = path.basename(qnaObjectId, path.extname(qnaObjectId))\n      const culture = fileHelper.getCultureFromPath(qnaObjectId)\n      fileName = culture ? fileName.substring(0, fileName.length - culture.length - 1) : fileName\n\n      luObjectId = Array.from(luFileIdToResourceMap.keys()).find(x => x.toLowerCase() === luObjectId)\n      if (luObjectId) {\n        const { luResource, qnaResource } = qnaCrossTrainCore(luFileIdToResourceMap.get(luObjectId), qnaFileIdToResourceMap.get(qnaObjectId), fileName, interruptionIntentName, allLuEmpty)\n        luFileIdToResourceMap.set(luObjectId, luResource)\n        qnaFileIdToResourceMap.set(qnaObjectId, qnaResource)\n      } else {\n        let qnaResource = qnaAddMetaData(qnaFileIdToResourceMap.get(qnaObjectId), fileName)\n        qnaFileIdToResourceMap.set(qnaObjectId, qnaResource)\n      }\n    }\n  } catch (err) {\n    throw (err)\n  }\n}\n\n/**\n * qna cross training core function\n * @param {LUResource} luResource the lu resource\n * @param {LUResource} qnaResource the qna resource\n * @param {string} fileName file name\n * @param {string} interruptionIntentName interruption intent name\n * @param {boolean} allLuEmpty indicate if all lu files are section empty\n * @returns {luResource: LUResource, qnaResource: LUResource} cross trained lu resource and qna resource\n */\nconst qnaCrossTrainCore = function (luResource, qnaResource, fileName, interruptionIntentName, allLuEmpty) {\n  let trainedLuResource = luResource\n  let trainedQnaResource = qnaResource\n\n  // extract questions\n  const qnaSections = qnaResource.Sections.filter(s => s.SectionType === LUSectionTypes.QNASECTION)\n  let questions = []\n  qnaSections.forEach(q => questions = questions.concat(q.Questions))\n  \n  // remove dups of questions themselves\n  questions = Array.from(new Set(questions))\n\n  // extract lu utterances of all intents\n  let utterances = extractIntentUtterances(luResource)\n  utterances = Array.from(new Set(utterances))\n\n  // extract lu utterances of interruption intent\n  let utterancesOfInterruption = extractIntentUtterances(luResource, interruptionIntentName)\n\n  // extract lu utterances except interruption\n  let utterancesOfLocalIntents = utterances.filter(u => !utterancesOfInterruption.includes(u)).map(u => u.toLowerCase())\n\n  // remove questions which are duplicated with local lu utterances\n  let dedupedQuestions = questions.filter(q => !utterancesOfLocalIntents.includes(q.toLowerCase()))\n\n  // update interruption intent if there are duplications with questions\n  let dedupedQuestionsOfLowerCase = dedupedQuestions.map(u => u.toLowerCase())\n  if (utterancesOfInterruption.some(u => dedupedQuestionsOfLowerCase.includes(u.toLowerCase()))) {\n    utterancesOfInterruption = utterancesOfInterruption.filter(u => !dedupedQuestionsOfLowerCase.includes(u.toLowerCase()))\n\n    // get section id\n    const sectionId = trainedLuResource.Sections.filter(s => s.Name === interruptionIntentName)[0].Id\n\n    // construct updated interruption intent content\n    utterancesOfInterruption = utterancesOfInterruption.map(u => '- '.concat(u))\n    let updatedSectionContent = utterancesOfInterruption.join(NEWLINE)\n    if (updatedSectionContent && updatedSectionContent !== '') {\n      trainedLuResource = new SectionOperator(trainedLuResource).updateSection(sectionId, `# ${interruptionIntentName}${NEWLINE}${updatedSectionContent}`)\n    }\n  }\n\n  // construct questions content\n  dedupedQuestions = dedupedQuestions.map(q => '- '.concat(q)).filter(i => !patternWithPrebuiltEntity(i))\n  let questionsContent = dedupedQuestions.join(NEWLINE)\n\n  // cross training comments\n  const crossTrainingComments = '> Source: cross training. Please do not edit these directly!'\n\n  // add questions from qna file to corresponding lu file with intent named DeferToRecognizer_QnA_${fileName}\n  if (!allLuEmpty && questionsContent && questionsContent !== '') {\n    const questionsToUtterances = `${NEWLINE}${crossTrainingComments}${NEWLINE}# DeferToRecognizer_QnA_${fileName}${NEWLINE}${questionsContent}`\n    trainedLuResource = new SectionOperator(trainedLuResource).addSection(questionsToUtterances)\n  }\n\n  // update qna filters\n  trainedQnaResource = qnaAddMetaData(qnaResource, fileName)\n\n  // remove utterances with curly brackets\n  const utterancesWithoutPatterns = utterances.filter(i => /{([^}]+)}/g.exec(i) === null)\n\n  // remove utterances which are duplicated with local qna questions\n  let questionsOfLowerCase = questions.map(q => q.toLowerCase())\n  let dedupedUtterances = utterancesWithoutPatterns.filter(u => !questionsOfLowerCase.includes(u.toLowerCase()))\n\n  // add utterances from lu file to corresponding qna file with question set to all utterances\n  // split large QA pair to multiple smaller ones to overcome the limit that the maximum number of questions per answer is 300\n  while (dedupedUtterances.length > 0) {\n    let subDedupedUtterances = dedupedUtterances.splice(0, MAX_QUESTIONS_PER_ANSWER)\n    // construct new question content for qna resource\n    let utterancesContent = subDedupedUtterances.join(NEWLINE + '- ')\n    let utterancesToQuestion = `${NEWLINE}${crossTrainingComments}${NEWLINE}> !# @qna.pair.source = crosstrained${NEWLINE}${NEWLINE}# ? ${utterancesContent}${NEWLINE}${NEWLINE}**Filters:**${NEWLINE}- dialogName=${fileName}${NEWLINE}${NEWLINE}\\`\\`\\`${NEWLINE}intent=DeferToRecognizer_LUIS_${fileName}${NEWLINE}\\`\\`\\``\n    trainedQnaResource = new SectionOperator(trainedQnaResource).addSection(utterancesToQuestion)\n  }\n\n  return { luResource: trainedLuResource, qnaResource: trainedQnaResource }\n}\n\nconst qnaAddMetaData = function (qnaResource, fileName) {\n  let resultQnaResource = qnaResource\n  // extract qna sections\n  const qnaSections = qnaResource.Sections.filter(s => s.SectionType === LUSectionTypes.QNASECTION)\n\n  // update qna filters\n  let qnaSectionContents = []\n  for (const qnaSection of qnaSections) {\n    qnaSection.FilterPairs.push({ key: 'dialogName', value: fileName })\n    let qnaSectionContent = ''\n    if (qnaSection.source !== QNA_GENERIC_SOURCE) {\n      qnaSectionContent += `> !# @qna.pair.source = ${qnaSection.source}${NEWLINE}${NEWLINE}`\n    }\n\n    if (qnaSection.QAPairId) {\n      qnaSectionContent += `<a id = \"${qnaSection.QAPairId}\"></a>${NEWLINE}${NEWLINE}`\n    }\n\n    qnaSectionContent += `# ? ${Array.from(new Set(qnaSection.Questions)).join(NEWLINE + '- ')}${NEWLINE}${NEWLINE}**Filters:**${NEWLINE}- ${qnaSection.FilterPairs.map(f => f.key + '=' + f.value).join(NEWLINE + '- ')}${NEWLINE}${NEWLINE}\\`\\`\\`${NEWLINE}${qnaSection.Answer}${NEWLINE}\\`\\`\\``\n    \n    if (qnaSection.promptsText && qnaSection.promptsText.length > 0) {\n      qnaSectionContent += `${NEWLINE}${NEWLINE}**Prompts:**${NEWLINE}- ${qnaSection.promptsText.join(NEWLINE + '- ')}`\n    }\n\n    qnaSectionContents.push(qnaSectionContent)\n  }\n\n  let qnaContents = qnaSectionContents.join(NEWLINE + NEWLINE)\n  if (qnaContents && qnaContents !== '') {\n    const modelInfoSections = qnaResource.Sections.filter(s => s.SectionType === LUSectionTypes.MODELINFOSECTION)\n    const modelInforContent = modelInfoSections.map(m => m.ModelInfo).join(NEWLINE)\n    if (modelInforContent && modelInforContent !== '') qnaContents = NEWLINE + qnaContents\n\n    resultQnaResource = new SectionOperator(new LUResource([], modelInforContent, [])).addSection(qnaContents)\n  }\n\n  return resultQnaResource\n}\n\n/**\n * Parse and validate lu or qna object array to convert to LUResource object dict\n * @param {luObject[]} objectArray the lu or qna object list to be parsed\n * @param {boolean} verbose indicate to enable log messages or not\n * @param {any} importResolver import Resolver when resolving import files\n * @returns {Map<string, LUResource>} map of file id and luResource\n * @throws {exception} throws errors\n */\nconst parseAndValidateContent = async function (objectArray, verbose, importResolver) {\n  let fileIdToResourceMap = new Map()\n  let allEmpty = true\n  for (const object of objectArray) {    \n    let fileContent = object.content\n    if (object.content && object.content !== '') {\n      if (object.id.toLowerCase().endsWith(fileExtEnum.LUFile)) {\n        let result = await LuisBuilderVerbose.build([object], verbose, undefined, importResolver)\n        let luisObj = new Luis(result)\n        fileContent = luisObj.parseToLuContent()\n      } else {\n        let result = await qnaBuilderVerbose.build([object], verbose, importResolver)\n        fileContent = result.parseToQnAContent()\n      }\n    }\n\n    let resource = luParser.parse(fileContent)\n\n    if (resource.Sections.filter(s => s.SectionType !== LUSectionTypes.MODELINFOSECTION).length > 0) allEmpty = false\n\n    if (resource.Errors && resource.Errors.length > 0) {\n      if (verbose) {\n        var warns = resource.Errors.filter(error => (error && error.Severity && error.Severity === DiagnosticSeverity.WARN))\n        if (warns.length > 0) {\n          process.stdout.write(warns.map(warn => warn.toString()).join(NEWLINE).concat(NEWLINE))\n        }\n      }\n\n      var errors = resource.Errors.filter(error => (error && error.Severity && error.Severity === DiagnosticSeverity.ERROR))\n      if (errors.length > 0) {\n        throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Invlid file ${object.Id}: ${errors.map(error => error.toString()).join(NEWLINE)}`))\n      }\n    }\n\n    fileIdToResourceMap.set(object.id, resource)\n  }\n\n  return {fileIdToResourceMap, allEmpty}\n}\n\nconst pretreatment = function (luContents, qnaContents) {\n   // Parse lu and qna objects\n   let luObjectArray = fileHelper.getParsedObjects(luContents)\n   let qnaObjectArray = fileHelper.getParsedObjects(qnaContents)\n\n   return {luObjectArray, qnaObjectArray}\n}\n\nconst patternWithPrebuiltEntity = function (utterance) {\n  let patternAnyEntity\n  let matchedEntity = /{([^}]+)}/g.exec(utterance)\n\n  if (matchedEntity !== null) {\n    patternAnyEntity = matchedEntity[1].trim()\n\n    if (patternAnyEntity && patternAnyEntity.startsWith('@')) {\n      patternAnyEntity = patternAnyEntity.slice(1).trim()\n    }\n\n    let patternAnyEntityWithRole = patternAnyEntity.split(':')\n    if (patternAnyEntityWithRole.length > 1) {\n      patternAnyEntity = patternAnyEntityWithRole[0].trim()\n    }\n\n    if (prebuiltEntityTypes.includes(patternAnyEntity)) {\n      return true\n    }\n  }\n\n  return false\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/index.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst modules = {\n    parser: {\n        parseFile: require('./lufile/parseFileContents').parseFile,\n        validateLUISBlob: require('./luis/luisValidator')\n    },\n    refresh: {\n        constructMdFromLUIS: require('./luis/luConverter'),\n        constructMdFromQnA: require('./qna/qnamaker/qnaConverter'),\n        constructMdFromQnAAlteration: require('./qna/alterations/qnaConverter')\n    },\n    translate: {\n        parseAndTranslate: require('./lufile/translate-helpers').parseAndTranslate,\n        translateText: require('./lufile/translate-helpers').translateText\n    },\n    helperEnums: {\n        errorCodes: require('./utils/enums/CLI-errors').errorCode,\n        parseCommands: require('./utils/enums/parsecommands'),\n    },\n    helperClasses: {\n        Exception: require('./utils/exception'),\n        LUIS: require('./luis/luis'),\n        QnA: require('./qna/qnamaker/qnamaker'),\n\n        Parser: require('./lufile/classes/parserObject')\n    },\n    V2 : {\n        Luis: require('./luis/luis'),\n        LU: require('./lu/lu'),\n        LuisBuilder: require('./luis/luisBuilder'),\n        QNA: require('./lu/qna'),\n        QnAMaker: require('./qna/qnamaker/qnamaker'),\n        KB: require('./qna/qnamaker/kb'),\n        Alterations: require('./qna/alterations/alterations'),\n        QnAMakerBuilder: require('./qna/qnamaker/qnaMakerBuilder'),\n        Exception: require('./utils/exception'),\n        LUOptions: require('./lu/luOptions'),\n        Utils: {\n            ReadTextFile: require('./lufile/read-text-file').readSync\n        }\n    }\n};\n\nmodule.exports = modules;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/lu.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst translateHelpers = require('./../lufile/translate-helpers')\nconst luOptions = require('./luOptions')\n\nclass Lu {\n    constructor(content, options = new luOptions){\n        this.content = content\n        this.id = options.id ? options.id : ''\n        this.includeInCollate = options.includeInCollate !== undefined ? options.includeInCollate : true\n        this.language = options.language ? options.language : ''\n        this.path = options.path ? options.path : ''\n\n        if (this.language !== '') {\n            this.name = this.id + '.' + this.language + '.lu'\n        } else {\n            this.name = this.id + '.lu'\n        }\n    }\n\n    async translate(translate_key, tgt_lang, translate_comments = false, translate_link_text = false){\n        this.content = await translateHelpers.parseAndTranslate(this.content, translate_key, tgt_lang, '', translate_comments, translate_link_text)\n    }\n}\n\nmodule.exports = Lu\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/luMerger.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst parseFileContents = require('./../lufile/parseFileContents');\nconst retCode = require('./../utils/enums/CLI-errors');\nconst helpers = require('./../utils/helpers');\nconst hClasses = require('./../lufile/classes/hclasses');\nconst exception = require('./../utils/exception');\nconst luObject = require('./lu');\nconst luOptions = require('./luOptions')\nconst parserObject = require('./../lufile/classes/parserObject');\nconst txtfile = require('./../lufile/read-text-file');\nconst BuildDiagnostic = require('./../lufile/diagnostic').BuildDiagnostic;\nconst LUISObjNameEnum = require('./../utils/enums/luisobjenum');\nconst fetch = require('node-fetch');\n\nmodule.exports = {\n    /**\n     * Merges Lu/QnA files into a parserObject.\n     * @param {Array<Lu>} luObjArray Array of LU/QnA files to be merge\n     * @param {boolean} verbose indicates if we need verbose logging.\n     * @param {string} luis_culture LUIS locale code\n     * @param {function} luSearchFn function to retrieve the lu files found in the references\n     * @returns {parserObject} Object that contains list of parsed LUIS object, list of parsed QnA object and list of parsed QnA Alteration Content\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    Build: async function(luObjArray, verbose, luis_culture, luSearchFn){\n        let allParsedContent = await buildLuJsonObject(luObjArray, verbose, luis_culture, luSearchFn)\n        let refTree = await buildRefTree(allParsedContent, luSearchFn)\n        resolveTreeRefs(refTree, luObjArray);\n        return allParsedContent\n    }\n}\n\nconst buildRefTree = async function(allParsedContent, luSearchFn) {\n    let refs = {};\n    await Promise.all(allParsedContent.LUISContent.map(async (parserObj, objIdx) => {\n        let luObj = {\n            obj : parserObj.LUISJsonStructure,\n            srcFile : parserObj.srcFile,\n            refs : []\n        };\n        if (refs[parserObj.srcFile] === undefined) {\n             refs[parserObj.srcFile] = {\n                'luis': luObj\n            };\n        } else {\n            if (refs[parsedObj.srcFile].luis === undefined) {\n                ref[parserObj.srcFile].luis = luObj;\n            }\n        }\n        parserObj.LUISJsonStructure.uttHash = {};\n        (parserObj.LUISJsonStructure.utterances || []).forEach(async (utterance, uttIdx) => {\n            parserObj.LUISJsonStructure.uttHash[utterance.text] = '';\n            if (helpers.isUtteranceLinkRef(utterance.text)) {\n                let parsedLinkUri = await helpers.parseLinkURI(utterance.text, parserObj.srcFile, luSearchFn);\n                refs[parserObj.srcFile].luis.refs.push({\n                    refId: parsedLinkUri.fileName,\n                    uttId: uttIdx,\n                    parsedLink: parsedLinkUri,\n                    uttObj: utterance,\n                    text: utterance.text,\n                    type: 'luis'\n                })\n            }\n        })\n    }))\n\n    await Promise.all(allParsedContent.QnAContent.map(async (parserObj, objIdx) => {\n        let qnaObj = {\n            obj : parserObj.qnaJsonStructure,\n            alt : allParsedContent.QnAAlterations[objIdx].qnaAlterations,\n            srcFile : parserObj.srcFile,\n            refs : []\n        }\n        if (refs[parserObj.srcFile] === undefined) {\n            refs[parserObj.srcFile] = {'qna': qnaObj};\n        } else {\n            if (refs[parserObj.srcFile].qna === undefined) {\n                refs[parserObj.srcFile].qna = qnaObj;\n            }\n        }\n        (parserObj.qnaJsonStructure.qnaList.forEach(async qnaPair => {\n            qnaPair.questions.forEach(async (question, qIdx) => {\n                if (helpers.isUtteranceLinkRef(question)) {\n                    let parsedLinkUri = await helpers.parseLinkURI(question)\n                    refs[parserObj.srcFile].qna.refs.push({\n                        refId: parsedLinkUri.fileName,\n                        qId: qIdx,\n                        text: question,\n                        qObj: qnaPair,\n                        parsedLink: parsedLinkUri,\n                        type: 'qna'\n                    })\n                }\n            })\n        }))\n    }));\n\n    return refs;\n}\n\nconst resolveTreeRefs = function(refTree, luObjArray) {\n    (luObjArray || []).forEach(luObj => {\n        resolveRefs(refTree, luObj.id)\n    })\n}\n\nconst resolveRefs = function(refTree, srcId) {\n    if (refTree[srcId] !== undefined && refTree[srcId].luis) {\n        // sort by refs\n        refTree[srcId].luis.refs.sort((a, b) => a.uttId - b.uttId)\n\n        refTree[srcId].luis.refs.forEach((ref, rIdx) => {\n\n            if (ref.IdsVisited === undefined) {\n                ref.IdsVisited = [srcId];\n            } else {\n                if(ref.IdsVisited.includes(srcId)) {\n                    // throw\n                    let error = BuildDiagnostic({\n                        message: `Loop detected for reference '${ref.text}' as ${ref.IdsVisited} -> ${srcId}`\n                    });\n\n                    throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString()));                \n                } else {\n                    ref.IdsVisited.push(srcId);\n                }\n            }\n\n            let result = resolveRefByType(srcId, ref, refTree)\n\n            // process utterances and patterns.\n            let luObj = refTree[srcId].luis.obj;\n\n            // remove the reference utterance\n            luObj.utterances.splice((ref.uttId - rIdx), 1);\n\n            // add new utterances\n            if (result.utterances !== undefined) {\n                result.utterances.forEach(utt => {\n                    if (luObj.uttHash[utt] === undefined) {\n                        luObj.utterances.push(new hClasses.uttereances(utt, ref.uttObj.intent));\n                        luObj.uttHash[utt] = '';\n                    }\n                })\n            }\n            \n            if (result.patterns !== undefined) {\n                // add new patterns\n                result.patterns.forEach(patt => {\n                    luObj.patterns.push(new hClasses.pattern(patt, ref.uttObj.intent));\n                    if(!patt.includes('{')) return \n                    handlePatternAnyEntity(patt, luObj);\n                })\n            }\n        })\n\n        delete refTree[srcId].luis.obj.uttHash;\n    }\n    \n    if (refTree[srcId] !== undefined && refTree[srcId].qna) {\n        // Handle qna refs\n        (refTree[srcId].qna.refs || []).forEach((ref, rIdx) => {\n            let result = resolveRefByType(srcId, ref, refTree)\n\n            if (result.patterns && result.patterns.length !== 0) {\n                // throw\n                let error = BuildDiagnostic({\n                    message: `Unable to parse ${ref.q} in file: ${srcId}. References cannot pull in patterns. Consider '*utterances*' suffix if you are looking to pull in only utteranes`\n                });\n        \n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString()));\n            }\n\n            // process utterances\n            let qObj = ref.qObj;\n            // remove the reference utterance\n            qObj.questions.splice((ref.qId - rIdx), 1);\n            // add new utterances\n            result.utterances.forEach(utt => qObj.questions.push(utt));\n        })\n    }\n    \n}\n\nconst handlePatternAnyEntity = function(patt, luObj) {\n    let entityRegex = new RegExp(/\\{(.*?)\\}/g);\n    let entitiesFound = patt.match(entityRegex);\n\n    entitiesFound.forEach(function (entity) {\n        entity = entity.replace(\"{\", \"\").replace(\"}\", \"\");\n        let entityName = entity;\n        let roleName = '';\n        if (entity.includes(':')) {\n            // this is an entity with role\n            [entityName, roleName] = entity.split(':');\n        }\n        // insert the entity only if it does not already exist\n        let paIdx = -1;\n        let patternAnyInMaster = luObj.patternAnyEntities.find((item, idx) => {\n            if (item.name === entityName) {\n                paIdx = idx;\n                return true;\n            }\n            return false;\n        });\n        // insert the entity only if it does not already exist\n        if (isNewEntity(luObj, entityName)) {\n            if (!patternAnyInMaster && roleName !== '') {\n                parseFileContents.addItemOrRoleIfNotPresent(luObj, LUISObjNameEnum.PATTERNANYENTITY, entityName, [roleName])\n                return\n            }\n\n            if (!patternAnyInMaster) {\n                parseFileContents.addItemIfNotPresent(luObj, LUISObjNameEnum.PATTERNANYENTITY, entity);\n                return\n            }\n            // add the role if it does not exist already.\n            if (roleName !== '') {\n                !patternAnyInMaster.roles.includes(roleName) ? patternAnyInMaster.roles.push(roleName) : undefined;    \n            }\n            return               \n        } \n        // we found this pattern.any entity as another type.\n        if (patternAnyInMaster && paIdx !== -1) {\n            // remove the patternAny entity from the list because it has been explicitly defined elsewhere.\n            luObj.patternAnyEntities.splice(paIdx, 1);\n        }\n    })\n}\n\nconst resolveQuestionRef = function(srcId, ref, refTree) {\n    let utterances = [];\n    let patterns = [];\n    let srcFile = refTree[srcId][ref.type].srcFile;\n    let newId = path.resolve(path.dirname(srcFile ? srcFile : ''), ref.parsedLink.fileName);\n    let tgtId = (refTree[ref.parsedLink.fileName] && refTree[ref.parsedLink.fileName].qna !== undefined) ? ref.parsedLink.fileName : undefined;\n    tgtId = (tgtId === undefined && refTree[newId] !== undefined && refTree[newId].qna !== undefined) ? newId : tgtId;\n    let tgtObj = refTree[ref.parsedLink.fileName] || refTree[newId] || undefined;\n    if (!tgtObj && !ref.parsedLink.fileName.endsWith('*')) {\n        let error = BuildDiagnostic({\n            message: `Unable to parse ${ref.text} in file: ${srcFile}. Cannot find reference.`\n        });\n        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString()));\n    }\n    // Resolve additional references if any in tgt obj\n    if (tgtObj && ((tgtObj.luis && tgtObj.luis.refs.length !== 0) || (tgtObj.qna && tgtObj.qna.refs.length !== 0)))\n        resolveRefs(refTree, tgtId);\n    let parseLCasePath = ref.parsedLink.path.toLowerCase();\n    let qnaObj = tgtObj && tgtObj.qna && tgtObj.qna.obj ? tgtObj.qna.obj : undefined;\n    let qnaAlt = tgtObj && tgtObj.qna && tgtObj.qna.alt ? tgtObj.qna.alt : undefined;\n    let parsedQnABlobs = qnaObj !== undefined ? [qnaObj] : [];\n    let parsedQnAAlterations = qnaAlt !== undefined ? [qnaAlt] : [];\n    if (ref.parsedLink.fileName.endsWith('*')) {\n        // this notation is only valid with file path. So try as file path.\n        let tPath = ref.parsedLink.fileName.replace(/\\*/g, '');\n        for (let prop in refTree) {\n            if (prop.startsWith(path.resolve(path.dirname(srcFile), tPath))) {\n                parsedQnABlobs.push(refTree[prop].qna.obj);\n                parsedQnAAlterations.push(refTree[prop].qna.alt)\n            }\n        }\n    }\n    if (parseLCasePath.startsWith('*answers*')) {\n        parsedQnABlobs.forEach(blob => blob.qnaList.forEach(item => utterances.push(item.answer)));\n    } else if (ref.parsedLink.path.length > 1 && parseLCasePath.startsWith('?') && parseLCasePath.endsWith('?')) {\n        let itemsFound = undefined;\n        let testQuestion = ref.parsedLink.path.replace(/\\?/g, '').replace(/-/g, ' ').trim();\n        // find the specific question\n        parsedQnABlobs.forEach(blob => {\n            if (itemsFound) return;\n            itemsFound = blob.qnaList.find(item => item.questions.includes(testQuestion));\n        })\n        if (itemsFound) {\n            itemsFound.questions.forEach(question => utterances.push(question));\n        }\n    } else if (parseLCasePath.startsWith('*alterations*')) {\n        parsedQnAAlterations.forEach(blob => blob.wordAlterations.forEach(item => item.alterations.forEach(alter => utterances.push(alter))));\n    } else if (parseLCasePath.startsWith('$') && parseLCasePath.endsWith('?')) {\n        // specific alteration to find \n        let alterToFind = ref.parsedLink.path.replace(/[$\\?]/g, '').trim();\n        parsedQnAAlterations.forEach(blob => blob.wordAlterations.forEach(item => {\n            if (item.alterations.includes(alterToFind)) {\n                item.alterations.forEach(alter => utterances.push(alter));\n            }\n        }));\n    } else {\n        parsedQnABlobs.forEach(blob => blob.qnaList.forEach(item => item.questions.forEach(question => utterances.push(question))));\n    }\n    return {utterances, patterns}\n}\n\nconst resolveUttAndPattRef = function(srcId, ref, refTree) {\n    let utterances = [];\n    let patterns = [];\n    let srcFile = refTree[srcId][ref.type].srcFile;\n    let newId = path.resolve(path.dirname(srcFile ? srcFile : ''), ref.parsedLink.fileName)\n    let tgtId = (refTree[ref.parsedLink.fileName] && refTree[ref.parsedLink.fileName].luis !== undefined) ? ref.parsedLink.fileName : undefined;\n    tgtId = (tgtId === undefined && refTree[newId] !== undefined && refTree[newId].luis !== undefined) ? newId : tgtId;\n    let tgtObj = refTree[ref.parsedLink.fileName] || refTree[newId] || undefined;\n    if (!tgtObj) {\n        let error = BuildDiagnostic({\n            message: `Unable to parse ${ref.text} in file: ${srcFile}. Cannot find reference.`\n        });\n\n        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString()));\n    }\n    // Resolve additional references if any in tgt obj\n    if ((tgtObj.luis && tgtObj.luis.refs.length !==0) || (tgtObj.qna && tgtObj.qna.refs.length !==0)) resolveRefs(refTree, tgtId)\n\n    let parseLCasePath = ref.parsedLink.path.toLowerCase();\n    let luisObj = tgtObj.luis.obj;\n    let referenceIntent = undefined;\n    if (parseLCasePath.endsWith('*utterancesandpatterns*')) {\n        // get utterance list from reference intent and update list\n        referenceIntent = parseLCasePath.replace(/-/g, ' ').replace('*utterancesandpatterns*', '').trim();\n    } else if (parseLCasePath.endsWith('*utterances*')) {\n        // get utterance list from reference intent and update list\n        referenceIntent = parseLCasePath.replace(/-/g, ' ').replace('*utterances*', '').trim();\n        patterns = undefined;\n    } else if (parseLCasePath.endsWith('*patterns*')) {\n        // get utterance list from reference intent and update list\n        referenceIntent = parseLCasePath.replace(/-/g, ' ').replace('*patterns*', '').trim();\n        utterances = undefined;\n    } else if (parseLCasePath.endsWith('*')) {\n        referenceIntent = undefined;\n    } else {\n        // get utterance list from reference intent and update list\n        referenceIntent = parseLCasePath.replace(/-/g, ' ').trim();\n    }\n    if (utterances !== undefined) {\n        luisObj.utterances.forEach(item => {\n            if (referenceIntent !== undefined && referenceIntent !== \"\") {\n                if (item.intent.toLowerCase() === referenceIntent.toLowerCase()) {\n                    utterances.push(item.text)\n                } \n            } else {\n                utterances.push(item.text)\n            }\n        })\n    }\n    if (patterns !== undefined) {\n        luisObj.patterns.forEach(patt => {\n            if (referenceIntent !== undefined && referenceIntent !== \"\") {\n                if (patt.intent.toLowerCase() === referenceIntent.toLowerCase()) {\n                    patterns.push(patt.pattern)\n                }\n            } else {\n                patterns.push(patt.pattern)\n            }\n        })\n    }\n    return {utterances, patterns};\n}\n\nconst resolveRefByType = function(srcId, ref, refTree) {\n    let filter = ref.parsedLink.path.endsWith('?') ? resolveQuestionRef : resolveUttAndPattRef\n    return filter(srcId, ref, refTree);\n}\n\nconst buildLuJsonObject = async function(luObjArray, log, luis_culture, luSearchFn = resolveLuContent){\n    let allParsedLUISContent = []\n    let allParsedQnAContent = []\n    let allParsedAlterationsContent = []\n    let filesToParse = Array.from(luObjArray)\n    let parsedFiles = []\n    while (filesToParse.length > 0) {\n        let luOb = filesToParse[0]\n        // skip this file if we have parsed it already\n        if (parsedFiles.includes(luOb.id)) {\n            filesToParse.splice(0,1)\n            continue\n        }\n\n        let parsedContent = await parseLuFile(luOb, log, luis_culture)\n        parsedFiles.push(luOb.id)\n\n        // Fix for BF-CLI #620\n        // We do not perform validation here. for parseFile V1 API route, \n        //  the recommendation is to call validate() after parse.\n        if (haveLUISContent(parsedContent.LUISJsonStructure)) {\n            allParsedLUISContent.push(parserObject.create(parsedContent.LUISJsonStructure, undefined, undefined, luOb.id, luOb.includeInCollate))\n        }\n\n        allParsedQnAContent.push(parserObject.create(undefined, parsedContent.qnaJsonStructure, undefined, luOb.id, luOb.includeInCollate))\n        allParsedAlterationsContent.push(parserObject.create(undefined, undefined, parsedContent.qnaAlterations, luOb.id, luOb.includeInCollate))\n        // remove this file from the list\n        filesToParse.splice(0,1)\n        \n        // add additional files to parse to the list\n        if(parsedContent.additionalFilesToParse.length <= 0) {\n            continue\n        }\n\n        let foundLuFiles = await luSearchFn(luOb.id, parsedContent.additionalFilesToParse)    \n        for( let i = 0; i < foundLuFiles.length; i++){ \n            if (parsedFiles.includes(foundLuFiles[i].id)) {\n                let duplicated = foundLuFiles.splice(i--, 1)\n                updateParsedFiles(allParsedLUISContent, allParsedQnAContent, allParsedAlterationsContent, duplicated)\n            }\n        }\n\n        filesToParse = filesToParse.concat(foundLuFiles)\n    }\n    return {\n        LUISContent: allParsedLUISContent,\n        QnAContent: allParsedQnAContent,\n        QnAAlterations: allParsedAlterationsContent\n    }\n}\nconst resolveLuContent = async function(srcId, idsToFind){\n    let luObjects = [];\n    for(let idx = 0; idx < idsToFind.length; idx++) {\n        let toResolve = idsToFind[idx];\n        if (isUrl(toResolve.filePath)) {\n            await resolveLuUriContent(srcId, toResolve, luObjects);\n        } else {\n            resolveLuFileContent(toResolve, luObjects, srcId);\n        }\n    }\n    return luObjects;\n}\nconst resolveLuFileContent = function(file, luObjects, srcId) {\n    let parentFilePath = srcId === 'stdin' ? process.cwd() : path.parse(path.resolve(srcId)).dir\n    // Support wild cards at the end of a relative .LU file path. \n    // './bar/*' should look for all .lu files under the specified folder.\n    // './bar/**' should recursively look for .lu files under sub-folders as well.\n    if(file.filePath.endsWith('*')) {\n        const isRecursive = file.filePath.endsWith('**')\n        const rootFolder = file.filePath.replace(/\\*/g, '')\n        let rootPath = rootFolder;\n        if(!path.isAbsolute(rootFolder)) {\n            rootPath = path.resolve(parentFilePath, rootFolder);\n        } \n        // Get LU files in this location\n        const luFilesToAdd = helpers.findLUFiles(rootPath, isRecursive);\n        // add these to filesToParse\n        for(let f = 0; f < luFilesToAdd.length; f++){\n            const opts = new luOptions(luFilesToAdd[f], file.includeInCollate)\n            luObjects.push(new luObject(readLuFile(luFilesToAdd[f]), opts))\n        } \n        return\n    } \n\n    if(!path.isAbsolute(file.filePath)) {\n        file.filePath = path.resolve(parentFilePath, file.filePath)\n    } \n    // find matching parsed files and ensure includeInCollate is updated if needed.\n    luObjects.push(new luObject(readLuFile(file.filePath), new luOptions(file.filePath, file.includeInCollate)))\n}\nconst resolveLuUriContent = async function(srcId, toResolve, luObjects) {\n    let uri = toResolve.filePath || undefined;\n    if (uri !== undefined) {\n        let response;\n        try {\n            response = await fetch(uri, { method: 'GET' });\n        } catch (err) {\n            // throw, invalid URI\n            let errorMsg = `URI: \"${uri}\" appears to be invalid. Please double check the URI or re-try this parse when you are connected to the internet.`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                range: luImport.Range\n            })\n    \n            throw (new exception(retCode.errorCode.INVALID_URI, error.toString(), [error]));\n        }\n        var res = await response.buffer();\n        var encodedRes = helpers.fixBuffer(res);\n        luObjects.push(new luObject(encodedRes, new luOptions(toResolve.filePath, toResolve.includeInCollate)));\n    }\n}\nconst isUrl = function(path) {\n    try {\n        new URL(path);\n        return true;\n    } catch (err) {\n        return false;\n    }\n}\n\nconst updateParsedFiles = function(allParsedLUISContent, allParsedQnAContent, allParsedAlterationsContent, luobject) {\n    // find the instance and ensure includeInCollate property is set correctly \n    if(luobject.includeInCollate) {\n        let matchInLUIS = allParsedLUISContent.find(item => item.srcFile == luobject.id);\n        if(matchInLUIS) matchInLUIS.includeInCollate = true;\n\n        let matchInQnA = allParsedQnAContent.find(item => item.srcFile == luobject.id);\n        if(matchInQnA) matchInQnA.includeInCollate = true;\n\n        let matchInAlterations = allParsedAlterationsContent.find(item => item.srcFile == luobject.id);\n        if(matchInAlterations) matchInAlterations.includeInCollate = true;\n    }\n} \n\nconst haveLUISContent = function(blob) {\n    if(!blob) return false;\n    return ((blob[LUISObjNameEnum.INTENT].length > 0) ||\n    (blob[LUISObjNameEnum.ENTITIES].length > 0) || \n    (blob[LUISObjNameEnum.CLOSEDLISTS].length > 0) ||\n    (blob[LUISObjNameEnum.PATTERNANYENTITY].length > 0) ||\n    (blob.patterns.length > 0) ||\n    (blob[LUISObjNameEnum.UTTERANCE].length > 0) ||\n    (blob.prebuiltEntities.length > 0) ||\n    (blob[LUISObjNameEnum.REGEX].length > 0) ||\n    (blob.model_features && blob.model_features.length > 0) ||\n    (blob.phraselists && blob.phraselists.length > 0) ||\n    (blob.composites.length > 0));\n}\n\nconst isNewEntity = function(luisModel, entityName){\n    let simpleEntityInMaster = luisModel.entities.find(item => item.name == entityName);\n    let compositeInMaster = luisModel.composites.find(item => item.name == entityName);\n    let listEntityInMaster = luisModel.closedLists.find(item => item.name == entityName);\n    let regexEntityInMaster = luisModel.regex_entities.find(item => item.name == entityName);\n    let prebuiltInMaster = luisModel.prebuiltEntities.find(item => item.name == entityName);\n\n    return !simpleEntityInMaster && \n    !compositeInMaster &&\n    !listEntityInMaster &&\n    !regexEntityInMaster &&\n    !prebuiltInMaster\n}\n\nconst readLuFile = function(file) {\n    if(!fs.existsSync(path.resolve(file))) {\n        let error = BuildDiagnostic({\n            message: `Sorry unable to open [${file}]`\n        });\n        throw(new exception(retCode.errorCode.FILE_OPEN_ERROR, error.toString()));     \n    }\n    \n    let fileContent = txtfile.readSync(file);\n    if (!fileContent) {\n        let error = BuildDiagnostic({\n            message: `Sorry, error reading file: ${file}`\n        });\n        throw(new exception(retCode.errorCode.FILE_OPEN_ERROR, error.toString()));\n    }\n    return fileContent\n}\n\nconst parseLuFile = async function(luOb, log, luis_culture) {\n    let parsedContent = ''\n    if (!luOb.content) {\n        let error = BuildDiagnostic({ message: `Cannot parse empty ${luOb.id}. Please add content to the file or remove it.` })\n        throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, error.toString()));\n    } \n    try {\n        parsedContent = await parseFileContents.parseFile(luOb.content, log, luis_culture);\n    } catch (err) {\n        err.source = luOb.id;\n        throw(err);\n    }\n    if (!parsedContent) {\n        let error = BuildDiagnostic({\n            message: `Sorry, file ${luOb.id} had invalid content`\n        });\n        throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, error.toString()));\n    } \n    return parsedContent\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/luOptions.js",
    "content": "class LuOptions {\n    constructor(id = '', includeInCollate = true, language = '', path = ''){\n        this.id = id ? id : get_guid()\n        this.includeInCollate = includeInCollate\n        this.language = language\n        this.path = path\n    }\n}\n\nmodule.exports = LuOptions\n\n/**\n * Helper function to create a random guid\n  * @returns {string} GUID\n */\nconst get_guid = function () {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n        return v.toString(16);\n    });\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/qna.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst translateHelpers = require('./../lufile/translate-helpers')\nconst qnaOptions = require('./qnaOptions')\n\nclass Qna {\n    constructor(content, options = new qnaOptions()){\n        this.content = content\n        this.id = options.id ? options.id : ''\n        this.includeInCollate = options.includeInCollate !== undefined ? options.includeInCollate : true\n        this.language = options.language ? options.language : ''\n        this.path = options.path ? options.path : ''\n\n        if (this.language !== '') {\n            this.name = this.id + '.' + this.language + '.qna'\n        } else {\n            this.name = this.id + '.qna'\n        }\n    }\n\n    async translate(translate_key, tgt_lang, translate_comments = false, translate_link_text = false){\n        this.content = await translateHelpers.parseAndTranslate(this.content, translate_key, tgt_lang, '', translate_comments, translate_link_text, false)\n    }\n}\n\nmodule.exports = Qna\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/qnaOptions.js",
    "content": "class QnAOptions {\n    constructor(id = '', includeInCollate = true, language = '', path = ''){\n        this.id = id ? id : get_guid()\n        this.includeInCollate = includeInCollate\n        this.language = language\n        this.path = path\n    }\n}\n\nmodule.exports = QnAOptions\n\n/**\n * Helper function to create a random guid\n  * @returns {string} GUID\n */\nconst get_guid = function () {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n        return v.toString(16);\n    });\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/builder.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {LuBuildCore} from './core'\nimport {Settings} from './settings'\nimport {MultiLanguageRecognizer} from './multi-language-recognizer'\nimport {Recognizer} from './recognizer'\nimport {CrossTrainedRecognizer} from './cross-trained-recognizer'\nconst path = require('path')\nconst fs = require('fs-extra')\nconst delay = require('delay')\nconst fileHelper = require('./../../utils/filehelper')\nconst fileExtEnum = require('./../utils/helpers').FileExtTypeEnum\nconst retCode = require('./../utils/enums/CLI-errors')\nconst exception = require('./../utils/exception')\nconst LuisBuilderVerbose = require('./../luis/luisCollate')\nconst LuisBuilder = require('./../luis/luisBuilder')\nconst Luis = require('./../luis/luis')\nconst LUOptions = require('./../lu/luOptions')\nconst Content = require('./../lu/lu')\nconst recognizerType = require('./../utils/enums/recognizertypes')\n\nexport class Builder {\n  private readonly handler: (input: string) => any\n\n  constructor(handler: any) {\n    this.handler = handler\n  }\n\n  async loadContents(\n    files: string[],\n    culture: string,\n    suffix: string,\n    region: string,\n    schema?: string,\n    importResolver?: object) {\n    let multiRecognizers = new Map<string, MultiLanguageRecognizer>()\n    let settings: any\n    let recognizers = new Map<string, Recognizer>()\n    let luContents: Array<any> = []\n    let crosstrainedRecognizers = new Map<string, CrossTrainedRecognizer>()\n\n    for (const file of files) {\n      let fileCulture: string\n      let fileName: string\n\n      let cultureFromPath = fileHelper.getCultureFromPath(file)\n      if (cultureFromPath) {\n        fileCulture = cultureFromPath\n        let fileNameWithCulture = path.basename(file, path.extname(file))\n        fileName = fileNameWithCulture.substring(0, fileNameWithCulture.length - fileCulture.length - 1)\n      } else {\n        fileCulture = culture\n        fileName = path.basename(file, path.extname(file))\n      }\n\n      const fileFolder = path.dirname(file)\n      const crossTrainedFileName = fileName + '.lu.qna.dialog'\n      const crossTrainedRecognizerPath = path.join(fileFolder, crossTrainedFileName)\n      if (!crosstrainedRecognizers.has(fileName)) {\n        let crosstrainedRecognizerContent = []\n        let crosstrainedRecognizerSchema = schema\n        if (fs.existsSync(crossTrainedRecognizerPath)) {\n          let crosstrainedRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(crossTrainedRecognizerPath))\n          crosstrainedRecognizerContent = crosstrainedRecognizerObject.recognizers\n          crosstrainedRecognizerSchema = crosstrainedRecognizerSchema || crosstrainedRecognizerObject.$schema\n          this.handler(`${crossTrainedRecognizerPath} loaded\\n`)\n        }\n\n        crosstrainedRecognizers.set(fileName, new CrossTrainedRecognizer(crossTrainedRecognizerPath, crosstrainedRecognizerContent, crosstrainedRecognizerSchema as string))\n      }\n\n      let fileContent = ''\n      let result\n      let luisObj\n      let luFiles = await fileHelper.getLuObjects(undefined, file, true, fileExtEnum.LUFile)\n      this.handler(`${file} loaded\\n`)\n\n      // filter empty lu files\n      luFiles = luFiles.filter((file: any) => file.content !== '')\n      if (luFiles.length <= 0) continue\n\n      try {\n        result = await LuisBuilderVerbose.build(luFiles, true, fileCulture, importResolver)\n        luisObj = new Luis(result)\n        fileContent = luisObj.parseToLuContent()\n      } catch (err) {\n        if (err.source) {\n          err.text = `Invalid LU file ${err.source}: ${err.text}`\n        } else {\n          err.text = `Invalid LU file ${file}: ${err.text}`\n        }\n        throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, err.text))\n      }\n\n      const multiRecognizerPath = path.join(fileFolder, `${fileName}.lu.dialog`)\n      if (!multiRecognizers.has(fileName)) {\n        let multiRecognizerContent = {}\n        let multiRecognizerSchema = schema\n        if (fs.existsSync(multiRecognizerPath)) {\n          let multiRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(multiRecognizerPath))\n          multiRecognizerContent = multiRecognizerObject.recognizers\n          multiRecognizerSchema = multiRecognizerSchema || multiRecognizerObject.$schema\n          this.handler(`${multiRecognizerPath} loaded\\n`)\n        }\n\n        multiRecognizers.set(fileName, new MultiLanguageRecognizer(multiRecognizerPath, multiRecognizerContent, multiRecognizerSchema as string))\n      }\n\n      if (settings === undefined) {\n        const settingsPath = path.join(fileFolder, `luis.settings.${suffix}.${region}.json`)\n        let settingsContent = {}\n        if (fs.existsSync(settingsPath)) {\n          settingsContent = JSON.parse(await fileHelper.getContentFromFile(settingsPath)).luis\n          this.handler(`${settingsPath} loaded\\n`)\n        }\n\n        settings = new Settings(settingsPath, settingsContent)\n      }\n\n      const content = new Content(fileContent, new LUOptions(fileName, true, fileCulture, file))\n      luContents.push(content)\n\n      const dialogFile = path.join(fileFolder, `${content.name}.dialog`)\n      let existingDialogObj: any\n      if (fs.existsSync(dialogFile)) {\n        existingDialogObj = JSON.parse(await fileHelper.getContentFromFile(dialogFile))\n        this.handler(`${dialogFile} loaded\\n`)\n      }\n\n      if (existingDialogObj && schema) {\n        existingDialogObj.$schema = schema\n      }\n\n      let recognizer = Recognizer.load(content.path, content.name, dialogFile, settings, existingDialogObj, schema)\n      recognizers.set(content.name, recognizer)\n    }\n\n    // validate if there are duplicated files with same name and locale\n    let setOfContents = new Set()\n    const hasDuplicates = luContents.some(function (currentObj) {\n      return setOfContents.size === setOfContents.add(currentObj.name).size\n    })\n\n    if (hasDuplicates) {\n      throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Files with same name and locale are found.'))\n    }\n\n    return {luContents, recognizers, multiRecognizers, settings, crosstrainedRecognizers}\n  }\n\n  async build(\n    luContents: any[],\n    recognizers: Map<string, Recognizer>,\n    authoringKey: string,\n    endpoint: string,\n    botName: string,\n    suffix: string,\n    fallbackLocale: string,\n    deleteOldVersion: boolean,\n    isStaging: boolean,\n    multiRecognizers?: Map<string, MultiLanguageRecognizer>,\n    settings?: Settings,\n    crosstrainedRecognizers?: Map<string, CrossTrainedRecognizer>,\n    dialogType?: string,\n    luisAPITPS?: number,\n    timeBucketOfRequests?: number,\n    retryCount?: number,\n    retryDuration?: number) {\n    // luis api TPS which means 5 concurrent transactions to luis api in 1 second\n    // can set to other value if switched to a higher TPS(transaction per second) key\n    let luisApiTps = luisAPITPS || 5\n\n    // set luis call delay duration to 1100 millisecond because 1000 can hit corner case of rate limit\n    let timeBucket = timeBucketOfRequests || 1100\n\n    // set retry count for rate limit luis API failure\n    let countForRetry = retryCount || 1\n\n    // set retry duration for rate limit luis API failure\n    let durationForRetry = retryDuration || 1000\n\n    //default returned recognizer values\n    let recognizerValues: Recognizer[] = []\n\n    let multiRecognizerValues: MultiLanguageRecognizer[] = []\n\n    let settingsValue: any\n\n    let crosstrainedRecognizerValues: CrossTrainedRecognizer[] = []\n\n    // filter if all lu contents are emtty\n    let isAllLuEmpty = fileHelper.isAllFilesSectionEmpty(luContents)\n\n    if (!isAllLuEmpty) {\n      const luBuildCore = new LuBuildCore(authoringKey, endpoint, countForRetry, durationForRetry)\n      const apps = await luBuildCore.getApplicationList()\n\n      // here we do a while loop to make full use of luis tps capacity\n      while (luContents.length > 0) {\n        // get a number(set by luisApiTps) of contents for each loop\n        const subLuContents = luContents.splice(0, luisApiTps)\n\n        // concurrently handle applications\n        await Promise.all(subLuContents.map(async content => {\n          // init current application object from lu content\n          let currentApp = await this.initApplicationFromLuContent(content, botName, suffix)\n\n          // get recognizer\n          let recognizer = recognizers.get(content.name) as Recognizer\n\n          // find if there is a matched name with current app under current authoring key\n          if (!recognizer.getAppId()) {\n            for (let app of apps) {\n              if (app.name === currentApp.name) {\n                recognizer.setAppId(app.id)\n                break\n              }\n            }\n          }\n\n          let needTrainAndPublish = false\n\n          // compare models to update the model if a match found\n          // otherwise create a new application\n          if (recognizer.getAppId() && recognizer.getAppId() !== '') {\n            // To see if need update the model\n            needTrainAndPublish = await this.updateApplication(currentApp, luBuildCore, recognizer, timeBucket, deleteOldVersion)\n          } else {\n            // create a new application\n            needTrainAndPublish = await this.createApplication(currentApp, luBuildCore, recognizer, timeBucket)\n          }\n\n          if (needTrainAndPublish) {\n            // train and publish application\n            await this.trainAndPublishApplication(luBuildCore, recognizer, timeBucket, isStaging)\n          }\n\n          // update multiLanguageRecognizer asset\n          if (multiRecognizers && multiRecognizers.has(content.id)) {\n            let multiRecognizer = multiRecognizers.get(content.id) as MultiLanguageRecognizer\n            multiRecognizer.recognizers[currentApp.culture] = path.basename(recognizer.getDialogPath(), '.dialog')\n            if (currentApp.culture.toLowerCase() === fallbackLocale.toLowerCase()) {\n              multiRecognizer.recognizers[''] = path.basename(recognizer.getDialogPath(), '.dialog')\n            }\n          }\n\n          if (crosstrainedRecognizers && crosstrainedRecognizers.has(content.id)) {\n            let crosstrainedRecognizer = crosstrainedRecognizers.get(content.id) as CrossTrainedRecognizer\n            if (!crosstrainedRecognizer.recognizers.includes(content.id + '.lu')) {\n              crosstrainedRecognizer.recognizers.push(content.id + '.lu')\n            }\n          }\n\n          // update settings asset\n          if (settings) {\n            settings.luis[content.name.split('.').join('_').replace(/-/g, '_')] = recognizer.getAppId()\n          }\n        }))\n      }\n\n      // write dialog assets\n      if (recognizers) {\n        recognizerValues = Array.from(recognizers.values())\n      }\n\n      if (multiRecognizers) {\n        multiRecognizerValues = Array.from(multiRecognizers.values())\n      }\n\n      if (settings) {\n        settingsValue = settings as Settings\n      }\n    }\n\n    if (dialogType === recognizerType.CROSSTRAINED && crosstrainedRecognizers) {\n      crosstrainedRecognizerValues = Array.from(crosstrainedRecognizers.values())\n    }\n\n    const dialogContents = this.generateDeclarativeAssets(recognizerValues, multiRecognizerValues, settingsValue, crosstrainedRecognizerValues)\n\n    return dialogContents\n  }\n\n  async writeDialogAssets(contents: any[], force: boolean, out: string, luconfig: string) {\n    let writeDone = false\n\n    let writeContents = contents.filter(c => c.id.endsWith('.dialog'))\n    let settingsContents = contents.filter(c => c.id.endsWith('.json'))\n\n    if (settingsContents && settingsContents.length > 0) {\n      let outPath\n      if (luconfig) {\n        outPath = path.join(path.resolve(path.dirname(luconfig)), settingsContents[0].id)\n      } else if (out) {\n        outPath = path.join(path.resolve(out), settingsContents[0].id)\n      } else {\n        outPath = path.resolve(settingsContents[0].id)\n      }\n      writeContents.push(this.mergeSettingsContent(outPath, settingsContents))\n    }\n\n    for (const content of writeContents) {\n      let outFilePath\n      if (out) {\n        outFilePath = path.join(path.resolve(out), path.basename(content.path))\n      } else {\n        outFilePath = content.path\n      }\n\n      let fileExists = fs.existsSync(outFilePath)\n      if (fileExists && outFilePath.endsWith('.lu.qna.dialog')) {\n        let existingCTRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(outFilePath))\n        let currentCTRecognizerObject = JSON.parse(content.content)\n        let ctRecognizerToBeMerged = currentCTRecognizerObject.recognizers.filter((r: string) => !existingCTRecognizerObject.recognizers.includes(r))\n        existingCTRecognizerObject.recognizers = existingCTRecognizerObject.recognizers.concat(ctRecognizerToBeMerged)\n        content.content = JSON.stringify(existingCTRecognizerObject, null, 4)\n      }\n\n      if (force || !fs.existsSync(outFilePath)) {\n        if (!fs.existsSync(path.dirname(outFilePath))) {\n          fs.mkdirSync(path.dirname(outFilePath))\n        }\n\n        this.handler(`Writing to ${outFilePath}\\n`)\n        await fs.writeFile(outFilePath, content.content, 'utf-8')\n        writeDone = true\n      }\n    }\n\n    return writeDone\n  }\n\n  async getActiveVersionIds(appNames: string[], authoringKey: string, region: string, retryCount?: number, retryDuration?: number) {\n    const luBuildCore = new LuBuildCore(authoringKey, `https://${region}.api.cognitive.microsoft.com`, retryCount || 1, retryDuration || 1000)\n    const apps = await luBuildCore.getApplicationList()\n    let appNameVersionMap = new Map<string, string>()\n    for (const appName of appNames) {\n      // find if there is a matched name with current app under current authoring key\n      appNameVersionMap.set(appName, '')\n      for (let app of apps) {\n        if (app.name === appName) {\n          const appInfo = await luBuildCore.getApplicationInfo(app.id)\n          appNameVersionMap.set(appName, appInfo.activeVersion)\n          break\n        }\n      }\n    }\n\n    return appNameVersionMap\n  }\n\n  async initApplicationFromLuContent(content: any, botName: string, suffix: string) {\n    let currentApp = await LuisBuilder.fromLUAsync([content])  // content.parseToLuis(true, content.language)\n    currentApp.culture = currentApp.culture && currentApp.culture !== '' && currentApp.culture !== 'en-us' ? currentApp.culture : content.language as string\n    currentApp.desc = currentApp.desc && currentApp.desc !== '' ? currentApp.desc : `Model for ${botName} app, targetting ${suffix}`\n\n    if (currentApp.name === undefined || currentApp.name === '') {\n      currentApp.name = `${botName}(${suffix})-${content.name}`\n    }\n\n    // remove empty intents from current app to avoid fewLabels error when training\n    this.filterEmptyIntents(currentApp)\n\n    return currentApp\n  }\n\n  async updateApplication(currentApp: any, luBuildCore: LuBuildCore, recognizer: Recognizer, timeBucket: number, deleteOldVersion: boolean) {\n    await delay(timeBucket)\n    const appInfo = await luBuildCore.getApplicationInfo(recognizer.getAppId())\n    recognizer.versionId = appInfo.activeVersion || appInfo.endpoints.PRODUCTION.versionId\n\n    await delay(timeBucket)\n    const existingApp = await luBuildCore.exportApplication(recognizer.getAppId(), recognizer.versionId)\n\n    // compare models\n    const needUpdate = luBuildCore.compareApplications(currentApp, existingApp)\n    if (needUpdate) {\n      const newVersionId = luBuildCore.updateVersion(currentApp, existingApp)\n      recognizer.versionId = newVersionId\n      const options: any = {\n        versionId: newVersionId\n      }\n\n      this.handler(`${recognizer.getLuPath()} creating version=${newVersionId}\\n`)\n      await delay(timeBucket)\n      await luBuildCore.importNewVersion(recognizer.getAppId(), currentApp, options)\n\n      if (deleteOldVersion) {\n        await delay(timeBucket)\n        const versionObjs = await luBuildCore.listApplicationVersions(recognizer.getAppId())\n        for (const versionObj of versionObjs) {\n          if (versionObj.version !== newVersionId) {\n            this.handler(`${recognizer.getLuPath()} deleting old version=${versionObj.version}`)\n            await delay(timeBucket)\n            await luBuildCore.deleteVersion(recognizer.getAppId(), versionObj.version)\n          }\n        }\n      }\n\n      return true\n    } else {\n      this.handler(`${recognizer.getLuPath()} no changes\\n`)\n      return false\n    }\n  }\n\n  async createApplication(currentApp: any, luBuildCore: LuBuildCore, recognizer: Recognizer, timeBucket: number) {\n    currentApp.versionId = currentApp.versionId && currentApp.versionId !== '' ? currentApp.versionId : '0.1'\n    recognizer.versionId = currentApp.versionId\n    this.handler(`Creating LUIS.ai application: ${currentApp.name} version:${currentApp.versionId}\\n`)\n    await delay(timeBucket)\n    const response = await luBuildCore.importApplication(currentApp)\n    recognizer.setAppId(typeof response === 'string' ? response : response[Object.keys(response)[0]])\n    return true\n  }\n\n  async trainAndPublishApplication(luBuildCore: LuBuildCore, recognizer: Recognizer, timeBucket: number, isStaging: boolean) {\n    // send train application request\n    this.handler(`${recognizer.getLuPath()} training version=${recognizer.versionId}\\n`)\n    await delay(timeBucket)\n    await luBuildCore.trainApplication(recognizer.getAppId(), recognizer.versionId)\n    this.handler(`${recognizer.getLuPath()} waiting for training for version=${recognizer.versionId}...\\n`)\n    let done = true\n    do {\n      await delay(timeBucket)\n\n      // get training status to see if training completed\n      let trainingStatus = await luBuildCore.getTrainingStatus(recognizer.getAppId(), recognizer.versionId)\n      done = true\n      for (let status of trainingStatus) {\n        if (status.details) {\n          if (status.details.status === 'InProgress' || status.details.status === 'Queued') {\n            done = false\n            break\n          }\n        }\n      }\n    } while (!done)\n    this.handler('done\\n')\n\n    // publish applications\n    this.handler(`${recognizer.getLuPath()} publishing version=${recognizer.versionId}\\n`)\n    await delay(timeBucket)\n    await luBuildCore.publishApplication(recognizer.getAppId(), recognizer.versionId, isStaging)\n    this.handler(`${recognizer.getLuPath()} publishing finished for ${isStaging ? 'Staging' : 'Production'} slot\\n`)\n  }\n\n  generateDeclarativeAssets(recognizers: Array<Recognizer>, multiRecognizers: Array<MultiLanguageRecognizer>, settings: Settings, crosstrainedRecognizers: Array<CrossTrainedRecognizer>)\n    : Array<any> {\n    let contents = new Array<any>()\n    for (const recognizer of recognizers) {\n      let content = new Content(recognizer.save(), new LUOptions(path.basename(recognizer.getDialogPath()), true, '', recognizer.getDialogPath()))\n      contents.push(content)\n    }\n\n    for (const multiRecognizer of multiRecognizers) {\n      const multiLangContent = new Content(multiRecognizer.save(), new LUOptions(path.basename(multiRecognizer.getDialogPath()), true, '', multiRecognizer.getDialogPath()))\n      contents.push(multiLangContent)\n    }\n\n    if (settings) {\n      const settingsContent = new Content(settings.save(), new LUOptions(path.basename(settings.getSettingsPath()), true, '', settings.getSettingsPath()))\n      contents.push(settingsContent)\n    }\n\n    for (const crosstrainedRecognizer of crosstrainedRecognizers) {\n      const crosstrainedContent = new Content(crosstrainedRecognizer.save(), new LUOptions(path.basename(crosstrainedRecognizer.getDialogPath()), true, '', crosstrainedRecognizer.getDialogPath()))\n      contents.push(crosstrainedContent)\n    }\n\n    return contents\n  }\n\n  mergeSettingsContent(settingsPath: string, contents: any[]) {\n    let settings = new Settings(settingsPath, {})\n    for (const content of contents) {\n      const luisAppsMap = JSON.parse(content.content).luis\n      for (const appName of Object.keys(luisAppsMap)) {\n        settings.luis[appName] = luisAppsMap[appName]\n      }\n    }\n\n    return new Content(settings.save(), new LUOptions(path.basename(settings.getSettingsPath()), true, '', settings.getSettingsPath()))\n  }\n\n  filterEmptyIntents(app: any) {\n    const intents = app.intents\n    const utterances = app.utterances\n    const patterns = app.patterns\n\n    const emptyIntents = intents.filter((intent: any) => !utterances.some((utterance: any) => utterance.intent === intent.name)\n      && !patterns.some((pattern: any) => pattern.intent === intent.name))\n\n    if (emptyIntents && emptyIntents.length > 0) {\n      const filteredIntents = intents.filter((intent: any) => !emptyIntents.some((emptyIntent: any) => emptyIntent.name === intent.name))\n      this.handler(`[WARN]: empty intent(s) ${emptyIntents.map((intent: any) => '# ' + intent.name).join(', ')} are filtered when handling luis application`)\n      app.intents = filteredIntents\n    }\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/core.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {CognitiveServicesCredentials} from '@azure/ms-rest-azure-js'\nimport {LUISAuthoringClient} from '@azure/cognitiveservices-luis-authoring'\nimport fetch from 'node-fetch'\n\nconst delay = require('delay')\nconst retCode = require('./../utils/enums/CLI-errors')\nconst exception = require('./../utils/exception')\nconst Luis = require('./../luis/luis')\n\nconst rateLimitErrorCode = 429\n\nexport class LuBuildCore {\n  private readonly client: any\n  private readonly subscriptionKey: string\n  private readonly endpoint: string\n  private readonly retryCount: number\n  private readonly retryDuration: number\n\n  constructor(subscriptionKey: string, endpoint: string, retryCount: number, retryDuration: number) {\n    this.subscriptionKey = subscriptionKey\n    this.endpoint = endpoint\n    this.retryCount = retryCount\n    this.retryDuration = retryDuration\n\n    // new luis api client\n    const creds = new CognitiveServicesCredentials(subscriptionKey)\n    this.client = new LUISAuthoringClient(creds, endpoint)\n  }\n\n  public async getApplicationList() {\n    let apps\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          apps = await this.client.apps.list(undefined, undefined)\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n\n    return apps\n  }\n\n  public async getApplicationInfo(appId: string) {\n    let appInfo\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          appInfo = await this.client.apps.get(appId)\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n\n    return appInfo\n  }\n\n  public async importApplication(currentApp: any): Promise<any> {\n    // let response = await this.client.apps.importMethod(currentApp)\n\n    const name = `?appName=${currentApp.name}`\n    const url = this.endpoint + '/luis/authoring/v3.0-preview/apps/import' + name\n    const headers = {\n      'Content-Type': 'application/json',\n      'Ocp-Apim-Subscription-Key': this.subscriptionKey\n    }\n\n    let messageData\n    let retryCount = this.retryCount + 1\n    let error: any\n    while (retryCount > 0) {\n      if (error === undefined || error.code === rateLimitErrorCode.toString()) {\n        let response = await fetch(url, {method: 'POST', headers, body: JSON.stringify(currentApp)})\n        messageData = await response.json()\n\n        if (messageData.error === undefined) break\n\n        error = messageData.error\n        retryCount--\n        if (retryCount > 0) await delay(this.retryDuration)\n      } else {\n        throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, error.message))\n      }\n    }\n\n    if (retryCount === 0) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, error.message))\n    }\n\n    return messageData\n  }\n\n  public async exportApplication(appId: string, versionId: string) {\n    const url = this.endpoint + '/luis/authoring/v3.0-preview/apps/' + appId + '/versions/' + versionId + '/export?format=json'\n    const headers = {\n      'Content-Type': 'application/json',\n      'Ocp-Apim-Subscription-Key': this.subscriptionKey\n    }\n\n    let messageData\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          const response = await fetch(url, {method: 'GET', headers})\n          messageData = await response.json()\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n\n    if (messageData.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, messageData.error.message))\n    }\n\n    return messageData\n  }\n\n  public compareApplications(currentApp: any, existingApp: any) {\n    currentApp.desc = currentApp.desc && currentApp.desc !== '' && currentApp.desc !== existingApp.desc ? currentApp.desc : existingApp.desc\n    currentApp.culture = currentApp.culture && currentApp.culture !== '' && currentApp.culture !== existingApp.culture ? currentApp.culture : existingApp.culture\n    currentApp.versionId = currentApp.versionId && currentApp.versionId !== '' && currentApp.versionId > existingApp.versionId ? currentApp.versionId : existingApp.versionId\n    currentApp.name = existingApp.name\n\n    let currentAppToCompare = JSON.parse(JSON.stringify(currentApp));\n\n    // convert list entities to remove synonyms word in list which is same with canonicalForm\n    (currentAppToCompare.closedLists || []).forEach((c: any) => {\n      (c.subLists || []).forEach((s: any) => {\n        if (s.list) {\n          const foundIndex = s.list.indexOf(s.canonicalForm)\n          if (foundIndex > -1) {\n            s.list.splice(foundIndex, 1)\n          }\n        }\n      })\n    })\n\n    // skip comparisons of properties that LUIS API automatically added or updated\n    currentAppToCompare.luis_schema_version = existingApp.luis_schema_version\n    currentAppToCompare.tokenizerVersion = existingApp.tokenizerVersion\n    currentAppToCompare.settings = existingApp.settings\n\n    // skip none intent comparison if that is automatically added by LUIS server\n    if (currentAppToCompare.intents && !currentAppToCompare.intents.some((x: any) => x.name === 'None')) {\n      const existingNoneIntentIndex = existingApp.intents.findIndex((x: any) => x.name === 'None')\n      if (existingNoneIntentIndex > -1) existingApp.intents.splice(existingNoneIntentIndex, 1)\n    }\n\n    // compare lu contents converted from luis josn\n    const isApplicationEqual = this.isApplicationEqual(currentAppToCompare, existingApp)\n\n    return !isApplicationEqual\n  }\n\n  public updateVersion(currentApp: any, existingApp: any) {\n    let newVersionId: string\n    if (currentApp.versionId > existingApp.versionId) {\n      newVersionId = currentApp.versionId\n    } else {\n      newVersionId = this.updateVersionValue(existingApp.versionId)\n    }\n\n    currentApp.versionId = newVersionId\n\n    return newVersionId\n  }\n\n  public async importNewVersion(appId: string, app: any, options: any) {\n    // await this.client.versions.importMethod(appId, app, options)\n\n    const versionId = `?versionId=${options.versionId}`\n    let url = this.endpoint + '/luis/authoring/v3.0-preview/apps/' + appId + '/versions/import' + versionId\n    const headers = {\n      'Content-Type': 'application/json',\n      'Ocp-Apim-Subscription-Key': this.subscriptionKey\n    }\n\n    let messageData\n    let retryCount = this.retryCount + 1\n    let error: any\n    while (retryCount > 0) {\n      if (error === undefined || error.code === rateLimitErrorCode.toString()) {\n        let response = await fetch(url, {method: 'POST', headers, body: JSON.stringify(app)})\n        messageData = await response.json()\n\n        if (messageData.error === undefined) break\n\n        error = messageData.error\n        retryCount--\n        if (retryCount > 0) await delay(this.retryDuration)\n      } else {\n        throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, error.message))\n      }\n    }\n\n    if (retryCount === 0) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, error.message))\n    }\n\n    return messageData\n  }\n\n  public async listApplicationVersions(appId: string) {\n    let appVersions\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          appVersions = await this.client.versions.list(appId)\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n\n    return appVersions\n  }\n\n  public async deleteVersion(appId: string, versionId: string) {\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          await this.client.versions.deleteMethod(appId, versionId)\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n  }\n\n  public async trainApplication(appId: string, versionId: string) {\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          await this.client.train.trainVersion(appId, versionId)\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n  }\n\n  public async getTrainingStatus(appId: string, versionId: string) {\n    let status\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          status = await this.client.train.getStatus(appId, versionId)\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n\n    return status\n  }\n\n  public async publishApplication(appId: string, versionId: string, isStaging: boolean) {\n    let retryCount = this.retryCount + 1\n    let error\n    while (retryCount > 0) {\n      if (error === undefined || error.statusCode === rateLimitErrorCode) {\n        try {\n          await this.client.apps.publish(appId,\n            {\n              versionId,\n              isStaging\n            })\n          break\n        } catch (e) {\n          error = e\n          retryCount--\n          if (retryCount > 0) await delay(this.retryDuration)\n        }\n      } else {\n        throw error\n      }\n    }\n\n    if (retryCount === 0) {\n      throw error\n    }\n  }\n\n  private updateVersionValue(versionId: string) {\n    let numberVersionId = parseFloat(versionId)\n    if (isNaN(numberVersionId)) {\n      const index = versionId.lastIndexOf('-')\n      if (index > 0) {\n        const strVersion = versionId.substring(0, index)\n        const numberVersion = versionId.substring(index + 1)\n        numberVersionId = parseFloat(numberVersion)\n        if (isNaN(numberVersionId)) {\n          return versionId\n        } else {\n          const newVersionId = numberVersionId + 0.1\n\n          return strVersion + '-' + newVersionId.toFixed(1)\n        }\n      } else {\n        return versionId + '-0.1'\n      }\n    } else {\n      return (numberVersionId + 0.1).toFixed(1)\n    }\n  }\n\n  private isApplicationEqual(appA: any, appB: any) {\n    let appALuis = new Luis(appA)\n    this.sortLuis(appALuis)\n    let appALu = appALuis.parseToLuContent().toLowerCase()\n\n    let appBLuis = new Luis(appB)\n    this.sortLuis(appBLuis)\n    let appBLu = appBLuis.parseToLuContent().toLowerCase()\n\n    return appALu === appBLu\n  }\n\n  private sortLuis(app: any) {\n    this.sortProperty(app.intents, 'name')\n    this.sortProperty(app.closedLists, 'name')\n    this.sortProperty(app.composites, 'name')\n    this.sortProperty(app.entities, 'name')\n    this.sortProperty(app.model_features, 'name')\n    this.sortProperty(app.phraselists, 'name')\n    this.sortProperty(app.patternAnyEntities, 'name')\n    this.sortProperty(app.patterns, 'pattern')\n    this.sortProperty(app.prebuiltEntities, 'name')\n    this.sortProperty(app.regex_entities, 'name')\n    this.sortProperty(app.regexEntities, 'name')\n    this.sortProperty(app.utterances, 'text')\n  }\n\n  private sortProperty(arrayToSort: any[], propertyToSort: string) {\n    (arrayToSort || []).sort((a: any, b: any) => {\n      const aValue = a[propertyToSort].toLowerCase()\n      const bValue = b[propertyToSort].toLowerCase()\n\n      return aValue < bValue ? -1 : aValue > bValue ? 1 : 0\n    })\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/cross-trained-recognizer.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport class CrossTrainedRecognizer {\n  public recognizers: any\n  private readonly dialogPath: string\n  private readonly $schema: string | undefined\n\n  constructor(dialogPath: string, recognizers: any, schema?: string) {\n    this.dialogPath = dialogPath\n    this.recognizers = recognizers\n    this.$schema = schema\n  }\n\n  save(): string {\n    let output: any = {\n      $kind: 'Microsoft.CrossTrainedRecognizerSet',\n      recognizers: this.recognizers\n    }\n\n    if (this.$schema) {\n      output = {$schema: this.$schema, ...output}\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getDialogPath(): string {\n    return this.dialogPath\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/multi-language-recognizer.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst path = require('path')\n\nexport class MultiLanguageRecognizer {\n  public recognizers: any\n  private readonly id: string\n  private readonly dialogPath: string\n  private readonly $schema: string | undefined\n\n  constructor(dialogPath: string, recognizers: any, schema?: string) {\n    this.id = `LUIS_${path.basename(dialogPath).split('.')[0]}`\n    this.dialogPath = dialogPath\n    this.recognizers = recognizers\n    this.$schema = schema\n  }\n\n  save(): string {\n    let output: any = {\n      $kind: 'Microsoft.MultiLanguageRecognizer',\n      id: this.id,\n      recognizers: this.recognizers\n    }\n\n    if (this.$schema) {\n      output = {$schema: this.$schema, ...output}\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getDialogPath(): string {\n    return this.dialogPath\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/recognizer.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {Settings} from './settings'\nimport * as path from 'path'\n\nexport class Recognizer {\n  static load(luFile: string, targetFileName: string, dialogPath: string, luisSettings: Settings, existingRecognizer: any, schema?: string): Recognizer {\n    if (existingRecognizer) {\n      let recognizer = new Recognizer(luFile, targetFileName, schema)\n      recognizer.dialogPath = dialogPath\n      Object.assign(recognizer, existingRecognizer)\n      recognizer.setAppId(luisSettings.luis[path.basename(luFile).split('.').join('_')])\n\n      return recognizer\n    }\n\n    let recognizer = new Recognizer(luFile, targetFileName, schema)\n    recognizer.dialogPath = dialogPath\n\n    return recognizer\n  }\n\n  versionId: string\n  private readonly id: string\n  private readonly applicationId: string | undefined\n  private readonly endpoint: string | undefined\n  private readonly endpointKey: string | undefined\n  private readonly $schema: string | undefined\n  private appId: string\n  private dialogPath: string | undefined\n\n  constructor(private readonly luFile: string, targetFileName: string, schema?: string) {\n    this.appId = ''\n    this.id = `LUIS_${targetFileName.split('.')[0]}`\n    this.applicationId = `=settings.luis.${targetFileName.split('.').join('_').replace(/-/g, '_')}`\n    this.endpoint = '=settings.luis.endpoint'\n    this.endpointKey = '=settings.luis.endpointKey'\n    this.versionId = '0.1'\n    this.$schema = schema\n  }\n\n  save(): string {\n    let output: any = {\n      $kind: 'Microsoft.LuisRecognizer',\n      id: this.id,\n      applicationId: this.applicationId,\n      endpoint: this.endpoint,\n      endpointKey: this.endpointKey\n    }\n\n    if (this.$schema) {\n      output = {$schema: this.$schema, ...output}\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getAppId(): string {\n    return this.appId\n  }\n\n  setAppId(appId: string) {\n    this.appId = appId\n  }\n\n  getDialogPath(): string {\n    return this.dialogPath as string\n  }\n\n  getLuPath() {\n    return this.luFile\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/settings.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport class Settings {\n  public luis: any\n  private readonly settingsPath: string\n\n  constructor(settingsPath: string, luis: any) {\n    this.settingsPath = settingsPath\n    this.luis = luis\n  }\n\n  save(): string {\n    let output = {\n      luis: this.luis\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getSettingsPath(): string {\n    return this.settingsPath\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/LUFileLexer.g4",
    "content": "lexer grammar LUFileLexer;\n\n// fragments\nfragment A: 'a' | 'A';\nfragment B: 'b' | 'B';\nfragment C: 'c' | 'C';\nfragment D: 'd' | 'D';\nfragment E: 'e' | 'E';\nfragment F: 'f' | 'F';\nfragment G: 'g' | 'G';\nfragment H: 'h' | 'H';\nfragment I: 'i' | 'I';\nfragment J: 'j' | 'J';\nfragment K: 'k' | 'K';\nfragment L: 'l' | 'L';\nfragment M: 'm' | 'M';\nfragment N: 'n' | 'N';\nfragment O: 'o' | 'O';\nfragment P: 'p' | 'P';\nfragment Q: 'q' | 'Q';\nfragment R: 'r' | 'R';\nfragment S: 's' | 'S';\nfragment T: 't' | 'T';\nfragment U: 'u' | 'U';\nfragment V: 'v' | 'V';\nfragment W: 'w' | 'W';\nfragment X: 'x' | 'X';\nfragment Y: 'y' | 'Y';\nfragment Z: 'z' | 'Z';\n\nfragment LETTER: 'a'..'z' | 'A'..'Z';\nfragment NUMBER: '0'..'9';\n\nfragment WHITESPACE\n  : ' '|'\\t'|'\\ufeff'|'\\u00a0'\n  ;\n\nfragment UTTERANCE_MARK: '-' | '*' | '+';\n\nWS\n  : WHITESPACE+\n  ;\n\nNEWLINE\n  : '\\r'? '\\n' -> skip\n  ;\n\nQNA_SOURCE_INFO\n  : WS* '>' WS* '!# @qna.pair.source' WS* '=' ~('\\r'|'\\n')+\n  ;\n\nMODEL_INFO\n  : WS* '>' WS* '!#' ~('\\r'|'\\n')+\n  ;\n\nCOMMENT\n  : WS* '>' ~('\\r'|'\\n')* -> skip\n  ;\n\nQNA\n  : '#'+ WS* '?' -> pushMode(QNA_MODE)\n  ;\n\nHASH\n  : '#' -> pushMode(INTENT_NAME_MODE)\n  ;\n\nDASH\n  : UTTERANCE_MARK -> pushMode(LIST_BODY_MODE)\n  ;\n\nDOLLAR\n  : '$' -> pushMode(ENTITY_MODE)\n  ;\n\nAT\n  : '@' -> pushMode(NEW_ENTITY_MODE)\n  ;\n\nIMPORT\n  : '[' ~[\\r\\n[\\]]*? ']' '(' ~[\\r\\n()]*? ')'\n  ;\n\nFILTER_MARK\n  : '**' F I L T E R S ':**'\n  ;\n\nQNA_ID_MARK\n  : '<a' .*? '</a>'\n  ;\n\nMULTI_LINE_TEXT\n  : '```' .*? '```'\n  ;\nPROMPT_MARK\n  : '**' P R O M P T S ':**'\n  ;\n  \nINVALID_TOKEN_DEFAULT_MODE\n  : .\n  ;\n  \nmode NEW_ENTITY_MODE;\n\nWS_IN_NEW_ENTITY\n  : WS -> type(WS)\n  ;\n\nNEWLINE_IN_NEW_ENTITY\n  : '\\r'? '\\n' -> type(NEWLINE), popMode\n  ;\n\nEQUAL\n  : '='\n  ;\n\nCOMMA\n  : ','\n  ;\n\nHAS_ROLES_LABEL\n  : H A S R O L E S?\n  ;\n\nHAS_FEATURES_LABEL\n  : U S E S F E A T U R E S?\n  ;\n\nNEW_ENTITY_TYPE_IDENTIFIER\n  : S I M P L E | L I S T | R E G E X | P R E B U I L T | C O M P O S I T E | M L | P A T T E R N A N Y | P H R A S E L I S T | I N T E N T\n  ;\n\nPHRASE_LIST_LABEL\n  : '(' (~[\\r\\n])* ')'\n  ;\n\nNEW_COMPOSITE_ENTITY\n  : '[' (~[\\r\\n{}[\\]()])* ']'\n  ;\n\nNEW_REGEX_ENTITY\n  : '/' (~[\\r\\n])*\n  ;\n\nNEW_ENTITY_IDENTIFIER\n  : (~[ \\t\\r\\n,;'\"])+\n  ;\n\nNEW_ENTITY_IDENTIFIER_WITH_WS\n  : ('\\'' | '\"') (~[\\t\\r\\n,;'\"])+ ('\\'' | '\"')\n  ;\n\nmode INTENT_NAME_MODE;\n  \nWS_IN_NAME\n  : WS -> type(WS)\n  ;\n\nHASH_IN_NAME\n  : '#' -> type(HASH)\n  ;\n\nNEWLINE_IN_NAME\n  : '\\r'? '\\n' -> skip, popMode\n  ;\n\nIDENTIFIER\n  : (LETTER | NUMBER | '_') (LETTER | NUMBER | '-' | '_')*\n  ;\n\nDOT\n  : '.'\n  ;\n\nmode LIST_BODY_MODE;\n\nWS_IN_LIST_BODY\n  : WS -> type(WS)\n  ;\n\nNEWLINE_IN_LIST_BODY\n  : '\\r'? '\\n' -> type(NEWLINE), popMode\n  ;\n\nESCAPE_CHARACTER\n  : '\\\\' ~[\\r\\n]?\n  ;\n\nEXPRESSION\n  : '{' (~[\\r\\n{}] | ('{' ~[\\r\\n]* '}'))* '}'\n  ;\n\nTEXT\n  : ~[ \\t\\r\\n\\\\]+?\n  ;\n\nmode ENTITY_MODE;\n\nWS_IN_ENTITY\n  : WS -> type(WS)\n  ;\n\nNEWLINE_IN_ENTITY\n  : '\\r'? '\\n' -> skip, popMode\n  ;\n\nCOMPOSITE_ENTITY\n  : '[' (~[\\r\\n{}[\\]()])* ']'\n  ;\n\nREGEX_ENTITY\n  : '/' (~[\\r\\n])*\n  ;\n\nENTITY_TEXT\n  : ~[ \\t\\r\\n:]+\n  ;\n\nCOLON_MARK\n  : ':'\n  ;\n\nmode QNA_MODE;\n\nNEWLINE_IN_QNA\n  : '\\r'? '\\n' -> skip, popMode\n  ;\n\nQNA_TEXT\n  : ~[\\t\\r\\n]+\n  ;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/LUFileParser.g4",
    "content": "parser grammar LUFileParser;\n\noptions { tokenVocab=LUFileLexer; }\n\nfile\n\t: paragraph+? EOF\n\t;\n\nparagraph\n    : newline\n    | nestedIntentSection\n    | simpleIntentSection\n    | entitySection\n    | newEntitySection\n    | importSection\n    | qnaSection\n    | modelInfoSection\n    ;\n\n// Treat EOF as newline to hanle file end gracefully\n// It's possible that parser doesn't even have to handle NEWLINE, \n// but before the syntax is finalized, we still keep the NEWLINE in grammer \nnewline\n    : WS* (NEWLINE | EOF)\n    ;\n\nerrorString\n    : (WS|INVALID_TOKEN_DEFAULT_MODE)+\n    ;\n\nnestedIntentSection\n    : nestedIntentNameLine nestedIntentBodyDefinition\n    ;\n\nnestedIntentNameLine\n    : WS* HASH WS* nestedIntentName\n    ;\n\nnestedIntentName\n    : nameIdentifier (WS|nameIdentifier)*\n    ;\n\nnameIdentifier\n    : IDENTIFIER (DOT IDENTIFIER)*\n    ;\n\nnestedIntentBodyDefinition\n    : subIntentDefinition+\n    ;\n\nsubIntentDefinition\n    : WS* HASH simpleIntentSection\n    ;\n\nsimpleIntentSection\n    : intentDefinition\n    ;\n\nintentDefinition\n\t: intentNameLine intentBody?\n\t;\n\nintentNameLine\n\t: WS* HASH HASH? WS* intentName\n\t;\n\nintentName\n    : nameIdentifier (WS|nameIdentifier)*\n    ;\n\nintentBody\n\t: WS* normalIntentBody\n\t;\n\nnormalIntentBody\n    : WS* ((normalIntentString newline) | errorString)+\n    ;\n\nnormalIntentString\n\t: WS* DASH (WS|TEXT|EXPRESSION|ESCAPE_CHARACTER)*\n\t;\n\nnewEntitySection\n    : newEntityDefinition\n    ;\n\nnewEntityDefinition\n    : newEntityLine newEntityListbody?\n    ;\n\nnewEntityListbody\n    : ((normalItemString newline) | errorString)+\n    ;\n\nnewEntityLine\n    : WS* AT WS* newEntityType? WS* (newEntityName|newEntityNameWithWS)? WS* newEntityRoles? WS* newEntityUsesFeatures? WS* EQUAL? WS* (newCompositeDefinition|newRegexDefinition)? newline\n    ;\n\nnewCompositeDefinition\n    : NEW_COMPOSITE_ENTITY\n    ;\n\nnewRegexDefinition\n    : NEW_REGEX_ENTITY\n    ;\n\nnewEntityType\n    : NEW_ENTITY_TYPE_IDENTIFIER\n    ;\n\nnewEntityRoles\n    : HAS_ROLES_LABEL? WS* newEntityRoleOrFeatures\n    ;\n\nnewEntityUsesFeatures\n    : HAS_FEATURES_LABEL WS* newEntityRoleOrFeatures\n    ;\n\nnewEntityRoleOrFeatures\n    : (NEW_ENTITY_IDENTIFIER|NEW_ENTITY_IDENTIFIER_WITH_WS) (WS* COMMA WS* (NEW_ENTITY_IDENTIFIER|NEW_ENTITY_IDENTIFIER_WITH_WS))*\n    ;\n\nnewEntityName\n    : NEW_ENTITY_IDENTIFIER (WS* PHRASE_LIST_LABEL)?\n    ;\n\nnewEntityNameWithWS\n    : NEW_ENTITY_IDENTIFIER_WITH_WS (WS* PHRASE_LIST_LABEL)?\n    ;\n\nentitySection\n    : entityDefinition\n    ;\n\nentityDefinition\n    : entityLine entityListBody?\n    ;\n    \nentityLine\n    : WS* DOLLAR entityName? COLON_MARK? entityType?\n    ;\n\nentityName\n    : (ENTITY_TEXT|WS)+\n    ;\n\nentityType\n    : (compositeEntityIdentifier|regexEntityIdentifier|ENTITY_TEXT|COLON_MARK|WS)+\n    ;\n\ncompositeEntityIdentifier\n    : COMPOSITE_ENTITY\n    ;\n\nregexEntityIdentifier\n    : REGEX_ENTITY\n    ;\n\nentityListBody\n    : ((normalItemString newline) | errorString)+\n    ;\n\nnormalItemString\n    : WS* DASH (WS|TEXT|EXPRESSION|ESCAPE_CHARACTER)*\n    ;\n\nimportSection\n    : importDefinition\n    ;\n\nimportDefinition\n    : WS* IMPORT WS*\n    ;\n\nqnaSection\n    : qnaDefinition\n    ;\n\nqnaDefinition\n    : qnaSourceInfo? qnaIdMark? qnaQuestion moreQuestionsBody qnaAnswerBody promptSection?\n    ;\n\nqnaSourceInfo\n    : WS* QNA_SOURCE_INFO\n    ;\n\nqnaIdMark\n    : WS* QNA_ID_MARK\n    ;\n    \nqnaQuestion\n    : WS* QNA questionText\n    ;\n\nquestionText\n    : QNA_TEXT*\n    ;\n\nmoreQuestionsBody\n    : WS* ((moreQuestion newline) | errorQuestionString)*\n    ;\n\nmoreQuestion\n    : DASH (WS|TEXT)*\n    ;\n\nerrorQuestionString\n    : (WS|INVALID_TOKEN_DEFAULT_MODE)+\n    ;\n\nqnaAnswerBody\n    : ((filterSection? multiLineAnswer)|(multiLineAnswer filterSection?))\n    ;\n\nfilterSection\n    : WS* FILTER_MARK (filterLine | errorFilterLine)+\n    ;\n\npromptSection\n    : WS* PROMPT_MARK (filterLine | errorFilterLine)+\n    ;\n\nfilterLine\n    : WS* DASH (WS|TEXT)* newline\n    ;\n\nerrorFilterLine\n    : (WS|INVALID_TOKEN_DEFAULT_MODE)+\n    ;\n\nmultiLineAnswer\n    : WS* MULTI_LINE_TEXT\n    ;\n\nmodelInfoSection\n    : modelInfoDefinition\n    ;\n\nmodelInfoDefinition\n    : WS* MODEL_INFO\n    ;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/baseSection.js",
    "content": "class BaseSection {\n    constructor(parameters) {\n        this.Errors = [];\n        this.SectionType = '';\n        this.Id = '';\n        this.Body = '';\n        this.Range;\n\n        if (parameters) {\n            this.Errors = parameters.Errors || [];\n            this.SectionType = parameters.SectionType || '';\n            this.Id = parameters.Id || '';\n            this.Body = parameters.Body || '';\n            this.Range = parameters.Range;\n        }\n    }\n}\n\nmodule.exports = BaseSection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/classes/filesToParse.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nclass FileToParse {\n    /**\n     * @property {string} filePath \n     */\n    /**\n     * @property {Boolean} includeInCollate\n     */\n    constructor(filePath, includeInCollate) {\n        this.filePath = filePath?filePath:'';\n        if(includeInCollate === undefined) this.includeInCollate = true;\n        else this.includeInCollate = includeInCollate;\n    }\n}\n\nmodule.exports = FileToParse;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/classes/hclasses.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst readerObj = {\n    readerObject : class {\n        constructor(sourceFile, model) {\n            this.sourceFile = sourceFile?sourceFile:'';\n            this.model = model?model:'';\n        }\n    },\n    entity : class {\n        constructor(entity, value, start, end) {\n            this.entity = entity?entity:'';\n            this.value = value?value:'';\n            this.start = !isNaN(start)?start:-1;\n            this.end = !isNaN(end)?end:-1;\n        }\n    },\n    intent: class {\n        constructor(intent, utterances) {\n            this.intent = intent?intent:'';\n            this.utterances = utterances?utterances:[]\n        }\n    }, \n    uttereances: class {\n        constructor(text, intent, entities) {\n            this.text = text?text:'';\n            this.intent = intent?intent:''; \n            this.entities = entities?entities:[];\n        }\n    },\n    rLuisObj: class {\n        constructor(intents, patterns) {\n            this.intents = intents?intents:[];\n            this.patterns = patterns?patterns:[]; \n        }\n    }, \n    pattern: class {\n        constructor(pattern, intent) {\n            this.pattern = pattern?pattern:'';\n            this.intent = intent?intent:'';\n        }\n    },\n    modelObj: class {\n        constructor(name, mode, words, activated) {\n            this.name = name?name:'';\n            this.words = words?words:'';\n            this.mode = mode?mode:false;\n            this.activated = activated?activated:false;\n        }\n    }, \n    subList: class {\n        constructor(canonicalForm, list) {\n            this.canonicalForm = canonicalForm?canonicalForm:'';\n            this.list = list?list:[];\n        }\n    },\n    closedLists: class {\n        constructor(name, subLists, roles) {\n            this.name = name?name:'';\n            this.subLists = subLists?subLists:[];\n            this.roles = roles?roles:[];\n        }\n    },\n    regExEntity: class {\n        constructor (name, regexPattern, roles) {\n            this.name = name ? name : '';\n            this.regexPattern = regexPattern ? regexPattern : '';\n            this.roles = roles ? roles : [];\n        }\n    },\n    compositeEntity: class {\n        constructor (name, children, roles) {\n            this.name = name ? name : '';\n            this.children = children ? children : [];\n            this.roles = roles ? roles : [];\n        }\n    },\n    utteranceEntity: class {\n        constructor (name, startPos, endPos, role) {\n            this.entity = name ? name : '';\n            this.startPos = startPos ? startPos : 0;\n            this.endPos = endPos ? endPos : 0\n        }\n    },\n    parserEntity: class {\n        constructor (parent, startPos, entity, value, endPos, type, role) {\n            this.entity = entity ? entity : '';\n            this.value = value ? value : [],\n            this.startPos = startPos ? startPos : 0,\n            this.endPos = endPos ? endPos : 0,\n            this.type = type ? type : 'simple';\n            this.role = role ? role : '';\n            this.parent = parent ? parent : undefined;\n        }\n    },\n    patternAnyEntity: class{\n        constructor(name, explicitList, roles) {\n            this.name = name ? name : '';\n            this.explicitList = explicitList ? explicitList : [];\n            this.roles = roles ? roles : [];\n        }\n    },\n    entityAndRoles: class {\n        constructor(name, type, roles) {\n            this.name = name ? name : '';\n            this.type = type ? type : '';\n            this.roles = roles ? roles : [];\n        }\n        addRoles(roles) {\n            (roles || []).forEach(role => {\n                if (!this.roles.includes(role)) this.roles.push(role)\n            })\n        }\n        hasRole(value) {\n            return this.roles.includes(value);\n        }\n    },\n    featureToModel: class {\n        constructor(name, featureType) {\n            this.featureName = name ? name : '';\n            this.featureType = featureType ? featureType : '';\n        }\n    },\n    modelToFeature: class {\n        constructor(name, featureType) {\n            this.modelName = name ? name : '';\n            this.modelType = featureType ? featureType : '';\n        }\n    },\n    childEntity: class {\n        constructor(name, instanceOf, context, children, features) {\n            this.name = name ? name : '';\n            this.instanceOf = instanceOf ? instanceOf : null;\n            this.children = children ? children : [];\n            this.features = features ? features : '';\n            this.context = context ? context : '';\n        }\n    },\n    entityFeature: class {\n        constructor(name, isRequired) {\n            this.modelName = name ? name : '';\n            this.isRequired = isRequired ? isRequired : false;\n        }\n    },\n    plFeature: class {\n        constructor(name, isRequired) {\n            this.featureName = name ? name : '';\n            this.isRequired = isRequired ? isRequired : false;\n        }\n    }\n};\n\nmodule.exports = readerObj;\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/classes/parserObject.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst QnA = require('./../../qna/qnamaker/kb');\nconst LUIS = require('./../../luis/luis');\nconst qnaAlterations = require('./../../qna/alterations/alterations');\nclass parserObject {\n    /**\n     * @property {FileToParse []} additionalFilesToParse\n     */\n    /**\n     * @property {LUIS} LUISJsonStructure\n     */\n    /**\n     * @property {QnA} qnaJsonStructure\n     */\n    /**\n     * @property {qnaAlterations} qnaAlterations\n     */\n    /**\n     * @property {string} srcFile\n     */\n    /**\n     * @property {Boolean} includeInCollate\n     */\n    constructor() {\n        this.additionalFilesToParse = [];\n        this.LUISJsonStructure = new LUIS();\n        this.qnaJsonStructure = new QnA();\n        this.qnaAlterations = new qnaAlterations();\n        this.srcFile = undefined;\n        this.includeInCollate = true;\n    }\n}\n/**\n * Helper method to create a parser object based on arbitrary attributes passed in.\n * @param {Object} LUISJsonStructure \n * @param {Object} qnaJsonStructure \n * @param {Object} lQnaAlterations \n * @param {Object} srcFile \n * @param {Object} includeInCollate \n */\nparserObject.create = function(LUISJsonStructure, qnaJsonStructure, lQnaAlterations, srcFile, includeInCollate) {\n    let parserObj = new parserObject();\n    parserObj.LUISJsonStructure = (LUISJsonStructure || new LUIS());\n    parserObj.qnaJsonStructure = (qnaJsonStructure || new QnA());\n    parserObj.qnaAlterations = (lQnaAlterations || new qnaAlterations());\n    parserObj.srcFile = (srcFile || undefined);\n    if(includeInCollate === undefined) parserObj.includeInCollate = true;\n    else parserObj.includeInCollate = includeInCollate;\n    return parserObj;\n}\n\nmodule.exports = parserObject;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/diagnostic.js",
    "content": "/**\n * Diagnostic class\n */\nclass Diagnostic {\n    constructor(range, message, severity = DiagnosticSeverity.ERROR) {\n        this.Message = message;\n        this.Range = range;\n        this.Severity = severity;\n    }\n\n    toString() {\n        if (this.Range === undefined) {\n            return `[${DiagnosticSeverity[this.Severity]}] ${this.Message.toString()}`;\n        }\n        else {\n            return `[${DiagnosticSeverity[this.Severity]}] ${this.Range.toString()}: ${this.Message.toString()}`;\n        }\n    }\n}\n\n/**\n * Range class\n */\nclass Range {\n    constructor(start, end) {\n        this.Start = start;\n        this.End = end;\n    }\n\n    toString() {\n        let result = this.Start.toString();\n        if (this.Start.Line <= this.End.Line && this.Start.Character < this.End.Character) {\n            result += ' - ';\n            result += this.End.toString();\n        }\n\n        return result;\n    };\n}\n\n/**\n * Position class\n */\nclass Position {\n    constructor(line, character) {\n        this.Line = line;\n        this.Character = character;\n    }\n\n    toString() { return `line ${this.Line}:${this.Character}` };\n}\n\n/**\n * DiagnosticSeverity enum\n */\nconst DiagnosticSeverity = {\n    ERROR: 'ERROR',\n    WARN: 'WARN'\n}\n\nconst AntlrTokens = {\n    '<EOF>': 'end of file',\n    'MODEL_INFO': 'model description',\n    'NEWLINE': 'new line',\n    'QNA': 'QnA definition',\n    'HASH': 'Intent definition',\n    'DOLLAR': 'Entity definition',\n    'IMPORT_DESC': 'Import statement',\n    'WS': 'Whitespace',\n    'FILTER_MARK': 'QnA filtering section',\n    \"'**Filters:**'\": 'QnA filtering section',\n    'MULTI_LINE_TEXT': 'multiple line text'\n}\n\nconst BuildDiagnostic =function(parameter) {\n    let message = parameter.message;\n    const severity = parameter.severity === undefined ? DiagnosticSeverity.ERROR : parameter.severity;\n\n    let range;\n    const rangeInput = parameter.range;\n    const context = parameter.context;\n    if (rangeInput !== undefined) {\n        const startPosition = new Position(rangeInput.Start.Line, rangeInput.Start.Character);\n        const stopPosition = new Position(rangeInput.End.Line, rangeInput.End.Character);\n        range = new Range(startPosition, stopPosition);\n    } else if (context !== undefined) {\n        const startPosition = new Position(context.start.line, context.start.column);\n        const stopPosition = new Position(context.stop.line, context.stop.column + context.stop.text.length);\n        range = new Range(startPosition, stopPosition);\n    } else if (parameter.line !== undefined) {\n        range = new Range(new Position(parameter.line, 0), new Position(parameter.line, 1));\n    }\n        \n    return new Diagnostic(range, message, severity);\n}\n\nmodule.exports = {\n    Diagnostic: Diagnostic,\n    Range: Range,\n    Position: Position,\n    DiagnosticSeverity: DiagnosticSeverity,\n    AntlrTokens: AntlrTokens,\n    BuildDiagnostic: BuildDiagnostic\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/entitySection.js",
    "content": "const EntitySectionContext = require('./generated/LUFileParser').LUFileParser.EntitySectionContext;\nconst DiagnosticSeverity = require('./diagnostic').DiagnosticSeverity;\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes');\nconst InvalidCharsInIntentOrEntityName = require('./../utils/enums/invalidchars').InvalidCharsInIntentOrEntityName;\nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass EntitySection extends BaseSection {\n    /**\n     * \n     * @param {EntitySectionContext} parseTree \n     */\n    constructor(parseTree) {\n        super();\n        this.SectionType = LUSectionTypes.ENTITYSECTION;\n        this.Name = this.ExtractName(parseTree);\n        this.Type = this.ExtractType(parseTree);\n        this.SynonymsOrPhraseList = this.ExtractSynonymsOrPhraseList(parseTree);\n        this.Id = `${this.SectionType}_${this.Name}`;\n        const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n        const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n        this.Range = new Range(startPosition, stopPosition);\n    }\n\n    ExtractName(parseTree) {\n        let entityName;\n        if (parseTree.entityDefinition().entityLine().entityName()) {\n            entityName = parseTree.entityDefinition().entityLine().entityName().getText().trim();\n        } else {\n            this.Errors.push(BuildDiagnostic({\n                message: \"Invalid entity line, did you miss entity name after $\",\n                context: parseTree.entityDefinition().entityLine()\n            }));\n        }\n\n        if (entityName && InvalidCharsInIntentOrEntityName.some(x => entityName.includes(x))) {\n            this.Errors.push(BuildDiagnostic({\n                message: `Invalid entity line, entity name ${entityName} cannot contain any of the following characters: [<, >, *, %, &, :, \\\\, $]`,\n                context: parseTree.newEntityDefinition().newEntityLine()\n            }));\n        } else {\n            return entityName;\n        }\n    }\n\n    ExtractType(parseTree) {\n        if (parseTree.entityDefinition().entityLine().entityType()) {\n            return parseTree.entityDefinition().entityLine().entityType().getText().trim();\n        } else {\n            this.Errors.push(BuildDiagnostic({\n                message: \"Invalid entity line, did you miss entity type after $\",\n                context: parseTree.entityDefinition().entityLine()\n            }))   \n        }\n    }\n\n    ExtractSynonymsOrPhraseList(parseTree) {\n        let synonymsOrPhraseList = [];\n\n        if (parseTree.entityDefinition().entityListBody()) {\n            for (const errorItemStr of parseTree.entityDefinition().entityListBody().errorString()) {\n                if (errorItemStr.getText().trim() !== '') {\n                    this.Errors.push(BuildDiagnostic({\n                    message: \"Invalid list entity line, did you miss '-' at line begin\",\n                    context: errorItemStr\n                }))}\n            }\n\n            for (const normalItemStr of parseTree.entityDefinition().entityListBody().normalItemString()) {\n                var itemStr = normalItemStr.getText().trim();\n                synonymsOrPhraseList.push(itemStr.substr(1).trim());\n            }\n        }\n\n        if (this.Type && this.Type.indexOf('=') > -1 && synonymsOrPhraseList.length === 0) {\n            let errorMsg = `no synonyms list found for list entity definition: \"${parseTree.entityDefinition().entityLine().getText()}\"`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                context: parseTree.entityDefinition().entityLine(),\n                severity: DiagnosticSeverity.WARN\n            })\n\n            this.Errors.push(error);\n        }\n\n        return synonymsOrPhraseList;\n    }\n}\n\nmodule.exports = EntitySection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.interp",
    "content": "token literal names:\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n'$'\n'@'\nnull\nnull\nnull\nnull\nnull\nnull\n'='\n','\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n'.'\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n':'\nnull\nnull\n\ntoken symbolic names:\nnull\nWS\nNEWLINE\nQNA_SOURCE_INFO\nMODEL_INFO\nCOMMENT\nQNA\nHASH\nDASH\nDOLLAR\nAT\nIMPORT\nFILTER_MARK\nQNA_ID_MARK\nMULTI_LINE_TEXT\nPROMPT_MARK\nINVALID_TOKEN_DEFAULT_MODE\nEQUAL\nCOMMA\nHAS_ROLES_LABEL\nHAS_FEATURES_LABEL\nNEW_ENTITY_TYPE_IDENTIFIER\nPHRASE_LIST_LABEL\nNEW_COMPOSITE_ENTITY\nNEW_REGEX_ENTITY\nNEW_ENTITY_IDENTIFIER\nNEW_ENTITY_IDENTIFIER_WITH_WS\nNEWLINE_IN_NAME\nIDENTIFIER\nDOT\nESCAPE_CHARACTER\nEXPRESSION\nTEXT\nNEWLINE_IN_ENTITY\nCOMPOSITE_ENTITY\nREGEX_ENTITY\nENTITY_TEXT\nCOLON_MARK\nNEWLINE_IN_QNA\nQNA_TEXT\n\nrule names:\nA\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nL\nM\nN\nO\nP\nQ\nR\nS\nT\nU\nV\nW\nX\nY\nZ\nLETTER\nNUMBER\nWHITESPACE\nUTTERANCE_MARK\nWS\nNEWLINE\nQNA_SOURCE_INFO\nMODEL_INFO\nCOMMENT\nQNA\nHASH\nDASH\nDOLLAR\nAT\nIMPORT\nFILTER_MARK\nQNA_ID_MARK\nMULTI_LINE_TEXT\nPROMPT_MARK\nINVALID_TOKEN_DEFAULT_MODE\nWS_IN_NEW_ENTITY\nNEWLINE_IN_NEW_ENTITY\nEQUAL\nCOMMA\nHAS_ROLES_LABEL\nHAS_FEATURES_LABEL\nNEW_ENTITY_TYPE_IDENTIFIER\nPHRASE_LIST_LABEL\nNEW_COMPOSITE_ENTITY\nNEW_REGEX_ENTITY\nNEW_ENTITY_IDENTIFIER\nNEW_ENTITY_IDENTIFIER_WITH_WS\nWS_IN_NAME\nHASH_IN_NAME\nNEWLINE_IN_NAME\nIDENTIFIER\nDOT\nWS_IN_LIST_BODY\nNEWLINE_IN_LIST_BODY\nESCAPE_CHARACTER\nEXPRESSION\nTEXT\nWS_IN_ENTITY\nNEWLINE_IN_ENTITY\nCOMPOSITE_ENTITY\nREGEX_ENTITY\nENTITY_TEXT\nCOLON_MARK\nNEWLINE_IN_QNA\nQNA_TEXT\n\nchannel names:\nDEFAULT_TOKEN_CHANNEL\nHIDDEN\n\nmode names:\nDEFAULT_MODE\nNEW_ENTITY_MODE\nINTENT_NAME_MODE\nLIST_BODY_MODE\nENTITY_MODE\nQNA_MODE\n\natn:\n[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 41, 685, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 6, 32, 222, 10, 32, 13, 32, 14, 32, 223, 3, 33, 5, 33, 227, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 7, 34, 234, 10, 34, 12, 34, 14, 34, 237, 11, 34, 3, 34, 3, 34, 7, 34, 241, 10, 34, 12, 34, 14, 34, 244, 11, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 7, 34, 267, 10, 34, 12, 34, 14, 34, 270, 11, 34, 3, 34, 3, 34, 6, 34, 274, 10, 34, 13, 34, 14, 34, 275, 3, 35, 7, 35, 279, 10, 35, 12, 35, 14, 35, 282, 11, 35, 3, 35, 3, 35, 7, 35, 286, 10, 35, 12, 35, 14, 35, 289, 11, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 295, 10, 35, 13, 35, 14, 35, 296, 3, 36, 7, 36, 300, 10, 36, 12, 36, 14, 36, 303, 11, 36, 3, 36, 3, 36, 7, 36, 307, 10, 36, 12, 36, 14, 36, 310, 11, 36, 3, 36, 3, 36, 3, 37, 6, 37, 315, 10, 37, 13, 37, 14, 37, 316, 3, 37, 7, 37, 320, 10, 37, 12, 37, 14, 37, 323, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 7, 42, 347, 10, 42, 12, 42, 14, 42, 350, 11, 42, 3, 42, 3, 42, 3, 42, 7, 42, 355, 10, 42, 12, 42, 14, 42, 358, 11, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 7, 44, 380, 10, 44, 12, 44, 14, 44, 383, 11, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 7, 45, 395, 10, 45, 12, 45, 14, 45, 398, 11, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 5, 49, 425, 10, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 444, 10, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 458, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 529, 10, 54, 3, 55, 3, 55, 7, 55, 533, 10, 55, 12, 55, 14, 55, 536, 11, 55, 3, 55, 3, 55, 3, 56, 3, 56, 7, 56, 542, 10, 56, 12, 56, 14, 56, 545, 11, 56, 3, 56, 3, 56, 3, 57, 3, 57, 7, 57, 551, 10, 57, 12, 57, 14, 57, 554, 11, 57, 3, 58, 6, 58, 557, 10, 58, 13, 58, 14, 58, 558, 3, 59, 3, 59, 6, 59, 563, 10, 59, 13, 59, 14, 59, 564, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 5, 62, 578, 10, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 588, 10, 63, 3, 63, 3, 63, 3, 63, 7, 63, 593, 10, 63, 12, 63, 14, 63, 596, 11, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 5, 66, 605, 10, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 5, 67, 614, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 620, 10, 68, 12, 68, 14, 68, 623, 11, 68, 3, 68, 7, 68, 626, 10, 68, 12, 68, 14, 68, 629, 11, 68, 3, 68, 3, 68, 3, 69, 6, 69, 634, 10, 69, 13, 69, 14, 69, 635, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 5, 71, 643, 10, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 7, 72, 652, 10, 72, 12, 72, 14, 72, 655, 11, 72, 3, 72, 3, 72, 3, 73, 3, 73, 7, 73, 661, 10, 73, 12, 73, 14, 73, 664, 11, 73, 3, 74, 6, 74, 667, 10, 74, 13, 74, 14, 74, 668, 3, 75, 3, 75, 3, 76, 5, 76, 674, 10, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 6, 77, 682, 10, 77, 13, 77, 14, 77, 683, 7, 348, 356, 381, 396, 635, 2, 78, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 3, 70, 4, 72, 5, 74, 6, 76, 7, 78, 8, 80, 9, 82, 10, 84, 11, 86, 12, 88, 13, 90, 14, 92, 15, 94, 16, 96, 17, 98, 18, 100, 2, 102, 2, 104, 19, 106, 20, 108, 21, 110, 22, 112, 23, 114, 24, 116, 25, 118, 26, 120, 27, 122, 28, 124, 2, 126, 2, 128, 29, 130, 30, 132, 31, 134, 2, 136, 2, 138, 32, 140, 33, 142, 34, 144, 2, 146, 35, 148, 36, 150, 37, 152, 38, 154, 39, 156, 40, 158, 41, 8, 2, 3, 4, 5, 6, 7, 43, 4, 2, 67, 67, 99, 99, 4, 2, 68, 68, 100, 100, 4, 2, 69, 69, 101, 101, 4, 2, 70, 70, 102, 102, 4, 2, 71, 71, 103, 103, 4, 2, 72, 72, 104, 104, 4, 2, 73, 73, 105, 105, 4, 2, 74, 74, 106, 106, 4, 2, 75, 75, 107, 107, 4, 2, 76, 76, 108, 108, 4, 2, 77, 77, 109, 109, 4, 2, 78, 78, 110, 110, 4, 2, 79, 79, 111, 111, 4, 2, 80, 80, 112, 112, 4, 2, 81, 81, 113, 113, 4, 2, 82, 82, 114, 114, 4, 2, 83, 83, 115, 115, 4, 2, 84, 84, 116, 116, 4, 2, 85, 85, 117, 117, 4, 2, 86, 86, 118, 118, 4, 2, 87, 87, 119, 119, 4, 2, 88, 88, 120, 120, 4, 2, 89, 89, 121, 121, 4, 2, 90, 90, 122, 122, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 4, 2, 67, 92, 99, 124, 6, 2, 11, 11, 34, 34, 162, 162, 65281, 65281, 4, 2, 44, 45, 47, 47, 4, 2, 12, 12, 15, 15, 6, 2, 12, 12, 15, 15, 93, 93, 95, 95, 5, 2, 12, 12, 15, 15, 42, 43, 9, 2, 12, 12, 15, 15, 42, 43, 93, 93, 95, 95, 125, 125, 127, 127, 9, 2, 11, 12, 15, 15, 34, 34, 36, 36, 41, 41, 46, 46, 61, 61, 4, 2, 36, 36, 41, 41, 8, 2, 11, 12, 15, 15, 36, 36, 41, 41, 46, 46, 61, 61, 4, 2, 47, 47, 97, 97, 6, 2, 12, 12, 15, 15, 125, 125, 127, 127, 6, 2, 11, 12, 15, 15, 34, 34, 94, 94, 6, 2, 11, 12, 15, 15, 34, 34, 60, 60, 4, 2, 11, 12, 15, 15, 2, 700, 2, 68, 3, 2, 2, 2, 2, 70, 3, 2, 2, 2, 2, 72, 3, 2, 2, 2, 2, 74, 3, 2, 2, 2, 2, 76, 3, 2, 2, 2, 2, 78, 3, 2, 2, 2, 2, 80, 3, 2, 2, 2, 2, 82, 3, 2, 2, 2, 2, 84, 3, 2, 2, 2, 2, 86, 3, 2, 2, 2, 2, 88, 3, 2, 2, 2, 2, 90, 3, 2, 2, 2, 2, 92, 3, 2, 2, 2, 2, 94, 3, 2, 2, 2, 2, 96, 3, 2, 2, 2, 2, 98, 3, 2, 2, 2, 3, 100, 3, 2, 2, 2, 3, 102, 3, 2, 2, 2, 3, 104, 3, 2, 2, 2, 3, 106, 3, 2, 2, 2, 3, 108, 3, 2, 2, 2, 3, 110, 3, 2, 2, 2, 3, 112, 3, 2, 2, 2, 3, 114, 3, 2, 2, 2, 3, 116, 3, 2, 2, 2, 3, 118, 3, 2, 2, 2, 3, 120, 3, 2, 2, 2, 3, 122, 3, 2, 2, 2, 4, 124, 3, 2, 2, 2, 4, 126, 3, 2, 2, 2, 4, 128, 3, 2, 2, 2, 4, 130, 3, 2, 2, 2, 4, 132, 3, 2, 2, 2, 5, 134, 3, 2, 2, 2, 5, 136, 3, 2, 2, 2, 5, 138, 3, 2, 2, 2, 5, 140, 3, 2, 2, 2, 5, 142, 3, 2, 2, 2, 6, 144, 3, 2, 2, 2, 6, 146, 3, 2, 2, 2, 6, 148, 3, 2, 2, 2, 6, 150, 3, 2, 2, 2, 6, 152, 3, 2, 2, 2, 6, 154, 3, 2, 2, 2, 7, 156, 3, 2, 2, 2, 7, 158, 3, 2, 2, 2, 8, 160, 3, 2, 2, 2, 10, 162, 3, 2, 2, 2, 12, 164, 3, 2, 2, 2, 14, 166, 3, 2, 2, 2, 16, 168, 3, 2, 2, 2, 18, 170, 3, 2, 2, 2, 20, 172, 3, 2, 2, 2, 22, 174, 3, 2, 2, 2, 24, 176, 3, 2, 2, 2, 26, 178, 3, 2, 2, 2, 28, 180, 3, 2, 2, 2, 30, 182, 3, 2, 2, 2, 32, 184, 3, 2, 2, 2, 34, 186, 3, 2, 2, 2, 36, 188, 3, 2, 2, 2, 38, 190, 3, 2, 2, 2, 40, 192, 3, 2, 2, 2, 42, 194, 3, 2, 2, 2, 44, 196, 3, 2, 2, 2, 46, 198, 3, 2, 2, 2, 48, 200, 3, 2, 2, 2, 50, 202, 3, 2, 2, 2, 52, 204, 3, 2, 2, 2, 54, 206, 3, 2, 2, 2, 56, 208, 3, 2, 2, 2, 58, 210, 3, 2, 2, 2, 60, 212, 3, 2, 2, 2, 62, 214, 3, 2, 2, 2, 64, 216, 3, 2, 2, 2, 66, 218, 3, 2, 2, 2, 68, 221, 3, 2, 2, 2, 70, 226, 3, 2, 2, 2, 72, 235, 3, 2, 2, 2, 74, 280, 3, 2, 2, 2, 76, 301, 3, 2, 2, 2, 78, 314, 3, 2, 2, 2, 80, 328, 3, 2, 2, 2, 82, 332, 3, 2, 2, 2, 84, 336, 3, 2, 2, 2, 86, 340, 3, 2, 2, 2, 88, 344, 3, 2, 2, 2, 90, 361, 3, 2, 2, 2, 92, 375, 3, 2, 2, 2, 94, 389, 3, 2, 2, 2, 96, 403, 3, 2, 2, 2, 98, 417, 3, 2, 2, 2, 100, 419, 3, 2, 2, 2, 102, 424, 3, 2, 2, 2, 104, 431, 3, 2, 2, 2, 106, 433, 3, 2, 2, 2, 108, 435, 3, 2, 2, 2, 110, 445, 3, 2, 2, 2, 112, 528, 3, 2, 2, 2, 114, 530, 3, 2, 2, 2, 116, 539, 3, 2, 2, 2, 118, 548, 3, 2, 2, 2, 120, 556, 3, 2, 2, 2, 122, 560, 3, 2, 2, 2, 124, 568, 3, 2, 2, 2, 126, 572, 3, 2, 2, 2, 128, 577, 3, 2, 2, 2, 130, 587, 3, 2, 2, 2, 132, 597, 3, 2, 2, 2, 134, 599, 3, 2, 2, 2, 136, 604, 3, 2, 2, 2, 138, 611, 3, 2, 2, 2, 140, 615, 3, 2, 2, 2, 142, 633, 3, 2, 2, 2, 144, 637, 3, 2, 2, 2, 146, 642, 3, 2, 2, 2, 148, 649, 3, 2, 2, 2, 150, 658, 3, 2, 2, 2, 152, 666, 3, 2, 2, 2, 154, 670, 3, 2, 2, 2, 156, 673, 3, 2, 2, 2, 158, 681, 3, 2, 2, 2, 160, 161, 9, 2, 2, 2, 161, 9, 3, 2, 2, 2, 162, 163, 9, 3, 2, 2, 163, 11, 3, 2, 2, 2, 164, 165, 9, 4, 2, 2, 165, 13, 3, 2, 2, 2, 166, 167, 9, 5, 2, 2, 167, 15, 3, 2, 2, 2, 168, 169, 9, 6, 2, 2, 169, 17, 3, 2, 2, 2, 170, 171, 9, 7, 2, 2, 171, 19, 3, 2, 2, 2, 172, 173, 9, 8, 2, 2, 173, 21, 3, 2, 2, 2, 174, 175, 9, 9, 2, 2, 175, 23, 3, 2, 2, 2, 176, 177, 9, 10, 2, 2, 177, 25, 3, 2, 2, 2, 178, 179, 9, 11, 2, 2, 179, 27, 3, 2, 2, 2, 180, 181, 9, 12, 2, 2, 181, 29, 3, 2, 2, 2, 182, 183, 9, 13, 2, 2, 183, 31, 3, 2, 2, 2, 184, 185, 9, 14, 2, 2, 185, 33, 3, 2, 2, 2, 186, 187, 9, 15, 2, 2, 187, 35, 3, 2, 2, 2, 188, 189, 9, 16, 2, 2, 189, 37, 3, 2, 2, 2, 190, 191, 9, 17, 2, 2, 191, 39, 3, 2, 2, 2, 192, 193, 9, 18, 2, 2, 193, 41, 3, 2, 2, 2, 194, 195, 9, 19, 2, 2, 195, 43, 3, 2, 2, 2, 196, 197, 9, 20, 2, 2, 197, 45, 3, 2, 2, 2, 198, 199, 9, 21, 2, 2, 199, 47, 3, 2, 2, 2, 200, 201, 9, 22, 2, 2, 201, 49, 3, 2, 2, 2, 202, 203, 9, 23, 2, 2, 203, 51, 3, 2, 2, 2, 204, 205, 9, 24, 2, 2, 205, 53, 3, 2, 2, 2, 206, 207, 9, 25, 2, 2, 207, 55, 3, 2, 2, 2, 208, 209, 9, 26, 2, 2, 209, 57, 3, 2, 2, 2, 210, 211, 9, 27, 2, 2, 211, 59, 3, 2, 2, 2, 212, 213, 9, 28, 2, 2, 213, 61, 3, 2, 2, 2, 214, 215, 4, 50, 59, 2, 215, 63, 3, 2, 2, 2, 216, 217, 9, 29, 2, 2, 217, 65, 3, 2, 2, 2, 218, 219, 9, 30, 2, 2, 219, 67, 3, 2, 2, 2, 220, 222, 5, 64, 30, 2, 221, 220, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 69, 3, 2, 2, 2, 225, 227, 7, 15, 2, 2, 226, 225, 3, 2, 2, 2, 226, 227, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 229, 7, 12, 2, 2, 229, 230, 3, 2, 2, 2, 230, 231, 8, 33, 2, 2, 231, 71, 3, 2, 2, 2, 232, 234, 5, 68, 32, 2, 233, 232, 3, 2, 2, 2, 234, 237, 3, 2, 2, 2, 235, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 238, 3, 2, 2, 2, 237, 235, 3, 2, 2, 2, 238, 242, 7, 64, 2, 2, 239, 241, 5, 68, 32, 2, 240, 239, 3, 2, 2, 2, 241, 244, 3, 2, 2, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 245, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 245, 246, 7, 35, 2, 2, 246, 247, 7, 37, 2, 2, 247, 248, 7, 34, 2, 2, 248, 249, 7, 66, 2, 2, 249, 250, 7, 115, 2, 2, 250, 251, 7, 112, 2, 2, 251, 252, 7, 99, 2, 2, 252, 253, 7, 48, 2, 2, 253, 254, 7, 114, 2, 2, 254, 255, 7, 99, 2, 2, 255, 256, 7, 107, 2, 2, 256, 257, 7, 116, 2, 2, 257, 258, 7, 48, 2, 2, 258, 259, 7, 117, 2, 2, 259, 260, 7, 113, 2, 2, 260, 261, 7, 119, 2, 2, 261, 262, 7, 116, 2, 2, 262, 263, 7, 101, 2, 2, 263, 264, 7, 103, 2, 2, 264, 268, 3, 2, 2, 2, 265, 267, 5, 68, 32, 2, 266, 265, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 268, 3, 2, 2, 2, 271, 273, 7, 63, 2, 2, 272, 274, 10, 31, 2, 2, 273, 272, 3, 2, 2, 2, 274, 275, 3, 2, 2, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 73, 3, 2, 2, 2, 277, 279, 5, 68, 32, 2, 278, 277, 3, 2, 2, 2, 279, 282, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 281, 3, 2, 2, 2, 281, 283, 3, 2, 2, 2, 282, 280, 3, 2, 2, 2, 283, 287, 7, 64, 2, 2, 284, 286, 5, 68, 32, 2, 285, 284, 3, 2, 2, 2, 286, 289, 3, 2, 2, 2, 287, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 290, 3, 2, 2, 2, 289, 287, 3, 2, 2, 2, 290, 291, 7, 35, 2, 2, 291, 292, 7, 37, 2, 2, 292, 294, 3, 2, 2, 2, 293, 295, 10, 31, 2, 2, 294, 293, 3, 2, 2, 2, 295, 296, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 75, 3, 2, 2, 2, 298, 300, 5, 68, 32, 2, 299, 298, 3, 2, 2, 2, 300, 303, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 304, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 304, 308, 7, 64, 2, 2, 305, 307, 10, 31, 2, 2, 306, 305, 3, 2, 2, 2, 307, 310, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 311, 3, 2, 2, 2, 310, 308, 3, 2, 2, 2, 311, 312, 8, 36, 2, 2, 312, 77, 3, 2, 2, 2, 313, 315, 7, 37, 2, 2, 314, 313, 3, 2, 2, 2, 315, 316, 3, 2, 2, 2, 316, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 321, 3, 2, 2, 2, 318, 320, 5, 68, 32, 2, 319, 318, 3, 2, 2, 2, 320, 323, 3, 2, 2, 2, 321, 319, 3, 2, 2, 2, 321, 322, 3, 2, 2, 2, 322, 324, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 324, 325, 7, 65, 2, 2, 325, 326, 3, 2, 2, 2, 326, 327, 8, 37, 3, 2, 327, 79, 3, 2, 2, 2, 328, 329, 7, 37, 2, 2, 329, 330, 3, 2, 2, 2, 330, 331, 8, 38, 4, 2, 331, 81, 3, 2, 2, 2, 332, 333, 5, 66, 31, 2, 333, 334, 3, 2, 2, 2, 334, 335, 8, 39, 5, 2, 335, 83, 3, 2, 2, 2, 336, 337, 7, 38, 2, 2, 337, 338, 3, 2, 2, 2, 338, 339, 8, 40, 6, 2, 339, 85, 3, 2, 2, 2, 340, 341, 7, 66, 2, 2, 341, 342, 3, 2, 2, 2, 342, 343, 8, 41, 7, 2, 343, 87, 3, 2, 2, 2, 344, 348, 7, 93, 2, 2, 345, 347, 10, 32, 2, 2, 346, 345, 3, 2, 2, 2, 347, 350, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 348, 346, 3, 2, 2, 2, 349, 351, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 351, 352, 7, 95, 2, 2, 352, 356, 7, 42, 2, 2, 353, 355, 10, 33, 2, 2, 354, 353, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 357, 359, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 360, 7, 43, 2, 2, 360, 89, 3, 2, 2, 2, 361, 362, 7, 44, 2, 2, 362, 363, 7, 44, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 5, 18, 7, 2, 365, 366, 5, 24, 10, 2, 366, 367, 5, 30, 13, 2, 367, 368, 5, 46, 21, 2, 368, 369, 5, 16, 6, 2, 369, 370, 5, 42, 19, 2, 370, 371, 5, 44, 20, 2, 371, 372, 7, 60, 2, 2, 372, 373, 7, 44, 2, 2, 373, 374, 7, 44, 2, 2, 374, 91, 3, 2, 2, 2, 375, 376, 7, 62, 2, 2, 376, 377, 7, 99, 2, 2, 377, 381, 3, 2, 2, 2, 378, 380, 11, 2, 2, 2, 379, 378, 3, 2, 2, 2, 380, 383, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 381, 379, 3, 2, 2, 2, 382, 384, 3, 2, 2, 2, 383, 381, 3, 2, 2, 2, 384, 385, 7, 62, 2, 2, 385, 386, 7, 49, 2, 2, 386, 387, 7, 99, 2, 2, 387, 388, 7, 64, 2, 2, 388, 93, 3, 2, 2, 2, 389, 390, 7, 98, 2, 2, 390, 391, 7, 98, 2, 2, 391, 392, 7, 98, 2, 2, 392, 396, 3, 2, 2, 2, 393, 395, 11, 2, 2, 2, 394, 393, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 397, 399, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 7, 98, 2, 2, 400, 401, 7, 98, 2, 2, 401, 402, 7, 98, 2, 2, 402, 95, 3, 2, 2, 2, 403, 404, 7, 44, 2, 2, 404, 405, 7, 44, 2, 2, 405, 406, 3, 2, 2, 2, 406, 407, 5, 38, 17, 2, 407, 408, 5, 42, 19, 2, 408, 409, 5, 36, 16, 2, 409, 410, 5, 32, 14, 2, 410, 411, 5, 38, 17, 2, 411, 412, 5, 46, 21, 2, 412, 413, 5, 44, 20, 2, 413, 414, 7, 60, 2, 2, 414, 415, 7, 44, 2, 2, 415, 416, 7, 44, 2, 2, 416, 97, 3, 2, 2, 2, 417, 418, 11, 2, 2, 2, 418, 99, 3, 2, 2, 2, 419, 420, 5, 68, 32, 2, 420, 421, 3, 2, 2, 2, 421, 422, 8, 48, 8, 2, 422, 101, 3, 2, 2, 2, 423, 425, 7, 15, 2, 2, 424, 423, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 7, 12, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 8, 49, 9, 2, 429, 430, 8, 49, 10, 2, 430, 103, 3, 2, 2, 2, 431, 432, 7, 63, 2, 2, 432, 105, 3, 2, 2, 2, 433, 434, 7, 46, 2, 2, 434, 107, 3, 2, 2, 2, 435, 436, 5, 22, 9, 2, 436, 437, 5, 8, 2, 2, 437, 438, 5, 44, 20, 2, 438, 439, 5, 42, 19, 2, 439, 440, 5, 36, 16, 2, 440, 441, 5, 30, 13, 2, 441, 443, 5, 16, 6, 2, 442, 444, 5, 44, 20, 2, 443, 442, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 109, 3, 2, 2, 2, 445, 446, 5, 48, 22, 2, 446, 447, 5, 44, 20, 2, 447, 448, 5, 16, 6, 2, 448, 449, 5, 44, 20, 2, 449, 450, 5, 18, 7, 2, 450, 451, 5, 16, 6, 2, 451, 452, 5, 8, 2, 2, 452, 453, 5, 46, 21, 2, 453, 454, 5, 48, 22, 2, 454, 455, 5, 42, 19, 2, 455, 457, 5, 16, 6, 2, 456, 458, 5, 44, 20, 2, 457, 456, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 111, 3, 2, 2, 2, 459, 460, 5, 44, 20, 2, 460, 461, 5, 24, 10, 2, 461, 462, 5, 32, 14, 2, 462, 463, 5, 38, 17, 2, 463, 464, 5, 30, 13, 2, 464, 465, 5, 16, 6, 2, 465, 529, 3, 2, 2, 2, 466, 467, 5, 30, 13, 2, 467, 468, 5, 24, 10, 2, 468, 469, 5, 44, 20, 2, 469, 470, 5, 46, 21, 2, 470, 529, 3, 2, 2, 2, 471, 472, 5, 42, 19, 2, 472, 473, 5, 16, 6, 2, 473, 474, 5, 20, 8, 2, 474, 475, 5, 16, 6, 2, 475, 476, 5, 54, 25, 2, 476, 529, 3, 2, 2, 2, 477, 478, 5, 38, 17, 2, 478, 479, 5, 42, 19, 2, 479, 480, 5, 16, 6, 2, 480, 481, 5, 10, 3, 2, 481, 482, 5, 48, 22, 2, 482, 483, 5, 24, 10, 2, 483, 484, 5, 30, 13, 2, 484, 485, 5, 46, 21, 2, 485, 529, 3, 2, 2, 2, 486, 487, 5, 12, 4, 2, 487, 488, 5, 36, 16, 2, 488, 489, 5, 32, 14, 2, 489, 490, 5, 38, 17, 2, 490, 491, 5, 36, 16, 2, 491, 492, 5, 44, 20, 2, 492, 493, 5, 24, 10, 2, 493, 494, 5, 46, 21, 2, 494, 495, 5, 16, 6, 2, 495, 529, 3, 2, 2, 2, 496, 497, 5, 32, 14, 2, 497, 498, 5, 30, 13, 2, 498, 529, 3, 2, 2, 2, 499, 500, 5, 38, 17, 2, 500, 501, 5, 8, 2, 2, 501, 502, 5, 46, 21, 2, 502, 503, 5, 46, 21, 2, 503, 504, 5, 16, 6, 2, 504, 505, 5, 42, 19, 2, 505, 506, 5, 34, 15, 2, 506, 507, 5, 8, 2, 2, 507, 508, 5, 34, 15, 2, 508, 509, 5, 56, 26, 2, 509, 529, 3, 2, 2, 2, 510, 511, 5, 38, 17, 2, 511, 512, 5, 22, 9, 2, 512, 513, 5, 42, 19, 2, 513, 514, 5, 8, 2, 2, 514, 515, 5, 44, 20, 2, 515, 516, 5, 16, 6, 2, 516, 517, 5, 30, 13, 2, 517, 518, 5, 24, 10, 2, 518, 519, 5, 44, 20, 2, 519, 520, 5, 46, 21, 2, 520, 529, 3, 2, 2, 2, 521, 522, 5, 24, 10, 2, 522, 523, 5, 34, 15, 2, 523, 524, 5, 46, 21, 2, 524, 525, 5, 16, 6, 2, 525, 526, 5, 34, 15, 2, 526, 527, 5, 46, 21, 2, 527, 529, 3, 2, 2, 2, 528, 459, 3, 2, 2, 2, 528, 466, 3, 2, 2, 2, 528, 471, 3, 2, 2, 2, 528, 477, 3, 2, 2, 2, 528, 486, 3, 2, 2, 2, 528, 496, 3, 2, 2, 2, 528, 499, 3, 2, 2, 2, 528, 510, 3, 2, 2, 2, 528, 521, 3, 2, 2, 2, 529, 113, 3, 2, 2, 2, 530, 534, 7, 42, 2, 2, 531, 533, 10, 31, 2, 2, 532, 531, 3, 2, 2, 2, 533, 536, 3, 2, 2, 2, 534, 532, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 537, 3, 2, 2, 2, 536, 534, 3, 2, 2, 2, 537, 538, 7, 43, 2, 2, 538, 115, 3, 2, 2, 2, 539, 543, 7, 93, 2, 2, 540, 542, 10, 34, 2, 2, 541, 540, 3, 2, 2, 2, 542, 545, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 546, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 546, 547, 7, 95, 2, 2, 547, 117, 3, 2, 2, 2, 548, 552, 7, 49, 2, 2, 549, 551, 10, 31, 2, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 119, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 557, 10, 35, 2, 2, 556, 555, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 556, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 121, 3, 2, 2, 2, 560, 562, 9, 36, 2, 2, 561, 563, 10, 37, 2, 2, 562, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 567, 9, 36, 2, 2, 567, 123, 3, 2, 2, 2, 568, 569, 5, 68, 32, 2, 569, 570, 3, 2, 2, 2, 570, 571, 8, 60, 8, 2, 571, 125, 3, 2, 2, 2, 572, 573, 7, 37, 2, 2, 573, 574, 3, 2, 2, 2, 574, 575, 8, 61, 11, 2, 575, 127, 3, 2, 2, 2, 576, 578, 7, 15, 2, 2, 577, 576, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 580, 7, 12, 2, 2, 580, 581, 3, 2, 2, 2, 581, 582, 8, 62, 2, 2, 582, 583, 8, 62, 10, 2, 583, 129, 3, 2, 2, 2, 584, 588, 5, 60, 28, 2, 585, 588, 5, 62, 29, 2, 586, 588, 7, 97, 2, 2, 587, 584, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 587, 586, 3, 2, 2, 2, 588, 594, 3, 2, 2, 2, 589, 593, 5, 60, 28, 2, 590, 593, 5, 62, 29, 2, 591, 593, 9, 38, 2, 2, 592, 589, 3, 2, 2, 2, 592, 590, 3, 2, 2, 2, 592, 591, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 131, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 598, 7, 48, 2, 2, 598, 133, 3, 2, 2, 2, 599, 600, 5, 68, 32, 2, 600, 601, 3, 2, 2, 2, 601, 602, 8, 65, 8, 2, 602, 135, 3, 2, 2, 2, 603, 605, 7, 15, 2, 2, 604, 603, 3, 2, 2, 2, 604, 605, 3, 2, 2, 2, 605, 606, 3, 2, 2, 2, 606, 607, 7, 12, 2, 2, 607, 608, 3, 2, 2, 2, 608, 609, 8, 66, 9, 2, 609, 610, 8, 66, 10, 2, 610, 137, 3, 2, 2, 2, 611, 613, 7, 94, 2, 2, 612, 614, 10, 31, 2, 2, 613, 612, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 139, 3, 2, 2, 2, 615, 627, 7, 125, 2, 2, 616, 626, 10, 39, 2, 2, 617, 621, 7, 125, 2, 2, 618, 620, 10, 31, 2, 2, 619, 618, 3, 2, 2, 2, 620, 623, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 621, 622, 3, 2, 2, 2, 622, 624, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 624, 626, 7, 127, 2, 2, 625, 616, 3, 2, 2, 2, 625, 617, 3, 2, 2, 2, 626, 629, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 630, 3, 2, 2, 2, 629, 627, 3, 2, 2, 2, 630, 631, 7, 127, 2, 2, 631, 141, 3, 2, 2, 2, 632, 634, 10, 40, 2, 2, 633, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 636, 143, 3, 2, 2, 2, 637, 638, 5, 68, 32, 2, 638, 639, 3, 2, 2, 2, 639, 640, 8, 70, 8, 2, 640, 145, 3, 2, 2, 2, 641, 643, 7, 15, 2, 2, 642, 641, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 645, 7, 12, 2, 2, 645, 646, 3, 2, 2, 2, 646, 647, 8, 71, 2, 2, 647, 648, 8, 71, 10, 2, 648, 147, 3, 2, 2, 2, 649, 653, 7, 93, 2, 2, 650, 652, 10, 34, 2, 2, 651, 650, 3, 2, 2, 2, 652, 655, 3, 2, 2, 2, 653, 651, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 656, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 656, 657, 7, 95, 2, 2, 657, 149, 3, 2, 2, 2, 658, 662, 7, 49, 2, 2, 659, 661, 10, 31, 2, 2, 660, 659, 3, 2, 2, 2, 661, 664, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 151, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 665, 667, 10, 41, 2, 2, 666, 665, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 666, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 153, 3, 2, 2, 2, 670, 671, 7, 60, 2, 2, 671, 155, 3, 2, 2, 2, 672, 674, 7, 15, 2, 2, 673, 672, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 676, 7, 12, 2, 2, 676, 677, 3, 2, 2, 2, 677, 678, 8, 76, 2, 2, 678, 679, 8, 76, 10, 2, 679, 157, 3, 2, 2, 2, 680, 682, 10, 42, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 159, 3, 2, 2, 2, 50, 2, 3, 4, 5, 6, 7, 223, 226, 235, 242, 268, 275, 280, 287, 296, 301, 308, 316, 321, 348, 356, 381, 396, 424, 443, 457, 528, 534, 543, 552, 558, 564, 577, 587, 592, 594, 604, 613, 621, 625, 627, 635, 642, 653, 662, 668, 673, 683, 12, 8, 2, 2, 7, 7, 2, 7, 4, 2, 7, 5, 2, 7, 6, 2, 7, 3, 2, 9, 3, 2, 9, 4, 2, 6, 2, 2, 9, 9, 2]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.js",
    "content": "// Generated from ../LUFileLexer.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n\n\nvar serializedATN = [\"\\u0003\\u608b\\ua72a\\u8133\\ub9ed\\u417c\\u3be7\\u7786\\u5964\",\n    \"\\u0002)\\u02ad\\b\\u0001\\b\\u0001\\b\\u0001\\b\\u0001\\b\\u0001\\b\\u0001\\u0004\",\n    \"\\u0002\\t\\u0002\\u0004\\u0003\\t\\u0003\\u0004\\u0004\\t\\u0004\\u0004\\u0005\\t\",\n    \"\\u0005\\u0004\\u0006\\t\\u0006\\u0004\\u0007\\t\\u0007\\u0004\\b\\t\\b\\u0004\\t\\t\",\n    \"\\t\\u0004\\n\\t\\n\\u0004\\u000b\\t\\u000b\\u0004\\f\\t\\f\\u0004\\r\\t\\r\\u0004\\u000e\",\n    \"\\t\\u000e\\u0004\\u000f\\t\\u000f\\u0004\\u0010\\t\\u0010\\u0004\\u0011\\t\\u0011\",\n    \"\\u0004\\u0012\\t\\u0012\\u0004\\u0013\\t\\u0013\\u0004\\u0014\\t\\u0014\\u0004\\u0015\",\n    \"\\t\\u0015\\u0004\\u0016\\t\\u0016\\u0004\\u0017\\t\\u0017\\u0004\\u0018\\t\\u0018\",\n    \"\\u0004\\u0019\\t\\u0019\\u0004\\u001a\\t\\u001a\\u0004\\u001b\\t\\u001b\\u0004\\u001c\",\n    \"\\t\\u001c\\u0004\\u001d\\t\\u001d\\u0004\\u001e\\t\\u001e\\u0004\\u001f\\t\\u001f\",\n    \"\\u0004 \\t \\u0004!\\t!\\u0004\\\"\\t\\\"\\u0004#\\t#\\u0004$\\t$\\u0004%\\t%\\u0004\",\n    \"&\\t&\\u0004\\'\\t\\'\\u0004(\\t(\\u0004)\\t)\\u0004*\\t*\\u0004+\\t+\\u0004,\\t,\\u0004\",\n    \"-\\t-\\u0004.\\t.\\u0004/\\t/\\u00040\\t0\\u00041\\t1\\u00042\\t2\\u00043\\t3\\u0004\",\n    \"4\\t4\\u00045\\t5\\u00046\\t6\\u00047\\t7\\u00048\\t8\\u00049\\t9\\u0004:\\t:\\u0004\",\n    \";\\t;\\u0004<\\t<\\u0004=\\t=\\u0004>\\t>\\u0004?\\t?\\u0004@\\t@\\u0004A\\tA\\u0004\",\n    \"B\\tB\\u0004C\\tC\\u0004D\\tD\\u0004E\\tE\\u0004F\\tF\\u0004G\\tG\\u0004H\\tH\\u0004\",\n    \"I\\tI\\u0004J\\tJ\\u0004K\\tK\\u0004L\\tL\\u0004M\\tM\\u0003\\u0002\\u0003\\u0002\",\n    \"\\u0003\\u0003\\u0003\\u0003\\u0003\\u0004\\u0003\\u0004\\u0003\\u0005\\u0003\\u0005\",\n    \"\\u0003\\u0006\\u0003\\u0006\\u0003\\u0007\\u0003\\u0007\\u0003\\b\\u0003\\b\\u0003\",\n    \"\\t\\u0003\\t\\u0003\\n\\u0003\\n\\u0003\\u000b\\u0003\\u000b\\u0003\\f\\u0003\\f\\u0003\",\n    \"\\r\\u0003\\r\\u0003\\u000e\\u0003\\u000e\\u0003\\u000f\\u0003\\u000f\\u0003\\u0010\",\n    \"\\u0003\\u0010\\u0003\\u0011\\u0003\\u0011\\u0003\\u0012\\u0003\\u0012\\u0003\\u0013\",\n    \"\\u0003\\u0013\\u0003\\u0014\\u0003\\u0014\\u0003\\u0015\\u0003\\u0015\\u0003\\u0016\",\n    \"\\u0003\\u0016\\u0003\\u0017\\u0003\\u0017\\u0003\\u0018\\u0003\\u0018\\u0003\\u0019\",\n    \"\\u0003\\u0019\\u0003\\u001a\\u0003\\u001a\\u0003\\u001b\\u0003\\u001b\\u0003\\u001c\",\n    \"\\u0003\\u001c\\u0003\\u001d\\u0003\\u001d\\u0003\\u001e\\u0003\\u001e\\u0003\\u001f\",\n    \"\\u0003\\u001f\\u0003 \\u0006 \\u00de\\n \\r \\u000e \\u00df\\u0003!\\u0005!\\u00e3\",\n    \"\\n!\\u0003!\\u0003!\\u0003!\\u0003!\\u0003\\\"\\u0007\\\"\\u00ea\\n\\\"\\f\\\"\\u000e\",\n    \"\\\"\\u00ed\\u000b\\\"\\u0003\\\"\\u0003\\\"\\u0007\\\"\\u00f1\\n\\\"\\f\\\"\\u000e\\\"\\u00f4\",\n    \"\\u000b\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\",\n    \"\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\",\n    \"\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0003\\\"\\u0007\\\"\\u010b\\n\\\"\\f\\\"\\u000e\\\"\\u010e\",\n    \"\\u000b\\\"\\u0003\\\"\\u0003\\\"\\u0006\\\"\\u0112\\n\\\"\\r\\\"\\u000e\\\"\\u0113\\u0003#\",\n    \"\\u0007#\\u0117\\n#\\f#\\u000e#\\u011a\\u000b#\\u0003#\\u0003#\\u0007#\\u011e\\n\",\n    \"#\\f#\\u000e#\\u0121\\u000b#\\u0003#\\u0003#\\u0003#\\u0003#\\u0006#\\u0127\\n\",\n    \"#\\r#\\u000e#\\u0128\\u0003$\\u0007$\\u012c\\n$\\f$\\u000e$\\u012f\\u000b$\\u0003\",\n    \"$\\u0003$\\u0007$\\u0133\\n$\\f$\\u000e$\\u0136\\u000b$\\u0003$\\u0003$\\u0003\",\n    \"%\\u0006%\\u013b\\n%\\r%\\u000e%\\u013c\\u0003%\\u0007%\\u0140\\n%\\f%\\u000e%\\u0143\",\n    \"\\u000b%\\u0003%\\u0003%\\u0003%\\u0003%\\u0003&\\u0003&\\u0003&\\u0003&\\u0003\",\n    \"\\'\\u0003\\'\\u0003\\'\\u0003\\'\\u0003(\\u0003(\\u0003(\\u0003(\\u0003)\\u0003\",\n    \")\\u0003)\\u0003)\\u0003*\\u0003*\\u0007*\\u015b\\n*\\f*\\u000e*\\u015e\\u000b\",\n    \"*\\u0003*\\u0003*\\u0003*\\u0007*\\u0163\\n*\\f*\\u000e*\\u0166\\u000b*\\u0003\",\n    \"*\\u0003*\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003\",\n    \"+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003,\\u0003,\\u0003,\\u0003,\\u0007\",\n    \",\\u017c\\n,\\f,\\u000e,\\u017f\\u000b,\\u0003,\\u0003,\\u0003,\\u0003,\\u0003\",\n    \",\\u0003-\\u0003-\\u0003-\\u0003-\\u0003-\\u0007-\\u018b\\n-\\f-\\u000e-\\u018e\",\n    \"\\u000b-\\u0003-\\u0003-\\u0003-\\u0003-\\u0003.\\u0003.\\u0003.\\u0003.\\u0003\",\n    \".\\u0003.\\u0003.\\u0003.\\u0003.\\u0003.\\u0003.\\u0003.\\u0003.\\u0003.\\u0003\",\n    \"/\\u0003/\\u00030\\u00030\\u00030\\u00030\\u00031\\u00051\\u01a9\\n1\\u00031\\u0003\",\n    \"1\\u00031\\u00031\\u00031\\u00032\\u00032\\u00033\\u00033\\u00034\\u00034\\u0003\",\n    \"4\\u00034\\u00034\\u00034\\u00034\\u00034\\u00054\\u01bc\\n4\\u00035\\u00035\\u0003\",\n    \"5\\u00035\\u00035\\u00035\\u00035\\u00035\\u00035\\u00035\\u00035\\u00035\\u0005\",\n    \"5\\u01ca\\n5\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u00036\\u0003\",\n    \"6\\u00056\\u0211\\n6\\u00037\\u00037\\u00077\\u0215\\n7\\f7\\u000e7\\u0218\\u000b\",\n    \"7\\u00037\\u00037\\u00038\\u00038\\u00078\\u021e\\n8\\f8\\u000e8\\u0221\\u000b\",\n    \"8\\u00038\\u00038\\u00039\\u00039\\u00079\\u0227\\n9\\f9\\u000e9\\u022a\\u000b\",\n    \"9\\u0003:\\u0006:\\u022d\\n:\\r:\\u000e:\\u022e\\u0003;\\u0003;\\u0006;\\u0233\",\n    \"\\n;\\r;\\u000e;\\u0234\\u0003;\\u0003;\\u0003<\\u0003<\\u0003<\\u0003<\\u0003\",\n    \"=\\u0003=\\u0003=\\u0003=\\u0003>\\u0005>\\u0242\\n>\\u0003>\\u0003>\\u0003>\\u0003\",\n    \">\\u0003>\\u0003?\\u0003?\\u0003?\\u0005?\\u024c\\n?\\u0003?\\u0003?\\u0003?\\u0007\",\n    \"?\\u0251\\n?\\f?\\u000e?\\u0254\\u000b?\\u0003@\\u0003@\\u0003A\\u0003A\\u0003\",\n    \"A\\u0003A\\u0003B\\u0005B\\u025d\\nB\\u0003B\\u0003B\\u0003B\\u0003B\\u0003B\\u0003\",\n    \"C\\u0003C\\u0005C\\u0266\\nC\\u0003D\\u0003D\\u0003D\\u0003D\\u0007D\\u026c\\n\",\n    \"D\\fD\\u000eD\\u026f\\u000bD\\u0003D\\u0007D\\u0272\\nD\\fD\\u000eD\\u0275\\u000b\",\n    \"D\\u0003D\\u0003D\\u0003E\\u0006E\\u027a\\nE\\rE\\u000eE\\u027b\\u0003F\\u0003\",\n    \"F\\u0003F\\u0003F\\u0003G\\u0005G\\u0283\\nG\\u0003G\\u0003G\\u0003G\\u0003G\\u0003\",\n    \"G\\u0003H\\u0003H\\u0007H\\u028c\\nH\\fH\\u000eH\\u028f\\u000bH\\u0003H\\u0003\",\n    \"H\\u0003I\\u0003I\\u0007I\\u0295\\nI\\fI\\u000eI\\u0298\\u000bI\\u0003J\\u0006\",\n    \"J\\u029b\\nJ\\rJ\\u000eJ\\u029c\\u0003K\\u0003K\\u0003L\\u0005L\\u02a2\\nL\\u0003\",\n    \"L\\u0003L\\u0003L\\u0003L\\u0003L\\u0003M\\u0006M\\u02aa\\nM\\rM\\u000eM\\u02ab\",\n    \"\\u0007\\u015c\\u0164\\u017d\\u018c\\u027b\\u0002N\\b\\u0002\\n\\u0002\\f\\u0002\",\n    \"\\u000e\\u0002\\u0010\\u0002\\u0012\\u0002\\u0014\\u0002\\u0016\\u0002\\u0018\\u0002\",\n    \"\\u001a\\u0002\\u001c\\u0002\\u001e\\u0002 \\u0002\\\"\\u0002$\\u0002&\\u0002(\\u0002\",\n    \"*\\u0002,\\u0002.\\u00020\\u00022\\u00024\\u00026\\u00028\\u0002:\\u0002<\\u0002\",\n    \">\\u0002@\\u0002B\\u0002D\\u0003F\\u0004H\\u0005J\\u0006L\\u0007N\\bP\\tR\\nT\\u000b\",\n    \"V\\fX\\rZ\\u000e\\\\\\u000f^\\u0010`\\u0011b\\u0012d\\u0002f\\u0002h\\u0013j\\u0014\",\n    \"l\\u0015n\\u0016p\\u0017r\\u0018t\\u0019v\\u001ax\\u001bz\\u001c|\\u0002~\\u0002\",\n    \"\\u0080\\u001d\\u0082\\u001e\\u0084\\u001f\\u0086\\u0002\\u0088\\u0002\\u008a \",\n    \"\\u008c!\\u008e\\\"\\u0090\\u0002\\u0092#\\u0094$\\u0096%\\u0098&\\u009a\\'\\u009c\",\n    \"(\\u009e)\\b\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007+\\u0004\\u0002CCcc\\u0004\",\n    \"\\u0002DDdd\\u0004\\u0002EEee\\u0004\\u0002FFff\\u0004\\u0002GGgg\\u0004\\u0002\",\n    \"HHhh\\u0004\\u0002IIii\\u0004\\u0002JJjj\\u0004\\u0002KKkk\\u0004\\u0002LLl\",\n    \"l\\u0004\\u0002MMmm\\u0004\\u0002NNnn\\u0004\\u0002OOoo\\u0004\\u0002PPpp\\u0004\",\n    \"\\u0002QQqq\\u0004\\u0002RRrr\\u0004\\u0002SSss\\u0004\\u0002TTtt\\u0004\\u0002\",\n    \"UUuu\\u0004\\u0002VVvv\\u0004\\u0002WWww\\u0004\\u0002XXxx\\u0004\\u0002YYy\",\n    \"y\\u0004\\u0002ZZzz\\u0004\\u0002[[{{\\u0004\\u0002\\\\\\\\||\\u0004\\u0002C\\\\c\",\n    \"|\\u0006\\u0002\\u000b\\u000b\\\"\\\"\\u00a2\\u00a2\\uff01\\uff01\\u0004\\u0002,-\",\n    \"//\\u0004\\u0002\\f\\f\\u000f\\u000f\\u0006\\u0002\\f\\f\\u000f\\u000f]]__\\u0005\",\n    \"\\u0002\\f\\f\\u000f\\u000f*+\\t\\u0002\\f\\f\\u000f\\u000f*+]]__}}\\u007f\\u007f\",\n    \"\\t\\u0002\\u000b\\f\\u000f\\u000f\\\"\\\"$$))..==\\u0004\\u0002$$))\\b\\u0002\\u000b\",\n    \"\\f\\u000f\\u000f$$))..==\\u0004\\u0002//aa\\u0006\\u0002\\f\\f\\u000f\\u000f}\",\n    \"}\\u007f\\u007f\\u0006\\u0002\\u000b\\f\\u000f\\u000f\\\"\\\"^^\\u0006\\u0002\\u000b\",\n    \"\\f\\u000f\\u000f\\\"\\\"<<\\u0004\\u0002\\u000b\\f\\u000f\\u000f\\u0002\\u02bc\\u0002\",\n    \"D\\u0003\\u0002\\u0002\\u0002\\u0002F\\u0003\\u0002\\u0002\\u0002\\u0002H\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0002J\\u0003\\u0002\\u0002\\u0002\\u0002L\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0002N\\u0003\\u0002\\u0002\\u0002\\u0002P\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0002R\\u0003\\u0002\\u0002\\u0002\\u0002T\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0002V\\u0003\\u0002\\u0002\\u0002\\u0002X\\u0003\\u0002\\u0002\\u0002\\u0002\",\n    \"Z\\u0003\\u0002\\u0002\\u0002\\u0002\\\\\\u0003\\u0002\\u0002\\u0002\\u0002^\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0002`\\u0003\\u0002\\u0002\\u0002\\u0002b\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0003d\\u0003\\u0002\\u0002\\u0002\\u0003f\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0003h\\u0003\\u0002\\u0002\\u0002\\u0003j\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0003l\\u0003\\u0002\\u0002\\u0002\\u0003n\\u0003\\u0002\\u0002\\u0002\\u0003\",\n    \"p\\u0003\\u0002\\u0002\\u0002\\u0003r\\u0003\\u0002\\u0002\\u0002\\u0003t\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0003v\\u0003\\u0002\\u0002\\u0002\\u0003x\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0003z\\u0003\\u0002\\u0002\\u0002\\u0004|\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0004~\\u0003\\u0002\\u0002\\u0002\\u0004\\u0080\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0004\\u0082\\u0003\\u0002\\u0002\\u0002\\u0004\\u0084\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0005\\u0086\\u0003\\u0002\\u0002\\u0002\\u0005\\u0088\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0005\\u008a\\u0003\\u0002\\u0002\\u0002\\u0005\\u008c\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0005\\u008e\\u0003\\u0002\\u0002\\u0002\\u0006\\u0090\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0006\\u0092\\u0003\\u0002\\u0002\\u0002\\u0006\\u0094\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0006\\u0096\\u0003\\u0002\\u0002\\u0002\\u0006\\u0098\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0006\\u009a\\u0003\\u0002\\u0002\\u0002\\u0007\\u009c\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0007\\u009e\\u0003\\u0002\\u0002\\u0002\\b\\u00a0\\u0003\\u0002\\u0002\",\n    \"\\u0002\\n\\u00a2\\u0003\\u0002\\u0002\\u0002\\f\\u00a4\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u000e\\u00a6\\u0003\\u0002\\u0002\\u0002\\u0010\\u00a8\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0012\\u00aa\\u0003\\u0002\\u0002\\u0002\\u0014\\u00ac\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0016\\u00ae\\u0003\\u0002\\u0002\\u0002\\u0018\\u00b0\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u001a\\u00b2\\u0003\\u0002\\u0002\\u0002\\u001c\\u00b4\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u001e\\u00b6\\u0003\\u0002\\u0002\\u0002 \\u00b8\\u0003\\u0002\\u0002\\u0002\",\n    \"\\\"\\u00ba\\u0003\\u0002\\u0002\\u0002$\\u00bc\\u0003\\u0002\\u0002\\u0002&\\u00be\",\n    \"\\u0003\\u0002\\u0002\\u0002(\\u00c0\\u0003\\u0002\\u0002\\u0002*\\u00c2\\u0003\",\n    \"\\u0002\\u0002\\u0002,\\u00c4\\u0003\\u0002\\u0002\\u0002.\\u00c6\\u0003\\u0002\",\n    \"\\u0002\\u00020\\u00c8\\u0003\\u0002\\u0002\\u00022\\u00ca\\u0003\\u0002\\u0002\",\n    \"\\u00024\\u00cc\\u0003\\u0002\\u0002\\u00026\\u00ce\\u0003\\u0002\\u0002\\u0002\",\n    \"8\\u00d0\\u0003\\u0002\\u0002\\u0002:\\u00d2\\u0003\\u0002\\u0002\\u0002<\\u00d4\",\n    \"\\u0003\\u0002\\u0002\\u0002>\\u00d6\\u0003\\u0002\\u0002\\u0002@\\u00d8\\u0003\",\n    \"\\u0002\\u0002\\u0002B\\u00da\\u0003\\u0002\\u0002\\u0002D\\u00dd\\u0003\\u0002\",\n    \"\\u0002\\u0002F\\u00e2\\u0003\\u0002\\u0002\\u0002H\\u00eb\\u0003\\u0002\\u0002\",\n    \"\\u0002J\\u0118\\u0003\\u0002\\u0002\\u0002L\\u012d\\u0003\\u0002\\u0002\\u0002\",\n    \"N\\u013a\\u0003\\u0002\\u0002\\u0002P\\u0148\\u0003\\u0002\\u0002\\u0002R\\u014c\",\n    \"\\u0003\\u0002\\u0002\\u0002T\\u0150\\u0003\\u0002\\u0002\\u0002V\\u0154\\u0003\",\n    \"\\u0002\\u0002\\u0002X\\u0158\\u0003\\u0002\\u0002\\u0002Z\\u0169\\u0003\\u0002\",\n    \"\\u0002\\u0002\\\\\\u0177\\u0003\\u0002\\u0002\\u0002^\\u0185\\u0003\\u0002\\u0002\",\n    \"\\u0002`\\u0193\\u0003\\u0002\\u0002\\u0002b\\u01a1\\u0003\\u0002\\u0002\\u0002\",\n    \"d\\u01a3\\u0003\\u0002\\u0002\\u0002f\\u01a8\\u0003\\u0002\\u0002\\u0002h\\u01af\",\n    \"\\u0003\\u0002\\u0002\\u0002j\\u01b1\\u0003\\u0002\\u0002\\u0002l\\u01b3\\u0003\",\n    \"\\u0002\\u0002\\u0002n\\u01bd\\u0003\\u0002\\u0002\\u0002p\\u0210\\u0003\\u0002\",\n    \"\\u0002\\u0002r\\u0212\\u0003\\u0002\\u0002\\u0002t\\u021b\\u0003\\u0002\\u0002\",\n    \"\\u0002v\\u0224\\u0003\\u0002\\u0002\\u0002x\\u022c\\u0003\\u0002\\u0002\\u0002\",\n    \"z\\u0230\\u0003\\u0002\\u0002\\u0002|\\u0238\\u0003\\u0002\\u0002\\u0002~\\u023c\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0080\\u0241\\u0003\\u0002\\u0002\\u0002\\u0082\\u024b\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0084\\u0255\\u0003\\u0002\\u0002\\u0002\\u0086\\u0257\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0088\\u025c\\u0003\\u0002\\u0002\\u0002\\u008a\\u0263\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u008c\\u0267\\u0003\\u0002\\u0002\\u0002\\u008e\\u0279\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0090\\u027d\\u0003\\u0002\\u0002\\u0002\\u0092\\u0282\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0094\\u0289\\u0003\\u0002\\u0002\\u0002\\u0096\\u0292\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0098\\u029a\\u0003\\u0002\\u0002\\u0002\\u009a\\u029e\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u009c\\u02a1\\u0003\\u0002\\u0002\\u0002\\u009e\\u02a9\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00a0\\u00a1\\t\\u0002\\u0002\\u0002\\u00a1\\t\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u00a2\\u00a3\\t\\u0003\\u0002\\u0002\\u00a3\\u000b\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u00a4\\u00a5\\t\\u0004\\u0002\\u0002\\u00a5\\r\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00a6\\u00a7\\t\\u0005\\u0002\\u0002\\u00a7\\u000f\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00a8\\u00a9\\t\\u0006\\u0002\\u0002\\u00a9\\u0011\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00aa\\u00ab\\t\\u0007\\u0002\\u0002\\u00ab\\u0013\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00ac\\u00ad\\t\\b\\u0002\\u0002\\u00ad\\u0015\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u00ae\\u00af\\t\\t\\u0002\\u0002\\u00af\\u0017\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00b0\\u00b1\\t\\n\\u0002\\u0002\\u00b1\\u0019\\u0003\\u0002\\u0002\\u0002\\u00b2\",\n    \"\\u00b3\\t\\u000b\\u0002\\u0002\\u00b3\\u001b\\u0003\\u0002\\u0002\\u0002\\u00b4\",\n    \"\\u00b5\\t\\f\\u0002\\u0002\\u00b5\\u001d\\u0003\\u0002\\u0002\\u0002\\u00b6\\u00b7\",\n    \"\\t\\r\\u0002\\u0002\\u00b7\\u001f\\u0003\\u0002\\u0002\\u0002\\u00b8\\u00b9\\t\\u000e\",\n    \"\\u0002\\u0002\\u00b9!\\u0003\\u0002\\u0002\\u0002\\u00ba\\u00bb\\t\\u000f\\u0002\",\n    \"\\u0002\\u00bb#\\u0003\\u0002\\u0002\\u0002\\u00bc\\u00bd\\t\\u0010\\u0002\\u0002\",\n    \"\\u00bd%\\u0003\\u0002\\u0002\\u0002\\u00be\\u00bf\\t\\u0011\\u0002\\u0002\\u00bf\",\n    \"\\'\\u0003\\u0002\\u0002\\u0002\\u00c0\\u00c1\\t\\u0012\\u0002\\u0002\\u00c1)\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u00c2\\u00c3\\t\\u0013\\u0002\\u0002\\u00c3+\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00c4\\u00c5\\t\\u0014\\u0002\\u0002\\u00c5-\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u00c6\\u00c7\\t\\u0015\\u0002\\u0002\\u00c7/\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00c8\\u00c9\\t\\u0016\\u0002\\u0002\\u00c91\\u0003\\u0002\\u0002\\u0002\\u00ca\",\n    \"\\u00cb\\t\\u0017\\u0002\\u0002\\u00cb3\\u0003\\u0002\\u0002\\u0002\\u00cc\\u00cd\",\n    \"\\t\\u0018\\u0002\\u0002\\u00cd5\\u0003\\u0002\\u0002\\u0002\\u00ce\\u00cf\\t\\u0019\",\n    \"\\u0002\\u0002\\u00cf7\\u0003\\u0002\\u0002\\u0002\\u00d0\\u00d1\\t\\u001a\\u0002\",\n    \"\\u0002\\u00d19\\u0003\\u0002\\u0002\\u0002\\u00d2\\u00d3\\t\\u001b\\u0002\\u0002\",\n    \"\\u00d3;\\u0003\\u0002\\u0002\\u0002\\u00d4\\u00d5\\t\\u001c\\u0002\\u0002\\u00d5\",\n    \"=\\u0003\\u0002\\u0002\\u0002\\u00d6\\u00d7\\u00042;\\u0002\\u00d7?\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00d8\\u00d9\\t\\u001d\\u0002\\u0002\\u00d9A\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u00da\\u00db\\t\\u001e\\u0002\\u0002\\u00dbC\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00dc\\u00de\\u0005@\\u001e\\u0002\\u00dd\\u00dc\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00de\\u00df\\u0003\\u0002\\u0002\\u0002\\u00df\\u00dd\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00df\\u00e0\\u0003\\u0002\\u0002\\u0002\\u00e0E\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00e1\\u00e3\\u0007\\u000f\\u0002\\u0002\\u00e2\\u00e1\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00e2\\u00e3\\u0003\\u0002\\u0002\\u0002\\u00e3\\u00e4\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00e4\\u00e5\\u0007\\f\\u0002\\u0002\\u00e5\\u00e6\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00e6\\u00e7\\b!\\u0002\\u0002\\u00e7G\\u0003\\u0002\\u0002\\u0002\\u00e8\\u00ea\",\n    \"\\u0005D \\u0002\\u00e9\\u00e8\\u0003\\u0002\\u0002\\u0002\\u00ea\\u00ed\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u00eb\\u00e9\\u0003\\u0002\\u0002\\u0002\\u00eb\\u00ec\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u00ec\\u00ee\\u0003\\u0002\\u0002\\u0002\\u00ed\\u00eb\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u00ee\\u00f2\\u0007@\\u0002\\u0002\\u00ef\\u00f1\\u0005\",\n    \"D \\u0002\\u00f0\\u00ef\\u0003\\u0002\\u0002\\u0002\\u00f1\\u00f4\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00f2\\u00f0\\u0003\\u0002\\u0002\\u0002\\u00f2\\u00f3\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00f3\\u00f5\\u0003\\u0002\\u0002\\u0002\\u00f4\\u00f2\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u00f5\\u00f6\\u0007#\\u0002\\u0002\\u00f6\\u00f7\\u0007%\\u0002\",\n    \"\\u0002\\u00f7\\u00f8\\u0007\\\"\\u0002\\u0002\\u00f8\\u00f9\\u0007B\\u0002\\u0002\",\n    \"\\u00f9\\u00fa\\u0007s\\u0002\\u0002\\u00fa\\u00fb\\u0007p\\u0002\\u0002\\u00fb\",\n    \"\\u00fc\\u0007c\\u0002\\u0002\\u00fc\\u00fd\\u00070\\u0002\\u0002\\u00fd\\u00fe\",\n    \"\\u0007r\\u0002\\u0002\\u00fe\\u00ff\\u0007c\\u0002\\u0002\\u00ff\\u0100\\u0007\",\n    \"k\\u0002\\u0002\\u0100\\u0101\\u0007t\\u0002\\u0002\\u0101\\u0102\\u00070\\u0002\",\n    \"\\u0002\\u0102\\u0103\\u0007u\\u0002\\u0002\\u0103\\u0104\\u0007q\\u0002\\u0002\",\n    \"\\u0104\\u0105\\u0007w\\u0002\\u0002\\u0105\\u0106\\u0007t\\u0002\\u0002\\u0106\",\n    \"\\u0107\\u0007e\\u0002\\u0002\\u0107\\u0108\\u0007g\\u0002\\u0002\\u0108\\u010c\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0109\\u010b\\u0005D \\u0002\\u010a\\u0109\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u010b\\u010e\\u0003\\u0002\\u0002\\u0002\\u010c\\u010a\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u010c\\u010d\\u0003\\u0002\\u0002\\u0002\\u010d\\u010f\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u010e\\u010c\\u0003\\u0002\\u0002\\u0002\\u010f\\u0111\\u0007\",\n    \"?\\u0002\\u0002\\u0110\\u0112\\n\\u001f\\u0002\\u0002\\u0111\\u0110\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0112\\u0113\\u0003\\u0002\\u0002\\u0002\\u0113\\u0111\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0113\\u0114\\u0003\\u0002\\u0002\\u0002\\u0114I\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0115\\u0117\\u0005D \\u0002\\u0116\\u0115\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0117\\u011a\\u0003\\u0002\\u0002\\u0002\\u0118\\u0116\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0118\\u0119\\u0003\\u0002\\u0002\\u0002\\u0119\\u011b\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u011a\\u0118\\u0003\\u0002\\u0002\\u0002\\u011b\\u011f\\u0007@\\u0002\",\n    \"\\u0002\\u011c\\u011e\\u0005D \\u0002\\u011d\\u011c\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u011e\\u0121\\u0003\\u0002\\u0002\\u0002\\u011f\\u011d\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u011f\\u0120\\u0003\\u0002\\u0002\\u0002\\u0120\\u0122\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0121\\u011f\\u0003\\u0002\\u0002\\u0002\\u0122\\u0123\\u0007#\\u0002\\u0002\",\n    \"\\u0123\\u0124\\u0007%\\u0002\\u0002\\u0124\\u0126\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0125\\u0127\\n\\u001f\\u0002\\u0002\\u0126\\u0125\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0127\\u0128\\u0003\\u0002\\u0002\\u0002\\u0128\\u0126\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0128\\u0129\\u0003\\u0002\\u0002\\u0002\\u0129K\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u012a\\u012c\\u0005D \\u0002\\u012b\\u012a\\u0003\\u0002\\u0002\\u0002\\u012c\",\n    \"\\u012f\\u0003\\u0002\\u0002\\u0002\\u012d\\u012b\\u0003\\u0002\\u0002\\u0002\\u012d\",\n    \"\\u012e\\u0003\\u0002\\u0002\\u0002\\u012e\\u0130\\u0003\\u0002\\u0002\\u0002\\u012f\",\n    \"\\u012d\\u0003\\u0002\\u0002\\u0002\\u0130\\u0134\\u0007@\\u0002\\u0002\\u0131\",\n    \"\\u0133\\n\\u001f\\u0002\\u0002\\u0132\\u0131\\u0003\\u0002\\u0002\\u0002\\u0133\",\n    \"\\u0136\\u0003\\u0002\\u0002\\u0002\\u0134\\u0132\\u0003\\u0002\\u0002\\u0002\\u0134\",\n    \"\\u0135\\u0003\\u0002\\u0002\\u0002\\u0135\\u0137\\u0003\\u0002\\u0002\\u0002\\u0136\",\n    \"\\u0134\\u0003\\u0002\\u0002\\u0002\\u0137\\u0138\\b$\\u0002\\u0002\\u0138M\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0139\\u013b\\u0007%\\u0002\\u0002\\u013a\\u0139\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u013b\\u013c\\u0003\\u0002\\u0002\\u0002\\u013c\\u013a\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u013c\\u013d\\u0003\\u0002\\u0002\\u0002\\u013d\\u0141\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u013e\\u0140\\u0005D \\u0002\\u013f\\u013e\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0140\\u0143\\u0003\\u0002\\u0002\\u0002\\u0141\\u013f\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0141\\u0142\\u0003\\u0002\\u0002\\u0002\\u0142\\u0144\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0143\\u0141\\u0003\\u0002\\u0002\\u0002\\u0144\\u0145\\u0007A\",\n    \"\\u0002\\u0002\\u0145\\u0146\\u0003\\u0002\\u0002\\u0002\\u0146\\u0147\\b%\\u0003\",\n    \"\\u0002\\u0147O\\u0003\\u0002\\u0002\\u0002\\u0148\\u0149\\u0007%\\u0002\\u0002\",\n    \"\\u0149\\u014a\\u0003\\u0002\\u0002\\u0002\\u014a\\u014b\\b&\\u0004\\u0002\\u014b\",\n    \"Q\\u0003\\u0002\\u0002\\u0002\\u014c\\u014d\\u0005B\\u001f\\u0002\\u014d\\u014e\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u014e\\u014f\\b\\'\\u0005\\u0002\\u014fS\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0150\\u0151\\u0007&\\u0002\\u0002\\u0151\\u0152\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0152\\u0153\\b(\\u0006\\u0002\\u0153U\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0154\\u0155\\u0007B\\u0002\\u0002\\u0155\\u0156\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0156\\u0157\\b)\\u0007\\u0002\\u0157W\\u0003\\u0002\\u0002\\u0002\\u0158\\u015c\",\n    \"\\u0007]\\u0002\\u0002\\u0159\\u015b\\n \\u0002\\u0002\\u015a\\u0159\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u015b\\u015e\\u0003\\u0002\\u0002\\u0002\\u015c\\u015d\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u015c\\u015a\\u0003\\u0002\\u0002\\u0002\\u015d\\u015f\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u015e\\u015c\\u0003\\u0002\\u0002\\u0002\\u015f\\u0160\\u0007_\",\n    \"\\u0002\\u0002\\u0160\\u0164\\u0007*\\u0002\\u0002\\u0161\\u0163\\n!\\u0002\\u0002\",\n    \"\\u0162\\u0161\\u0003\\u0002\\u0002\\u0002\\u0163\\u0166\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0164\\u0165\\u0003\\u0002\\u0002\\u0002\\u0164\\u0162\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0165\\u0167\\u0003\\u0002\\u0002\\u0002\\u0166\\u0164\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0167\\u0168\\u0007+\\u0002\\u0002\\u0168Y\\u0003\\u0002\\u0002\\u0002\\u0169\",\n    \"\\u016a\\u0007,\\u0002\\u0002\\u016a\\u016b\\u0007,\\u0002\\u0002\\u016b\\u016c\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u016c\\u016d\\u0005\\u0012\\u0007\\u0002\\u016d\\u016e\",\n    \"\\u0005\\u0018\\n\\u0002\\u016e\\u016f\\u0005\\u001e\\r\\u0002\\u016f\\u0170\\u0005\",\n    \".\\u0015\\u0002\\u0170\\u0171\\u0005\\u0010\\u0006\\u0002\\u0171\\u0172\\u0005\",\n    \"*\\u0013\\u0002\\u0172\\u0173\\u0005,\\u0014\\u0002\\u0173\\u0174\\u0007<\\u0002\",\n    \"\\u0002\\u0174\\u0175\\u0007,\\u0002\\u0002\\u0175\\u0176\\u0007,\\u0002\\u0002\",\n    \"\\u0176[\\u0003\\u0002\\u0002\\u0002\\u0177\\u0178\\u0007>\\u0002\\u0002\\u0178\",\n    \"\\u0179\\u0007c\\u0002\\u0002\\u0179\\u017d\\u0003\\u0002\\u0002\\u0002\\u017a\",\n    \"\\u017c\\u000b\\u0002\\u0002\\u0002\\u017b\\u017a\\u0003\\u0002\\u0002\\u0002\\u017c\",\n    \"\\u017f\\u0003\\u0002\\u0002\\u0002\\u017d\\u017e\\u0003\\u0002\\u0002\\u0002\\u017d\",\n    \"\\u017b\\u0003\\u0002\\u0002\\u0002\\u017e\\u0180\\u0003\\u0002\\u0002\\u0002\\u017f\",\n    \"\\u017d\\u0003\\u0002\\u0002\\u0002\\u0180\\u0181\\u0007>\\u0002\\u0002\\u0181\",\n    \"\\u0182\\u00071\\u0002\\u0002\\u0182\\u0183\\u0007c\\u0002\\u0002\\u0183\\u0184\",\n    \"\\u0007@\\u0002\\u0002\\u0184]\\u0003\\u0002\\u0002\\u0002\\u0185\\u0186\\u0007\",\n    \"b\\u0002\\u0002\\u0186\\u0187\\u0007b\\u0002\\u0002\\u0187\\u0188\\u0007b\\u0002\",\n    \"\\u0002\\u0188\\u018c\\u0003\\u0002\\u0002\\u0002\\u0189\\u018b\\u000b\\u0002\\u0002\",\n    \"\\u0002\\u018a\\u0189\\u0003\\u0002\\u0002\\u0002\\u018b\\u018e\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u018c\\u018d\\u0003\\u0002\\u0002\\u0002\\u018c\\u018a\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u018d\\u018f\\u0003\\u0002\\u0002\\u0002\\u018e\\u018c\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u018f\\u0190\\u0007b\\u0002\\u0002\\u0190\\u0191\\u0007b\\u0002\\u0002\",\n    \"\\u0191\\u0192\\u0007b\\u0002\\u0002\\u0192_\\u0003\\u0002\\u0002\\u0002\\u0193\",\n    \"\\u0194\\u0007,\\u0002\\u0002\\u0194\\u0195\\u0007,\\u0002\\u0002\\u0195\\u0196\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0196\\u0197\\u0005&\\u0011\\u0002\\u0197\\u0198\",\n    \"\\u0005*\\u0013\\u0002\\u0198\\u0199\\u0005$\\u0010\\u0002\\u0199\\u019a\\u0005\",\n    \" \\u000e\\u0002\\u019a\\u019b\\u0005&\\u0011\\u0002\\u019b\\u019c\\u0005.\\u0015\",\n    \"\\u0002\\u019c\\u019d\\u0005,\\u0014\\u0002\\u019d\\u019e\\u0007<\\u0002\\u0002\",\n    \"\\u019e\\u019f\\u0007,\\u0002\\u0002\\u019f\\u01a0\\u0007,\\u0002\\u0002\\u01a0\",\n    \"a\\u0003\\u0002\\u0002\\u0002\\u01a1\\u01a2\\u000b\\u0002\\u0002\\u0002\\u01a2\",\n    \"c\\u0003\\u0002\\u0002\\u0002\\u01a3\\u01a4\\u0005D \\u0002\\u01a4\\u01a5\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01a5\\u01a6\\b0\\b\\u0002\\u01a6e\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01a7\\u01a9\\u0007\\u000f\\u0002\\u0002\\u01a8\\u01a7\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01a8\\u01a9\\u0003\\u0002\\u0002\\u0002\\u01a9\\u01aa\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01aa\\u01ab\\u0007\\f\\u0002\\u0002\\u01ab\\u01ac\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01ac\\u01ad\\b1\\t\\u0002\\u01ad\\u01ae\\b1\\n\\u0002\\u01aeg\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u01af\\u01b0\\u0007?\\u0002\\u0002\\u01b0i\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01b1\\u01b2\\u0007.\\u0002\\u0002\\u01b2k\\u0003\\u0002\\u0002\\u0002\\u01b3\",\n    \"\\u01b4\\u0005\\u0016\\t\\u0002\\u01b4\\u01b5\\u0005\\b\\u0002\\u0002\\u01b5\\u01b6\",\n    \"\\u0005,\\u0014\\u0002\\u01b6\\u01b7\\u0005*\\u0013\\u0002\\u01b7\\u01b8\\u0005\",\n    \"$\\u0010\\u0002\\u01b8\\u01b9\\u0005\\u001e\\r\\u0002\\u01b9\\u01bb\\u0005\\u0010\",\n    \"\\u0006\\u0002\\u01ba\\u01bc\\u0005,\\u0014\\u0002\\u01bb\\u01ba\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01bb\\u01bc\\u0003\\u0002\\u0002\\u0002\\u01bcm\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01bd\\u01be\\u00050\\u0016\\u0002\\u01be\\u01bf\\u0005,\\u0014\",\n    \"\\u0002\\u01bf\\u01c0\\u0005\\u0010\\u0006\\u0002\\u01c0\\u01c1\\u0005,\\u0014\",\n    \"\\u0002\\u01c1\\u01c2\\u0005\\u0012\\u0007\\u0002\\u01c2\\u01c3\\u0005\\u0010\\u0006\",\n    \"\\u0002\\u01c3\\u01c4\\u0005\\b\\u0002\\u0002\\u01c4\\u01c5\\u0005.\\u0015\\u0002\",\n    \"\\u01c5\\u01c6\\u00050\\u0016\\u0002\\u01c6\\u01c7\\u0005*\\u0013\\u0002\\u01c7\",\n    \"\\u01c9\\u0005\\u0010\\u0006\\u0002\\u01c8\\u01ca\\u0005,\\u0014\\u0002\\u01c9\",\n    \"\\u01c8\\u0003\\u0002\\u0002\\u0002\\u01c9\\u01ca\\u0003\\u0002\\u0002\\u0002\\u01ca\",\n    \"o\\u0003\\u0002\\u0002\\u0002\\u01cb\\u01cc\\u0005,\\u0014\\u0002\\u01cc\\u01cd\",\n    \"\\u0005\\u0018\\n\\u0002\\u01cd\\u01ce\\u0005 \\u000e\\u0002\\u01ce\\u01cf\\u0005\",\n    \"&\\u0011\\u0002\\u01cf\\u01d0\\u0005\\u001e\\r\\u0002\\u01d0\\u01d1\\u0005\\u0010\",\n    \"\\u0006\\u0002\\u01d1\\u0211\\u0003\\u0002\\u0002\\u0002\\u01d2\\u01d3\\u0005\\u001e\",\n    \"\\r\\u0002\\u01d3\\u01d4\\u0005\\u0018\\n\\u0002\\u01d4\\u01d5\\u0005,\\u0014\\u0002\",\n    \"\\u01d5\\u01d6\\u0005.\\u0015\\u0002\\u01d6\\u0211\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01d7\\u01d8\\u0005*\\u0013\\u0002\\u01d8\\u01d9\\u0005\\u0010\\u0006\\u0002\",\n    \"\\u01d9\\u01da\\u0005\\u0014\\b\\u0002\\u01da\\u01db\\u0005\\u0010\\u0006\\u0002\",\n    \"\\u01db\\u01dc\\u00056\\u0019\\u0002\\u01dc\\u0211\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01dd\\u01de\\u0005&\\u0011\\u0002\\u01de\\u01df\\u0005*\\u0013\\u0002\\u01df\",\n    \"\\u01e0\\u0005\\u0010\\u0006\\u0002\\u01e0\\u01e1\\u0005\\n\\u0003\\u0002\\u01e1\",\n    \"\\u01e2\\u00050\\u0016\\u0002\\u01e2\\u01e3\\u0005\\u0018\\n\\u0002\\u01e3\\u01e4\",\n    \"\\u0005\\u001e\\r\\u0002\\u01e4\\u01e5\\u0005.\\u0015\\u0002\\u01e5\\u0211\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01e6\\u01e7\\u0005\\f\\u0004\\u0002\\u01e7\\u01e8\\u0005\",\n    \"$\\u0010\\u0002\\u01e8\\u01e9\\u0005 \\u000e\\u0002\\u01e9\\u01ea\\u0005&\\u0011\",\n    \"\\u0002\\u01ea\\u01eb\\u0005$\\u0010\\u0002\\u01eb\\u01ec\\u0005,\\u0014\\u0002\",\n    \"\\u01ec\\u01ed\\u0005\\u0018\\n\\u0002\\u01ed\\u01ee\\u0005.\\u0015\\u0002\\u01ee\",\n    \"\\u01ef\\u0005\\u0010\\u0006\\u0002\\u01ef\\u0211\\u0003\\u0002\\u0002\\u0002\\u01f0\",\n    \"\\u01f1\\u0005 \\u000e\\u0002\\u01f1\\u01f2\\u0005\\u001e\\r\\u0002\\u01f2\\u0211\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u01f3\\u01f4\\u0005&\\u0011\\u0002\\u01f4\\u01f5\",\n    \"\\u0005\\b\\u0002\\u0002\\u01f5\\u01f6\\u0005.\\u0015\\u0002\\u01f6\\u01f7\\u0005\",\n    \".\\u0015\\u0002\\u01f7\\u01f8\\u0005\\u0010\\u0006\\u0002\\u01f8\\u01f9\\u0005\",\n    \"*\\u0013\\u0002\\u01f9\\u01fa\\u0005\\\"\\u000f\\u0002\\u01fa\\u01fb\\u0005\\b\\u0002\",\n    \"\\u0002\\u01fb\\u01fc\\u0005\\\"\\u000f\\u0002\\u01fc\\u01fd\\u00058\\u001a\\u0002\",\n    \"\\u01fd\\u0211\\u0003\\u0002\\u0002\\u0002\\u01fe\\u01ff\\u0005&\\u0011\\u0002\",\n    \"\\u01ff\\u0200\\u0005\\u0016\\t\\u0002\\u0200\\u0201\\u0005*\\u0013\\u0002\\u0201\",\n    \"\\u0202\\u0005\\b\\u0002\\u0002\\u0202\\u0203\\u0005,\\u0014\\u0002\\u0203\\u0204\",\n    \"\\u0005\\u0010\\u0006\\u0002\\u0204\\u0205\\u0005\\u001e\\r\\u0002\\u0205\\u0206\",\n    \"\\u0005\\u0018\\n\\u0002\\u0206\\u0207\\u0005,\\u0014\\u0002\\u0207\\u0208\\u0005\",\n    \".\\u0015\\u0002\\u0208\\u0211\\u0003\\u0002\\u0002\\u0002\\u0209\\u020a\\u0005\",\n    \"\\u0018\\n\\u0002\\u020a\\u020b\\u0005\\\"\\u000f\\u0002\\u020b\\u020c\\u0005.\\u0015\",\n    \"\\u0002\\u020c\\u020d\\u0005\\u0010\\u0006\\u0002\\u020d\\u020e\\u0005\\\"\\u000f\",\n    \"\\u0002\\u020e\\u020f\\u0005.\\u0015\\u0002\\u020f\\u0211\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0210\\u01cb\\u0003\\u0002\\u0002\\u0002\\u0210\\u01d2\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0210\\u01d7\\u0003\\u0002\\u0002\\u0002\\u0210\\u01dd\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0210\\u01e6\\u0003\\u0002\\u0002\\u0002\\u0210\\u01f0\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0210\\u01f3\\u0003\\u0002\\u0002\\u0002\\u0210\\u01fe\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0210\\u0209\\u0003\\u0002\\u0002\\u0002\\u0211q\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0212\\u0216\\u0007*\\u0002\\u0002\\u0213\\u0215\\n\\u001f\\u0002\\u0002\",\n    \"\\u0214\\u0213\\u0003\\u0002\\u0002\\u0002\\u0215\\u0218\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0216\\u0214\\u0003\\u0002\\u0002\\u0002\\u0216\\u0217\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0217\\u0219\\u0003\\u0002\\u0002\\u0002\\u0218\\u0216\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0219\\u021a\\u0007+\\u0002\\u0002\\u021as\\u0003\\u0002\\u0002\\u0002\\u021b\",\n    \"\\u021f\\u0007]\\u0002\\u0002\\u021c\\u021e\\n\\\"\\u0002\\u0002\\u021d\\u021c\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u021e\\u0221\\u0003\\u0002\\u0002\\u0002\\u021f\\u021d\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u021f\\u0220\\u0003\\u0002\\u0002\\u0002\\u0220\\u0222\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0221\\u021f\\u0003\\u0002\\u0002\\u0002\\u0222\\u0223\\u0007\",\n    \"_\\u0002\\u0002\\u0223u\\u0003\\u0002\\u0002\\u0002\\u0224\\u0228\\u00071\\u0002\",\n    \"\\u0002\\u0225\\u0227\\n\\u001f\\u0002\\u0002\\u0226\\u0225\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0227\\u022a\\u0003\\u0002\\u0002\\u0002\\u0228\\u0226\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0228\\u0229\\u0003\\u0002\\u0002\\u0002\\u0229w\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u022a\\u0228\\u0003\\u0002\\u0002\\u0002\\u022b\\u022d\\n#\\u0002\\u0002\",\n    \"\\u022c\\u022b\\u0003\\u0002\\u0002\\u0002\\u022d\\u022e\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u022e\\u022c\\u0003\\u0002\\u0002\\u0002\\u022e\\u022f\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u022fy\\u0003\\u0002\\u0002\\u0002\\u0230\\u0232\\t$\\u0002\\u0002\\u0231\\u0233\",\n    \"\\n%\\u0002\\u0002\\u0232\\u0231\\u0003\\u0002\\u0002\\u0002\\u0233\\u0234\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0234\\u0232\\u0003\\u0002\\u0002\\u0002\\u0234\\u0235\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0235\\u0236\\u0003\\u0002\\u0002\\u0002\\u0236\\u0237\\t\",\n    \"$\\u0002\\u0002\\u0237{\\u0003\\u0002\\u0002\\u0002\\u0238\\u0239\\u0005D \\u0002\",\n    \"\\u0239\\u023a\\u0003\\u0002\\u0002\\u0002\\u023a\\u023b\\b<\\b\\u0002\\u023b}\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u023c\\u023d\\u0007%\\u0002\\u0002\\u023d\\u023e\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u023e\\u023f\\b=\\u000b\\u0002\\u023f\\u007f\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0240\\u0242\\u0007\\u000f\\u0002\\u0002\\u0241\\u0240\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0241\\u0242\\u0003\\u0002\\u0002\\u0002\\u0242\\u0243\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0243\\u0244\\u0007\\f\\u0002\\u0002\\u0244\\u0245\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0245\\u0246\\b>\\u0002\\u0002\\u0246\\u0247\\b>\\n\\u0002\\u0247\",\n    \"\\u0081\\u0003\\u0002\\u0002\\u0002\\u0248\\u024c\\u0005<\\u001c\\u0002\\u0249\",\n    \"\\u024c\\u0005>\\u001d\\u0002\\u024a\\u024c\\u0007a\\u0002\\u0002\\u024b\\u0248\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u024b\\u0249\\u0003\\u0002\\u0002\\u0002\\u024b\\u024a\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u024c\\u0252\\u0003\\u0002\\u0002\\u0002\\u024d\\u0251\",\n    \"\\u0005<\\u001c\\u0002\\u024e\\u0251\\u0005>\\u001d\\u0002\\u024f\\u0251\\t&\\u0002\",\n    \"\\u0002\\u0250\\u024d\\u0003\\u0002\\u0002\\u0002\\u0250\\u024e\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0250\\u024f\\u0003\\u0002\\u0002\\u0002\\u0251\\u0254\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0252\\u0250\\u0003\\u0002\\u0002\\u0002\\u0252\\u0253\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0253\\u0083\\u0003\\u0002\\u0002\\u0002\\u0254\\u0252\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0255\\u0256\\u00070\\u0002\\u0002\\u0256\\u0085\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0257\\u0258\\u0005D \\u0002\\u0258\\u0259\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0259\\u025a\\bA\\b\\u0002\\u025a\\u0087\\u0003\\u0002\\u0002\\u0002\\u025b\\u025d\",\n    \"\\u0007\\u000f\\u0002\\u0002\\u025c\\u025b\\u0003\\u0002\\u0002\\u0002\\u025c\\u025d\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u025d\\u025e\\u0003\\u0002\\u0002\\u0002\\u025e\\u025f\",\n    \"\\u0007\\f\\u0002\\u0002\\u025f\\u0260\\u0003\\u0002\\u0002\\u0002\\u0260\\u0261\",\n    \"\\bB\\t\\u0002\\u0261\\u0262\\bB\\n\\u0002\\u0262\\u0089\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0263\\u0265\\u0007^\\u0002\\u0002\\u0264\\u0266\\n\\u001f\\u0002\\u0002\\u0265\",\n    \"\\u0264\\u0003\\u0002\\u0002\\u0002\\u0265\\u0266\\u0003\\u0002\\u0002\\u0002\\u0266\",\n    \"\\u008b\\u0003\\u0002\\u0002\\u0002\\u0267\\u0273\\u0007}\\u0002\\u0002\\u0268\",\n    \"\\u0272\\n\\'\\u0002\\u0002\\u0269\\u026d\\u0007}\\u0002\\u0002\\u026a\\u026c\\n\",\n    \"\\u001f\\u0002\\u0002\\u026b\\u026a\\u0003\\u0002\\u0002\\u0002\\u026c\\u026f\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u026d\\u026b\\u0003\\u0002\\u0002\\u0002\\u026d\\u026e\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u026e\\u0270\\u0003\\u0002\\u0002\\u0002\\u026f\\u026d\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0270\\u0272\\u0007\\u007f\\u0002\\u0002\\u0271\\u0268\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0271\\u0269\\u0003\\u0002\\u0002\\u0002\\u0272\\u0275\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0273\\u0271\\u0003\\u0002\\u0002\\u0002\\u0273\\u0274\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0274\\u0276\\u0003\\u0002\\u0002\\u0002\\u0275\\u0273\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0276\\u0277\\u0007\\u007f\\u0002\\u0002\\u0277\\u008d\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0278\\u027a\\n(\\u0002\\u0002\\u0279\\u0278\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u027a\\u027b\\u0003\\u0002\\u0002\\u0002\\u027b\\u027c\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u027b\\u0279\\u0003\\u0002\\u0002\\u0002\\u027c\\u008f\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u027d\\u027e\\u0005D \\u0002\\u027e\\u027f\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u027f\\u0280\\bF\\b\\u0002\\u0280\\u0091\\u0003\\u0002\\u0002\\u0002\\u0281\",\n    \"\\u0283\\u0007\\u000f\\u0002\\u0002\\u0282\\u0281\\u0003\\u0002\\u0002\\u0002\\u0282\",\n    \"\\u0283\\u0003\\u0002\\u0002\\u0002\\u0283\\u0284\\u0003\\u0002\\u0002\\u0002\\u0284\",\n    \"\\u0285\\u0007\\f\\u0002\\u0002\\u0285\\u0286\\u0003\\u0002\\u0002\\u0002\\u0286\",\n    \"\\u0287\\bG\\u0002\\u0002\\u0287\\u0288\\bG\\n\\u0002\\u0288\\u0093\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0289\\u028d\\u0007]\\u0002\\u0002\\u028a\\u028c\\n\\\"\\u0002\\u0002\",\n    \"\\u028b\\u028a\\u0003\\u0002\\u0002\\u0002\\u028c\\u028f\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u028d\\u028b\\u0003\\u0002\\u0002\\u0002\\u028d\\u028e\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u028e\\u0290\\u0003\\u0002\\u0002\\u0002\\u028f\\u028d\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0290\\u0291\\u0007_\\u0002\\u0002\\u0291\\u0095\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0292\\u0296\\u00071\\u0002\\u0002\\u0293\\u0295\\n\\u001f\\u0002\\u0002\\u0294\",\n    \"\\u0293\\u0003\\u0002\\u0002\\u0002\\u0295\\u0298\\u0003\\u0002\\u0002\\u0002\\u0296\",\n    \"\\u0294\\u0003\\u0002\\u0002\\u0002\\u0296\\u0297\\u0003\\u0002\\u0002\\u0002\\u0297\",\n    \"\\u0097\\u0003\\u0002\\u0002\\u0002\\u0298\\u0296\\u0003\\u0002\\u0002\\u0002\\u0299\",\n    \"\\u029b\\n)\\u0002\\u0002\\u029a\\u0299\\u0003\\u0002\\u0002\\u0002\\u029b\\u029c\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u029c\\u029a\\u0003\\u0002\\u0002\\u0002\\u029c\\u029d\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u029d\\u0099\\u0003\\u0002\\u0002\\u0002\\u029e\\u029f\",\n    \"\\u0007<\\u0002\\u0002\\u029f\\u009b\\u0003\\u0002\\u0002\\u0002\\u02a0\\u02a2\",\n    \"\\u0007\\u000f\\u0002\\u0002\\u02a1\\u02a0\\u0003\\u0002\\u0002\\u0002\\u02a1\\u02a2\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u02a2\\u02a3\\u0003\\u0002\\u0002\\u0002\\u02a3\\u02a4\",\n    \"\\u0007\\f\\u0002\\u0002\\u02a4\\u02a5\\u0003\\u0002\\u0002\\u0002\\u02a5\\u02a6\",\n    \"\\bL\\u0002\\u0002\\u02a6\\u02a7\\bL\\n\\u0002\\u02a7\\u009d\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u02a8\\u02aa\\n*\\u0002\\u0002\\u02a9\\u02a8\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u02aa\\u02ab\\u0003\\u0002\\u0002\\u0002\\u02ab\\u02a9\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u02ab\\u02ac\\u0003\\u0002\\u0002\\u0002\\u02ac\\u009f\\u0003\\u0002\\u0002\\u0002\",\n    \"2\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u00df\\u00e2\\u00eb\\u00f2\\u010c\",\n    \"\\u0113\\u0118\\u011f\\u0128\\u012d\\u0134\\u013c\\u0141\\u015c\\u0164\\u017d\\u018c\",\n    \"\\u01a8\\u01bb\\u01c9\\u0210\\u0216\\u021f\\u0228\\u022e\\u0234\\u0241\\u024b\\u0250\",\n    \"\\u0252\\u025c\\u0265\\u026d\\u0271\\u0273\\u027b\\u0282\\u028d\\u0296\\u029c\\u02a1\",\n    \"\\u02ab\\f\\b\\u0002\\u0002\\u0007\\u0007\\u0002\\u0007\\u0004\\u0002\\u0007\\u0005\",\n    \"\\u0002\\u0007\\u0006\\u0002\\u0007\\u0003\\u0002\\t\\u0003\\u0002\\t\\u0004\\u0002\",\n    \"\\u0006\\u0002\\u0002\\t\\t\\u0002\"].join(\"\");\n\n\nvar atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);\n\nvar decisionsToDFA = atn.decisionToState.map( function(ds, index) { return new antlr4.dfa.DFA(ds, index); });\n\nfunction LUFileLexer(input) {\n\tantlr4.Lexer.call(this, input);\n    this._interp = new antlr4.atn.LexerATNSimulator(this, atn, decisionsToDFA, new antlr4.PredictionContextCache());\n    return this;\n}\n\nLUFileLexer.prototype = Object.create(antlr4.Lexer.prototype);\nLUFileLexer.prototype.constructor = LUFileLexer;\n\nObject.defineProperty(LUFileLexer.prototype, \"atn\", {\n        get : function() {\n                return atn;\n        }\n});\n\nLUFileLexer.EOF = antlr4.Token.EOF;\nLUFileLexer.WS = 1;\nLUFileLexer.NEWLINE = 2;\nLUFileLexer.QNA_SOURCE_INFO = 3;\nLUFileLexer.MODEL_INFO = 4;\nLUFileLexer.COMMENT = 5;\nLUFileLexer.QNA = 6;\nLUFileLexer.HASH = 7;\nLUFileLexer.DASH = 8;\nLUFileLexer.DOLLAR = 9;\nLUFileLexer.AT = 10;\nLUFileLexer.IMPORT = 11;\nLUFileLexer.FILTER_MARK = 12;\nLUFileLexer.QNA_ID_MARK = 13;\nLUFileLexer.MULTI_LINE_TEXT = 14;\nLUFileLexer.PROMPT_MARK = 15;\nLUFileLexer.INVALID_TOKEN_DEFAULT_MODE = 16;\nLUFileLexer.EQUAL = 17;\nLUFileLexer.COMMA = 18;\nLUFileLexer.HAS_ROLES_LABEL = 19;\nLUFileLexer.HAS_FEATURES_LABEL = 20;\nLUFileLexer.NEW_ENTITY_TYPE_IDENTIFIER = 21;\nLUFileLexer.PHRASE_LIST_LABEL = 22;\nLUFileLexer.NEW_COMPOSITE_ENTITY = 23;\nLUFileLexer.NEW_REGEX_ENTITY = 24;\nLUFileLexer.NEW_ENTITY_IDENTIFIER = 25;\nLUFileLexer.NEW_ENTITY_IDENTIFIER_WITH_WS = 26;\nLUFileLexer.NEWLINE_IN_NAME = 27;\nLUFileLexer.IDENTIFIER = 28;\nLUFileLexer.DOT = 29;\nLUFileLexer.ESCAPE_CHARACTER = 30;\nLUFileLexer.EXPRESSION = 31;\nLUFileLexer.TEXT = 32;\nLUFileLexer.NEWLINE_IN_ENTITY = 33;\nLUFileLexer.COMPOSITE_ENTITY = 34;\nLUFileLexer.REGEX_ENTITY = 35;\nLUFileLexer.ENTITY_TEXT = 36;\nLUFileLexer.COLON_MARK = 37;\nLUFileLexer.NEWLINE_IN_QNA = 38;\nLUFileLexer.QNA_TEXT = 39;\n\nLUFileLexer.NEW_ENTITY_MODE = 1;\nLUFileLexer.INTENT_NAME_MODE = 2;\nLUFileLexer.LIST_BODY_MODE = 3;\nLUFileLexer.ENTITY_MODE = 4;\nLUFileLexer.QNA_MODE = 5;\n\nLUFileLexer.prototype.channelNames = [ \"DEFAULT_TOKEN_CHANNEL\", \"HIDDEN\" ];\n\nLUFileLexer.prototype.modeNames = [ \"DEFAULT_MODE\", \"NEW_ENTITY_MODE\", \"INTENT_NAME_MODE\", \n                                    \"LIST_BODY_MODE\", \"ENTITY_MODE\", \"QNA_MODE\" ];\n\nLUFileLexer.prototype.literalNames = [ null, null, null, null, null, null, \n                                       null, null, null, \"'$'\", \"'@'\", null, \n                                       null, null, null, null, null, \"'='\", \n                                       \"','\", null, null, null, null, null, \n                                       null, null, null, null, null, \"'.'\", \n                                       null, null, null, null, null, null, \n                                       null, \"':'\" ];\n\nLUFileLexer.prototype.symbolicNames = [ null, \"WS\", \"NEWLINE\", \"QNA_SOURCE_INFO\", \n                                        \"MODEL_INFO\", \"COMMENT\", \"QNA\", \n                                        \"HASH\", \"DASH\", \"DOLLAR\", \"AT\", \n                                        \"IMPORT\", \"FILTER_MARK\", \"QNA_ID_MARK\", \n                                        \"MULTI_LINE_TEXT\", \"PROMPT_MARK\", \n                                        \"INVALID_TOKEN_DEFAULT_MODE\", \"EQUAL\", \n                                        \"COMMA\", \"HAS_ROLES_LABEL\", \"HAS_FEATURES_LABEL\", \n                                        \"NEW_ENTITY_TYPE_IDENTIFIER\", \"PHRASE_LIST_LABEL\", \n                                        \"NEW_COMPOSITE_ENTITY\", \"NEW_REGEX_ENTITY\", \n                                        \"NEW_ENTITY_IDENTIFIER\", \"NEW_ENTITY_IDENTIFIER_WITH_WS\", \n                                        \"NEWLINE_IN_NAME\", \"IDENTIFIER\", \n                                        \"DOT\", \"ESCAPE_CHARACTER\", \"EXPRESSION\", \n                                        \"TEXT\", \"NEWLINE_IN_ENTITY\", \"COMPOSITE_ENTITY\", \n                                        \"REGEX_ENTITY\", \"ENTITY_TEXT\", \"COLON_MARK\", \n                                        \"NEWLINE_IN_QNA\", \"QNA_TEXT\" ];\n\nLUFileLexer.prototype.ruleNames = [ \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \n                                    \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \n                                    \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \n                                    \"Y\", \"Z\", \"LETTER\", \"NUMBER\", \"WHITESPACE\", \n                                    \"UTTERANCE_MARK\", \"WS\", \"NEWLINE\", \"QNA_SOURCE_INFO\", \n                                    \"MODEL_INFO\", \"COMMENT\", \"QNA\", \"HASH\", \n                                    \"DASH\", \"DOLLAR\", \"AT\", \"IMPORT\", \"FILTER_MARK\", \n                                    \"QNA_ID_MARK\", \"MULTI_LINE_TEXT\", \"PROMPT_MARK\", \n                                    \"INVALID_TOKEN_DEFAULT_MODE\", \"WS_IN_NEW_ENTITY\", \n                                    \"NEWLINE_IN_NEW_ENTITY\", \"EQUAL\", \"COMMA\", \n                                    \"HAS_ROLES_LABEL\", \"HAS_FEATURES_LABEL\", \n                                    \"NEW_ENTITY_TYPE_IDENTIFIER\", \"PHRASE_LIST_LABEL\", \n                                    \"NEW_COMPOSITE_ENTITY\", \"NEW_REGEX_ENTITY\", \n                                    \"NEW_ENTITY_IDENTIFIER\", \"NEW_ENTITY_IDENTIFIER_WITH_WS\", \n                                    \"WS_IN_NAME\", \"HASH_IN_NAME\", \"NEWLINE_IN_NAME\", \n                                    \"IDENTIFIER\", \"DOT\", \"WS_IN_LIST_BODY\", \n                                    \"NEWLINE_IN_LIST_BODY\", \"ESCAPE_CHARACTER\", \n                                    \"EXPRESSION\", \"TEXT\", \"WS_IN_ENTITY\", \n                                    \"NEWLINE_IN_ENTITY\", \"COMPOSITE_ENTITY\", \n                                    \"REGEX_ENTITY\", \"ENTITY_TEXT\", \"COLON_MARK\", \n                                    \"NEWLINE_IN_QNA\", \"QNA_TEXT\" ];\n\nLUFileLexer.prototype.grammarFileName = \"LUFileLexer.g4\";\n\n\nexports.LUFileLexer = LUFileLexer;\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.tokens",
    "content": "WS=1\nNEWLINE=2\nQNA_SOURCE_INFO=3\nMODEL_INFO=4\nCOMMENT=5\nQNA=6\nHASH=7\nDASH=8\nDOLLAR=9\nAT=10\nIMPORT=11\nFILTER_MARK=12\nQNA_ID_MARK=13\nMULTI_LINE_TEXT=14\nPROMPT_MARK=15\nINVALID_TOKEN_DEFAULT_MODE=16\nEQUAL=17\nCOMMA=18\nHAS_ROLES_LABEL=19\nHAS_FEATURES_LABEL=20\nNEW_ENTITY_TYPE_IDENTIFIER=21\nPHRASE_LIST_LABEL=22\nNEW_COMPOSITE_ENTITY=23\nNEW_REGEX_ENTITY=24\nNEW_ENTITY_IDENTIFIER=25\nNEW_ENTITY_IDENTIFIER_WITH_WS=26\nNEWLINE_IN_NAME=27\nIDENTIFIER=28\nDOT=29\nESCAPE_CHARACTER=30\nEXPRESSION=31\nTEXT=32\nNEWLINE_IN_ENTITY=33\nCOMPOSITE_ENTITY=34\nREGEX_ENTITY=35\nENTITY_TEXT=36\nCOLON_MARK=37\nNEWLINE_IN_QNA=38\nQNA_TEXT=39\n'$'=9\n'@'=10\n'='=17\n','=18\n'.'=29\n':'=37\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.interp",
    "content": "token literal names:\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n'$'\n'@'\nnull\nnull\nnull\nnull\nnull\nnull\n'='\n','\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n'.'\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n':'\nnull\nnull\n\ntoken symbolic names:\nnull\nWS\nNEWLINE\nQNA_SOURCE_INFO\nMODEL_INFO\nCOMMENT\nQNA\nHASH\nDASH\nDOLLAR\nAT\nIMPORT\nFILTER_MARK\nQNA_ID_MARK\nMULTI_LINE_TEXT\nPROMPT_MARK\nINVALID_TOKEN_DEFAULT_MODE\nEQUAL\nCOMMA\nHAS_ROLES_LABEL\nHAS_FEATURES_LABEL\nNEW_ENTITY_TYPE_IDENTIFIER\nPHRASE_LIST_LABEL\nNEW_COMPOSITE_ENTITY\nNEW_REGEX_ENTITY\nNEW_ENTITY_IDENTIFIER\nNEW_ENTITY_IDENTIFIER_WITH_WS\nNEWLINE_IN_NAME\nIDENTIFIER\nDOT\nESCAPE_CHARACTER\nEXPRESSION\nTEXT\nNEWLINE_IN_ENTITY\nCOMPOSITE_ENTITY\nREGEX_ENTITY\nENTITY_TEXT\nCOLON_MARK\nNEWLINE_IN_QNA\nQNA_TEXT\n\nrule names:\nfile\nparagraph\nnewline\nerrorString\nnestedIntentSection\nnestedIntentNameLine\nnestedIntentName\nnameIdentifier\nnestedIntentBodyDefinition\nsubIntentDefinition\nsimpleIntentSection\nintentDefinition\nintentNameLine\nintentName\nintentBody\nnormalIntentBody\nnormalIntentString\nnewEntitySection\nnewEntityDefinition\nnewEntityListbody\nnewEntityLine\nnewCompositeDefinition\nnewRegexDefinition\nnewEntityType\nnewEntityRoles\nnewEntityUsesFeatures\nnewEntityRoleOrFeatures\nnewEntityName\nnewEntityNameWithWS\nentitySection\nentityDefinition\nentityLine\nentityName\nentityType\ncompositeEntityIdentifier\nregexEntityIdentifier\nentityListBody\nnormalItemString\nimportSection\nimportDefinition\nqnaSection\nqnaDefinition\nqnaSourceInfo\nqnaIdMark\nqnaQuestion\nquestionText\nmoreQuestionsBody\nmoreQuestion\nerrorQuestionString\nqnaAnswerBody\nfilterSection\npromptSection\nfilterLine\nerrorFilterLine\nmultiLineAnswer\nmodelInfoSection\nmodelInfoDefinition\n\n\natn:\n[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 41, 629, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 3, 2, 6, 2, 118, 10, 2, 13, 2, 14, 2, 119, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 132, 10, 3, 3, 4, 7, 4, 135, 10, 4, 12, 4, 14, 4, 138, 11, 4, 3, 4, 3, 4, 3, 5, 6, 5, 143, 10, 5, 13, 5, 14, 5, 144, 3, 6, 3, 6, 3, 6, 3, 7, 7, 7, 151, 10, 7, 12, 7, 14, 7, 154, 11, 7, 3, 7, 3, 7, 7, 7, 158, 10, 7, 12, 7, 14, 7, 161, 11, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 7, 8, 168, 10, 8, 12, 8, 14, 8, 171, 11, 8, 3, 9, 3, 9, 3, 9, 7, 9, 176, 10, 9, 12, 9, 14, 9, 179, 11, 9, 3, 10, 6, 10, 182, 10, 10, 13, 10, 14, 10, 183, 3, 11, 7, 11, 187, 10, 11, 12, 11, 14, 11, 190, 11, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 5, 13, 199, 10, 13, 3, 14, 7, 14, 202, 10, 14, 12, 14, 14, 14, 205, 11, 14, 3, 14, 3, 14, 5, 14, 209, 10, 14, 3, 14, 7, 14, 212, 10, 14, 12, 14, 14, 14, 215, 11, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 7, 15, 222, 10, 15, 12, 15, 14, 15, 225, 11, 15, 3, 16, 7, 16, 228, 10, 16, 12, 16, 14, 16, 231, 11, 16, 3, 16, 3, 16, 3, 17, 7, 17, 236, 10, 17, 12, 17, 14, 17, 239, 11, 17, 3, 17, 3, 17, 3, 17, 3, 17, 6, 17, 245, 10, 17, 13, 17, 14, 17, 246, 3, 18, 7, 18, 250, 10, 18, 12, 18, 14, 18, 253, 11, 18, 3, 18, 3, 18, 7, 18, 257, 10, 18, 12, 18, 14, 18, 260, 11, 18, 3, 19, 3, 19, 3, 20, 3, 20, 5, 20, 266, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 6, 21, 272, 10, 21, 13, 21, 14, 21, 273, 3, 22, 7, 22, 277, 10, 22, 12, 22, 14, 22, 280, 11, 22, 3, 22, 3, 22, 7, 22, 284, 10, 22, 12, 22, 14, 22, 287, 11, 22, 3, 22, 5, 22, 290, 10, 22, 3, 22, 7, 22, 293, 10, 22, 12, 22, 14, 22, 296, 11, 22, 3, 22, 3, 22, 5, 22, 300, 10, 22, 3, 22, 7, 22, 303, 10, 22, 12, 22, 14, 22, 306, 11, 22, 3, 22, 5, 22, 309, 10, 22, 3, 22, 7, 22, 312, 10, 22, 12, 22, 14, 22, 315, 11, 22, 3, 22, 5, 22, 318, 10, 22, 3, 22, 7, 22, 321, 10, 22, 12, 22, 14, 22, 324, 11, 22, 3, 22, 5, 22, 327, 10, 22, 3, 22, 7, 22, 330, 10, 22, 12, 22, 14, 22, 333, 11, 22, 3, 22, 3, 22, 5, 22, 337, 10, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 5, 26, 348, 10, 26, 3, 26, 7, 26, 351, 10, 26, 12, 26, 14, 26, 354, 11, 26, 3, 26, 3, 26, 3, 27, 3, 27, 7, 27, 360, 10, 27, 12, 27, 14, 27, 363, 11, 27, 3, 27, 3, 27, 3, 28, 3, 28, 7, 28, 369, 10, 28, 12, 28, 14, 28, 372, 11, 28, 3, 28, 3, 28, 7, 28, 376, 10, 28, 12, 28, 14, 28, 379, 11, 28, 3, 28, 7, 28, 382, 10, 28, 12, 28, 14, 28, 385, 11, 28, 3, 29, 3, 29, 7, 29, 389, 10, 29, 12, 29, 14, 29, 392, 11, 29, 3, 29, 5, 29, 395, 10, 29, 3, 30, 3, 30, 7, 30, 399, 10, 30, 12, 30, 14, 30, 402, 11, 30, 3, 30, 5, 30, 405, 10, 30, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 411, 10, 32, 3, 33, 7, 33, 414, 10, 33, 12, 33, 14, 33, 417, 11, 33, 3, 33, 3, 33, 5, 33, 421, 10, 33, 3, 33, 5, 33, 424, 10, 33, 3, 33, 5, 33, 427, 10, 33, 3, 34, 6, 34, 430, 10, 34, 13, 34, 14, 34, 431, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 6, 35, 439, 10, 35, 13, 35, 14, 35, 440, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 6, 38, 451, 10, 38, 13, 38, 14, 38, 452, 3, 39, 7, 39, 456, 10, 39, 12, 39, 14, 39, 459, 11, 39, 3, 39, 3, 39, 7, 39, 463, 10, 39, 12, 39, 14, 39, 466, 11, 39, 3, 40, 3, 40, 3, 41, 7, 41, 471, 10, 41, 12, 41, 14, 41, 474, 11, 41, 3, 41, 3, 41, 7, 41, 478, 10, 41, 12, 41, 14, 41, 481, 11, 41, 3, 42, 3, 42, 3, 43, 5, 43, 486, 10, 43, 3, 43, 5, 43, 489, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 495, 10, 43, 3, 44, 7, 44, 498, 10, 44, 12, 44, 14, 44, 501, 11, 44, 3, 44, 3, 44, 3, 45, 7, 45, 506, 10, 45, 12, 45, 14, 45, 509, 11, 45, 3, 45, 3, 45, 3, 46, 7, 46, 514, 10, 46, 12, 46, 14, 46, 517, 11, 46, 3, 46, 3, 46, 3, 46, 3, 47, 7, 47, 523, 10, 47, 12, 47, 14, 47, 526, 11, 47, 3, 48, 7, 48, 529, 10, 48, 12, 48, 14, 48, 532, 11, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 538, 10, 48, 12, 48, 14, 48, 541, 11, 48, 3, 49, 3, 49, 7, 49, 545, 10, 49, 12, 49, 14, 49, 548, 11, 49, 3, 50, 6, 50, 551, 10, 50, 13, 50, 14, 50, 552, 3, 51, 5, 51, 556, 10, 51, 3, 51, 3, 51, 3, 51, 5, 51, 561, 10, 51, 5, 51, 563, 10, 51, 3, 52, 7, 52, 566, 10, 52, 12, 52, 14, 52, 569, 11, 52, 3, 52, 3, 52, 3, 52, 6, 52, 574, 10, 52, 13, 52, 14, 52, 575, 3, 53, 7, 53, 579, 10, 53, 12, 53, 14, 53, 582, 11, 53, 3, 53, 3, 53, 3, 53, 6, 53, 587, 10, 53, 13, 53, 14, 53, 588, 3, 54, 7, 54, 592, 10, 54, 12, 54, 14, 54, 595, 11, 54, 3, 54, 3, 54, 7, 54, 599, 10, 54, 12, 54, 14, 54, 602, 11, 54, 3, 54, 3, 54, 3, 55, 6, 55, 607, 10, 55, 13, 55, 14, 55, 608, 3, 56, 7, 56, 612, 10, 56, 12, 56, 14, 56, 615, 11, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 7, 58, 622, 10, 58, 12, 58, 14, 58, 625, 11, 58, 3, 58, 3, 58, 3, 58, 3, 119, 2, 59, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 2, 8, 3, 3, 4, 4, 4, 2, 3, 3, 18, 18, 4, 2, 3, 3, 32, 34, 3, 2, 27, 28, 4, 2, 3, 3, 38, 38, 4, 2, 3, 3, 34, 34, 2, 671, 2, 117, 3, 2, 2, 2, 4, 131, 3, 2, 2, 2, 6, 136, 3, 2, 2, 2, 8, 142, 3, 2, 2, 2, 10, 146, 3, 2, 2, 2, 12, 152, 3, 2, 2, 2, 14, 164, 3, 2, 2, 2, 16, 172, 3, 2, 2, 2, 18, 181, 3, 2, 2, 2, 20, 188, 3, 2, 2, 2, 22, 194, 3, 2, 2, 2, 24, 196, 3, 2, 2, 2, 26, 203, 3, 2, 2, 2, 28, 218, 3, 2, 2, 2, 30, 229, 3, 2, 2, 2, 32, 237, 3, 2, 2, 2, 34, 251, 3, 2, 2, 2, 36, 261, 3, 2, 2, 2, 38, 263, 3, 2, 2, 2, 40, 271, 3, 2, 2, 2, 42, 278, 3, 2, 2, 2, 44, 340, 3, 2, 2, 2, 46, 342, 3, 2, 2, 2, 48, 344, 3, 2, 2, 2, 50, 347, 3, 2, 2, 2, 52, 357, 3, 2, 2, 2, 54, 366, 3, 2, 2, 2, 56, 386, 3, 2, 2, 2, 58, 396, 3, 2, 2, 2, 60, 406, 3, 2, 2, 2, 62, 408, 3, 2, 2, 2, 64, 415, 3, 2, 2, 2, 66, 429, 3, 2, 2, 2, 68, 438, 3, 2, 2, 2, 70, 442, 3, 2, 2, 2, 72, 444, 3, 2, 2, 2, 74, 450, 3, 2, 2, 2, 76, 457, 3, 2, 2, 2, 78, 467, 3, 2, 2, 2, 80, 472, 3, 2, 2, 2, 82, 482, 3, 2, 2, 2, 84, 485, 3, 2, 2, 2, 86, 499, 3, 2, 2, 2, 88, 507, 3, 2, 2, 2, 90, 515, 3, 2, 2, 2, 92, 524, 3, 2, 2, 2, 94, 530, 3, 2, 2, 2, 96, 542, 3, 2, 2, 2, 98, 550, 3, 2, 2, 2, 100, 562, 3, 2, 2, 2, 102, 567, 3, 2, 2, 2, 104, 580, 3, 2, 2, 2, 106, 593, 3, 2, 2, 2, 108, 606, 3, 2, 2, 2, 110, 613, 3, 2, 2, 2, 112, 618, 3, 2, 2, 2, 114, 623, 3, 2, 2, 2, 116, 118, 5, 4, 3, 2, 117, 116, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 122, 7, 2, 2, 3, 122, 3, 3, 2, 2, 2, 123, 132, 5, 6, 4, 2, 124, 132, 5, 10, 6, 2, 125, 132, 5, 22, 12, 2, 126, 132, 5, 60, 31, 2, 127, 132, 5, 36, 19, 2, 128, 132, 5, 78, 40, 2, 129, 132, 5, 82, 42, 2, 130, 132, 5, 112, 57, 2, 131, 123, 3, 2, 2, 2, 131, 124, 3, 2, 2, 2, 131, 125, 3, 2, 2, 2, 131, 126, 3, 2, 2, 2, 131, 127, 3, 2, 2, 2, 131, 128, 3, 2, 2, 2, 131, 129, 3, 2, 2, 2, 131, 130, 3, 2, 2, 2, 132, 5, 3, 2, 2, 2, 133, 135, 7, 3, 2, 2, 134, 133, 3, 2, 2, 2, 135, 138, 3, 2, 2, 2, 136, 134, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 139, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 139, 140, 9, 2, 2, 2, 140, 7, 3, 2, 2, 2, 141, 143, 9, 3, 2, 2, 142, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 9, 3, 2, 2, 2, 146, 147, 5, 12, 7, 2, 147, 148, 5, 18, 10, 2, 148, 11, 3, 2, 2, 2, 149, 151, 7, 3, 2, 2, 150, 149, 3, 2, 2, 2, 151, 154, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 155, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 155, 159, 7, 9, 2, 2, 156, 158, 7, 3, 2, 2, 157, 156, 3, 2, 2, 2, 158, 161, 3, 2, 2, 2, 159, 157, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 162, 3, 2, 2, 2, 161, 159, 3, 2, 2, 2, 162, 163, 5, 14, 8, 2, 163, 13, 3, 2, 2, 2, 164, 169, 5, 16, 9, 2, 165, 168, 7, 3, 2, 2, 166, 168, 5, 16, 9, 2, 167, 165, 3, 2, 2, 2, 167, 166, 3, 2, 2, 2, 168, 171, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 15, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 172, 177, 7, 30, 2, 2, 173, 174, 7, 31, 2, 2, 174, 176, 7, 30, 2, 2, 175, 173, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 175, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 17, 3, 2, 2, 2, 179, 177, 3, 2, 2, 2, 180, 182, 5, 20, 11, 2, 181, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 19, 3, 2, 2, 2, 185, 187, 7, 3, 2, 2, 186, 185, 3, 2, 2, 2, 187, 190, 3, 2, 2, 2, 188, 186, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 188, 3, 2, 2, 2, 191, 192, 7, 9, 2, 2, 192, 193, 5, 22, 12, 2, 193, 21, 3, 2, 2, 2, 194, 195, 5, 24, 13, 2, 195, 23, 3, 2, 2, 2, 196, 198, 5, 26, 14, 2, 197, 199, 5, 30, 16, 2, 198, 197, 3, 2, 2, 2, 198, 199, 3, 2, 2, 2, 199, 25, 3, 2, 2, 2, 200, 202, 7, 3, 2, 2, 201, 200, 3, 2, 2, 2, 202, 205, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 203, 204, 3, 2, 2, 2, 204, 206, 3, 2, 2, 2, 205, 203, 3, 2, 2, 2, 206, 208, 7, 9, 2, 2, 207, 209, 7, 9, 2, 2, 208, 207, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 213, 3, 2, 2, 2, 210, 212, 7, 3, 2, 2, 211, 210, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 5, 28, 15, 2, 217, 27, 3, 2, 2, 2, 218, 223, 5, 16, 9, 2, 219, 222, 7, 3, 2, 2, 220, 222, 5, 16, 9, 2, 221, 219, 3, 2, 2, 2, 221, 220, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 29, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 228, 7, 3, 2, 2, 227, 226, 3, 2, 2, 2, 228, 231, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 232, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 232, 233, 5, 32, 17, 2, 233, 31, 3, 2, 2, 2, 234, 236, 7, 3, 2, 2, 235, 234, 3, 2, 2, 2, 236, 239, 3, 2, 2, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 244, 3, 2, 2, 2, 239, 237, 3, 2, 2, 2, 240, 241, 5, 34, 18, 2, 241, 242, 5, 6, 4, 2, 242, 245, 3, 2, 2, 2, 243, 245, 5, 8, 5, 2, 244, 240, 3, 2, 2, 2, 244, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 244, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 33, 3, 2, 2, 2, 248, 250, 7, 3, 2, 2, 249, 248, 3, 2, 2, 2, 250, 253, 3, 2, 2, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 254, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 254, 258, 7, 10, 2, 2, 255, 257, 9, 4, 2, 2, 256, 255, 3, 2, 2, 2, 257, 260, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 35, 3, 2, 2, 2, 260, 258, 3, 2, 2, 2, 261, 262, 5, 38, 20, 2, 262, 37, 3, 2, 2, 2, 263, 265, 5, 42, 22, 2, 264, 266, 5, 40, 21, 2, 265, 264, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 39, 3, 2, 2, 2, 267, 268, 5, 76, 39, 2, 268, 269, 5, 6, 4, 2, 269, 272, 3, 2, 2, 2, 270, 272, 5, 8, 5, 2, 271, 267, 3, 2, 2, 2, 271, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 271, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 41, 3, 2, 2, 2, 275, 277, 7, 3, 2, 2, 276, 275, 3, 2, 2, 2, 277, 280, 3, 2, 2, 2, 278, 276, 3, 2, 2, 2, 278, 279, 3, 2, 2, 2, 279, 281, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 281, 285, 7, 12, 2, 2, 282, 284, 7, 3, 2, 2, 283, 282, 3, 2, 2, 2, 284, 287, 3, 2, 2, 2, 285, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 289, 3, 2, 2, 2, 287, 285, 3, 2, 2, 2, 288, 290, 5, 48, 25, 2, 289, 288, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 294, 3, 2, 2, 2, 291, 293, 7, 3, 2, 2, 292, 291, 3, 2, 2, 2, 293, 296, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 299, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 297, 300, 5, 56, 29, 2, 298, 300, 5, 58, 30, 2, 299, 297, 3, 2, 2, 2, 299, 298, 3, 2, 2, 2, 299, 300, 3, 2, 2, 2, 300, 304, 3, 2, 2, 2, 301, 303, 7, 3, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 309, 5, 50, 26, 2, 308, 307, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 313, 3, 2, 2, 2, 310, 312, 7, 3, 2, 2, 311, 310, 3, 2, 2, 2, 312, 315, 3, 2, 2, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 317, 3, 2, 2, 2, 315, 313, 3, 2, 2, 2, 316, 318, 5, 52, 27, 2, 317, 316, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 322, 3, 2, 2, 2, 319, 321, 7, 3, 2, 2, 320, 319, 3, 2, 2, 2, 321, 324, 3, 2, 2, 2, 322, 320, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 322, 3, 2, 2, 2, 325, 327, 7, 19, 2, 2, 326, 325, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 331, 3, 2, 2, 2, 328, 330, 7, 3, 2, 2, 329, 328, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 336, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 334, 337, 5, 44, 23, 2, 335, 337, 5, 46, 24, 2, 336, 334, 3, 2, 2, 2, 336, 335, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 339, 5, 6, 4, 2, 339, 43, 3, 2, 2, 2, 340, 341, 7, 25, 2, 2, 341, 45, 3, 2, 2, 2, 342, 343, 7, 26, 2, 2, 343, 47, 3, 2, 2, 2, 344, 345, 7, 23, 2, 2, 345, 49, 3, 2, 2, 2, 346, 348, 7, 21, 2, 2, 347, 346, 3, 2, 2, 2, 347, 348, 3, 2, 2, 2, 348, 352, 3, 2, 2, 2, 349, 351, 7, 3, 2, 2, 350, 349, 3, 2, 2, 2, 351, 354, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 355, 3, 2, 2, 2, 354, 352, 3, 2, 2, 2, 355, 356, 5, 54, 28, 2, 356, 51, 3, 2, 2, 2, 357, 361, 7, 22, 2, 2, 358, 360, 7, 3, 2, 2, 359, 358, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 364, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 364, 365, 5, 54, 28, 2, 365, 53, 3, 2, 2, 2, 366, 383, 9, 5, 2, 2, 367, 369, 7, 3, 2, 2, 368, 367, 3, 2, 2, 2, 369, 372, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 373, 3, 2, 2, 2, 372, 370, 3, 2, 2, 2, 373, 377, 7, 20, 2, 2, 374, 376, 7, 3, 2, 2, 375, 374, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 380, 3, 2, 2, 2, 379, 377, 3, 2, 2, 2, 380, 382, 9, 5, 2, 2, 381, 370, 3, 2, 2, 2, 382, 385, 3, 2, 2, 2, 383, 381, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 55, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 386, 394, 7, 27, 2, 2, 387, 389, 7, 3, 2, 2, 388, 387, 3, 2, 2, 2, 389, 392, 3, 2, 2, 2, 390, 388, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 393, 3, 2, 2, 2, 392, 390, 3, 2, 2, 2, 393, 395, 7, 24, 2, 2, 394, 390, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 57, 3, 2, 2, 2, 396, 404, 7, 28, 2, 2, 397, 399, 7, 3, 2, 2, 398, 397, 3, 2, 2, 2, 399, 402, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 403, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 403, 405, 7, 24, 2, 2, 404, 400, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 59, 3, 2, 2, 2, 406, 407, 5, 62, 32, 2, 407, 61, 3, 2, 2, 2, 408, 410, 5, 64, 33, 2, 409, 411, 5, 74, 38, 2, 410, 409, 3, 2, 2, 2, 410, 411, 3, 2, 2, 2, 411, 63, 3, 2, 2, 2, 412, 414, 7, 3, 2, 2, 413, 412, 3, 2, 2, 2, 414, 417, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 418, 420, 7, 11, 2, 2, 419, 421, 5, 66, 34, 2, 420, 419, 3, 2, 2, 2, 420, 421, 3, 2, 2, 2, 421, 423, 3, 2, 2, 2, 422, 424, 7, 39, 2, 2, 423, 422, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 427, 5, 68, 35, 2, 426, 425, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 65, 3, 2, 2, 2, 428, 430, 9, 6, 2, 2, 429, 428, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 67, 3, 2, 2, 2, 433, 439, 5, 70, 36, 2, 434, 439, 5, 72, 37, 2, 435, 439, 7, 38, 2, 2, 436, 439, 7, 39, 2, 2, 437, 439, 7, 3, 2, 2, 438, 433, 3, 2, 2, 2, 438, 434, 3, 2, 2, 2, 438, 435, 3, 2, 2, 2, 438, 436, 3, 2, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 69, 3, 2, 2, 2, 442, 443, 7, 36, 2, 2, 443, 71, 3, 2, 2, 2, 444, 445, 7, 37, 2, 2, 445, 73, 3, 2, 2, 2, 446, 447, 5, 76, 39, 2, 447, 448, 5, 6, 4, 2, 448, 451, 3, 2, 2, 2, 449, 451, 5, 8, 5, 2, 450, 446, 3, 2, 2, 2, 450, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 75, 3, 2, 2, 2, 454, 456, 7, 3, 2, 2, 455, 454, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 460, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 464, 7, 10, 2, 2, 461, 463, 9, 4, 2, 2, 462, 461, 3, 2, 2, 2, 463, 466, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 77, 3, 2, 2, 2, 466, 464, 3, 2, 2, 2, 467, 468, 5, 80, 41, 2, 468, 79, 3, 2, 2, 2, 469, 471, 7, 3, 2, 2, 470, 469, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 475, 479, 7, 13, 2, 2, 476, 478, 7, 3, 2, 2, 477, 476, 3, 2, 2, 2, 478, 481, 3, 2, 2, 2, 479, 477, 3, 2, 2, 2, 479, 480, 3, 2, 2, 2, 480, 81, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 482, 483, 5, 84, 43, 2, 483, 83, 3, 2, 2, 2, 484, 486, 5, 86, 44, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 488, 3, 2, 2, 2, 487, 489, 5, 88, 45, 2, 488, 487, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 5, 90, 46, 2, 491, 492, 5, 94, 48, 2, 492, 494, 5, 100, 51, 2, 493, 495, 5, 104, 53, 2, 494, 493, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 85, 3, 2, 2, 2, 496, 498, 7, 3, 2, 2, 497, 496, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 502, 3, 2, 2, 2, 501, 499, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 87, 3, 2, 2, 2, 504, 506, 7, 3, 2, 2, 505, 504, 3, 2, 2, 2, 506, 509, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 510, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 510, 511, 7, 15, 2, 2, 511, 89, 3, 2, 2, 2, 512, 514, 7, 3, 2, 2, 513, 512, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 518, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 518, 519, 7, 8, 2, 2, 519, 520, 5, 92, 47, 2, 520, 91, 3, 2, 2, 2, 521, 523, 7, 41, 2, 2, 522, 521, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 93, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 527, 529, 7, 3, 2, 2, 528, 527, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 530, 531, 3, 2, 2, 2, 531, 539, 3, 2, 2, 2, 532, 530, 3, 2, 2, 2, 533, 534, 5, 96, 49, 2, 534, 535, 5, 6, 4, 2, 535, 538, 3, 2, 2, 2, 536, 538, 5, 98, 50, 2, 537, 533, 3, 2, 2, 2, 537, 536, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 95, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 546, 7, 10, 2, 2, 543, 545, 9, 7, 2, 2, 544, 543, 3, 2, 2, 2, 545, 548, 3, 2, 2, 2, 546, 544, 3, 2, 2, 2, 546, 547, 3, 2, 2, 2, 547, 97, 3, 2, 2, 2, 548, 546, 3, 2, 2, 2, 549, 551, 9, 3, 2, 2, 550, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 99, 3, 2, 2, 2, 554, 556, 5, 102, 52, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 563, 5, 110, 56, 2, 558, 560, 5, 110, 56, 2, 559, 561, 5, 102, 52, 2, 560, 559, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 563, 3, 2, 2, 2, 562, 555, 3, 2, 2, 2, 562, 558, 3, 2, 2, 2, 563, 101, 3, 2, 2, 2, 564, 566, 7, 3, 2, 2, 565, 564, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 570, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 573, 7, 14, 2, 2, 571, 574, 5, 106, 54, 2, 572, 574, 5, 108, 55, 2, 573, 571, 3, 2, 2, 2, 573, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 103, 3, 2, 2, 2, 577, 579, 7, 3, 2, 2, 578, 577, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 583, 3, 2, 2, 2, 582, 580, 3, 2, 2, 2, 583, 586, 7, 17, 2, 2, 584, 587, 5, 106, 54, 2, 585, 587, 5, 108, 55, 2, 586, 584, 3, 2, 2, 2, 586, 585, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 586, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 105, 3, 2, 2, 2, 590, 592, 7, 3, 2, 2, 591, 590, 3, 2, 2, 2, 592, 595, 3, 2, 2, 2, 593, 591, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 596, 3, 2, 2, 2, 595, 593, 3, 2, 2, 2, 596, 600, 7, 10, 2, 2, 597, 599, 9, 7, 2, 2, 598, 597, 3, 2, 2, 2, 599, 602, 3, 2, 2, 2, 600, 598, 3, 2, 2, 2, 600, 601, 3, 2, 2, 2, 601, 603, 3, 2, 2, 2, 602, 600, 3, 2, 2, 2, 603, 604, 5, 6, 4, 2, 604, 107, 3, 2, 2, 2, 605, 607, 9, 3, 2, 2, 606, 605, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 606, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 109, 3, 2, 2, 2, 610, 612, 7, 3, 2, 2, 611, 610, 3, 2, 2, 2, 612, 615, 3, 2, 2, 2, 613, 611, 3, 2, 2, 2, 613, 614, 3, 2, 2, 2, 614, 616, 3, 2, 2, 2, 615, 613, 3, 2, 2, 2, 616, 617, 7, 16, 2, 2, 617, 111, 3, 2, 2, 2, 618, 619, 5, 114, 58, 2, 619, 113, 3, 2, 2, 2, 620, 622, 7, 3, 2, 2, 621, 620, 3, 2, 2, 2, 622, 625, 3, 2, 2, 2, 623, 621, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 626, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 626, 627, 7, 6, 2, 2, 627, 115, 3, 2, 2, 2, 91, 119, 131, 136, 144, 152, 159, 167, 169, 177, 183, 188, 198, 203, 208, 213, 221, 223, 229, 237, 244, 246, 251, 258, 265, 271, 273, 278, 285, 289, 294, 299, 304, 308, 313, 317, 322, 326, 331, 336, 347, 352, 361, 370, 377, 383, 390, 394, 400, 404, 410, 415, 420, 423, 426, 431, 438, 440, 450, 452, 457, 464, 472, 479, 485, 488, 494, 499, 507, 515, 524, 530, 537, 539, 546, 552, 555, 560, 562, 567, 573, 575, 580, 586, 588, 593, 600, 608, 613, 623]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.js",
    "content": "// Generated from ../LUFileParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\nvar LUFileParserListener = require('./LUFileParserListener').LUFileParserListener;\nvar LUFileParserVisitor = require('./LUFileParserVisitor').LUFileParserVisitor;\n\nvar grammarFileName = \"LUFileParser.g4\";\n\n\nvar serializedATN = [\"\\u0003\\u608b\\ua72a\\u8133\\ub9ed\\u417c\\u3be7\\u7786\\u5964\",\n    \"\\u0003)\\u0275\\u0004\\u0002\\t\\u0002\\u0004\\u0003\\t\\u0003\\u0004\\u0004\\t\",\n    \"\\u0004\\u0004\\u0005\\t\\u0005\\u0004\\u0006\\t\\u0006\\u0004\\u0007\\t\\u0007\\u0004\",\n    \"\\b\\t\\b\\u0004\\t\\t\\t\\u0004\\n\\t\\n\\u0004\\u000b\\t\\u000b\\u0004\\f\\t\\f\\u0004\",\n    \"\\r\\t\\r\\u0004\\u000e\\t\\u000e\\u0004\\u000f\\t\\u000f\\u0004\\u0010\\t\\u0010\\u0004\",\n    \"\\u0011\\t\\u0011\\u0004\\u0012\\t\\u0012\\u0004\\u0013\\t\\u0013\\u0004\\u0014\\t\",\n    \"\\u0014\\u0004\\u0015\\t\\u0015\\u0004\\u0016\\t\\u0016\\u0004\\u0017\\t\\u0017\\u0004\",\n    \"\\u0018\\t\\u0018\\u0004\\u0019\\t\\u0019\\u0004\\u001a\\t\\u001a\\u0004\\u001b\\t\",\n    \"\\u001b\\u0004\\u001c\\t\\u001c\\u0004\\u001d\\t\\u001d\\u0004\\u001e\\t\\u001e\\u0004\",\n    \"\\u001f\\t\\u001f\\u0004 \\t \\u0004!\\t!\\u0004\\\"\\t\\\"\\u0004#\\t#\\u0004$\\t$\\u0004\",\n    \"%\\t%\\u0004&\\t&\\u0004\\'\\t\\'\\u0004(\\t(\\u0004)\\t)\\u0004*\\t*\\u0004+\\t+\\u0004\",\n    \",\\t,\\u0004-\\t-\\u0004.\\t.\\u0004/\\t/\\u00040\\t0\\u00041\\t1\\u00042\\t2\\u0004\",\n    \"3\\t3\\u00044\\t4\\u00045\\t5\\u00046\\t6\\u00047\\t7\\u00048\\t8\\u00049\\t9\\u0004\",\n    \":\\t:\\u0003\\u0002\\u0006\\u0002v\\n\\u0002\\r\\u0002\\u000e\\u0002w\\u0003\\u0002\",\n    \"\\u0003\\u0002\\u0003\\u0003\\u0003\\u0003\\u0003\\u0003\\u0003\\u0003\\u0003\\u0003\",\n    \"\\u0003\\u0003\\u0003\\u0003\\u0003\\u0003\\u0005\\u0003\\u0084\\n\\u0003\\u0003\",\n    \"\\u0004\\u0007\\u0004\\u0087\\n\\u0004\\f\\u0004\\u000e\\u0004\\u008a\\u000b\\u0004\",\n    \"\\u0003\\u0004\\u0003\\u0004\\u0003\\u0005\\u0006\\u0005\\u008f\\n\\u0005\\r\\u0005\",\n    \"\\u000e\\u0005\\u0090\\u0003\\u0006\\u0003\\u0006\\u0003\\u0006\\u0003\\u0007\\u0007\",\n    \"\\u0007\\u0097\\n\\u0007\\f\\u0007\\u000e\\u0007\\u009a\\u000b\\u0007\\u0003\\u0007\",\n    \"\\u0003\\u0007\\u0007\\u0007\\u009e\\n\\u0007\\f\\u0007\\u000e\\u0007\\u00a1\\u000b\",\n    \"\\u0007\\u0003\\u0007\\u0003\\u0007\\u0003\\b\\u0003\\b\\u0003\\b\\u0007\\b\\u00a8\",\n    \"\\n\\b\\f\\b\\u000e\\b\\u00ab\\u000b\\b\\u0003\\t\\u0003\\t\\u0003\\t\\u0007\\t\\u00b0\",\n    \"\\n\\t\\f\\t\\u000e\\t\\u00b3\\u000b\\t\\u0003\\n\\u0006\\n\\u00b6\\n\\n\\r\\n\\u000e\\n\",\n    \"\\u00b7\\u0003\\u000b\\u0007\\u000b\\u00bb\\n\\u000b\\f\\u000b\\u000e\\u000b\\u00be\",\n    \"\\u000b\\u000b\\u0003\\u000b\\u0003\\u000b\\u0003\\u000b\\u0003\\f\\u0003\\f\\u0003\",\n    \"\\r\\u0003\\r\\u0005\\r\\u00c7\\n\\r\\u0003\\u000e\\u0007\\u000e\\u00ca\\n\\u000e\\f\",\n    \"\\u000e\\u000e\\u000e\\u00cd\\u000b\\u000e\\u0003\\u000e\\u0003\\u000e\\u0005\\u000e\",\n    \"\\u00d1\\n\\u000e\\u0003\\u000e\\u0007\\u000e\\u00d4\\n\\u000e\\f\\u000e\\u000e\\u000e\",\n    \"\\u00d7\\u000b\\u000e\\u0003\\u000e\\u0003\\u000e\\u0003\\u000f\\u0003\\u000f\\u0003\",\n    \"\\u000f\\u0007\\u000f\\u00de\\n\\u000f\\f\\u000f\\u000e\\u000f\\u00e1\\u000b\\u000f\",\n    \"\\u0003\\u0010\\u0007\\u0010\\u00e4\\n\\u0010\\f\\u0010\\u000e\\u0010\\u00e7\\u000b\",\n    \"\\u0010\\u0003\\u0010\\u0003\\u0010\\u0003\\u0011\\u0007\\u0011\\u00ec\\n\\u0011\",\n    \"\\f\\u0011\\u000e\\u0011\\u00ef\\u000b\\u0011\\u0003\\u0011\\u0003\\u0011\\u0003\",\n    \"\\u0011\\u0003\\u0011\\u0006\\u0011\\u00f5\\n\\u0011\\r\\u0011\\u000e\\u0011\\u00f6\",\n    \"\\u0003\\u0012\\u0007\\u0012\\u00fa\\n\\u0012\\f\\u0012\\u000e\\u0012\\u00fd\\u000b\",\n    \"\\u0012\\u0003\\u0012\\u0003\\u0012\\u0007\\u0012\\u0101\\n\\u0012\\f\\u0012\\u000e\",\n    \"\\u0012\\u0104\\u000b\\u0012\\u0003\\u0013\\u0003\\u0013\\u0003\\u0014\\u0003\\u0014\",\n    \"\\u0005\\u0014\\u010a\\n\\u0014\\u0003\\u0015\\u0003\\u0015\\u0003\\u0015\\u0003\",\n    \"\\u0015\\u0006\\u0015\\u0110\\n\\u0015\\r\\u0015\\u000e\\u0015\\u0111\\u0003\\u0016\",\n    \"\\u0007\\u0016\\u0115\\n\\u0016\\f\\u0016\\u000e\\u0016\\u0118\\u000b\\u0016\\u0003\",\n    \"\\u0016\\u0003\\u0016\\u0007\\u0016\\u011c\\n\\u0016\\f\\u0016\\u000e\\u0016\\u011f\",\n    \"\\u000b\\u0016\\u0003\\u0016\\u0005\\u0016\\u0122\\n\\u0016\\u0003\\u0016\\u0007\",\n    \"\\u0016\\u0125\\n\\u0016\\f\\u0016\\u000e\\u0016\\u0128\\u000b\\u0016\\u0003\\u0016\",\n    \"\\u0003\\u0016\\u0005\\u0016\\u012c\\n\\u0016\\u0003\\u0016\\u0007\\u0016\\u012f\",\n    \"\\n\\u0016\\f\\u0016\\u000e\\u0016\\u0132\\u000b\\u0016\\u0003\\u0016\\u0005\\u0016\",\n    \"\\u0135\\n\\u0016\\u0003\\u0016\\u0007\\u0016\\u0138\\n\\u0016\\f\\u0016\\u000e\\u0016\",\n    \"\\u013b\\u000b\\u0016\\u0003\\u0016\\u0005\\u0016\\u013e\\n\\u0016\\u0003\\u0016\",\n    \"\\u0007\\u0016\\u0141\\n\\u0016\\f\\u0016\\u000e\\u0016\\u0144\\u000b\\u0016\\u0003\",\n    \"\\u0016\\u0005\\u0016\\u0147\\n\\u0016\\u0003\\u0016\\u0007\\u0016\\u014a\\n\\u0016\",\n    \"\\f\\u0016\\u000e\\u0016\\u014d\\u000b\\u0016\\u0003\\u0016\\u0003\\u0016\\u0005\",\n    \"\\u0016\\u0151\\n\\u0016\\u0003\\u0016\\u0003\\u0016\\u0003\\u0017\\u0003\\u0017\",\n    \"\\u0003\\u0018\\u0003\\u0018\\u0003\\u0019\\u0003\\u0019\\u0003\\u001a\\u0005\\u001a\",\n    \"\\u015c\\n\\u001a\\u0003\\u001a\\u0007\\u001a\\u015f\\n\\u001a\\f\\u001a\\u000e\\u001a\",\n    \"\\u0162\\u000b\\u001a\\u0003\\u001a\\u0003\\u001a\\u0003\\u001b\\u0003\\u001b\\u0007\",\n    \"\\u001b\\u0168\\n\\u001b\\f\\u001b\\u000e\\u001b\\u016b\\u000b\\u001b\\u0003\\u001b\",\n    \"\\u0003\\u001b\\u0003\\u001c\\u0003\\u001c\\u0007\\u001c\\u0171\\n\\u001c\\f\\u001c\",\n    \"\\u000e\\u001c\\u0174\\u000b\\u001c\\u0003\\u001c\\u0003\\u001c\\u0007\\u001c\\u0178\",\n    \"\\n\\u001c\\f\\u001c\\u000e\\u001c\\u017b\\u000b\\u001c\\u0003\\u001c\\u0007\\u001c\",\n    \"\\u017e\\n\\u001c\\f\\u001c\\u000e\\u001c\\u0181\\u000b\\u001c\\u0003\\u001d\\u0003\",\n    \"\\u001d\\u0007\\u001d\\u0185\\n\\u001d\\f\\u001d\\u000e\\u001d\\u0188\\u000b\\u001d\",\n    \"\\u0003\\u001d\\u0005\\u001d\\u018b\\n\\u001d\\u0003\\u001e\\u0003\\u001e\\u0007\",\n    \"\\u001e\\u018f\\n\\u001e\\f\\u001e\\u000e\\u001e\\u0192\\u000b\\u001e\\u0003\\u001e\",\n    \"\\u0005\\u001e\\u0195\\n\\u001e\\u0003\\u001f\\u0003\\u001f\\u0003 \\u0003 \\u0005\",\n    \" \\u019b\\n \\u0003!\\u0007!\\u019e\\n!\\f!\\u000e!\\u01a1\\u000b!\\u0003!\\u0003\",\n    \"!\\u0005!\\u01a5\\n!\\u0003!\\u0005!\\u01a8\\n!\\u0003!\\u0005!\\u01ab\\n!\\u0003\",\n    \"\\\"\\u0006\\\"\\u01ae\\n\\\"\\r\\\"\\u000e\\\"\\u01af\\u0003#\\u0003#\\u0003#\\u0003#\\u0003\",\n    \"#\\u0006#\\u01b7\\n#\\r#\\u000e#\\u01b8\\u0003$\\u0003$\\u0003%\\u0003%\\u0003\",\n    \"&\\u0003&\\u0003&\\u0003&\\u0006&\\u01c3\\n&\\r&\\u000e&\\u01c4\\u0003\\'\\u0007\",\n    \"\\'\\u01c8\\n\\'\\f\\'\\u000e\\'\\u01cb\\u000b\\'\\u0003\\'\\u0003\\'\\u0007\\'\\u01cf\",\n    \"\\n\\'\\f\\'\\u000e\\'\\u01d2\\u000b\\'\\u0003(\\u0003(\\u0003)\\u0007)\\u01d7\\n)\",\n    \"\\f)\\u000e)\\u01da\\u000b)\\u0003)\\u0003)\\u0007)\\u01de\\n)\\f)\\u000e)\\u01e1\",\n    \"\\u000b)\\u0003*\\u0003*\\u0003+\\u0005+\\u01e6\\n+\\u0003+\\u0005+\\u01e9\\n+\",\n    \"\\u0003+\\u0003+\\u0003+\\u0003+\\u0005+\\u01ef\\n+\\u0003,\\u0007,\\u01f2\\n,\",\n    \"\\f,\\u000e,\\u01f5\\u000b,\\u0003,\\u0003,\\u0003-\\u0007-\\u01fa\\n-\\f-\\u000e\",\n    \"-\\u01fd\\u000b-\\u0003-\\u0003-\\u0003.\\u0007.\\u0202\\n.\\f.\\u000e.\\u0205\",\n    \"\\u000b.\\u0003.\\u0003.\\u0003.\\u0003/\\u0007/\\u020b\\n/\\f/\\u000e/\\u020e\",\n    \"\\u000b/\\u00030\\u00070\\u0211\\n0\\f0\\u000e0\\u0214\\u000b0\\u00030\\u00030\",\n    \"\\u00030\\u00030\\u00070\\u021a\\n0\\f0\\u000e0\\u021d\\u000b0\\u00031\\u00031\",\n    \"\\u00071\\u0221\\n1\\f1\\u000e1\\u0224\\u000b1\\u00032\\u00062\\u0227\\n2\\r2\\u000e\",\n    \"2\\u0228\\u00033\\u00053\\u022c\\n3\\u00033\\u00033\\u00033\\u00053\\u0231\\n3\",\n    \"\\u00053\\u0233\\n3\\u00034\\u00074\\u0236\\n4\\f4\\u000e4\\u0239\\u000b4\\u0003\",\n    \"4\\u00034\\u00034\\u00064\\u023e\\n4\\r4\\u000e4\\u023f\\u00035\\u00075\\u0243\",\n    \"\\n5\\f5\\u000e5\\u0246\\u000b5\\u00035\\u00035\\u00035\\u00065\\u024b\\n5\\r5\\u000e\",\n    \"5\\u024c\\u00036\\u00076\\u0250\\n6\\f6\\u000e6\\u0253\\u000b6\\u00036\\u00036\",\n    \"\\u00076\\u0257\\n6\\f6\\u000e6\\u025a\\u000b6\\u00036\\u00036\\u00037\\u00067\",\n    \"\\u025f\\n7\\r7\\u000e7\\u0260\\u00038\\u00078\\u0264\\n8\\f8\\u000e8\\u0267\\u000b\",\n    \"8\\u00038\\u00038\\u00039\\u00039\\u0003:\\u0007:\\u026e\\n:\\f:\\u000e:\\u0271\",\n    \"\\u000b:\\u0003:\\u0003:\\u0003:\\u0003w\\u0002;\\u0002\\u0004\\u0006\\b\\n\\f\\u000e\",\n    \"\\u0010\\u0012\\u0014\\u0016\\u0018\\u001a\\u001c\\u001e \\\"$&(*,.02468:<>@B\",\n    \"DFHJLNPRTVXZ\\\\^`bdfhjlnpr\\u0002\\b\\u0003\\u0003\\u0004\\u0004\\u0004\\u0002\",\n    \"\\u0003\\u0003\\u0012\\u0012\\u0004\\u0002\\u0003\\u0003 \\\"\\u0003\\u0002\\u001b\",\n    \"\\u001c\\u0004\\u0002\\u0003\\u0003&&\\u0004\\u0002\\u0003\\u0003\\\"\\\"\\u0002\\u029f\",\n    \"\\u0002u\\u0003\\u0002\\u0002\\u0002\\u0004\\u0083\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0006\\u0088\\u0003\\u0002\\u0002\\u0002\\b\\u008e\\u0003\\u0002\\u0002\\u0002\",\n    \"\\n\\u0092\\u0003\\u0002\\u0002\\u0002\\f\\u0098\\u0003\\u0002\\u0002\\u0002\\u000e\",\n    \"\\u00a4\\u0003\\u0002\\u0002\\u0002\\u0010\\u00ac\\u0003\\u0002\\u0002\\u0002\\u0012\",\n    \"\\u00b5\\u0003\\u0002\\u0002\\u0002\\u0014\\u00bc\\u0003\\u0002\\u0002\\u0002\\u0016\",\n    \"\\u00c2\\u0003\\u0002\\u0002\\u0002\\u0018\\u00c4\\u0003\\u0002\\u0002\\u0002\\u001a\",\n    \"\\u00cb\\u0003\\u0002\\u0002\\u0002\\u001c\\u00da\\u0003\\u0002\\u0002\\u0002\\u001e\",\n    \"\\u00e5\\u0003\\u0002\\u0002\\u0002 \\u00ed\\u0003\\u0002\\u0002\\u0002\\\"\\u00fb\",\n    \"\\u0003\\u0002\\u0002\\u0002$\\u0105\\u0003\\u0002\\u0002\\u0002&\\u0107\\u0003\",\n    \"\\u0002\\u0002\\u0002(\\u010f\\u0003\\u0002\\u0002\\u0002*\\u0116\\u0003\\u0002\",\n    \"\\u0002\\u0002,\\u0154\\u0003\\u0002\\u0002\\u0002.\\u0156\\u0003\\u0002\\u0002\",\n    \"\\u00020\\u0158\\u0003\\u0002\\u0002\\u00022\\u015b\\u0003\\u0002\\u0002\\u0002\",\n    \"4\\u0165\\u0003\\u0002\\u0002\\u00026\\u016e\\u0003\\u0002\\u0002\\u00028\\u0182\",\n    \"\\u0003\\u0002\\u0002\\u0002:\\u018c\\u0003\\u0002\\u0002\\u0002<\\u0196\\u0003\",\n    \"\\u0002\\u0002\\u0002>\\u0198\\u0003\\u0002\\u0002\\u0002@\\u019f\\u0003\\u0002\",\n    \"\\u0002\\u0002B\\u01ad\\u0003\\u0002\\u0002\\u0002D\\u01b6\\u0003\\u0002\\u0002\",\n    \"\\u0002F\\u01ba\\u0003\\u0002\\u0002\\u0002H\\u01bc\\u0003\\u0002\\u0002\\u0002\",\n    \"J\\u01c2\\u0003\\u0002\\u0002\\u0002L\\u01c9\\u0003\\u0002\\u0002\\u0002N\\u01d3\",\n    \"\\u0003\\u0002\\u0002\\u0002P\\u01d8\\u0003\\u0002\\u0002\\u0002R\\u01e2\\u0003\",\n    \"\\u0002\\u0002\\u0002T\\u01e5\\u0003\\u0002\\u0002\\u0002V\\u01f3\\u0003\\u0002\",\n    \"\\u0002\\u0002X\\u01fb\\u0003\\u0002\\u0002\\u0002Z\\u0203\\u0003\\u0002\\u0002\",\n    \"\\u0002\\\\\\u020c\\u0003\\u0002\\u0002\\u0002^\\u0212\\u0003\\u0002\\u0002\\u0002\",\n    \"`\\u021e\\u0003\\u0002\\u0002\\u0002b\\u0226\\u0003\\u0002\\u0002\\u0002d\\u0232\",\n    \"\\u0003\\u0002\\u0002\\u0002f\\u0237\\u0003\\u0002\\u0002\\u0002h\\u0244\\u0003\",\n    \"\\u0002\\u0002\\u0002j\\u0251\\u0003\\u0002\\u0002\\u0002l\\u025e\\u0003\\u0002\",\n    \"\\u0002\\u0002n\\u0265\\u0003\\u0002\\u0002\\u0002p\\u026a\\u0003\\u0002\\u0002\",\n    \"\\u0002r\\u026f\\u0003\\u0002\\u0002\\u0002tv\\u0005\\u0004\\u0003\\u0002ut\\u0003\",\n    \"\\u0002\\u0002\\u0002vw\\u0003\\u0002\\u0002\\u0002wx\\u0003\\u0002\\u0002\\u0002\",\n    \"wu\\u0003\\u0002\\u0002\\u0002xy\\u0003\\u0002\\u0002\\u0002yz\\u0007\\u0002\\u0002\",\n    \"\\u0003z\\u0003\\u0003\\u0002\\u0002\\u0002{\\u0084\\u0005\\u0006\\u0004\\u0002\",\n    \"|\\u0084\\u0005\\n\\u0006\\u0002}\\u0084\\u0005\\u0016\\f\\u0002~\\u0084\\u0005\",\n    \"<\\u001f\\u0002\\u007f\\u0084\\u0005$\\u0013\\u0002\\u0080\\u0084\\u0005N(\\u0002\",\n    \"\\u0081\\u0084\\u0005R*\\u0002\\u0082\\u0084\\u0005p9\\u0002\\u0083{\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0083|\\u0003\\u0002\\u0002\\u0002\\u0083}\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0083~\\u0003\\u0002\\u0002\\u0002\\u0083\\u007f\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0083\\u0080\\u0003\\u0002\\u0002\\u0002\\u0083\\u0081\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0083\\u0082\\u0003\\u0002\\u0002\\u0002\\u0084\\u0005\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0085\\u0087\\u0007\\u0003\\u0002\\u0002\\u0086\\u0085\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0087\\u008a\\u0003\\u0002\\u0002\\u0002\\u0088\\u0086\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0088\\u0089\\u0003\\u0002\\u0002\\u0002\\u0089\\u008b\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u008a\\u0088\\u0003\\u0002\\u0002\\u0002\\u008b\\u008c\\t\\u0002\\u0002\",\n    \"\\u0002\\u008c\\u0007\\u0003\\u0002\\u0002\\u0002\\u008d\\u008f\\t\\u0003\\u0002\",\n    \"\\u0002\\u008e\\u008d\\u0003\\u0002\\u0002\\u0002\\u008f\\u0090\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0090\\u008e\\u0003\\u0002\\u0002\\u0002\\u0090\\u0091\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0091\\t\\u0003\\u0002\\u0002\\u0002\\u0092\\u0093\\u0005\\f\\u0007\\u0002\",\n    \"\\u0093\\u0094\\u0005\\u0012\\n\\u0002\\u0094\\u000b\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0095\\u0097\\u0007\\u0003\\u0002\\u0002\\u0096\\u0095\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0097\\u009a\\u0003\\u0002\\u0002\\u0002\\u0098\\u0096\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0098\\u0099\\u0003\\u0002\\u0002\\u0002\\u0099\\u009b\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u009a\\u0098\\u0003\\u0002\\u0002\\u0002\\u009b\\u009f\\u0007\\t\\u0002\\u0002\",\n    \"\\u009c\\u009e\\u0007\\u0003\\u0002\\u0002\\u009d\\u009c\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u009e\\u00a1\\u0003\\u0002\\u0002\\u0002\\u009f\\u009d\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u009f\\u00a0\\u0003\\u0002\\u0002\\u0002\\u00a0\\u00a2\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u00a1\\u009f\\u0003\\u0002\\u0002\\u0002\\u00a2\\u00a3\\u0005\\u000e\\b\\u0002\",\n    \"\\u00a3\\r\\u0003\\u0002\\u0002\\u0002\\u00a4\\u00a9\\u0005\\u0010\\t\\u0002\\u00a5\",\n    \"\\u00a8\\u0007\\u0003\\u0002\\u0002\\u00a6\\u00a8\\u0005\\u0010\\t\\u0002\\u00a7\",\n    \"\\u00a5\\u0003\\u0002\\u0002\\u0002\\u00a7\\u00a6\\u0003\\u0002\\u0002\\u0002\\u00a8\",\n    \"\\u00ab\\u0003\\u0002\\u0002\\u0002\\u00a9\\u00a7\\u0003\\u0002\\u0002\\u0002\\u00a9\",\n    \"\\u00aa\\u0003\\u0002\\u0002\\u0002\\u00aa\\u000f\\u0003\\u0002\\u0002\\u0002\\u00ab\",\n    \"\\u00a9\\u0003\\u0002\\u0002\\u0002\\u00ac\\u00b1\\u0007\\u001e\\u0002\\u0002\\u00ad\",\n    \"\\u00ae\\u0007\\u001f\\u0002\\u0002\\u00ae\\u00b0\\u0007\\u001e\\u0002\\u0002\\u00af\",\n    \"\\u00ad\\u0003\\u0002\\u0002\\u0002\\u00b0\\u00b3\\u0003\\u0002\\u0002\\u0002\\u00b1\",\n    \"\\u00af\\u0003\\u0002\\u0002\\u0002\\u00b1\\u00b2\\u0003\\u0002\\u0002\\u0002\\u00b2\",\n    \"\\u0011\\u0003\\u0002\\u0002\\u0002\\u00b3\\u00b1\\u0003\\u0002\\u0002\\u0002\\u00b4\",\n    \"\\u00b6\\u0005\\u0014\\u000b\\u0002\\u00b5\\u00b4\\u0003\\u0002\\u0002\\u0002\\u00b6\",\n    \"\\u00b7\\u0003\\u0002\\u0002\\u0002\\u00b7\\u00b5\\u0003\\u0002\\u0002\\u0002\\u00b7\",\n    \"\\u00b8\\u0003\\u0002\\u0002\\u0002\\u00b8\\u0013\\u0003\\u0002\\u0002\\u0002\\u00b9\",\n    \"\\u00bb\\u0007\\u0003\\u0002\\u0002\\u00ba\\u00b9\\u0003\\u0002\\u0002\\u0002\\u00bb\",\n    \"\\u00be\\u0003\\u0002\\u0002\\u0002\\u00bc\\u00ba\\u0003\\u0002\\u0002\\u0002\\u00bc\",\n    \"\\u00bd\\u0003\\u0002\\u0002\\u0002\\u00bd\\u00bf\\u0003\\u0002\\u0002\\u0002\\u00be\",\n    \"\\u00bc\\u0003\\u0002\\u0002\\u0002\\u00bf\\u00c0\\u0007\\t\\u0002\\u0002\\u00c0\",\n    \"\\u00c1\\u0005\\u0016\\f\\u0002\\u00c1\\u0015\\u0003\\u0002\\u0002\\u0002\\u00c2\",\n    \"\\u00c3\\u0005\\u0018\\r\\u0002\\u00c3\\u0017\\u0003\\u0002\\u0002\\u0002\\u00c4\",\n    \"\\u00c6\\u0005\\u001a\\u000e\\u0002\\u00c5\\u00c7\\u0005\\u001e\\u0010\\u0002\\u00c6\",\n    \"\\u00c5\\u0003\\u0002\\u0002\\u0002\\u00c6\\u00c7\\u0003\\u0002\\u0002\\u0002\\u00c7\",\n    \"\\u0019\\u0003\\u0002\\u0002\\u0002\\u00c8\\u00ca\\u0007\\u0003\\u0002\\u0002\\u00c9\",\n    \"\\u00c8\\u0003\\u0002\\u0002\\u0002\\u00ca\\u00cd\\u0003\\u0002\\u0002\\u0002\\u00cb\",\n    \"\\u00c9\\u0003\\u0002\\u0002\\u0002\\u00cb\\u00cc\\u0003\\u0002\\u0002\\u0002\\u00cc\",\n    \"\\u00ce\\u0003\\u0002\\u0002\\u0002\\u00cd\\u00cb\\u0003\\u0002\\u0002\\u0002\\u00ce\",\n    \"\\u00d0\\u0007\\t\\u0002\\u0002\\u00cf\\u00d1\\u0007\\t\\u0002\\u0002\\u00d0\\u00cf\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00d0\\u00d1\\u0003\\u0002\\u0002\\u0002\\u00d1\\u00d5\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00d2\\u00d4\\u0007\\u0003\\u0002\\u0002\\u00d3\\u00d2\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00d4\\u00d7\\u0003\\u0002\\u0002\\u0002\\u00d5\\u00d3\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00d5\\u00d6\\u0003\\u0002\\u0002\\u0002\\u00d6\\u00d8\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00d7\\u00d5\\u0003\\u0002\\u0002\\u0002\\u00d8\\u00d9\",\n    \"\\u0005\\u001c\\u000f\\u0002\\u00d9\\u001b\\u0003\\u0002\\u0002\\u0002\\u00da\\u00df\",\n    \"\\u0005\\u0010\\t\\u0002\\u00db\\u00de\\u0007\\u0003\\u0002\\u0002\\u00dc\\u00de\",\n    \"\\u0005\\u0010\\t\\u0002\\u00dd\\u00db\\u0003\\u0002\\u0002\\u0002\\u00dd\\u00dc\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00de\\u00e1\\u0003\\u0002\\u0002\\u0002\\u00df\\u00dd\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00df\\u00e0\\u0003\\u0002\\u0002\\u0002\\u00e0\\u001d\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00e1\\u00df\\u0003\\u0002\\u0002\\u0002\\u00e2\\u00e4\",\n    \"\\u0007\\u0003\\u0002\\u0002\\u00e3\\u00e2\\u0003\\u0002\\u0002\\u0002\\u00e4\\u00e7\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00e5\\u00e3\\u0003\\u0002\\u0002\\u0002\\u00e5\\u00e6\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00e6\\u00e8\\u0003\\u0002\\u0002\\u0002\\u00e7\\u00e5\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00e8\\u00e9\\u0005 \\u0011\\u0002\\u00e9\\u001f\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00ea\\u00ec\\u0007\\u0003\\u0002\\u0002\\u00eb\\u00ea\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00ec\\u00ef\\u0003\\u0002\\u0002\\u0002\\u00ed\\u00eb\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00ed\\u00ee\\u0003\\u0002\\u0002\\u0002\\u00ee\\u00f4\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00ef\\u00ed\\u0003\\u0002\\u0002\\u0002\\u00f0\\u00f1\",\n    \"\\u0005\\\"\\u0012\\u0002\\u00f1\\u00f2\\u0005\\u0006\\u0004\\u0002\\u00f2\\u00f5\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00f3\\u00f5\\u0005\\b\\u0005\\u0002\\u00f4\\u00f0\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00f4\\u00f3\\u0003\\u0002\\u0002\\u0002\\u00f5\\u00f6\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00f6\\u00f4\\u0003\\u0002\\u0002\\u0002\\u00f6\\u00f7\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00f7!\\u0003\\u0002\\u0002\\u0002\\u00f8\\u00fa\",\n    \"\\u0007\\u0003\\u0002\\u0002\\u00f9\\u00f8\\u0003\\u0002\\u0002\\u0002\\u00fa\\u00fd\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00fb\\u00f9\\u0003\\u0002\\u0002\\u0002\\u00fb\\u00fc\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00fc\\u00fe\\u0003\\u0002\\u0002\\u0002\\u00fd\\u00fb\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u00fe\\u0102\\u0007\\n\\u0002\\u0002\\u00ff\\u0101\",\n    \"\\t\\u0004\\u0002\\u0002\\u0100\\u00ff\\u0003\\u0002\\u0002\\u0002\\u0101\\u0104\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0102\\u0100\\u0003\\u0002\\u0002\\u0002\\u0102\\u0103\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0103#\\u0003\\u0002\\u0002\\u0002\\u0104\\u0102\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0105\\u0106\\u0005&\\u0014\\u0002\\u0106%\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0107\\u0109\\u0005*\\u0016\\u0002\\u0108\\u010a\\u0005\",\n    \"(\\u0015\\u0002\\u0109\\u0108\\u0003\\u0002\\u0002\\u0002\\u0109\\u010a\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u010a\\'\\u0003\\u0002\\u0002\\u0002\\u010b\\u010c\\u0005\",\n    \"L\\'\\u0002\\u010c\\u010d\\u0005\\u0006\\u0004\\u0002\\u010d\\u0110\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u010e\\u0110\\u0005\\b\\u0005\\u0002\\u010f\\u010b\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u010f\\u010e\\u0003\\u0002\\u0002\\u0002\\u0110\\u0111\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0111\\u010f\\u0003\\u0002\\u0002\\u0002\\u0111\\u0112\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0112)\\u0003\\u0002\\u0002\\u0002\\u0113\\u0115\\u0007\\u0003\",\n    \"\\u0002\\u0002\\u0114\\u0113\\u0003\\u0002\\u0002\\u0002\\u0115\\u0118\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0116\\u0114\\u0003\\u0002\\u0002\\u0002\\u0116\\u0117\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0117\\u0119\\u0003\\u0002\\u0002\\u0002\\u0118\\u0116\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0119\\u011d\\u0007\\f\\u0002\\u0002\\u011a\\u011c\\u0007\\u0003\",\n    \"\\u0002\\u0002\\u011b\\u011a\\u0003\\u0002\\u0002\\u0002\\u011c\\u011f\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u011d\\u011b\\u0003\\u0002\\u0002\\u0002\\u011d\\u011e\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u011e\\u0121\\u0003\\u0002\\u0002\\u0002\\u011f\\u011d\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0120\\u0122\\u00050\\u0019\\u0002\\u0121\\u0120\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0121\\u0122\\u0003\\u0002\\u0002\\u0002\\u0122\\u0126\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0123\\u0125\\u0007\\u0003\\u0002\\u0002\\u0124\\u0123\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0125\\u0128\\u0003\\u0002\\u0002\\u0002\\u0126\\u0124\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0126\\u0127\\u0003\\u0002\\u0002\\u0002\\u0127\\u012b\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0128\\u0126\\u0003\\u0002\\u0002\\u0002\\u0129\\u012c\\u00058\",\n    \"\\u001d\\u0002\\u012a\\u012c\\u0005:\\u001e\\u0002\\u012b\\u0129\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u012b\\u012a\\u0003\\u0002\\u0002\\u0002\\u012b\\u012c\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u012c\\u0130\\u0003\\u0002\\u0002\\u0002\\u012d\\u012f\\u0007\\u0003\",\n    \"\\u0002\\u0002\\u012e\\u012d\\u0003\\u0002\\u0002\\u0002\\u012f\\u0132\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0130\\u012e\\u0003\\u0002\\u0002\\u0002\\u0130\\u0131\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0131\\u0134\\u0003\\u0002\\u0002\\u0002\\u0132\\u0130\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0133\\u0135\\u00052\\u001a\\u0002\\u0134\\u0133\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0134\\u0135\\u0003\\u0002\\u0002\\u0002\\u0135\\u0139\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0136\\u0138\\u0007\\u0003\\u0002\\u0002\\u0137\\u0136\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0138\\u013b\\u0003\\u0002\\u0002\\u0002\\u0139\\u0137\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0139\\u013a\\u0003\\u0002\\u0002\\u0002\\u013a\\u013d\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u013b\\u0139\\u0003\\u0002\\u0002\\u0002\\u013c\\u013e\\u00054\",\n    \"\\u001b\\u0002\\u013d\\u013c\\u0003\\u0002\\u0002\\u0002\\u013d\\u013e\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u013e\\u0142\\u0003\\u0002\\u0002\\u0002\\u013f\\u0141\\u0007\\u0003\",\n    \"\\u0002\\u0002\\u0140\\u013f\\u0003\\u0002\\u0002\\u0002\\u0141\\u0144\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0142\\u0140\\u0003\\u0002\\u0002\\u0002\\u0142\\u0143\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0143\\u0146\\u0003\\u0002\\u0002\\u0002\\u0144\\u0142\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0145\\u0147\\u0007\\u0013\\u0002\\u0002\\u0146\\u0145\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0146\\u0147\\u0003\\u0002\\u0002\\u0002\\u0147\\u014b\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0148\\u014a\\u0007\\u0003\\u0002\\u0002\\u0149\\u0148\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u014a\\u014d\\u0003\\u0002\\u0002\\u0002\\u014b\\u0149\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u014b\\u014c\\u0003\\u0002\\u0002\\u0002\\u014c\\u0150\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u014d\\u014b\\u0003\\u0002\\u0002\\u0002\\u014e\\u0151\\u0005,\",\n    \"\\u0017\\u0002\\u014f\\u0151\\u0005.\\u0018\\u0002\\u0150\\u014e\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0150\\u014f\\u0003\\u0002\\u0002\\u0002\\u0150\\u0151\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0151\\u0152\\u0003\\u0002\\u0002\\u0002\\u0152\\u0153\\u0005\\u0006\",\n    \"\\u0004\\u0002\\u0153+\\u0003\\u0002\\u0002\\u0002\\u0154\\u0155\\u0007\\u0019\",\n    \"\\u0002\\u0002\\u0155-\\u0003\\u0002\\u0002\\u0002\\u0156\\u0157\\u0007\\u001a\",\n    \"\\u0002\\u0002\\u0157/\\u0003\\u0002\\u0002\\u0002\\u0158\\u0159\\u0007\\u0017\",\n    \"\\u0002\\u0002\\u01591\\u0003\\u0002\\u0002\\u0002\\u015a\\u015c\\u0007\\u0015\",\n    \"\\u0002\\u0002\\u015b\\u015a\\u0003\\u0002\\u0002\\u0002\\u015b\\u015c\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u015c\\u0160\\u0003\\u0002\\u0002\\u0002\\u015d\\u015f\\u0007\\u0003\",\n    \"\\u0002\\u0002\\u015e\\u015d\\u0003\\u0002\\u0002\\u0002\\u015f\\u0162\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0160\\u015e\\u0003\\u0002\\u0002\\u0002\\u0160\\u0161\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0161\\u0163\\u0003\\u0002\\u0002\\u0002\\u0162\\u0160\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0163\\u0164\\u00056\\u001c\\u0002\\u01643\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0165\\u0169\\u0007\\u0016\\u0002\\u0002\\u0166\\u0168\\u0007\\u0003\\u0002\",\n    \"\\u0002\\u0167\\u0166\\u0003\\u0002\\u0002\\u0002\\u0168\\u016b\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u0169\\u0167\\u0003\\u0002\\u0002\\u0002\\u0169\\u016a\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u016a\\u016c\\u0003\\u0002\\u0002\\u0002\\u016b\\u0169\\u0003\\u0002\\u0002\",\n    \"\\u0002\\u016c\\u016d\\u00056\\u001c\\u0002\\u016d5\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u016e\\u017f\\t\\u0005\\u0002\\u0002\\u016f\\u0171\\u0007\\u0003\\u0002\\u0002\",\n    \"\\u0170\\u016f\\u0003\\u0002\\u0002\\u0002\\u0171\\u0174\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0172\\u0170\\u0003\\u0002\\u0002\\u0002\\u0172\\u0173\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0173\\u0175\\u0003\\u0002\\u0002\\u0002\\u0174\\u0172\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0175\\u0179\\u0007\\u0014\\u0002\\u0002\\u0176\\u0178\\u0007\\u0003\\u0002\\u0002\",\n    \"\\u0177\\u0176\\u0003\\u0002\\u0002\\u0002\\u0178\\u017b\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0179\\u0177\\u0003\\u0002\\u0002\\u0002\\u0179\\u017a\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u017a\\u017c\\u0003\\u0002\\u0002\\u0002\\u017b\\u0179\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u017c\\u017e\\t\\u0005\\u0002\\u0002\\u017d\\u0172\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u017e\\u0181\\u0003\\u0002\\u0002\\u0002\\u017f\\u017d\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u017f\\u0180\\u0003\\u0002\\u0002\\u0002\\u01807\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0181\\u017f\\u0003\\u0002\\u0002\\u0002\\u0182\\u018a\\u0007\\u001b\\u0002\\u0002\",\n    \"\\u0183\\u0185\\u0007\\u0003\\u0002\\u0002\\u0184\\u0183\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0185\\u0188\\u0003\\u0002\\u0002\\u0002\\u0186\\u0184\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0186\\u0187\\u0003\\u0002\\u0002\\u0002\\u0187\\u0189\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0188\\u0186\\u0003\\u0002\\u0002\\u0002\\u0189\\u018b\\u0007\\u0018\\u0002\\u0002\",\n    \"\\u018a\\u0186\\u0003\\u0002\\u0002\\u0002\\u018a\\u018b\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u018b9\\u0003\\u0002\\u0002\\u0002\\u018c\\u0194\\u0007\\u001c\\u0002\\u0002\",\n    \"\\u018d\\u018f\\u0007\\u0003\\u0002\\u0002\\u018e\\u018d\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u018f\\u0192\\u0003\\u0002\\u0002\\u0002\\u0190\\u018e\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0190\\u0191\\u0003\\u0002\\u0002\\u0002\\u0191\\u0193\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0192\\u0190\\u0003\\u0002\\u0002\\u0002\\u0193\\u0195\\u0007\\u0018\\u0002\\u0002\",\n    \"\\u0194\\u0190\\u0003\\u0002\\u0002\\u0002\\u0194\\u0195\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0195;\\u0003\\u0002\\u0002\\u0002\\u0196\\u0197\\u0005> \\u0002\\u0197=\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0198\\u019a\\u0005@!\\u0002\\u0199\\u019b\\u0005J&\\u0002\",\n    \"\\u019a\\u0199\\u0003\\u0002\\u0002\\u0002\\u019a\\u019b\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u019b?\\u0003\\u0002\\u0002\\u0002\\u019c\\u019e\\u0007\\u0003\\u0002\\u0002\",\n    \"\\u019d\\u019c\\u0003\\u0002\\u0002\\u0002\\u019e\\u01a1\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u019f\\u019d\\u0003\\u0002\\u0002\\u0002\\u019f\\u01a0\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01a0\\u01a2\\u0003\\u0002\\u0002\\u0002\\u01a1\\u019f\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01a2\\u01a4\\u0007\\u000b\\u0002\\u0002\\u01a3\\u01a5\\u0005B\\\"\\u0002\\u01a4\",\n    \"\\u01a3\\u0003\\u0002\\u0002\\u0002\\u01a4\\u01a5\\u0003\\u0002\\u0002\\u0002\\u01a5\",\n    \"\\u01a7\\u0003\\u0002\\u0002\\u0002\\u01a6\\u01a8\\u0007\\'\\u0002\\u0002\\u01a7\",\n    \"\\u01a6\\u0003\\u0002\\u0002\\u0002\\u01a7\\u01a8\\u0003\\u0002\\u0002\\u0002\\u01a8\",\n    \"\\u01aa\\u0003\\u0002\\u0002\\u0002\\u01a9\\u01ab\\u0005D#\\u0002\\u01aa\\u01a9\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u01aa\\u01ab\\u0003\\u0002\\u0002\\u0002\\u01abA\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u01ac\\u01ae\\t\\u0006\\u0002\\u0002\\u01ad\\u01ac\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u01ae\\u01af\\u0003\\u0002\\u0002\\u0002\\u01af\\u01ad\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u01af\\u01b0\\u0003\\u0002\\u0002\\u0002\\u01b0C\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u01b1\\u01b7\\u0005F$\\u0002\\u01b2\\u01b7\\u0005\",\n    \"H%\\u0002\\u01b3\\u01b7\\u0007&\\u0002\\u0002\\u01b4\\u01b7\\u0007\\'\\u0002\\u0002\",\n    \"\\u01b5\\u01b7\\u0007\\u0003\\u0002\\u0002\\u01b6\\u01b1\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01b6\\u01b2\\u0003\\u0002\\u0002\\u0002\\u01b6\\u01b3\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01b6\\u01b4\\u0003\\u0002\\u0002\\u0002\\u01b6\\u01b5\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01b7\\u01b8\\u0003\\u0002\\u0002\\u0002\\u01b8\\u01b6\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01b8\\u01b9\\u0003\\u0002\\u0002\\u0002\\u01b9E\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01ba\\u01bb\\u0007$\\u0002\\u0002\\u01bbG\\u0003\\u0002\\u0002\\u0002\\u01bc\",\n    \"\\u01bd\\u0007%\\u0002\\u0002\\u01bdI\\u0003\\u0002\\u0002\\u0002\\u01be\\u01bf\",\n    \"\\u0005L\\'\\u0002\\u01bf\\u01c0\\u0005\\u0006\\u0004\\u0002\\u01c0\\u01c3\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01c1\\u01c3\\u0005\\b\\u0005\\u0002\\u01c2\\u01be\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01c2\\u01c1\\u0003\\u0002\\u0002\\u0002\\u01c3\\u01c4\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01c4\\u01c2\\u0003\\u0002\\u0002\\u0002\\u01c4\\u01c5\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01c5K\\u0003\\u0002\\u0002\\u0002\\u01c6\\u01c8\\u0007\",\n    \"\\u0003\\u0002\\u0002\\u01c7\\u01c6\\u0003\\u0002\\u0002\\u0002\\u01c8\\u01cb\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01c9\\u01c7\\u0003\\u0002\\u0002\\u0002\\u01c9\\u01ca\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01ca\\u01cc\\u0003\\u0002\\u0002\\u0002\\u01cb\\u01c9\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01cc\\u01d0\\u0007\\n\\u0002\\u0002\\u01cd\\u01cf\\t\\u0004\",\n    \"\\u0002\\u0002\\u01ce\\u01cd\\u0003\\u0002\\u0002\\u0002\\u01cf\\u01d2\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01d0\\u01ce\\u0003\\u0002\\u0002\\u0002\\u01d0\\u01d1\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01d1M\\u0003\\u0002\\u0002\\u0002\\u01d2\\u01d0\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01d3\\u01d4\\u0005P)\\u0002\\u01d4O\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01d5\\u01d7\\u0007\\u0003\\u0002\\u0002\\u01d6\\u01d5\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01d7\\u01da\\u0003\\u0002\\u0002\\u0002\\u01d8\\u01d6\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01d8\\u01d9\\u0003\\u0002\\u0002\\u0002\\u01d9\\u01db\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01da\\u01d8\\u0003\\u0002\\u0002\\u0002\\u01db\\u01df\\u0007\\r\\u0002\\u0002\",\n    \"\\u01dc\\u01de\\u0007\\u0003\\u0002\\u0002\\u01dd\\u01dc\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01de\\u01e1\\u0003\\u0002\\u0002\\u0002\\u01df\\u01dd\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01df\\u01e0\\u0003\\u0002\\u0002\\u0002\\u01e0Q\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u01e1\\u01df\\u0003\\u0002\\u0002\\u0002\\u01e2\\u01e3\\u0005T+\\u0002\\u01e3\",\n    \"S\\u0003\\u0002\\u0002\\u0002\\u01e4\\u01e6\\u0005V,\\u0002\\u01e5\\u01e4\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01e5\\u01e6\\u0003\\u0002\\u0002\\u0002\\u01e6\\u01e8\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u01e7\\u01e9\\u0005X-\\u0002\\u01e8\\u01e7\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01e8\\u01e9\\u0003\\u0002\\u0002\\u0002\\u01e9\\u01ea\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01ea\\u01eb\\u0005Z.\\u0002\\u01eb\\u01ec\\u0005^0\\u0002\\u01ec\",\n    \"\\u01ee\\u0005d3\\u0002\\u01ed\\u01ef\\u0005h5\\u0002\\u01ee\\u01ed\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01ee\\u01ef\\u0003\\u0002\\u0002\\u0002\\u01efU\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01f0\\u01f2\\u0007\\u0003\\u0002\\u0002\\u01f1\\u01f0\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01f2\\u01f5\\u0003\\u0002\\u0002\\u0002\\u01f3\\u01f1\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01f3\\u01f4\\u0003\\u0002\\u0002\\u0002\\u01f4\\u01f6\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01f5\\u01f3\\u0003\\u0002\\u0002\\u0002\\u01f6\\u01f7\\u0007\\u0005\",\n    \"\\u0002\\u0002\\u01f7W\\u0003\\u0002\\u0002\\u0002\\u01f8\\u01fa\\u0007\\u0003\",\n    \"\\u0002\\u0002\\u01f9\\u01f8\\u0003\\u0002\\u0002\\u0002\\u01fa\\u01fd\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01fb\\u01f9\\u0003\\u0002\\u0002\\u0002\\u01fb\\u01fc\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01fc\\u01fe\\u0003\\u0002\\u0002\\u0002\\u01fd\\u01fb\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u01fe\\u01ff\\u0007\\u000f\\u0002\\u0002\\u01ffY\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0200\\u0202\\u0007\\u0003\\u0002\\u0002\\u0201\\u0200\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0202\\u0205\\u0003\\u0002\\u0002\\u0002\\u0203\\u0201\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0203\\u0204\\u0003\\u0002\\u0002\\u0002\\u0204\\u0206\\u0003\\u0002\",\n    \"\\u0002\\u0002\\u0205\\u0203\\u0003\\u0002\\u0002\\u0002\\u0206\\u0207\\u0007\\b\",\n    \"\\u0002\\u0002\\u0207\\u0208\\u0005\\\\/\\u0002\\u0208[\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0209\\u020b\\u0007)\\u0002\\u0002\\u020a\\u0209\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u020b\\u020e\\u0003\\u0002\\u0002\\u0002\\u020c\\u020a\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u020c\\u020d\\u0003\\u0002\\u0002\\u0002\\u020d]\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u020e\\u020c\\u0003\\u0002\\u0002\\u0002\\u020f\\u0211\\u0007\\u0003\\u0002\\u0002\",\n    \"\\u0210\\u020f\\u0003\\u0002\\u0002\\u0002\\u0211\\u0214\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0212\\u0210\\u0003\\u0002\\u0002\\u0002\\u0212\\u0213\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0213\\u021b\\u0003\\u0002\\u0002\\u0002\\u0214\\u0212\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0215\\u0216\\u0005`1\\u0002\\u0216\\u0217\\u0005\\u0006\\u0004\\u0002\\u0217\",\n    \"\\u021a\\u0003\\u0002\\u0002\\u0002\\u0218\\u021a\\u0005b2\\u0002\\u0219\\u0215\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0219\\u0218\\u0003\\u0002\\u0002\\u0002\\u021a\\u021d\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u021b\\u0219\\u0003\\u0002\\u0002\\u0002\\u021b\\u021c\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u021c_\\u0003\\u0002\\u0002\\u0002\\u021d\\u021b\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u021e\\u0222\\u0007\\n\\u0002\\u0002\\u021f\\u0221\",\n    \"\\t\\u0007\\u0002\\u0002\\u0220\\u021f\\u0003\\u0002\\u0002\\u0002\\u0221\\u0224\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0222\\u0220\\u0003\\u0002\\u0002\\u0002\\u0222\\u0223\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0223a\\u0003\\u0002\\u0002\\u0002\\u0224\\u0222\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0225\\u0227\\t\\u0003\\u0002\\u0002\\u0226\\u0225\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0227\\u0228\\u0003\\u0002\\u0002\\u0002\\u0228\\u0226\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u0228\\u0229\\u0003\\u0002\\u0002\\u0002\\u0229c\",\n    \"\\u0003\\u0002\\u0002\\u0002\\u022a\\u022c\\u0005f4\\u0002\\u022b\\u022a\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u022b\\u022c\\u0003\\u0002\\u0002\\u0002\\u022c\\u022d\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u022d\\u0233\\u0005n8\\u0002\\u022e\\u0230\\u0005n8\\u0002\",\n    \"\\u022f\\u0231\\u0005f4\\u0002\\u0230\\u022f\\u0003\\u0002\\u0002\\u0002\\u0230\",\n    \"\\u0231\\u0003\\u0002\\u0002\\u0002\\u0231\\u0233\\u0003\\u0002\\u0002\\u0002\\u0232\",\n    \"\\u022b\\u0003\\u0002\\u0002\\u0002\\u0232\\u022e\\u0003\\u0002\\u0002\\u0002\\u0233\",\n    \"e\\u0003\\u0002\\u0002\\u0002\\u0234\\u0236\\u0007\\u0003\\u0002\\u0002\\u0235\",\n    \"\\u0234\\u0003\\u0002\\u0002\\u0002\\u0236\\u0239\\u0003\\u0002\\u0002\\u0002\\u0237\",\n    \"\\u0235\\u0003\\u0002\\u0002\\u0002\\u0237\\u0238\\u0003\\u0002\\u0002\\u0002\\u0238\",\n    \"\\u023a\\u0003\\u0002\\u0002\\u0002\\u0239\\u0237\\u0003\\u0002\\u0002\\u0002\\u023a\",\n    \"\\u023d\\u0007\\u000e\\u0002\\u0002\\u023b\\u023e\\u0005j6\\u0002\\u023c\\u023e\",\n    \"\\u0005l7\\u0002\\u023d\\u023b\\u0003\\u0002\\u0002\\u0002\\u023d\\u023c\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u023e\\u023f\\u0003\\u0002\\u0002\\u0002\\u023f\\u023d\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u023f\\u0240\\u0003\\u0002\\u0002\\u0002\\u0240g\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0241\\u0243\\u0007\\u0003\\u0002\\u0002\\u0242\\u0241\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0243\\u0246\\u0003\\u0002\\u0002\\u0002\\u0244\\u0242\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0244\\u0245\\u0003\\u0002\\u0002\\u0002\\u0245\\u0247\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0246\\u0244\\u0003\\u0002\\u0002\\u0002\\u0247\\u024a\\u0007\",\n    \"\\u0011\\u0002\\u0002\\u0248\\u024b\\u0005j6\\u0002\\u0249\\u024b\\u0005l7\\u0002\",\n    \"\\u024a\\u0248\\u0003\\u0002\\u0002\\u0002\\u024a\\u0249\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u024b\\u024c\\u0003\\u0002\\u0002\\u0002\\u024c\\u024a\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u024c\\u024d\\u0003\\u0002\\u0002\\u0002\\u024di\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u024e\\u0250\\u0007\\u0003\\u0002\\u0002\\u024f\\u024e\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0250\\u0253\\u0003\\u0002\\u0002\\u0002\\u0251\\u024f\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0251\\u0252\\u0003\\u0002\\u0002\\u0002\\u0252\\u0254\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0253\\u0251\\u0003\\u0002\\u0002\\u0002\\u0254\\u0258\\u0007\\n\\u0002\\u0002\",\n    \"\\u0255\\u0257\\t\\u0007\\u0002\\u0002\\u0256\\u0255\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0257\\u025a\\u0003\\u0002\\u0002\\u0002\\u0258\\u0256\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u0258\\u0259\\u0003\\u0002\\u0002\\u0002\\u0259\\u025b\\u0003\\u0002\\u0002\\u0002\",\n    \"\\u025a\\u0258\\u0003\\u0002\\u0002\\u0002\\u025b\\u025c\\u0005\\u0006\\u0004\\u0002\",\n    \"\\u025ck\\u0003\\u0002\\u0002\\u0002\\u025d\\u025f\\t\\u0003\\u0002\\u0002\\u025e\",\n    \"\\u025d\\u0003\\u0002\\u0002\\u0002\\u025f\\u0260\\u0003\\u0002\\u0002\\u0002\\u0260\",\n    \"\\u025e\\u0003\\u0002\\u0002\\u0002\\u0260\\u0261\\u0003\\u0002\\u0002\\u0002\\u0261\",\n    \"m\\u0003\\u0002\\u0002\\u0002\\u0262\\u0264\\u0007\\u0003\\u0002\\u0002\\u0263\",\n    \"\\u0262\\u0003\\u0002\\u0002\\u0002\\u0264\\u0267\\u0003\\u0002\\u0002\\u0002\\u0265\",\n    \"\\u0263\\u0003\\u0002\\u0002\\u0002\\u0265\\u0266\\u0003\\u0002\\u0002\\u0002\\u0266\",\n    \"\\u0268\\u0003\\u0002\\u0002\\u0002\\u0267\\u0265\\u0003\\u0002\\u0002\\u0002\\u0268\",\n    \"\\u0269\\u0007\\u0010\\u0002\\u0002\\u0269o\\u0003\\u0002\\u0002\\u0002\\u026a\",\n    \"\\u026b\\u0005r:\\u0002\\u026bq\\u0003\\u0002\\u0002\\u0002\\u026c\\u026e\\u0007\",\n    \"\\u0003\\u0002\\u0002\\u026d\\u026c\\u0003\\u0002\\u0002\\u0002\\u026e\\u0271\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u026f\\u026d\\u0003\\u0002\\u0002\\u0002\\u026f\\u0270\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0270\\u0272\\u0003\\u0002\\u0002\\u0002\\u0271\\u026f\\u0003\",\n    \"\\u0002\\u0002\\u0002\\u0272\\u0273\\u0007\\u0006\\u0002\\u0002\\u0273s\\u0003\",\n    \"\\u0002\\u0002\\u0002[w\\u0083\\u0088\\u0090\\u0098\\u009f\\u00a7\\u00a9\\u00b1\",\n    \"\\u00b7\\u00bc\\u00c6\\u00cb\\u00d0\\u00d5\\u00dd\\u00df\\u00e5\\u00ed\\u00f4\\u00f6\",\n    \"\\u00fb\\u0102\\u0109\\u010f\\u0111\\u0116\\u011d\\u0121\\u0126\\u012b\\u0130\\u0134\",\n    \"\\u0139\\u013d\\u0142\\u0146\\u014b\\u0150\\u015b\\u0160\\u0169\\u0172\\u0179\\u017f\",\n    \"\\u0186\\u018a\\u0190\\u0194\\u019a\\u019f\\u01a4\\u01a7\\u01aa\\u01af\\u01b6\\u01b8\",\n    \"\\u01c2\\u01c4\\u01c9\\u01d0\\u01d8\\u01df\\u01e5\\u01e8\\u01ee\\u01f3\\u01fb\\u0203\",\n    \"\\u020c\\u0212\\u0219\\u021b\\u0222\\u0228\\u022b\\u0230\\u0232\\u0237\\u023d\\u023f\",\n    \"\\u0244\\u024a\\u024c\\u0251\\u0258\\u0260\\u0265\\u026f\"].join(\"\");\n\n\nvar atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);\n\nvar decisionsToDFA = atn.decisionToState.map( function(ds, index) { return new antlr4.dfa.DFA(ds, index); });\n\nvar sharedContextCache = new antlr4.PredictionContextCache();\n\nvar literalNames = [ null, null, null, null, null, null, null, null, null, \n                     \"'$'\", \"'@'\", null, null, null, null, null, null, \"'='\", \n                     \"','\", null, null, null, null, null, null, null, null, \n                     null, null, \"'.'\", null, null, null, null, null, null, \n                     null, \"':'\" ];\n\nvar symbolicNames = [ null, \"WS\", \"NEWLINE\", \"QNA_SOURCE_INFO\", \"MODEL_INFO\", \n                      \"COMMENT\", \"QNA\", \"HASH\", \"DASH\", \"DOLLAR\", \"AT\", \n                      \"IMPORT\", \"FILTER_MARK\", \"QNA_ID_MARK\", \"MULTI_LINE_TEXT\", \n                      \"PROMPT_MARK\", \"INVALID_TOKEN_DEFAULT_MODE\", \"EQUAL\", \n                      \"COMMA\", \"HAS_ROLES_LABEL\", \"HAS_FEATURES_LABEL\", \n                      \"NEW_ENTITY_TYPE_IDENTIFIER\", \"PHRASE_LIST_LABEL\", \n                      \"NEW_COMPOSITE_ENTITY\", \"NEW_REGEX_ENTITY\", \"NEW_ENTITY_IDENTIFIER\", \n                      \"NEW_ENTITY_IDENTIFIER_WITH_WS\", \"NEWLINE_IN_NAME\", \n                      \"IDENTIFIER\", \"DOT\", \"ESCAPE_CHARACTER\", \"EXPRESSION\", \n                      \"TEXT\", \"NEWLINE_IN_ENTITY\", \"COMPOSITE_ENTITY\", \"REGEX_ENTITY\", \n                      \"ENTITY_TEXT\", \"COLON_MARK\", \"NEWLINE_IN_QNA\", \"QNA_TEXT\" ];\n\nvar ruleNames =  [ \"file\", \"paragraph\", \"newline\", \"errorString\", \"nestedIntentSection\", \n                   \"nestedIntentNameLine\", \"nestedIntentName\", \"nameIdentifier\", \n                   \"nestedIntentBodyDefinition\", \"subIntentDefinition\", \n                   \"simpleIntentSection\", \"intentDefinition\", \"intentNameLine\", \n                   \"intentName\", \"intentBody\", \"normalIntentBody\", \"normalIntentString\", \n                   \"newEntitySection\", \"newEntityDefinition\", \"newEntityListbody\", \n                   \"newEntityLine\", \"newCompositeDefinition\", \"newRegexDefinition\", \n                   \"newEntityType\", \"newEntityRoles\", \"newEntityUsesFeatures\", \n                   \"newEntityRoleOrFeatures\", \"newEntityName\", \"newEntityNameWithWS\", \n                   \"entitySection\", \"entityDefinition\", \"entityLine\", \"entityName\", \n                   \"entityType\", \"compositeEntityIdentifier\", \"regexEntityIdentifier\", \n                   \"entityListBody\", \"normalItemString\", \"importSection\", \n                   \"importDefinition\", \"qnaSection\", \"qnaDefinition\", \"qnaSourceInfo\", \n                   \"qnaIdMark\", \"qnaQuestion\", \"questionText\", \"moreQuestionsBody\", \n                   \"moreQuestion\", \"errorQuestionString\", \"qnaAnswerBody\", \n                   \"filterSection\", \"promptSection\", \"filterLine\", \"errorFilterLine\", \n                   \"multiLineAnswer\", \"modelInfoSection\", \"modelInfoDefinition\" ];\n\nfunction LUFileParser (input) {\n\tantlr4.Parser.call(this, input);\n    this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache);\n    this.ruleNames = ruleNames;\n    this.literalNames = literalNames;\n    this.symbolicNames = symbolicNames;\n    return this;\n}\n\nLUFileParser.prototype = Object.create(antlr4.Parser.prototype);\nLUFileParser.prototype.constructor = LUFileParser;\n\nObject.defineProperty(LUFileParser.prototype, \"atn\", {\n\tget : function() {\n\t\treturn atn;\n\t}\n});\n\nLUFileParser.EOF = antlr4.Token.EOF;\nLUFileParser.WS = 1;\nLUFileParser.NEWLINE = 2;\nLUFileParser.QNA_SOURCE_INFO = 3;\nLUFileParser.MODEL_INFO = 4;\nLUFileParser.COMMENT = 5;\nLUFileParser.QNA = 6;\nLUFileParser.HASH = 7;\nLUFileParser.DASH = 8;\nLUFileParser.DOLLAR = 9;\nLUFileParser.AT = 10;\nLUFileParser.IMPORT = 11;\nLUFileParser.FILTER_MARK = 12;\nLUFileParser.QNA_ID_MARK = 13;\nLUFileParser.MULTI_LINE_TEXT = 14;\nLUFileParser.PROMPT_MARK = 15;\nLUFileParser.INVALID_TOKEN_DEFAULT_MODE = 16;\nLUFileParser.EQUAL = 17;\nLUFileParser.COMMA = 18;\nLUFileParser.HAS_ROLES_LABEL = 19;\nLUFileParser.HAS_FEATURES_LABEL = 20;\nLUFileParser.NEW_ENTITY_TYPE_IDENTIFIER = 21;\nLUFileParser.PHRASE_LIST_LABEL = 22;\nLUFileParser.NEW_COMPOSITE_ENTITY = 23;\nLUFileParser.NEW_REGEX_ENTITY = 24;\nLUFileParser.NEW_ENTITY_IDENTIFIER = 25;\nLUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS = 26;\nLUFileParser.NEWLINE_IN_NAME = 27;\nLUFileParser.IDENTIFIER = 28;\nLUFileParser.DOT = 29;\nLUFileParser.ESCAPE_CHARACTER = 30;\nLUFileParser.EXPRESSION = 31;\nLUFileParser.TEXT = 32;\nLUFileParser.NEWLINE_IN_ENTITY = 33;\nLUFileParser.COMPOSITE_ENTITY = 34;\nLUFileParser.REGEX_ENTITY = 35;\nLUFileParser.ENTITY_TEXT = 36;\nLUFileParser.COLON_MARK = 37;\nLUFileParser.NEWLINE_IN_QNA = 38;\nLUFileParser.QNA_TEXT = 39;\n\nLUFileParser.RULE_file = 0;\nLUFileParser.RULE_paragraph = 1;\nLUFileParser.RULE_newline = 2;\nLUFileParser.RULE_errorString = 3;\nLUFileParser.RULE_nestedIntentSection = 4;\nLUFileParser.RULE_nestedIntentNameLine = 5;\nLUFileParser.RULE_nestedIntentName = 6;\nLUFileParser.RULE_nameIdentifier = 7;\nLUFileParser.RULE_nestedIntentBodyDefinition = 8;\nLUFileParser.RULE_subIntentDefinition = 9;\nLUFileParser.RULE_simpleIntentSection = 10;\nLUFileParser.RULE_intentDefinition = 11;\nLUFileParser.RULE_intentNameLine = 12;\nLUFileParser.RULE_intentName = 13;\nLUFileParser.RULE_intentBody = 14;\nLUFileParser.RULE_normalIntentBody = 15;\nLUFileParser.RULE_normalIntentString = 16;\nLUFileParser.RULE_newEntitySection = 17;\nLUFileParser.RULE_newEntityDefinition = 18;\nLUFileParser.RULE_newEntityListbody = 19;\nLUFileParser.RULE_newEntityLine = 20;\nLUFileParser.RULE_newCompositeDefinition = 21;\nLUFileParser.RULE_newRegexDefinition = 22;\nLUFileParser.RULE_newEntityType = 23;\nLUFileParser.RULE_newEntityRoles = 24;\nLUFileParser.RULE_newEntityUsesFeatures = 25;\nLUFileParser.RULE_newEntityRoleOrFeatures = 26;\nLUFileParser.RULE_newEntityName = 27;\nLUFileParser.RULE_newEntityNameWithWS = 28;\nLUFileParser.RULE_entitySection = 29;\nLUFileParser.RULE_entityDefinition = 30;\nLUFileParser.RULE_entityLine = 31;\nLUFileParser.RULE_entityName = 32;\nLUFileParser.RULE_entityType = 33;\nLUFileParser.RULE_compositeEntityIdentifier = 34;\nLUFileParser.RULE_regexEntityIdentifier = 35;\nLUFileParser.RULE_entityListBody = 36;\nLUFileParser.RULE_normalItemString = 37;\nLUFileParser.RULE_importSection = 38;\nLUFileParser.RULE_importDefinition = 39;\nLUFileParser.RULE_qnaSection = 40;\nLUFileParser.RULE_qnaDefinition = 41;\nLUFileParser.RULE_qnaSourceInfo = 42;\nLUFileParser.RULE_qnaIdMark = 43;\nLUFileParser.RULE_qnaQuestion = 44;\nLUFileParser.RULE_questionText = 45;\nLUFileParser.RULE_moreQuestionsBody = 46;\nLUFileParser.RULE_moreQuestion = 47;\nLUFileParser.RULE_errorQuestionString = 48;\nLUFileParser.RULE_qnaAnswerBody = 49;\nLUFileParser.RULE_filterSection = 50;\nLUFileParser.RULE_promptSection = 51;\nLUFileParser.RULE_filterLine = 52;\nLUFileParser.RULE_errorFilterLine = 53;\nLUFileParser.RULE_multiLineAnswer = 54;\nLUFileParser.RULE_modelInfoSection = 55;\nLUFileParser.RULE_modelInfoDefinition = 56;\n\n\nfunction FileContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_file;\n    return this;\n}\n\nFileContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFileContext.prototype.constructor = FileContext;\n\nFileContext.prototype.EOF = function() {\n    return this.getToken(LUFileParser.EOF, 0);\n};\n\nFileContext.prototype.paragraph = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ParagraphContext);\n    } else {\n        return this.getTypedRuleContext(ParagraphContext,i);\n    }\n};\n\nFileContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterFile(this);\n\t}\n};\n\nFileContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitFile(this);\n\t}\n};\n\nFileContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitFile(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.FileContext = FileContext;\n\nLUFileParser.prototype.file = function() {\n\n    var localctx = new FileContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 0, LUFileParser.RULE_file);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 115; \n        this._errHandler.sync(this);\n        var _alt = 1+1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1+1:\n        \t\tthis.state = 114;\n        \t\tthis.paragraph();\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 117; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,0, this._ctx);\n        } while ( _alt!=1 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n        this.state = 119;\n        this.match(LUFileParser.EOF);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ParagraphContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_paragraph;\n    return this;\n}\n\nParagraphContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nParagraphContext.prototype.constructor = ParagraphContext;\n\nParagraphContext.prototype.newline = function() {\n    return this.getTypedRuleContext(NewlineContext,0);\n};\n\nParagraphContext.prototype.nestedIntentSection = function() {\n    return this.getTypedRuleContext(NestedIntentSectionContext,0);\n};\n\nParagraphContext.prototype.simpleIntentSection = function() {\n    return this.getTypedRuleContext(SimpleIntentSectionContext,0);\n};\n\nParagraphContext.prototype.entitySection = function() {\n    return this.getTypedRuleContext(EntitySectionContext,0);\n};\n\nParagraphContext.prototype.newEntitySection = function() {\n    return this.getTypedRuleContext(NewEntitySectionContext,0);\n};\n\nParagraphContext.prototype.importSection = function() {\n    return this.getTypedRuleContext(ImportSectionContext,0);\n};\n\nParagraphContext.prototype.qnaSection = function() {\n    return this.getTypedRuleContext(QnaSectionContext,0);\n};\n\nParagraphContext.prototype.modelInfoSection = function() {\n    return this.getTypedRuleContext(ModelInfoSectionContext,0);\n};\n\nParagraphContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterParagraph(this);\n\t}\n};\n\nParagraphContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitParagraph(this);\n\t}\n};\n\nParagraphContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitParagraph(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ParagraphContext = ParagraphContext;\n\nLUFileParser.prototype.paragraph = function() {\n\n    var localctx = new ParagraphContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 2, LUFileParser.RULE_paragraph);\n    try {\n        this.state = 129;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,1,this._ctx);\n        switch(la_) {\n        case 1:\n            this.enterOuterAlt(localctx, 1);\n            this.state = 121;\n            this.newline();\n            break;\n\n        case 2:\n            this.enterOuterAlt(localctx, 2);\n            this.state = 122;\n            this.nestedIntentSection();\n            break;\n\n        case 3:\n            this.enterOuterAlt(localctx, 3);\n            this.state = 123;\n            this.simpleIntentSection();\n            break;\n\n        case 4:\n            this.enterOuterAlt(localctx, 4);\n            this.state = 124;\n            this.entitySection();\n            break;\n\n        case 5:\n            this.enterOuterAlt(localctx, 5);\n            this.state = 125;\n            this.newEntitySection();\n            break;\n\n        case 6:\n            this.enterOuterAlt(localctx, 6);\n            this.state = 126;\n            this.importSection();\n            break;\n\n        case 7:\n            this.enterOuterAlt(localctx, 7);\n            this.state = 127;\n            this.qnaSection();\n            break;\n\n        case 8:\n            this.enterOuterAlt(localctx, 8);\n            this.state = 128;\n            this.modelInfoSection();\n            break;\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewlineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newline;\n    return this;\n}\n\nNewlineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewlineContext.prototype.constructor = NewlineContext;\n\nNewlineContext.prototype.NEWLINE = function() {\n    return this.getToken(LUFileParser.NEWLINE, 0);\n};\n\nNewlineContext.prototype.EOF = function() {\n    return this.getToken(LUFileParser.EOF, 0);\n};\n\nNewlineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewlineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewline(this);\n\t}\n};\n\nNewlineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewline(this);\n\t}\n};\n\nNewlineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewline(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewlineContext = NewlineContext;\n\nLUFileParser.prototype.newline = function() {\n\n    var localctx = new NewlineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 4, LUFileParser.RULE_newline);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 134;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 131;\n            this.match(LUFileParser.WS);\n            this.state = 136;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 137;\n        _la = this._input.LA(1);\n        if(!(_la===LUFileParser.EOF || _la===LUFileParser.NEWLINE)) {\n        this._errHandler.recoverInline(this);\n        }\n        else {\n        \tthis._errHandler.reportMatch(this);\n            this.consume();\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ErrorStringContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_errorString;\n    return this;\n}\n\nErrorStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nErrorStringContext.prototype.constructor = ErrorStringContext;\n\nErrorStringContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nErrorStringContext.prototype.INVALID_TOKEN_DEFAULT_MODE = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.INVALID_TOKEN_DEFAULT_MODE);\n    } else {\n        return this.getToken(LUFileParser.INVALID_TOKEN_DEFAULT_MODE, i);\n    }\n};\n\n\nErrorStringContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterErrorString(this);\n\t}\n};\n\nErrorStringContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitErrorString(this);\n\t}\n};\n\nErrorStringContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitErrorString(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ErrorStringContext = ErrorStringContext;\n\nLUFileParser.prototype.errorString = function() {\n\n    var localctx = new ErrorStringContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 6, LUFileParser.RULE_errorString);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 140; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 139;\n        \t\t_la = this._input.LA(1);\n        \t\tif(!(_la===LUFileParser.WS || _la===LUFileParser.INVALID_TOKEN_DEFAULT_MODE)) {\n        \t\tthis._errHandler.recoverInline(this);\n        \t\t}\n        \t\telse {\n        \t\t\tthis._errHandler.reportMatch(this);\n        \t\t    this.consume();\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 142; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,3, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NestedIntentSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_nestedIntentSection;\n    return this;\n}\n\nNestedIntentSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNestedIntentSectionContext.prototype.constructor = NestedIntentSectionContext;\n\nNestedIntentSectionContext.prototype.nestedIntentNameLine = function() {\n    return this.getTypedRuleContext(NestedIntentNameLineContext,0);\n};\n\nNestedIntentSectionContext.prototype.nestedIntentBodyDefinition = function() {\n    return this.getTypedRuleContext(NestedIntentBodyDefinitionContext,0);\n};\n\nNestedIntentSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNestedIntentSection(this);\n\t}\n};\n\nNestedIntentSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNestedIntentSection(this);\n\t}\n};\n\nNestedIntentSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNestedIntentSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NestedIntentSectionContext = NestedIntentSectionContext;\n\nLUFileParser.prototype.nestedIntentSection = function() {\n\n    var localctx = new NestedIntentSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 8, LUFileParser.RULE_nestedIntentSection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 144;\n        this.nestedIntentNameLine();\n        this.state = 145;\n        this.nestedIntentBodyDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NestedIntentNameLineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_nestedIntentNameLine;\n    return this;\n}\n\nNestedIntentNameLineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNestedIntentNameLineContext.prototype.constructor = NestedIntentNameLineContext;\n\nNestedIntentNameLineContext.prototype.HASH = function() {\n    return this.getToken(LUFileParser.HASH, 0);\n};\n\nNestedIntentNameLineContext.prototype.nestedIntentName = function() {\n    return this.getTypedRuleContext(NestedIntentNameContext,0);\n};\n\nNestedIntentNameLineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNestedIntentNameLineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNestedIntentNameLine(this);\n\t}\n};\n\nNestedIntentNameLineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNestedIntentNameLine(this);\n\t}\n};\n\nNestedIntentNameLineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNestedIntentNameLine(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NestedIntentNameLineContext = NestedIntentNameLineContext;\n\nLUFileParser.prototype.nestedIntentNameLine = function() {\n\n    var localctx = new NestedIntentNameLineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 10, LUFileParser.RULE_nestedIntentNameLine);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 150;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 147;\n            this.match(LUFileParser.WS);\n            this.state = 152;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 153;\n        this.match(LUFileParser.HASH);\n        this.state = 157;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 154;\n            this.match(LUFileParser.WS);\n            this.state = 159;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 160;\n        this.nestedIntentName();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NestedIntentNameContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_nestedIntentName;\n    return this;\n}\n\nNestedIntentNameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNestedIntentNameContext.prototype.constructor = NestedIntentNameContext;\n\nNestedIntentNameContext.prototype.nameIdentifier = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NameIdentifierContext);\n    } else {\n        return this.getTypedRuleContext(NameIdentifierContext,i);\n    }\n};\n\nNestedIntentNameContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNestedIntentNameContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNestedIntentName(this);\n\t}\n};\n\nNestedIntentNameContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNestedIntentName(this);\n\t}\n};\n\nNestedIntentNameContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNestedIntentName(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NestedIntentNameContext = NestedIntentNameContext;\n\nLUFileParser.prototype.nestedIntentName = function() {\n\n    var localctx = new NestedIntentNameContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 12, LUFileParser.RULE_nestedIntentName);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 162;\n        this.nameIdentifier();\n        this.state = 167;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,7,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 165;\n                this._errHandler.sync(this);\n                switch(this._input.LA(1)) {\n                case LUFileParser.WS:\n                    this.state = 163;\n                    this.match(LUFileParser.WS);\n                    break;\n                case LUFileParser.IDENTIFIER:\n                    this.state = 164;\n                    this.nameIdentifier();\n                    break;\n                default:\n                    throw new antlr4.error.NoViableAltException(this);\n                } \n            }\n            this.state = 169;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,7,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NameIdentifierContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_nameIdentifier;\n    return this;\n}\n\nNameIdentifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNameIdentifierContext.prototype.constructor = NameIdentifierContext;\n\nNameIdentifierContext.prototype.IDENTIFIER = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.IDENTIFIER);\n    } else {\n        return this.getToken(LUFileParser.IDENTIFIER, i);\n    }\n};\n\n\nNameIdentifierContext.prototype.DOT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.DOT);\n    } else {\n        return this.getToken(LUFileParser.DOT, i);\n    }\n};\n\n\nNameIdentifierContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNameIdentifier(this);\n\t}\n};\n\nNameIdentifierContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNameIdentifier(this);\n\t}\n};\n\nNameIdentifierContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNameIdentifier(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NameIdentifierContext = NameIdentifierContext;\n\nLUFileParser.prototype.nameIdentifier = function() {\n\n    var localctx = new NameIdentifierContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 14, LUFileParser.RULE_nameIdentifier);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 170;\n        this.match(LUFileParser.IDENTIFIER);\n        this.state = 175;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.DOT) {\n            this.state = 171;\n            this.match(LUFileParser.DOT);\n            this.state = 172;\n            this.match(LUFileParser.IDENTIFIER);\n            this.state = 177;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NestedIntentBodyDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_nestedIntentBodyDefinition;\n    return this;\n}\n\nNestedIntentBodyDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNestedIntentBodyDefinitionContext.prototype.constructor = NestedIntentBodyDefinitionContext;\n\nNestedIntentBodyDefinitionContext.prototype.subIntentDefinition = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(SubIntentDefinitionContext);\n    } else {\n        return this.getTypedRuleContext(SubIntentDefinitionContext,i);\n    }\n};\n\nNestedIntentBodyDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNestedIntentBodyDefinition(this);\n\t}\n};\n\nNestedIntentBodyDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNestedIntentBodyDefinition(this);\n\t}\n};\n\nNestedIntentBodyDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNestedIntentBodyDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NestedIntentBodyDefinitionContext = NestedIntentBodyDefinitionContext;\n\nLUFileParser.prototype.nestedIntentBodyDefinition = function() {\n\n    var localctx = new NestedIntentBodyDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 16, LUFileParser.RULE_nestedIntentBodyDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 179; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 178;\n        \t\tthis.subIntentDefinition();\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 181; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,9, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction SubIntentDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_subIntentDefinition;\n    return this;\n}\n\nSubIntentDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nSubIntentDefinitionContext.prototype.constructor = SubIntentDefinitionContext;\n\nSubIntentDefinitionContext.prototype.HASH = function() {\n    return this.getToken(LUFileParser.HASH, 0);\n};\n\nSubIntentDefinitionContext.prototype.simpleIntentSection = function() {\n    return this.getTypedRuleContext(SimpleIntentSectionContext,0);\n};\n\nSubIntentDefinitionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nSubIntentDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterSubIntentDefinition(this);\n\t}\n};\n\nSubIntentDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitSubIntentDefinition(this);\n\t}\n};\n\nSubIntentDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitSubIntentDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.SubIntentDefinitionContext = SubIntentDefinitionContext;\n\nLUFileParser.prototype.subIntentDefinition = function() {\n\n    var localctx = new SubIntentDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 18, LUFileParser.RULE_subIntentDefinition);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 186;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 183;\n            this.match(LUFileParser.WS);\n            this.state = 188;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 189;\n        this.match(LUFileParser.HASH);\n        this.state = 190;\n        this.simpleIntentSection();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction SimpleIntentSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_simpleIntentSection;\n    return this;\n}\n\nSimpleIntentSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nSimpleIntentSectionContext.prototype.constructor = SimpleIntentSectionContext;\n\nSimpleIntentSectionContext.prototype.intentDefinition = function() {\n    return this.getTypedRuleContext(IntentDefinitionContext,0);\n};\n\nSimpleIntentSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterSimpleIntentSection(this);\n\t}\n};\n\nSimpleIntentSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitSimpleIntentSection(this);\n\t}\n};\n\nSimpleIntentSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitSimpleIntentSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.SimpleIntentSectionContext = SimpleIntentSectionContext;\n\nLUFileParser.prototype.simpleIntentSection = function() {\n\n    var localctx = new SimpleIntentSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 20, LUFileParser.RULE_simpleIntentSection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 192;\n        this.intentDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction IntentDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_intentDefinition;\n    return this;\n}\n\nIntentDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nIntentDefinitionContext.prototype.constructor = IntentDefinitionContext;\n\nIntentDefinitionContext.prototype.intentNameLine = function() {\n    return this.getTypedRuleContext(IntentNameLineContext,0);\n};\n\nIntentDefinitionContext.prototype.intentBody = function() {\n    return this.getTypedRuleContext(IntentBodyContext,0);\n};\n\nIntentDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterIntentDefinition(this);\n\t}\n};\n\nIntentDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitIntentDefinition(this);\n\t}\n};\n\nIntentDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitIntentDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.IntentDefinitionContext = IntentDefinitionContext;\n\nLUFileParser.prototype.intentDefinition = function() {\n\n    var localctx = new IntentDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 22, LUFileParser.RULE_intentDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 194;\n        this.intentNameLine();\n        this.state = 196;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,11,this._ctx);\n        if(la_===1) {\n            this.state = 195;\n            this.intentBody();\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction IntentNameLineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_intentNameLine;\n    return this;\n}\n\nIntentNameLineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nIntentNameLineContext.prototype.constructor = IntentNameLineContext;\n\nIntentNameLineContext.prototype.HASH = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.HASH);\n    } else {\n        return this.getToken(LUFileParser.HASH, i);\n    }\n};\n\n\nIntentNameLineContext.prototype.intentName = function() {\n    return this.getTypedRuleContext(IntentNameContext,0);\n};\n\nIntentNameLineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nIntentNameLineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterIntentNameLine(this);\n\t}\n};\n\nIntentNameLineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitIntentNameLine(this);\n\t}\n};\n\nIntentNameLineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitIntentNameLine(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.IntentNameLineContext = IntentNameLineContext;\n\nLUFileParser.prototype.intentNameLine = function() {\n\n    var localctx = new IntentNameLineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 24, LUFileParser.RULE_intentNameLine);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 201;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 198;\n            this.match(LUFileParser.WS);\n            this.state = 203;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 204;\n        this.match(LUFileParser.HASH);\n        this.state = 206;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if(_la===LUFileParser.HASH) {\n            this.state = 205;\n            this.match(LUFileParser.HASH);\n        }\n\n        this.state = 211;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 208;\n            this.match(LUFileParser.WS);\n            this.state = 213;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 214;\n        this.intentName();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction IntentNameContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_intentName;\n    return this;\n}\n\nIntentNameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nIntentNameContext.prototype.constructor = IntentNameContext;\n\nIntentNameContext.prototype.nameIdentifier = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NameIdentifierContext);\n    } else {\n        return this.getTypedRuleContext(NameIdentifierContext,i);\n    }\n};\n\nIntentNameContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nIntentNameContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterIntentName(this);\n\t}\n};\n\nIntentNameContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitIntentName(this);\n\t}\n};\n\nIntentNameContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitIntentName(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.IntentNameContext = IntentNameContext;\n\nLUFileParser.prototype.intentName = function() {\n\n    var localctx = new IntentNameContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 26, LUFileParser.RULE_intentName);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 216;\n        this.nameIdentifier();\n        this.state = 221;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,16,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 219;\n                this._errHandler.sync(this);\n                switch(this._input.LA(1)) {\n                case LUFileParser.WS:\n                    this.state = 217;\n                    this.match(LUFileParser.WS);\n                    break;\n                case LUFileParser.IDENTIFIER:\n                    this.state = 218;\n                    this.nameIdentifier();\n                    break;\n                default:\n                    throw new antlr4.error.NoViableAltException(this);\n                } \n            }\n            this.state = 223;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,16,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction IntentBodyContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_intentBody;\n    return this;\n}\n\nIntentBodyContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nIntentBodyContext.prototype.constructor = IntentBodyContext;\n\nIntentBodyContext.prototype.normalIntentBody = function() {\n    return this.getTypedRuleContext(NormalIntentBodyContext,0);\n};\n\nIntentBodyContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nIntentBodyContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterIntentBody(this);\n\t}\n};\n\nIntentBodyContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitIntentBody(this);\n\t}\n};\n\nIntentBodyContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitIntentBody(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.IntentBodyContext = IntentBodyContext;\n\nLUFileParser.prototype.intentBody = function() {\n\n    var localctx = new IntentBodyContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 28, LUFileParser.RULE_intentBody);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 227;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,17,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 224;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 229;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,17,this._ctx);\n        }\n\n        this.state = 230;\n        this.normalIntentBody();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NormalIntentBodyContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_normalIntentBody;\n    return this;\n}\n\nNormalIntentBodyContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNormalIntentBodyContext.prototype.constructor = NormalIntentBodyContext;\n\nNormalIntentBodyContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNormalIntentBodyContext.prototype.errorString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ErrorStringContext);\n    } else {\n        return this.getTypedRuleContext(ErrorStringContext,i);\n    }\n};\n\nNormalIntentBodyContext.prototype.normalIntentString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NormalIntentStringContext);\n    } else {\n        return this.getTypedRuleContext(NormalIntentStringContext,i);\n    }\n};\n\nNormalIntentBodyContext.prototype.newline = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NewlineContext);\n    } else {\n        return this.getTypedRuleContext(NewlineContext,i);\n    }\n};\n\nNormalIntentBodyContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNormalIntentBody(this);\n\t}\n};\n\nNormalIntentBodyContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNormalIntentBody(this);\n\t}\n};\n\nNormalIntentBodyContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNormalIntentBody(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NormalIntentBodyContext = NormalIntentBodyContext;\n\nLUFileParser.prototype.normalIntentBody = function() {\n\n    var localctx = new NormalIntentBodyContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 30, LUFileParser.RULE_normalIntentBody);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 235;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,18,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 232;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 237;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,18,this._ctx);\n        }\n\n        this.state = 242; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 242;\n        \t\tthis._errHandler.sync(this);\n        \t\tvar la_ = this._interp.adaptivePredict(this._input,19,this._ctx);\n        \t\tswitch(la_) {\n        \t\tcase 1:\n        \t\t    this.state = 238;\n        \t\t    this.normalIntentString();\n        \t\t    this.state = 239;\n        \t\t    this.newline();\n        \t\t    break;\n\n        \t\tcase 2:\n        \t\t    this.state = 241;\n        \t\t    this.errorString();\n        \t\t    break;\n\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 244; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,20, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NormalIntentStringContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_normalIntentString;\n    return this;\n}\n\nNormalIntentStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNormalIntentStringContext.prototype.constructor = NormalIntentStringContext;\n\nNormalIntentStringContext.prototype.DASH = function() {\n    return this.getToken(LUFileParser.DASH, 0);\n};\n\nNormalIntentStringContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNormalIntentStringContext.prototype.TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.TEXT);\n    } else {\n        return this.getToken(LUFileParser.TEXT, i);\n    }\n};\n\n\nNormalIntentStringContext.prototype.EXPRESSION = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.EXPRESSION);\n    } else {\n        return this.getToken(LUFileParser.EXPRESSION, i);\n    }\n};\n\n\nNormalIntentStringContext.prototype.ESCAPE_CHARACTER = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.ESCAPE_CHARACTER);\n    } else {\n        return this.getToken(LUFileParser.ESCAPE_CHARACTER, i);\n    }\n};\n\n\nNormalIntentStringContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNormalIntentString(this);\n\t}\n};\n\nNormalIntentStringContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNormalIntentString(this);\n\t}\n};\n\nNormalIntentStringContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNormalIntentString(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NormalIntentStringContext = NormalIntentStringContext;\n\nLUFileParser.prototype.normalIntentString = function() {\n\n    var localctx = new NormalIntentStringContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 32, LUFileParser.RULE_normalIntentString);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 249;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 246;\n            this.match(LUFileParser.WS);\n            this.state = 251;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 252;\n        this.match(LUFileParser.DASH);\n        this.state = 256;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,22,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 253;\n                _la = this._input.LA(1);\n                if(!(((((_la - 1)) & ~0x1f) == 0 && ((1 << (_la - 1)) & ((1 << (LUFileParser.WS - 1)) | (1 << (LUFileParser.ESCAPE_CHARACTER - 1)) | (1 << (LUFileParser.EXPRESSION - 1)) | (1 << (LUFileParser.TEXT - 1)))) !== 0))) {\n                this._errHandler.recoverInline(this);\n                }\n                else {\n                \tthis._errHandler.reportMatch(this);\n                    this.consume();\n                } \n            }\n            this.state = 258;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,22,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntitySectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntitySection;\n    return this;\n}\n\nNewEntitySectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntitySectionContext.prototype.constructor = NewEntitySectionContext;\n\nNewEntitySectionContext.prototype.newEntityDefinition = function() {\n    return this.getTypedRuleContext(NewEntityDefinitionContext,0);\n};\n\nNewEntitySectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntitySection(this);\n\t}\n};\n\nNewEntitySectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntitySection(this);\n\t}\n};\n\nNewEntitySectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntitySection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntitySectionContext = NewEntitySectionContext;\n\nLUFileParser.prototype.newEntitySection = function() {\n\n    var localctx = new NewEntitySectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 34, LUFileParser.RULE_newEntitySection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 259;\n        this.newEntityDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityDefinition;\n    return this;\n}\n\nNewEntityDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityDefinitionContext.prototype.constructor = NewEntityDefinitionContext;\n\nNewEntityDefinitionContext.prototype.newEntityLine = function() {\n    return this.getTypedRuleContext(NewEntityLineContext,0);\n};\n\nNewEntityDefinitionContext.prototype.newEntityListbody = function() {\n    return this.getTypedRuleContext(NewEntityListbodyContext,0);\n};\n\nNewEntityDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityDefinition(this);\n\t}\n};\n\nNewEntityDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityDefinition(this);\n\t}\n};\n\nNewEntityDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityDefinitionContext = NewEntityDefinitionContext;\n\nLUFileParser.prototype.newEntityDefinition = function() {\n\n    var localctx = new NewEntityDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 36, LUFileParser.RULE_newEntityDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 261;\n        this.newEntityLine();\n        this.state = 263;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,23,this._ctx);\n        if(la_===1) {\n            this.state = 262;\n            this.newEntityListbody();\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityListbodyContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityListbody;\n    return this;\n}\n\nNewEntityListbodyContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityListbodyContext.prototype.constructor = NewEntityListbodyContext;\n\nNewEntityListbodyContext.prototype.errorString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ErrorStringContext);\n    } else {\n        return this.getTypedRuleContext(ErrorStringContext,i);\n    }\n};\n\nNewEntityListbodyContext.prototype.normalItemString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NormalItemStringContext);\n    } else {\n        return this.getTypedRuleContext(NormalItemStringContext,i);\n    }\n};\n\nNewEntityListbodyContext.prototype.newline = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NewlineContext);\n    } else {\n        return this.getTypedRuleContext(NewlineContext,i);\n    }\n};\n\nNewEntityListbodyContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityListbody(this);\n\t}\n};\n\nNewEntityListbodyContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityListbody(this);\n\t}\n};\n\nNewEntityListbodyContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityListbody(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityListbodyContext = NewEntityListbodyContext;\n\nLUFileParser.prototype.newEntityListbody = function() {\n\n    var localctx = new NewEntityListbodyContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 38, LUFileParser.RULE_newEntityListbody);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 269; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 269;\n        \t\tthis._errHandler.sync(this);\n        \t\tvar la_ = this._interp.adaptivePredict(this._input,24,this._ctx);\n        \t\tswitch(la_) {\n        \t\tcase 1:\n        \t\t    this.state = 265;\n        \t\t    this.normalItemString();\n        \t\t    this.state = 266;\n        \t\t    this.newline();\n        \t\t    break;\n\n        \t\tcase 2:\n        \t\t    this.state = 268;\n        \t\t    this.errorString();\n        \t\t    break;\n\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 271; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,25, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityLineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityLine;\n    return this;\n}\n\nNewEntityLineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityLineContext.prototype.constructor = NewEntityLineContext;\n\nNewEntityLineContext.prototype.AT = function() {\n    return this.getToken(LUFileParser.AT, 0);\n};\n\nNewEntityLineContext.prototype.newline = function() {\n    return this.getTypedRuleContext(NewlineContext,0);\n};\n\nNewEntityLineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewEntityLineContext.prototype.newEntityType = function() {\n    return this.getTypedRuleContext(NewEntityTypeContext,0);\n};\n\nNewEntityLineContext.prototype.newEntityName = function() {\n    return this.getTypedRuleContext(NewEntityNameContext,0);\n};\n\nNewEntityLineContext.prototype.newEntityNameWithWS = function() {\n    return this.getTypedRuleContext(NewEntityNameWithWSContext,0);\n};\n\nNewEntityLineContext.prototype.newEntityRoles = function() {\n    return this.getTypedRuleContext(NewEntityRolesContext,0);\n};\n\nNewEntityLineContext.prototype.newEntityUsesFeatures = function() {\n    return this.getTypedRuleContext(NewEntityUsesFeaturesContext,0);\n};\n\nNewEntityLineContext.prototype.EQUAL = function() {\n    return this.getToken(LUFileParser.EQUAL, 0);\n};\n\nNewEntityLineContext.prototype.newCompositeDefinition = function() {\n    return this.getTypedRuleContext(NewCompositeDefinitionContext,0);\n};\n\nNewEntityLineContext.prototype.newRegexDefinition = function() {\n    return this.getTypedRuleContext(NewRegexDefinitionContext,0);\n};\n\nNewEntityLineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityLine(this);\n\t}\n};\n\nNewEntityLineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityLine(this);\n\t}\n};\n\nNewEntityLineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityLine(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityLineContext = NewEntityLineContext;\n\nLUFileParser.prototype.newEntityLine = function() {\n\n    var localctx = new NewEntityLineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 40, LUFileParser.RULE_newEntityLine);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 276;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 273;\n            this.match(LUFileParser.WS);\n            this.state = 278;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 279;\n        this.match(LUFileParser.AT);\n        this.state = 283;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,27,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 280;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 285;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,27,this._ctx);\n        }\n\n        this.state = 287;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if(_la===LUFileParser.NEW_ENTITY_TYPE_IDENTIFIER) {\n            this.state = 286;\n            this.newEntityType();\n        }\n\n        this.state = 292;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,29,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 289;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 294;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,29,this._ctx);\n        }\n\n        this.state = 297;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,30,this._ctx);\n        if(la_===1) {\n            this.state = 295;\n            this.newEntityName();\n\n        } else if(la_===2) {\n            this.state = 296;\n            this.newEntityNameWithWS();\n\n        }\n        this.state = 302;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,31,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 299;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 304;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,31,this._ctx);\n        }\n\n        this.state = 306;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,32,this._ctx);\n        if(la_===1) {\n            this.state = 305;\n            this.newEntityRoles();\n\n        }\n        this.state = 311;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,33,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 308;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 313;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,33,this._ctx);\n        }\n\n        this.state = 315;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if(_la===LUFileParser.HAS_FEATURES_LABEL) {\n            this.state = 314;\n            this.newEntityUsesFeatures();\n        }\n\n        this.state = 320;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,35,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 317;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 322;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,35,this._ctx);\n        }\n\n        this.state = 324;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if(_la===LUFileParser.EQUAL) {\n            this.state = 323;\n            this.match(LUFileParser.EQUAL);\n        }\n\n        this.state = 329;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,37,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 326;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 331;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,37,this._ctx);\n        }\n\n        this.state = 334;\n        this._errHandler.sync(this);\n        switch (this._input.LA(1)) {\n        case LUFileParser.NEW_COMPOSITE_ENTITY:\n        \tthis.state = 332;\n        \tthis.newCompositeDefinition();\n        \tbreak;\n        case LUFileParser.NEW_REGEX_ENTITY:\n        \tthis.state = 333;\n        \tthis.newRegexDefinition();\n        \tbreak;\n        case LUFileParser.EOF:\n        case LUFileParser.WS:\n        case LUFileParser.NEWLINE:\n        \tbreak;\n        default:\n        \tbreak;\n        }\n        this.state = 336;\n        this.newline();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewCompositeDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newCompositeDefinition;\n    return this;\n}\n\nNewCompositeDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewCompositeDefinitionContext.prototype.constructor = NewCompositeDefinitionContext;\n\nNewCompositeDefinitionContext.prototype.NEW_COMPOSITE_ENTITY = function() {\n    return this.getToken(LUFileParser.NEW_COMPOSITE_ENTITY, 0);\n};\n\nNewCompositeDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewCompositeDefinition(this);\n\t}\n};\n\nNewCompositeDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewCompositeDefinition(this);\n\t}\n};\n\nNewCompositeDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewCompositeDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewCompositeDefinitionContext = NewCompositeDefinitionContext;\n\nLUFileParser.prototype.newCompositeDefinition = function() {\n\n    var localctx = new NewCompositeDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 42, LUFileParser.RULE_newCompositeDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 338;\n        this.match(LUFileParser.NEW_COMPOSITE_ENTITY);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewRegexDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newRegexDefinition;\n    return this;\n}\n\nNewRegexDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewRegexDefinitionContext.prototype.constructor = NewRegexDefinitionContext;\n\nNewRegexDefinitionContext.prototype.NEW_REGEX_ENTITY = function() {\n    return this.getToken(LUFileParser.NEW_REGEX_ENTITY, 0);\n};\n\nNewRegexDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewRegexDefinition(this);\n\t}\n};\n\nNewRegexDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewRegexDefinition(this);\n\t}\n};\n\nNewRegexDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewRegexDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewRegexDefinitionContext = NewRegexDefinitionContext;\n\nLUFileParser.prototype.newRegexDefinition = function() {\n\n    var localctx = new NewRegexDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 44, LUFileParser.RULE_newRegexDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 340;\n        this.match(LUFileParser.NEW_REGEX_ENTITY);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityTypeContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityType;\n    return this;\n}\n\nNewEntityTypeContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityTypeContext.prototype.constructor = NewEntityTypeContext;\n\nNewEntityTypeContext.prototype.NEW_ENTITY_TYPE_IDENTIFIER = function() {\n    return this.getToken(LUFileParser.NEW_ENTITY_TYPE_IDENTIFIER, 0);\n};\n\nNewEntityTypeContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityType(this);\n\t}\n};\n\nNewEntityTypeContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityType(this);\n\t}\n};\n\nNewEntityTypeContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityType(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityTypeContext = NewEntityTypeContext;\n\nLUFileParser.prototype.newEntityType = function() {\n\n    var localctx = new NewEntityTypeContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 46, LUFileParser.RULE_newEntityType);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 342;\n        this.match(LUFileParser.NEW_ENTITY_TYPE_IDENTIFIER);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityRolesContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityRoles;\n    return this;\n}\n\nNewEntityRolesContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityRolesContext.prototype.constructor = NewEntityRolesContext;\n\nNewEntityRolesContext.prototype.newEntityRoleOrFeatures = function() {\n    return this.getTypedRuleContext(NewEntityRoleOrFeaturesContext,0);\n};\n\nNewEntityRolesContext.prototype.HAS_ROLES_LABEL = function() {\n    return this.getToken(LUFileParser.HAS_ROLES_LABEL, 0);\n};\n\nNewEntityRolesContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewEntityRolesContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityRoles(this);\n\t}\n};\n\nNewEntityRolesContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityRoles(this);\n\t}\n};\n\nNewEntityRolesContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityRoles(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityRolesContext = NewEntityRolesContext;\n\nLUFileParser.prototype.newEntityRoles = function() {\n\n    var localctx = new NewEntityRolesContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 48, LUFileParser.RULE_newEntityRoles);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 345;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if(_la===LUFileParser.HAS_ROLES_LABEL) {\n            this.state = 344;\n            this.match(LUFileParser.HAS_ROLES_LABEL);\n        }\n\n        this.state = 350;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 347;\n            this.match(LUFileParser.WS);\n            this.state = 352;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 353;\n        this.newEntityRoleOrFeatures();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityUsesFeaturesContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityUsesFeatures;\n    return this;\n}\n\nNewEntityUsesFeaturesContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityUsesFeaturesContext.prototype.constructor = NewEntityUsesFeaturesContext;\n\nNewEntityUsesFeaturesContext.prototype.HAS_FEATURES_LABEL = function() {\n    return this.getToken(LUFileParser.HAS_FEATURES_LABEL, 0);\n};\n\nNewEntityUsesFeaturesContext.prototype.newEntityRoleOrFeatures = function() {\n    return this.getTypedRuleContext(NewEntityRoleOrFeaturesContext,0);\n};\n\nNewEntityUsesFeaturesContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewEntityUsesFeaturesContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityUsesFeatures(this);\n\t}\n};\n\nNewEntityUsesFeaturesContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityUsesFeatures(this);\n\t}\n};\n\nNewEntityUsesFeaturesContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityUsesFeatures(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityUsesFeaturesContext = NewEntityUsesFeaturesContext;\n\nLUFileParser.prototype.newEntityUsesFeatures = function() {\n\n    var localctx = new NewEntityUsesFeaturesContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 50, LUFileParser.RULE_newEntityUsesFeatures);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 355;\n        this.match(LUFileParser.HAS_FEATURES_LABEL);\n        this.state = 359;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 356;\n            this.match(LUFileParser.WS);\n            this.state = 361;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 362;\n        this.newEntityRoleOrFeatures();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityRoleOrFeaturesContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityRoleOrFeatures;\n    return this;\n}\n\nNewEntityRoleOrFeaturesContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityRoleOrFeaturesContext.prototype.constructor = NewEntityRoleOrFeaturesContext;\n\nNewEntityRoleOrFeaturesContext.prototype.NEW_ENTITY_IDENTIFIER = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.NEW_ENTITY_IDENTIFIER);\n    } else {\n        return this.getToken(LUFileParser.NEW_ENTITY_IDENTIFIER, i);\n    }\n};\n\n\nNewEntityRoleOrFeaturesContext.prototype.NEW_ENTITY_IDENTIFIER_WITH_WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS);\n    } else {\n        return this.getToken(LUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS, i);\n    }\n};\n\n\nNewEntityRoleOrFeaturesContext.prototype.COMMA = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.COMMA);\n    } else {\n        return this.getToken(LUFileParser.COMMA, i);\n    }\n};\n\n\nNewEntityRoleOrFeaturesContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewEntityRoleOrFeaturesContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityRoleOrFeatures(this);\n\t}\n};\n\nNewEntityRoleOrFeaturesContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityRoleOrFeatures(this);\n\t}\n};\n\nNewEntityRoleOrFeaturesContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityRoleOrFeatures(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityRoleOrFeaturesContext = NewEntityRoleOrFeaturesContext;\n\nLUFileParser.prototype.newEntityRoleOrFeatures = function() {\n\n    var localctx = new NewEntityRoleOrFeaturesContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 52, LUFileParser.RULE_newEntityRoleOrFeatures);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 364;\n        _la = this._input.LA(1);\n        if(!(_la===LUFileParser.NEW_ENTITY_IDENTIFIER || _la===LUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS)) {\n        this._errHandler.recoverInline(this);\n        }\n        else {\n        \tthis._errHandler.reportMatch(this);\n            this.consume();\n        }\n        this.state = 381;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,44,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 368;\n                this._errHandler.sync(this);\n                _la = this._input.LA(1);\n                while(_la===LUFileParser.WS) {\n                    this.state = 365;\n                    this.match(LUFileParser.WS);\n                    this.state = 370;\n                    this._errHandler.sync(this);\n                    _la = this._input.LA(1);\n                }\n                this.state = 371;\n                this.match(LUFileParser.COMMA);\n                this.state = 375;\n                this._errHandler.sync(this);\n                _la = this._input.LA(1);\n                while(_la===LUFileParser.WS) {\n                    this.state = 372;\n                    this.match(LUFileParser.WS);\n                    this.state = 377;\n                    this._errHandler.sync(this);\n                    _la = this._input.LA(1);\n                }\n                this.state = 378;\n                _la = this._input.LA(1);\n                if(!(_la===LUFileParser.NEW_ENTITY_IDENTIFIER || _la===LUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS)) {\n                this._errHandler.recoverInline(this);\n                }\n                else {\n                \tthis._errHandler.reportMatch(this);\n                    this.consume();\n                } \n            }\n            this.state = 383;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,44,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityNameContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityName;\n    return this;\n}\n\nNewEntityNameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityNameContext.prototype.constructor = NewEntityNameContext;\n\nNewEntityNameContext.prototype.NEW_ENTITY_IDENTIFIER = function() {\n    return this.getToken(LUFileParser.NEW_ENTITY_IDENTIFIER, 0);\n};\n\nNewEntityNameContext.prototype.PHRASE_LIST_LABEL = function() {\n    return this.getToken(LUFileParser.PHRASE_LIST_LABEL, 0);\n};\n\nNewEntityNameContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewEntityNameContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityName(this);\n\t}\n};\n\nNewEntityNameContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityName(this);\n\t}\n};\n\nNewEntityNameContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityName(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityNameContext = NewEntityNameContext;\n\nLUFileParser.prototype.newEntityName = function() {\n\n    var localctx = new NewEntityNameContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 54, LUFileParser.RULE_newEntityName);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 384;\n        this.match(LUFileParser.NEW_ENTITY_IDENTIFIER);\n        this.state = 392;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,46,this._ctx);\n        if(la_===1) {\n            this.state = 388;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n            while(_la===LUFileParser.WS) {\n                this.state = 385;\n                this.match(LUFileParser.WS);\n                this.state = 390;\n                this._errHandler.sync(this);\n                _la = this._input.LA(1);\n            }\n            this.state = 391;\n            this.match(LUFileParser.PHRASE_LIST_LABEL);\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NewEntityNameWithWSContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_newEntityNameWithWS;\n    return this;\n}\n\nNewEntityNameWithWSContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNewEntityNameWithWSContext.prototype.constructor = NewEntityNameWithWSContext;\n\nNewEntityNameWithWSContext.prototype.NEW_ENTITY_IDENTIFIER_WITH_WS = function() {\n    return this.getToken(LUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS, 0);\n};\n\nNewEntityNameWithWSContext.prototype.PHRASE_LIST_LABEL = function() {\n    return this.getToken(LUFileParser.PHRASE_LIST_LABEL, 0);\n};\n\nNewEntityNameWithWSContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNewEntityNameWithWSContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNewEntityNameWithWS(this);\n\t}\n};\n\nNewEntityNameWithWSContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNewEntityNameWithWS(this);\n\t}\n};\n\nNewEntityNameWithWSContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNewEntityNameWithWS(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NewEntityNameWithWSContext = NewEntityNameWithWSContext;\n\nLUFileParser.prototype.newEntityNameWithWS = function() {\n\n    var localctx = new NewEntityNameWithWSContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 56, LUFileParser.RULE_newEntityNameWithWS);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 394;\n        this.match(LUFileParser.NEW_ENTITY_IDENTIFIER_WITH_WS);\n        this.state = 402;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,48,this._ctx);\n        if(la_===1) {\n            this.state = 398;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n            while(_la===LUFileParser.WS) {\n                this.state = 395;\n                this.match(LUFileParser.WS);\n                this.state = 400;\n                this._errHandler.sync(this);\n                _la = this._input.LA(1);\n            }\n            this.state = 401;\n            this.match(LUFileParser.PHRASE_LIST_LABEL);\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction EntitySectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_entitySection;\n    return this;\n}\n\nEntitySectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEntitySectionContext.prototype.constructor = EntitySectionContext;\n\nEntitySectionContext.prototype.entityDefinition = function() {\n    return this.getTypedRuleContext(EntityDefinitionContext,0);\n};\n\nEntitySectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterEntitySection(this);\n\t}\n};\n\nEntitySectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitEntitySection(this);\n\t}\n};\n\nEntitySectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitEntitySection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.EntitySectionContext = EntitySectionContext;\n\nLUFileParser.prototype.entitySection = function() {\n\n    var localctx = new EntitySectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 58, LUFileParser.RULE_entitySection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 404;\n        this.entityDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction EntityDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_entityDefinition;\n    return this;\n}\n\nEntityDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEntityDefinitionContext.prototype.constructor = EntityDefinitionContext;\n\nEntityDefinitionContext.prototype.entityLine = function() {\n    return this.getTypedRuleContext(EntityLineContext,0);\n};\n\nEntityDefinitionContext.prototype.entityListBody = function() {\n    return this.getTypedRuleContext(EntityListBodyContext,0);\n};\n\nEntityDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterEntityDefinition(this);\n\t}\n};\n\nEntityDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitEntityDefinition(this);\n\t}\n};\n\nEntityDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitEntityDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.EntityDefinitionContext = EntityDefinitionContext;\n\nLUFileParser.prototype.entityDefinition = function() {\n\n    var localctx = new EntityDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 60, LUFileParser.RULE_entityDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 406;\n        this.entityLine();\n        this.state = 408;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,49,this._ctx);\n        if(la_===1) {\n            this.state = 407;\n            this.entityListBody();\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction EntityLineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_entityLine;\n    return this;\n}\n\nEntityLineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEntityLineContext.prototype.constructor = EntityLineContext;\n\nEntityLineContext.prototype.DOLLAR = function() {\n    return this.getToken(LUFileParser.DOLLAR, 0);\n};\n\nEntityLineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nEntityLineContext.prototype.entityName = function() {\n    return this.getTypedRuleContext(EntityNameContext,0);\n};\n\nEntityLineContext.prototype.COLON_MARK = function() {\n    return this.getToken(LUFileParser.COLON_MARK, 0);\n};\n\nEntityLineContext.prototype.entityType = function() {\n    return this.getTypedRuleContext(EntityTypeContext,0);\n};\n\nEntityLineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterEntityLine(this);\n\t}\n};\n\nEntityLineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitEntityLine(this);\n\t}\n};\n\nEntityLineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitEntityLine(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.EntityLineContext = EntityLineContext;\n\nLUFileParser.prototype.entityLine = function() {\n\n    var localctx = new EntityLineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 62, LUFileParser.RULE_entityLine);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 413;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 410;\n            this.match(LUFileParser.WS);\n            this.state = 415;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 416;\n        this.match(LUFileParser.DOLLAR);\n        this.state = 418;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,51,this._ctx);\n        if(la_===1) {\n            this.state = 417;\n            this.entityName();\n\n        }\n        this.state = 421;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,52,this._ctx);\n        if(la_===1) {\n            this.state = 420;\n            this.match(LUFileParser.COLON_MARK);\n\n        }\n        this.state = 424;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,53,this._ctx);\n        if(la_===1) {\n            this.state = 423;\n            this.entityType();\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction EntityNameContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_entityName;\n    return this;\n}\n\nEntityNameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEntityNameContext.prototype.constructor = EntityNameContext;\n\nEntityNameContext.prototype.ENTITY_TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.ENTITY_TEXT);\n    } else {\n        return this.getToken(LUFileParser.ENTITY_TEXT, i);\n    }\n};\n\n\nEntityNameContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nEntityNameContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterEntityName(this);\n\t}\n};\n\nEntityNameContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitEntityName(this);\n\t}\n};\n\nEntityNameContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitEntityName(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.EntityNameContext = EntityNameContext;\n\nLUFileParser.prototype.entityName = function() {\n\n    var localctx = new EntityNameContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 64, LUFileParser.RULE_entityName);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 427; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 426;\n        \t\t_la = this._input.LA(1);\n        \t\tif(!(_la===LUFileParser.WS || _la===LUFileParser.ENTITY_TEXT)) {\n        \t\tthis._errHandler.recoverInline(this);\n        \t\t}\n        \t\telse {\n        \t\t\tthis._errHandler.reportMatch(this);\n        \t\t    this.consume();\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 429; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,54, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction EntityTypeContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_entityType;\n    return this;\n}\n\nEntityTypeContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEntityTypeContext.prototype.constructor = EntityTypeContext;\n\nEntityTypeContext.prototype.compositeEntityIdentifier = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(CompositeEntityIdentifierContext);\n    } else {\n        return this.getTypedRuleContext(CompositeEntityIdentifierContext,i);\n    }\n};\n\nEntityTypeContext.prototype.regexEntityIdentifier = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(RegexEntityIdentifierContext);\n    } else {\n        return this.getTypedRuleContext(RegexEntityIdentifierContext,i);\n    }\n};\n\nEntityTypeContext.prototype.ENTITY_TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.ENTITY_TEXT);\n    } else {\n        return this.getToken(LUFileParser.ENTITY_TEXT, i);\n    }\n};\n\n\nEntityTypeContext.prototype.COLON_MARK = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.COLON_MARK);\n    } else {\n        return this.getToken(LUFileParser.COLON_MARK, i);\n    }\n};\n\n\nEntityTypeContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nEntityTypeContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterEntityType(this);\n\t}\n};\n\nEntityTypeContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitEntityType(this);\n\t}\n};\n\nEntityTypeContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitEntityType(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.EntityTypeContext = EntityTypeContext;\n\nLUFileParser.prototype.entityType = function() {\n\n    var localctx = new EntityTypeContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 66, LUFileParser.RULE_entityType);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 436; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 436;\n        \t\tthis._errHandler.sync(this);\n        \t\tswitch(this._input.LA(1)) {\n        \t\tcase LUFileParser.COMPOSITE_ENTITY:\n        \t\t    this.state = 431;\n        \t\t    this.compositeEntityIdentifier();\n        \t\t    break;\n        \t\tcase LUFileParser.REGEX_ENTITY:\n        \t\t    this.state = 432;\n        \t\t    this.regexEntityIdentifier();\n        \t\t    break;\n        \t\tcase LUFileParser.ENTITY_TEXT:\n        \t\t    this.state = 433;\n        \t\t    this.match(LUFileParser.ENTITY_TEXT);\n        \t\t    break;\n        \t\tcase LUFileParser.COLON_MARK:\n        \t\t    this.state = 434;\n        \t\t    this.match(LUFileParser.COLON_MARK);\n        \t\t    break;\n        \t\tcase LUFileParser.WS:\n        \t\t    this.state = 435;\n        \t\t    this.match(LUFileParser.WS);\n        \t\t    break;\n        \t\tdefault:\n        \t\t    throw new antlr4.error.NoViableAltException(this);\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 438; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,56, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction CompositeEntityIdentifierContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_compositeEntityIdentifier;\n    return this;\n}\n\nCompositeEntityIdentifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nCompositeEntityIdentifierContext.prototype.constructor = CompositeEntityIdentifierContext;\n\nCompositeEntityIdentifierContext.prototype.COMPOSITE_ENTITY = function() {\n    return this.getToken(LUFileParser.COMPOSITE_ENTITY, 0);\n};\n\nCompositeEntityIdentifierContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterCompositeEntityIdentifier(this);\n\t}\n};\n\nCompositeEntityIdentifierContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitCompositeEntityIdentifier(this);\n\t}\n};\n\nCompositeEntityIdentifierContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitCompositeEntityIdentifier(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.CompositeEntityIdentifierContext = CompositeEntityIdentifierContext;\n\nLUFileParser.prototype.compositeEntityIdentifier = function() {\n\n    var localctx = new CompositeEntityIdentifierContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 68, LUFileParser.RULE_compositeEntityIdentifier);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 440;\n        this.match(LUFileParser.COMPOSITE_ENTITY);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction RegexEntityIdentifierContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_regexEntityIdentifier;\n    return this;\n}\n\nRegexEntityIdentifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nRegexEntityIdentifierContext.prototype.constructor = RegexEntityIdentifierContext;\n\nRegexEntityIdentifierContext.prototype.REGEX_ENTITY = function() {\n    return this.getToken(LUFileParser.REGEX_ENTITY, 0);\n};\n\nRegexEntityIdentifierContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterRegexEntityIdentifier(this);\n\t}\n};\n\nRegexEntityIdentifierContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitRegexEntityIdentifier(this);\n\t}\n};\n\nRegexEntityIdentifierContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitRegexEntityIdentifier(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.RegexEntityIdentifierContext = RegexEntityIdentifierContext;\n\nLUFileParser.prototype.regexEntityIdentifier = function() {\n\n    var localctx = new RegexEntityIdentifierContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 70, LUFileParser.RULE_regexEntityIdentifier);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 442;\n        this.match(LUFileParser.REGEX_ENTITY);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction EntityListBodyContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_entityListBody;\n    return this;\n}\n\nEntityListBodyContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEntityListBodyContext.prototype.constructor = EntityListBodyContext;\n\nEntityListBodyContext.prototype.errorString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ErrorStringContext);\n    } else {\n        return this.getTypedRuleContext(ErrorStringContext,i);\n    }\n};\n\nEntityListBodyContext.prototype.normalItemString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NormalItemStringContext);\n    } else {\n        return this.getTypedRuleContext(NormalItemStringContext,i);\n    }\n};\n\nEntityListBodyContext.prototype.newline = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NewlineContext);\n    } else {\n        return this.getTypedRuleContext(NewlineContext,i);\n    }\n};\n\nEntityListBodyContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterEntityListBody(this);\n\t}\n};\n\nEntityListBodyContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitEntityListBody(this);\n\t}\n};\n\nEntityListBodyContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitEntityListBody(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.EntityListBodyContext = EntityListBodyContext;\n\nLUFileParser.prototype.entityListBody = function() {\n\n    var localctx = new EntityListBodyContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 72, LUFileParser.RULE_entityListBody);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 448; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 448;\n        \t\tthis._errHandler.sync(this);\n        \t\tvar la_ = this._interp.adaptivePredict(this._input,57,this._ctx);\n        \t\tswitch(la_) {\n        \t\tcase 1:\n        \t\t    this.state = 444;\n        \t\t    this.normalItemString();\n        \t\t    this.state = 445;\n        \t\t    this.newline();\n        \t\t    break;\n\n        \t\tcase 2:\n        \t\t    this.state = 447;\n        \t\t    this.errorString();\n        \t\t    break;\n\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 450; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,58, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction NormalItemStringContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_normalItemString;\n    return this;\n}\n\nNormalItemStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNormalItemStringContext.prototype.constructor = NormalItemStringContext;\n\nNormalItemStringContext.prototype.DASH = function() {\n    return this.getToken(LUFileParser.DASH, 0);\n};\n\nNormalItemStringContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nNormalItemStringContext.prototype.TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.TEXT);\n    } else {\n        return this.getToken(LUFileParser.TEXT, i);\n    }\n};\n\n\nNormalItemStringContext.prototype.EXPRESSION = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.EXPRESSION);\n    } else {\n        return this.getToken(LUFileParser.EXPRESSION, i);\n    }\n};\n\n\nNormalItemStringContext.prototype.ESCAPE_CHARACTER = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.ESCAPE_CHARACTER);\n    } else {\n        return this.getToken(LUFileParser.ESCAPE_CHARACTER, i);\n    }\n};\n\n\nNormalItemStringContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterNormalItemString(this);\n\t}\n};\n\nNormalItemStringContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitNormalItemString(this);\n\t}\n};\n\nNormalItemStringContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitNormalItemString(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.NormalItemStringContext = NormalItemStringContext;\n\nLUFileParser.prototype.normalItemString = function() {\n\n    var localctx = new NormalItemStringContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 74, LUFileParser.RULE_normalItemString);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 455;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 452;\n            this.match(LUFileParser.WS);\n            this.state = 457;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 458;\n        this.match(LUFileParser.DASH);\n        this.state = 462;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,60,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 459;\n                _la = this._input.LA(1);\n                if(!(((((_la - 1)) & ~0x1f) == 0 && ((1 << (_la - 1)) & ((1 << (LUFileParser.WS - 1)) | (1 << (LUFileParser.ESCAPE_CHARACTER - 1)) | (1 << (LUFileParser.EXPRESSION - 1)) | (1 << (LUFileParser.TEXT - 1)))) !== 0))) {\n                this._errHandler.recoverInline(this);\n                }\n                else {\n                \tthis._errHandler.reportMatch(this);\n                    this.consume();\n                } \n            }\n            this.state = 464;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,60,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ImportSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_importSection;\n    return this;\n}\n\nImportSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nImportSectionContext.prototype.constructor = ImportSectionContext;\n\nImportSectionContext.prototype.importDefinition = function() {\n    return this.getTypedRuleContext(ImportDefinitionContext,0);\n};\n\nImportSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterImportSection(this);\n\t}\n};\n\nImportSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitImportSection(this);\n\t}\n};\n\nImportSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitImportSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ImportSectionContext = ImportSectionContext;\n\nLUFileParser.prototype.importSection = function() {\n\n    var localctx = new ImportSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 76, LUFileParser.RULE_importSection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 465;\n        this.importDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ImportDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_importDefinition;\n    return this;\n}\n\nImportDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nImportDefinitionContext.prototype.constructor = ImportDefinitionContext;\n\nImportDefinitionContext.prototype.IMPORT = function() {\n    return this.getToken(LUFileParser.IMPORT, 0);\n};\n\nImportDefinitionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nImportDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterImportDefinition(this);\n\t}\n};\n\nImportDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitImportDefinition(this);\n\t}\n};\n\nImportDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitImportDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ImportDefinitionContext = ImportDefinitionContext;\n\nLUFileParser.prototype.importDefinition = function() {\n\n    var localctx = new ImportDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 78, LUFileParser.RULE_importDefinition);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 470;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 467;\n            this.match(LUFileParser.WS);\n            this.state = 472;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 473;\n        this.match(LUFileParser.IMPORT);\n        this.state = 477;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,62,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 474;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 479;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,62,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QnaSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_qnaSection;\n    return this;\n}\n\nQnaSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQnaSectionContext.prototype.constructor = QnaSectionContext;\n\nQnaSectionContext.prototype.qnaDefinition = function() {\n    return this.getTypedRuleContext(QnaDefinitionContext,0);\n};\n\nQnaSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQnaSection(this);\n\t}\n};\n\nQnaSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQnaSection(this);\n\t}\n};\n\nQnaSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQnaSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QnaSectionContext = QnaSectionContext;\n\nLUFileParser.prototype.qnaSection = function() {\n\n    var localctx = new QnaSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 80, LUFileParser.RULE_qnaSection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 480;\n        this.qnaDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QnaDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_qnaDefinition;\n    return this;\n}\n\nQnaDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQnaDefinitionContext.prototype.constructor = QnaDefinitionContext;\n\nQnaDefinitionContext.prototype.qnaQuestion = function() {\n    return this.getTypedRuleContext(QnaQuestionContext,0);\n};\n\nQnaDefinitionContext.prototype.moreQuestionsBody = function() {\n    return this.getTypedRuleContext(MoreQuestionsBodyContext,0);\n};\n\nQnaDefinitionContext.prototype.qnaAnswerBody = function() {\n    return this.getTypedRuleContext(QnaAnswerBodyContext,0);\n};\n\nQnaDefinitionContext.prototype.qnaSourceInfo = function() {\n    return this.getTypedRuleContext(QnaSourceInfoContext,0);\n};\n\nQnaDefinitionContext.prototype.qnaIdMark = function() {\n    return this.getTypedRuleContext(QnaIdMarkContext,0);\n};\n\nQnaDefinitionContext.prototype.promptSection = function() {\n    return this.getTypedRuleContext(PromptSectionContext,0);\n};\n\nQnaDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQnaDefinition(this);\n\t}\n};\n\nQnaDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQnaDefinition(this);\n\t}\n};\n\nQnaDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQnaDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QnaDefinitionContext = QnaDefinitionContext;\n\nLUFileParser.prototype.qnaDefinition = function() {\n\n    var localctx = new QnaDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 82, LUFileParser.RULE_qnaDefinition);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 483;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,63,this._ctx);\n        if(la_===1) {\n            this.state = 482;\n            this.qnaSourceInfo();\n\n        }\n        this.state = 486;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,64,this._ctx);\n        if(la_===1) {\n            this.state = 485;\n            this.qnaIdMark();\n\n        }\n        this.state = 488;\n        this.qnaQuestion();\n        this.state = 489;\n        this.moreQuestionsBody();\n        this.state = 490;\n        this.qnaAnswerBody();\n        this.state = 492;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,65,this._ctx);\n        if(la_===1) {\n            this.state = 491;\n            this.promptSection();\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QnaSourceInfoContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_qnaSourceInfo;\n    return this;\n}\n\nQnaSourceInfoContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQnaSourceInfoContext.prototype.constructor = QnaSourceInfoContext;\n\nQnaSourceInfoContext.prototype.QNA_SOURCE_INFO = function() {\n    return this.getToken(LUFileParser.QNA_SOURCE_INFO, 0);\n};\n\nQnaSourceInfoContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nQnaSourceInfoContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQnaSourceInfo(this);\n\t}\n};\n\nQnaSourceInfoContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQnaSourceInfo(this);\n\t}\n};\n\nQnaSourceInfoContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQnaSourceInfo(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QnaSourceInfoContext = QnaSourceInfoContext;\n\nLUFileParser.prototype.qnaSourceInfo = function() {\n\n    var localctx = new QnaSourceInfoContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 84, LUFileParser.RULE_qnaSourceInfo);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 497;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 494;\n            this.match(LUFileParser.WS);\n            this.state = 499;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 500;\n        this.match(LUFileParser.QNA_SOURCE_INFO);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QnaIdMarkContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_qnaIdMark;\n    return this;\n}\n\nQnaIdMarkContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQnaIdMarkContext.prototype.constructor = QnaIdMarkContext;\n\nQnaIdMarkContext.prototype.QNA_ID_MARK = function() {\n    return this.getToken(LUFileParser.QNA_ID_MARK, 0);\n};\n\nQnaIdMarkContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nQnaIdMarkContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQnaIdMark(this);\n\t}\n};\n\nQnaIdMarkContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQnaIdMark(this);\n\t}\n};\n\nQnaIdMarkContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQnaIdMark(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QnaIdMarkContext = QnaIdMarkContext;\n\nLUFileParser.prototype.qnaIdMark = function() {\n\n    var localctx = new QnaIdMarkContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 86, LUFileParser.RULE_qnaIdMark);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 505;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 502;\n            this.match(LUFileParser.WS);\n            this.state = 507;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 508;\n        this.match(LUFileParser.QNA_ID_MARK);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QnaQuestionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_qnaQuestion;\n    return this;\n}\n\nQnaQuestionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQnaQuestionContext.prototype.constructor = QnaQuestionContext;\n\nQnaQuestionContext.prototype.QNA = function() {\n    return this.getToken(LUFileParser.QNA, 0);\n};\n\nQnaQuestionContext.prototype.questionText = function() {\n    return this.getTypedRuleContext(QuestionTextContext,0);\n};\n\nQnaQuestionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nQnaQuestionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQnaQuestion(this);\n\t}\n};\n\nQnaQuestionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQnaQuestion(this);\n\t}\n};\n\nQnaQuestionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQnaQuestion(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QnaQuestionContext = QnaQuestionContext;\n\nLUFileParser.prototype.qnaQuestion = function() {\n\n    var localctx = new QnaQuestionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 88, LUFileParser.RULE_qnaQuestion);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 513;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 510;\n            this.match(LUFileParser.WS);\n            this.state = 515;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 516;\n        this.match(LUFileParser.QNA);\n        this.state = 517;\n        this.questionText();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QuestionTextContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_questionText;\n    return this;\n}\n\nQuestionTextContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQuestionTextContext.prototype.constructor = QuestionTextContext;\n\nQuestionTextContext.prototype.QNA_TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.QNA_TEXT);\n    } else {\n        return this.getToken(LUFileParser.QNA_TEXT, i);\n    }\n};\n\n\nQuestionTextContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQuestionText(this);\n\t}\n};\n\nQuestionTextContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQuestionText(this);\n\t}\n};\n\nQuestionTextContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQuestionText(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QuestionTextContext = QuestionTextContext;\n\nLUFileParser.prototype.questionText = function() {\n\n    var localctx = new QuestionTextContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 90, LUFileParser.RULE_questionText);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 522;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.QNA_TEXT) {\n            this.state = 519;\n            this.match(LUFileParser.QNA_TEXT);\n            this.state = 524;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction MoreQuestionsBodyContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_moreQuestionsBody;\n    return this;\n}\n\nMoreQuestionsBodyContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nMoreQuestionsBodyContext.prototype.constructor = MoreQuestionsBodyContext;\n\nMoreQuestionsBodyContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nMoreQuestionsBodyContext.prototype.errorQuestionString = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ErrorQuestionStringContext);\n    } else {\n        return this.getTypedRuleContext(ErrorQuestionStringContext,i);\n    }\n};\n\nMoreQuestionsBodyContext.prototype.moreQuestion = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(MoreQuestionContext);\n    } else {\n        return this.getTypedRuleContext(MoreQuestionContext,i);\n    }\n};\n\nMoreQuestionsBodyContext.prototype.newline = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(NewlineContext);\n    } else {\n        return this.getTypedRuleContext(NewlineContext,i);\n    }\n};\n\nMoreQuestionsBodyContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterMoreQuestionsBody(this);\n\t}\n};\n\nMoreQuestionsBodyContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitMoreQuestionsBody(this);\n\t}\n};\n\nMoreQuestionsBodyContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitMoreQuestionsBody(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.MoreQuestionsBodyContext = MoreQuestionsBodyContext;\n\nLUFileParser.prototype.moreQuestionsBody = function() {\n\n    var localctx = new MoreQuestionsBodyContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 92, LUFileParser.RULE_moreQuestionsBody);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 528;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,70,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 525;\n                this.match(LUFileParser.WS); \n            }\n            this.state = 530;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,70,this._ctx);\n        }\n\n        this.state = 537;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,72,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 535;\n                this._errHandler.sync(this);\n                switch(this._input.LA(1)) {\n                case LUFileParser.DASH:\n                    this.state = 531;\n                    this.moreQuestion();\n                    this.state = 532;\n                    this.newline();\n                    break;\n                case LUFileParser.WS:\n                case LUFileParser.INVALID_TOKEN_DEFAULT_MODE:\n                    this.state = 534;\n                    this.errorQuestionString();\n                    break;\n                default:\n                    throw new antlr4.error.NoViableAltException(this);\n                } \n            }\n            this.state = 539;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,72,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction MoreQuestionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_moreQuestion;\n    return this;\n}\n\nMoreQuestionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nMoreQuestionContext.prototype.constructor = MoreQuestionContext;\n\nMoreQuestionContext.prototype.DASH = function() {\n    return this.getToken(LUFileParser.DASH, 0);\n};\n\nMoreQuestionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nMoreQuestionContext.prototype.TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.TEXT);\n    } else {\n        return this.getToken(LUFileParser.TEXT, i);\n    }\n};\n\n\nMoreQuestionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterMoreQuestion(this);\n\t}\n};\n\nMoreQuestionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitMoreQuestion(this);\n\t}\n};\n\nMoreQuestionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitMoreQuestion(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.MoreQuestionContext = MoreQuestionContext;\n\nLUFileParser.prototype.moreQuestion = function() {\n\n    var localctx = new MoreQuestionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 94, LUFileParser.RULE_moreQuestion);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 540;\n        this.match(LUFileParser.DASH);\n        this.state = 544;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,73,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 541;\n                _la = this._input.LA(1);\n                if(!(_la===LUFileParser.WS || _la===LUFileParser.TEXT)) {\n                this._errHandler.recoverInline(this);\n                }\n                else {\n                \tthis._errHandler.reportMatch(this);\n                    this.consume();\n                } \n            }\n            this.state = 546;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,73,this._ctx);\n        }\n\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ErrorQuestionStringContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_errorQuestionString;\n    return this;\n}\n\nErrorQuestionStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nErrorQuestionStringContext.prototype.constructor = ErrorQuestionStringContext;\n\nErrorQuestionStringContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nErrorQuestionStringContext.prototype.INVALID_TOKEN_DEFAULT_MODE = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.INVALID_TOKEN_DEFAULT_MODE);\n    } else {\n        return this.getToken(LUFileParser.INVALID_TOKEN_DEFAULT_MODE, i);\n    }\n};\n\n\nErrorQuestionStringContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterErrorQuestionString(this);\n\t}\n};\n\nErrorQuestionStringContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitErrorQuestionString(this);\n\t}\n};\n\nErrorQuestionStringContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitErrorQuestionString(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ErrorQuestionStringContext = ErrorQuestionStringContext;\n\nLUFileParser.prototype.errorQuestionString = function() {\n\n    var localctx = new ErrorQuestionStringContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 96, LUFileParser.RULE_errorQuestionString);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 548; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 547;\n        \t\t_la = this._input.LA(1);\n        \t\tif(!(_la===LUFileParser.WS || _la===LUFileParser.INVALID_TOKEN_DEFAULT_MODE)) {\n        \t\tthis._errHandler.recoverInline(this);\n        \t\t}\n        \t\telse {\n        \t\t\tthis._errHandler.reportMatch(this);\n        \t\t    this.consume();\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 550; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,74, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction QnaAnswerBodyContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_qnaAnswerBody;\n    return this;\n}\n\nQnaAnswerBodyContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQnaAnswerBodyContext.prototype.constructor = QnaAnswerBodyContext;\n\nQnaAnswerBodyContext.prototype.multiLineAnswer = function() {\n    return this.getTypedRuleContext(MultiLineAnswerContext,0);\n};\n\nQnaAnswerBodyContext.prototype.filterSection = function() {\n    return this.getTypedRuleContext(FilterSectionContext,0);\n};\n\nQnaAnswerBodyContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterQnaAnswerBody(this);\n\t}\n};\n\nQnaAnswerBodyContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitQnaAnswerBody(this);\n\t}\n};\n\nQnaAnswerBodyContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitQnaAnswerBody(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.QnaAnswerBodyContext = QnaAnswerBodyContext;\n\nLUFileParser.prototype.qnaAnswerBody = function() {\n\n    var localctx = new QnaAnswerBodyContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 98, LUFileParser.RULE_qnaAnswerBody);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 560;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input,77,this._ctx);\n        switch(la_) {\n        case 1:\n            this.state = 553;\n            this._errHandler.sync(this);\n            var la_ = this._interp.adaptivePredict(this._input,75,this._ctx);\n            if(la_===1) {\n                this.state = 552;\n                this.filterSection();\n\n            }\n            this.state = 555;\n            this.multiLineAnswer();\n            break;\n\n        case 2:\n            this.state = 556;\n            this.multiLineAnswer();\n            this.state = 558;\n            this._errHandler.sync(this);\n            var la_ = this._interp.adaptivePredict(this._input,76,this._ctx);\n            if(la_===1) {\n                this.state = 557;\n                this.filterSection();\n\n            }\n            break;\n\n        }\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction FilterSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_filterSection;\n    return this;\n}\n\nFilterSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFilterSectionContext.prototype.constructor = FilterSectionContext;\n\nFilterSectionContext.prototype.FILTER_MARK = function() {\n    return this.getToken(LUFileParser.FILTER_MARK, 0);\n};\n\nFilterSectionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nFilterSectionContext.prototype.filterLine = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(FilterLineContext);\n    } else {\n        return this.getTypedRuleContext(FilterLineContext,i);\n    }\n};\n\nFilterSectionContext.prototype.errorFilterLine = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ErrorFilterLineContext);\n    } else {\n        return this.getTypedRuleContext(ErrorFilterLineContext,i);\n    }\n};\n\nFilterSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterFilterSection(this);\n\t}\n};\n\nFilterSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitFilterSection(this);\n\t}\n};\n\nFilterSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitFilterSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.FilterSectionContext = FilterSectionContext;\n\nLUFileParser.prototype.filterSection = function() {\n\n    var localctx = new FilterSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 100, LUFileParser.RULE_filterSection);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 565;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 562;\n            this.match(LUFileParser.WS);\n            this.state = 567;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 568;\n        this.match(LUFileParser.FILTER_MARK);\n        this.state = 571; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 571;\n        \t\tthis._errHandler.sync(this);\n        \t\tvar la_ = this._interp.adaptivePredict(this._input,79,this._ctx);\n        \t\tswitch(la_) {\n        \t\tcase 1:\n        \t\t    this.state = 569;\n        \t\t    this.filterLine();\n        \t\t    break;\n\n        \t\tcase 2:\n        \t\t    this.state = 570;\n        \t\t    this.errorFilterLine();\n        \t\t    break;\n\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 573; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,80, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction PromptSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_promptSection;\n    return this;\n}\n\nPromptSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nPromptSectionContext.prototype.constructor = PromptSectionContext;\n\nPromptSectionContext.prototype.PROMPT_MARK = function() {\n    return this.getToken(LUFileParser.PROMPT_MARK, 0);\n};\n\nPromptSectionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nPromptSectionContext.prototype.filterLine = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(FilterLineContext);\n    } else {\n        return this.getTypedRuleContext(FilterLineContext,i);\n    }\n};\n\nPromptSectionContext.prototype.errorFilterLine = function(i) {\n    if(i===undefined) {\n        i = null;\n    }\n    if(i===null) {\n        return this.getTypedRuleContexts(ErrorFilterLineContext);\n    } else {\n        return this.getTypedRuleContext(ErrorFilterLineContext,i);\n    }\n};\n\nPromptSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterPromptSection(this);\n\t}\n};\n\nPromptSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitPromptSection(this);\n\t}\n};\n\nPromptSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitPromptSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.PromptSectionContext = PromptSectionContext;\n\nLUFileParser.prototype.promptSection = function() {\n\n    var localctx = new PromptSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 102, LUFileParser.RULE_promptSection);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 578;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 575;\n            this.match(LUFileParser.WS);\n            this.state = 580;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 581;\n        this.match(LUFileParser.PROMPT_MARK);\n        this.state = 584; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 584;\n        \t\tthis._errHandler.sync(this);\n        \t\tvar la_ = this._interp.adaptivePredict(this._input,82,this._ctx);\n        \t\tswitch(la_) {\n        \t\tcase 1:\n        \t\t    this.state = 582;\n        \t\t    this.filterLine();\n        \t\t    break;\n\n        \t\tcase 2:\n        \t\t    this.state = 583;\n        \t\t    this.errorFilterLine();\n        \t\t    break;\n\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 586; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,83, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction FilterLineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_filterLine;\n    return this;\n}\n\nFilterLineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFilterLineContext.prototype.constructor = FilterLineContext;\n\nFilterLineContext.prototype.DASH = function() {\n    return this.getToken(LUFileParser.DASH, 0);\n};\n\nFilterLineContext.prototype.newline = function() {\n    return this.getTypedRuleContext(NewlineContext,0);\n};\n\nFilterLineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nFilterLineContext.prototype.TEXT = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.TEXT);\n    } else {\n        return this.getToken(LUFileParser.TEXT, i);\n    }\n};\n\n\nFilterLineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterFilterLine(this);\n\t}\n};\n\nFilterLineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitFilterLine(this);\n\t}\n};\n\nFilterLineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitFilterLine(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.FilterLineContext = FilterLineContext;\n\nLUFileParser.prototype.filterLine = function() {\n\n    var localctx = new FilterLineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 104, LUFileParser.RULE_filterLine);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 591;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 588;\n            this.match(LUFileParser.WS);\n            this.state = 593;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 594;\n        this.match(LUFileParser.DASH);\n        this.state = 598;\n        this._errHandler.sync(this);\n        var _alt = this._interp.adaptivePredict(this._input,85,this._ctx)\n        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n            if(_alt===1) {\n                this.state = 595;\n                _la = this._input.LA(1);\n                if(!(_la===LUFileParser.WS || _la===LUFileParser.TEXT)) {\n                this._errHandler.recoverInline(this);\n                }\n                else {\n                \tthis._errHandler.reportMatch(this);\n                    this.consume();\n                } \n            }\n            this.state = 600;\n            this._errHandler.sync(this);\n            _alt = this._interp.adaptivePredict(this._input,85,this._ctx);\n        }\n\n        this.state = 601;\n        this.newline();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ErrorFilterLineContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_errorFilterLine;\n    return this;\n}\n\nErrorFilterLineContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nErrorFilterLineContext.prototype.constructor = ErrorFilterLineContext;\n\nErrorFilterLineContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nErrorFilterLineContext.prototype.INVALID_TOKEN_DEFAULT_MODE = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.INVALID_TOKEN_DEFAULT_MODE);\n    } else {\n        return this.getToken(LUFileParser.INVALID_TOKEN_DEFAULT_MODE, i);\n    }\n};\n\n\nErrorFilterLineContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterErrorFilterLine(this);\n\t}\n};\n\nErrorFilterLineContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitErrorFilterLine(this);\n\t}\n};\n\nErrorFilterLineContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitErrorFilterLine(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ErrorFilterLineContext = ErrorFilterLineContext;\n\nLUFileParser.prototype.errorFilterLine = function() {\n\n    var localctx = new ErrorFilterLineContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 106, LUFileParser.RULE_errorFilterLine);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 604; \n        this._errHandler.sync(this);\n        var _alt = 1;\n        do {\n        \tswitch (_alt) {\n        \tcase 1:\n        \t\tthis.state = 603;\n        \t\t_la = this._input.LA(1);\n        \t\tif(!(_la===LUFileParser.WS || _la===LUFileParser.INVALID_TOKEN_DEFAULT_MODE)) {\n        \t\tthis._errHandler.recoverInline(this);\n        \t\t}\n        \t\telse {\n        \t\t\tthis._errHandler.reportMatch(this);\n        \t\t    this.consume();\n        \t\t}\n        \t\tbreak;\n        \tdefault:\n        \t\tthrow new antlr4.error.NoViableAltException(this);\n        \t}\n        \tthis.state = 606; \n        \tthis._errHandler.sync(this);\n        \t_alt = this._interp.adaptivePredict(this._input,86, this._ctx);\n        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction MultiLineAnswerContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_multiLineAnswer;\n    return this;\n}\n\nMultiLineAnswerContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nMultiLineAnswerContext.prototype.constructor = MultiLineAnswerContext;\n\nMultiLineAnswerContext.prototype.MULTI_LINE_TEXT = function() {\n    return this.getToken(LUFileParser.MULTI_LINE_TEXT, 0);\n};\n\nMultiLineAnswerContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nMultiLineAnswerContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterMultiLineAnswer(this);\n\t}\n};\n\nMultiLineAnswerContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitMultiLineAnswer(this);\n\t}\n};\n\nMultiLineAnswerContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitMultiLineAnswer(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.MultiLineAnswerContext = MultiLineAnswerContext;\n\nLUFileParser.prototype.multiLineAnswer = function() {\n\n    var localctx = new MultiLineAnswerContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 108, LUFileParser.RULE_multiLineAnswer);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 611;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 608;\n            this.match(LUFileParser.WS);\n            this.state = 613;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 614;\n        this.match(LUFileParser.MULTI_LINE_TEXT);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ModelInfoSectionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_modelInfoSection;\n    return this;\n}\n\nModelInfoSectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nModelInfoSectionContext.prototype.constructor = ModelInfoSectionContext;\n\nModelInfoSectionContext.prototype.modelInfoDefinition = function() {\n    return this.getTypedRuleContext(ModelInfoDefinitionContext,0);\n};\n\nModelInfoSectionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterModelInfoSection(this);\n\t}\n};\n\nModelInfoSectionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitModelInfoSection(this);\n\t}\n};\n\nModelInfoSectionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitModelInfoSection(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ModelInfoSectionContext = ModelInfoSectionContext;\n\nLUFileParser.prototype.modelInfoSection = function() {\n\n    var localctx = new ModelInfoSectionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 110, LUFileParser.RULE_modelInfoSection);\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 616;\n        this.modelInfoDefinition();\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nfunction ModelInfoDefinitionContext(parser, parent, invokingState) {\n\tif(parent===undefined) {\n\t    parent = null;\n\t}\n\tif(invokingState===undefined || invokingState===null) {\n\t\tinvokingState = -1;\n\t}\n\tantlr4.ParserRuleContext.call(this, parent, invokingState);\n    this.parser = parser;\n    this.ruleIndex = LUFileParser.RULE_modelInfoDefinition;\n    return this;\n}\n\nModelInfoDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nModelInfoDefinitionContext.prototype.constructor = ModelInfoDefinitionContext;\n\nModelInfoDefinitionContext.prototype.MODEL_INFO = function() {\n    return this.getToken(LUFileParser.MODEL_INFO, 0);\n};\n\nModelInfoDefinitionContext.prototype.WS = function(i) {\n\tif(i===undefined) {\n\t\ti = null;\n\t}\n    if(i===null) {\n        return this.getTokens(LUFileParser.WS);\n    } else {\n        return this.getToken(LUFileParser.WS, i);\n    }\n};\n\n\nModelInfoDefinitionContext.prototype.enterRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.enterModelInfoDefinition(this);\n\t}\n};\n\nModelInfoDefinitionContext.prototype.exitRule = function(listener) {\n    if(listener instanceof LUFileParserListener ) {\n        listener.exitModelInfoDefinition(this);\n\t}\n};\n\nModelInfoDefinitionContext.prototype.accept = function(visitor) {\n    if ( visitor instanceof LUFileParserVisitor ) {\n        return visitor.visitModelInfoDefinition(this);\n    } else {\n        return visitor.visitChildren(this);\n    }\n};\n\n\n\n\nLUFileParser.ModelInfoDefinitionContext = ModelInfoDefinitionContext;\n\nLUFileParser.prototype.modelInfoDefinition = function() {\n\n    var localctx = new ModelInfoDefinitionContext(this, this._ctx, this.state);\n    this.enterRule(localctx, 112, LUFileParser.RULE_modelInfoDefinition);\n    var _la = 0; // Token type\n    try {\n        this.enterOuterAlt(localctx, 1);\n        this.state = 621;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while(_la===LUFileParser.WS) {\n            this.state = 618;\n            this.match(LUFileParser.WS);\n            this.state = 623;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n        }\n        this.state = 624;\n        this.match(LUFileParser.MODEL_INFO);\n    } catch (re) {\n    \tif(re instanceof antlr4.error.RecognitionException) {\n\t        localctx.exception = re;\n\t        this._errHandler.reportError(this, re);\n\t        this._errHandler.recover(this, re);\n\t    } else {\n\t    \tthrow re;\n\t    }\n    } finally {\n        this.exitRule();\n    }\n    return localctx;\n};\n\n\nexports.LUFileParser = LUFileParser;\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.tokens",
    "content": "WS=1\nNEWLINE=2\nQNA_SOURCE_INFO=3\nMODEL_INFO=4\nCOMMENT=5\nQNA=6\nHASH=7\nDASH=8\nDOLLAR=9\nAT=10\nIMPORT=11\nFILTER_MARK=12\nQNA_ID_MARK=13\nMULTI_LINE_TEXT=14\nPROMPT_MARK=15\nINVALID_TOKEN_DEFAULT_MODE=16\nEQUAL=17\nCOMMA=18\nHAS_ROLES_LABEL=19\nHAS_FEATURES_LABEL=20\nNEW_ENTITY_TYPE_IDENTIFIER=21\nPHRASE_LIST_LABEL=22\nNEW_COMPOSITE_ENTITY=23\nNEW_REGEX_ENTITY=24\nNEW_ENTITY_IDENTIFIER=25\nNEW_ENTITY_IDENTIFIER_WITH_WS=26\nNEWLINE_IN_NAME=27\nIDENTIFIER=28\nDOT=29\nESCAPE_CHARACTER=30\nEXPRESSION=31\nTEXT=32\nNEWLINE_IN_ENTITY=33\nCOMPOSITE_ENTITY=34\nREGEX_ENTITY=35\nENTITY_TEXT=36\nCOLON_MARK=37\nNEWLINE_IN_QNA=38\nQNA_TEXT=39\n'$'=9\n'@'=10\n'='=17\n','=18\n'.'=29\n':'=37\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParserListener.js",
    "content": "// Generated from ../LUFileParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n// This class defines a complete listener for a parse tree produced by LUFileParser.\nfunction LUFileParserListener() {\n\tantlr4.tree.ParseTreeListener.call(this);\n\treturn this;\n}\n\nLUFileParserListener.prototype = Object.create(antlr4.tree.ParseTreeListener.prototype);\nLUFileParserListener.prototype.constructor = LUFileParserListener;\n\n// Enter a parse tree produced by LUFileParser#file.\nLUFileParserListener.prototype.enterFile = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#file.\nLUFileParserListener.prototype.exitFile = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#paragraph.\nLUFileParserListener.prototype.enterParagraph = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#paragraph.\nLUFileParserListener.prototype.exitParagraph = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newline.\nLUFileParserListener.prototype.enterNewline = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newline.\nLUFileParserListener.prototype.exitNewline = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#errorString.\nLUFileParserListener.prototype.enterErrorString = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#errorString.\nLUFileParserListener.prototype.exitErrorString = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#nestedIntentSection.\nLUFileParserListener.prototype.enterNestedIntentSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#nestedIntentSection.\nLUFileParserListener.prototype.exitNestedIntentSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#nestedIntentNameLine.\nLUFileParserListener.prototype.enterNestedIntentNameLine = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#nestedIntentNameLine.\nLUFileParserListener.prototype.exitNestedIntentNameLine = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#nestedIntentName.\nLUFileParserListener.prototype.enterNestedIntentName = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#nestedIntentName.\nLUFileParserListener.prototype.exitNestedIntentName = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#nameIdentifier.\nLUFileParserListener.prototype.enterNameIdentifier = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#nameIdentifier.\nLUFileParserListener.prototype.exitNameIdentifier = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#nestedIntentBodyDefinition.\nLUFileParserListener.prototype.enterNestedIntentBodyDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#nestedIntentBodyDefinition.\nLUFileParserListener.prototype.exitNestedIntentBodyDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#subIntentDefinition.\nLUFileParserListener.prototype.enterSubIntentDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#subIntentDefinition.\nLUFileParserListener.prototype.exitSubIntentDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#simpleIntentSection.\nLUFileParserListener.prototype.enterSimpleIntentSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#simpleIntentSection.\nLUFileParserListener.prototype.exitSimpleIntentSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#intentDefinition.\nLUFileParserListener.prototype.enterIntentDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#intentDefinition.\nLUFileParserListener.prototype.exitIntentDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#intentNameLine.\nLUFileParserListener.prototype.enterIntentNameLine = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#intentNameLine.\nLUFileParserListener.prototype.exitIntentNameLine = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#intentName.\nLUFileParserListener.prototype.enterIntentName = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#intentName.\nLUFileParserListener.prototype.exitIntentName = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#intentBody.\nLUFileParserListener.prototype.enterIntentBody = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#intentBody.\nLUFileParserListener.prototype.exitIntentBody = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#normalIntentBody.\nLUFileParserListener.prototype.enterNormalIntentBody = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#normalIntentBody.\nLUFileParserListener.prototype.exitNormalIntentBody = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#normalIntentString.\nLUFileParserListener.prototype.enterNormalIntentString = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#normalIntentString.\nLUFileParserListener.prototype.exitNormalIntentString = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntitySection.\nLUFileParserListener.prototype.enterNewEntitySection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntitySection.\nLUFileParserListener.prototype.exitNewEntitySection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityDefinition.\nLUFileParserListener.prototype.enterNewEntityDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityDefinition.\nLUFileParserListener.prototype.exitNewEntityDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityListbody.\nLUFileParserListener.prototype.enterNewEntityListbody = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityListbody.\nLUFileParserListener.prototype.exitNewEntityListbody = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityLine.\nLUFileParserListener.prototype.enterNewEntityLine = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityLine.\nLUFileParserListener.prototype.exitNewEntityLine = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newCompositeDefinition.\nLUFileParserListener.prototype.enterNewCompositeDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newCompositeDefinition.\nLUFileParserListener.prototype.exitNewCompositeDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newRegexDefinition.\nLUFileParserListener.prototype.enterNewRegexDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newRegexDefinition.\nLUFileParserListener.prototype.exitNewRegexDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityType.\nLUFileParserListener.prototype.enterNewEntityType = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityType.\nLUFileParserListener.prototype.exitNewEntityType = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityRoles.\nLUFileParserListener.prototype.enterNewEntityRoles = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityRoles.\nLUFileParserListener.prototype.exitNewEntityRoles = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityUsesFeatures.\nLUFileParserListener.prototype.enterNewEntityUsesFeatures = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityUsesFeatures.\nLUFileParserListener.prototype.exitNewEntityUsesFeatures = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityRoleOrFeatures.\nLUFileParserListener.prototype.enterNewEntityRoleOrFeatures = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityRoleOrFeatures.\nLUFileParserListener.prototype.exitNewEntityRoleOrFeatures = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityName.\nLUFileParserListener.prototype.enterNewEntityName = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityName.\nLUFileParserListener.prototype.exitNewEntityName = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#newEntityNameWithWS.\nLUFileParserListener.prototype.enterNewEntityNameWithWS = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#newEntityNameWithWS.\nLUFileParserListener.prototype.exitNewEntityNameWithWS = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#entitySection.\nLUFileParserListener.prototype.enterEntitySection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#entitySection.\nLUFileParserListener.prototype.exitEntitySection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#entityDefinition.\nLUFileParserListener.prototype.enterEntityDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#entityDefinition.\nLUFileParserListener.prototype.exitEntityDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#entityLine.\nLUFileParserListener.prototype.enterEntityLine = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#entityLine.\nLUFileParserListener.prototype.exitEntityLine = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#entityName.\nLUFileParserListener.prototype.enterEntityName = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#entityName.\nLUFileParserListener.prototype.exitEntityName = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#entityType.\nLUFileParserListener.prototype.enterEntityType = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#entityType.\nLUFileParserListener.prototype.exitEntityType = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#compositeEntityIdentifier.\nLUFileParserListener.prototype.enterCompositeEntityIdentifier = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#compositeEntityIdentifier.\nLUFileParserListener.prototype.exitCompositeEntityIdentifier = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#regexEntityIdentifier.\nLUFileParserListener.prototype.enterRegexEntityIdentifier = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#regexEntityIdentifier.\nLUFileParserListener.prototype.exitRegexEntityIdentifier = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#entityListBody.\nLUFileParserListener.prototype.enterEntityListBody = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#entityListBody.\nLUFileParserListener.prototype.exitEntityListBody = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#normalItemString.\nLUFileParserListener.prototype.enterNormalItemString = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#normalItemString.\nLUFileParserListener.prototype.exitNormalItemString = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#importSection.\nLUFileParserListener.prototype.enterImportSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#importSection.\nLUFileParserListener.prototype.exitImportSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#importDefinition.\nLUFileParserListener.prototype.enterImportDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#importDefinition.\nLUFileParserListener.prototype.exitImportDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#qnaSection.\nLUFileParserListener.prototype.enterQnaSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#qnaSection.\nLUFileParserListener.prototype.exitQnaSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#qnaDefinition.\nLUFileParserListener.prototype.enterQnaDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#qnaDefinition.\nLUFileParserListener.prototype.exitQnaDefinition = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#qnaSourceInfo.\nLUFileParserListener.prototype.enterQnaSourceInfo = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#qnaSourceInfo.\nLUFileParserListener.prototype.exitQnaSourceInfo = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#qnaIdMark.\nLUFileParserListener.prototype.enterQnaIdMark = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#qnaIdMark.\nLUFileParserListener.prototype.exitQnaIdMark = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#qnaQuestion.\nLUFileParserListener.prototype.enterQnaQuestion = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#qnaQuestion.\nLUFileParserListener.prototype.exitQnaQuestion = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#questionText.\nLUFileParserListener.prototype.enterQuestionText = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#questionText.\nLUFileParserListener.prototype.exitQuestionText = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#moreQuestionsBody.\nLUFileParserListener.prototype.enterMoreQuestionsBody = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#moreQuestionsBody.\nLUFileParserListener.prototype.exitMoreQuestionsBody = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#moreQuestion.\nLUFileParserListener.prototype.enterMoreQuestion = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#moreQuestion.\nLUFileParserListener.prototype.exitMoreQuestion = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#errorQuestionString.\nLUFileParserListener.prototype.enterErrorQuestionString = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#errorQuestionString.\nLUFileParserListener.prototype.exitErrorQuestionString = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#qnaAnswerBody.\nLUFileParserListener.prototype.enterQnaAnswerBody = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#qnaAnswerBody.\nLUFileParserListener.prototype.exitQnaAnswerBody = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#filterSection.\nLUFileParserListener.prototype.enterFilterSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#filterSection.\nLUFileParserListener.prototype.exitFilterSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#promptSection.\nLUFileParserListener.prototype.enterPromptSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#promptSection.\nLUFileParserListener.prototype.exitPromptSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#filterLine.\nLUFileParserListener.prototype.enterFilterLine = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#filterLine.\nLUFileParserListener.prototype.exitFilterLine = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#errorFilterLine.\nLUFileParserListener.prototype.enterErrorFilterLine = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#errorFilterLine.\nLUFileParserListener.prototype.exitErrorFilterLine = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#multiLineAnswer.\nLUFileParserListener.prototype.enterMultiLineAnswer = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#multiLineAnswer.\nLUFileParserListener.prototype.exitMultiLineAnswer = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#modelInfoSection.\nLUFileParserListener.prototype.enterModelInfoSection = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#modelInfoSection.\nLUFileParserListener.prototype.exitModelInfoSection = function(ctx) {\n};\n\n\n// Enter a parse tree produced by LUFileParser#modelInfoDefinition.\nLUFileParserListener.prototype.enterModelInfoDefinition = function(ctx) {\n};\n\n// Exit a parse tree produced by LUFileParser#modelInfoDefinition.\nLUFileParserListener.prototype.exitModelInfoDefinition = function(ctx) {\n};\n\n\n\nexports.LUFileParserListener = LUFileParserListener;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParserVisitor.js",
    "content": "// Generated from ../LUFileParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n// This class defines a complete generic visitor for a parse tree produced by LUFileParser.\n\nfunction LUFileParserVisitor() {\n\tantlr4.tree.ParseTreeVisitor.call(this);\n\treturn this;\n}\n\nLUFileParserVisitor.prototype = Object.create(antlr4.tree.ParseTreeVisitor.prototype);\nLUFileParserVisitor.prototype.constructor = LUFileParserVisitor;\n\n// Visit a parse tree produced by LUFileParser#file.\nLUFileParserVisitor.prototype.visitFile = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#paragraph.\nLUFileParserVisitor.prototype.visitParagraph = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newline.\nLUFileParserVisitor.prototype.visitNewline = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#errorString.\nLUFileParserVisitor.prototype.visitErrorString = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#nestedIntentSection.\nLUFileParserVisitor.prototype.visitNestedIntentSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#nestedIntentNameLine.\nLUFileParserVisitor.prototype.visitNestedIntentNameLine = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#nestedIntentName.\nLUFileParserVisitor.prototype.visitNestedIntentName = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#nameIdentifier.\nLUFileParserVisitor.prototype.visitNameIdentifier = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#nestedIntentBodyDefinition.\nLUFileParserVisitor.prototype.visitNestedIntentBodyDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#subIntentDefinition.\nLUFileParserVisitor.prototype.visitSubIntentDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#simpleIntentSection.\nLUFileParserVisitor.prototype.visitSimpleIntentSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#intentDefinition.\nLUFileParserVisitor.prototype.visitIntentDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#intentNameLine.\nLUFileParserVisitor.prototype.visitIntentNameLine = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#intentName.\nLUFileParserVisitor.prototype.visitIntentName = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#intentBody.\nLUFileParserVisitor.prototype.visitIntentBody = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#normalIntentBody.\nLUFileParserVisitor.prototype.visitNormalIntentBody = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#normalIntentString.\nLUFileParserVisitor.prototype.visitNormalIntentString = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntitySection.\nLUFileParserVisitor.prototype.visitNewEntitySection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityDefinition.\nLUFileParserVisitor.prototype.visitNewEntityDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityListbody.\nLUFileParserVisitor.prototype.visitNewEntityListbody = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityLine.\nLUFileParserVisitor.prototype.visitNewEntityLine = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newCompositeDefinition.\nLUFileParserVisitor.prototype.visitNewCompositeDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newRegexDefinition.\nLUFileParserVisitor.prototype.visitNewRegexDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityType.\nLUFileParserVisitor.prototype.visitNewEntityType = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityRoles.\nLUFileParserVisitor.prototype.visitNewEntityRoles = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityUsesFeatures.\nLUFileParserVisitor.prototype.visitNewEntityUsesFeatures = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityRoleOrFeatures.\nLUFileParserVisitor.prototype.visitNewEntityRoleOrFeatures = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityName.\nLUFileParserVisitor.prototype.visitNewEntityName = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#newEntityNameWithWS.\nLUFileParserVisitor.prototype.visitNewEntityNameWithWS = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#entitySection.\nLUFileParserVisitor.prototype.visitEntitySection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#entityDefinition.\nLUFileParserVisitor.prototype.visitEntityDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#entityLine.\nLUFileParserVisitor.prototype.visitEntityLine = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#entityName.\nLUFileParserVisitor.prototype.visitEntityName = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#entityType.\nLUFileParserVisitor.prototype.visitEntityType = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#compositeEntityIdentifier.\nLUFileParserVisitor.prototype.visitCompositeEntityIdentifier = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#regexEntityIdentifier.\nLUFileParserVisitor.prototype.visitRegexEntityIdentifier = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#entityListBody.\nLUFileParserVisitor.prototype.visitEntityListBody = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#normalItemString.\nLUFileParserVisitor.prototype.visitNormalItemString = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#importSection.\nLUFileParserVisitor.prototype.visitImportSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#importDefinition.\nLUFileParserVisitor.prototype.visitImportDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#qnaSection.\nLUFileParserVisitor.prototype.visitQnaSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#qnaDefinition.\nLUFileParserVisitor.prototype.visitQnaDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#qnaSourceInfo.\nLUFileParserVisitor.prototype.visitQnaSourceInfo = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#qnaIdMark.\nLUFileParserVisitor.prototype.visitQnaIdMark = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#qnaQuestion.\nLUFileParserVisitor.prototype.visitQnaQuestion = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#questionText.\nLUFileParserVisitor.prototype.visitQuestionText = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#moreQuestionsBody.\nLUFileParserVisitor.prototype.visitMoreQuestionsBody = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#moreQuestion.\nLUFileParserVisitor.prototype.visitMoreQuestion = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#errorQuestionString.\nLUFileParserVisitor.prototype.visitErrorQuestionString = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#qnaAnswerBody.\nLUFileParserVisitor.prototype.visitQnaAnswerBody = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#filterSection.\nLUFileParserVisitor.prototype.visitFilterSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#promptSection.\nLUFileParserVisitor.prototype.visitPromptSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#filterLine.\nLUFileParserVisitor.prototype.visitFilterLine = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#errorFilterLine.\nLUFileParserVisitor.prototype.visitErrorFilterLine = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#multiLineAnswer.\nLUFileParserVisitor.prototype.visitMultiLineAnswer = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#modelInfoSection.\nLUFileParserVisitor.prototype.visitModelInfoSection = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n// Visit a parse tree produced by LUFileParser#modelInfoDefinition.\nLUFileParserVisitor.prototype.visitModelInfoDefinition = function(ctx) {\n  return this.visitChildren(ctx);\n};\n\n\n\nexports.LUFileParserVisitor = LUFileParserVisitor;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/importSection.js",
    "content": "const ImportSectionContext = require('./generated/LUFileParser').LUFileParser.ImportSectionContext;\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes'); \nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass ImportSection extends BaseSection {\n    /**\n     * \n     * @param {ImportSectionContext} parseTree \n     */\n    constructor(parseTree) {\n        super();\n        this.Errors = []\n        this.SectionType = LUSectionTypes.IMPORTSECTION;\n        let result = this.ExtractDescriptionAndPath(parseTree);\n        this.Description = result.description;\n        this.Path = result.path;\n        this.Id = `${this.SectionType}_${this.Path}`;\n        const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n        const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n        this.Range = new Range(startPosition, stopPosition);\n    }\n\n    ExtractDescriptionAndPath(parseTree) {\n        let importRegex = new RegExp(/\\[([^\\]]*)\\]\\(([^\\)]*)\\)/);\n        let importStr = parseTree.importDefinition().IMPORT().getText();\n\n        let description\n        let path\n\n        let groups = importStr.match(importRegex);\n        if (groups && groups.length === 3) {\n            description = groups[1].trim();\n            path = groups[2].trim();\n            if (path === undefined || path === '') {\n                let errorMsg = `LU file reference path is empty: \"${parseTree.getText()}\"`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    context: parseTree\n                })\n\n                this.Errors.push(error);\n            }\n        }\n\n        return { description, path }\n    }\n}\n\nmodule.exports = ImportSection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/luErrorListener.js",
    "content": "const antlr4 = require('antlr4');\nconst Position = require('./diagnostic').Position;\nconst Range = require('./diagnostic').Range;\nconst Diagnostic = require('./diagnostic').Diagnostic;\nconst AntlrTokens = require('./diagnostic').AntlrTokens;\n\nlet LUErrorListener = function(errors) {\n    antlr4.error.ErrorListener.call(this);\n    this.errors = errors;\n    return this;\n}\n\nLUErrorListener.prototype = Object.create(antlr4.error.ErrorListener.prototype);\nLUErrorListener.prototype.constructor = LUErrorListener;\nLUErrorListener.prototype.syntaxError = function(recognizer, offendingSymbol, line, charPositionInLine, msg, e) {\n    const startPosition = new Position(line, charPositionInLine);\n    const stopPosition = new Position(line, charPositionInLine + offendingSymbol.stop - offendingSymbol.start + 1);\n    const range = new Range(startPosition, stopPosition);\n    msg = `syntax error: ` + msg;\n    const invalidToken = msg.match(/'([^']+)'/)[1];\n    const expectedTokenStr = msg.substring(msg.indexOf('{') + 1, msg.lastIndexOf('}'));\n    const expectedTokens = expectedTokenStr.split(',');\n    if (expectedTokenStr.length > 0 && expectedTokens.length > 0) {\n        msg = `syntax error: invalid input '${invalidToken}' detected. Expecting one of this - `;\n        expectedTokens.forEach(token => {\n            msg += AntlrTokens[token.trim()] + ', ';\n        });\n\n        msg = msg.substring(0, msg.lastIndexOf(', '));\n    }\n    \n    const diagnostic = new Diagnostic(range, msg);\n    this.errors.push(diagnostic);\n}\n\nmodule.exports = LUErrorListener;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/luParser.js",
    "content": "const antlr4 = require('antlr4');\nconst LUFileLexer = require('./generated/LUFileLexer').LUFileLexer;\nconst LUFileParser = require('./generated/LUFileParser').LUFileParser;\nconst FileContext = require('./generated/LUFileParser').LUFileParser.FileContext;\nconst LUResource = require('./luResource');\nconst NestedIntentSection = require('./nestedIntentSection');\nconst SimpleIntentSection = require('./simpleIntentSection');\nconst EntitySection = require('./entitySection');\nconst NewEntitySection =  require('./newEntitySection');\nconst ImportSection = require('./importSection');\nconst QnaSection = require('./qnaSection');\nconst ModelInfoSection = require('./modelInfoSection');\nconst LUErrorListener = require('./luErrorListener');\nconst SectionType = require('./../utils/enums/lusectiontypes');\nconst DiagnosticSeverity = require('./diagnostic').DiagnosticSeverity;\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\nconst NEWLINE = require('os').EOL;\n\nclass LUParser {\n\n    /**\n     * \n     * @param {string} text \n     * @param {LUResource} luResource \n     */\n    static parseWithRef(text, luResource) {\n        if (text === undefined || text === '') {\n            return new LUResource([], '', []);\n        }\n\n        const sectionEnabled = luResource ? this.isSectionEnabled(luResource.Sections) : undefined;\n\n        return this.parse(text, sectionEnabled);\n    }\n\n    /**\n     * @param {string} text\n     */\n    static parse(text, sectionEnabled) {\n        if (text === undefined || text === '') {\n            return new LUResource([], '', []);\n        }\n\n        let {fileContent, errors} = this.getFileContent(text);\n\n        return this.extractFileContent(fileContent, text, errors, sectionEnabled);\n    }\n\n    static extractFileContent(fileContent, content, errors, sectionEnabled) {\n        let sections = [];\n        try {\n            let modelInfoSections = this.extractModelInfoSections(fileContent);\n            modelInfoSections.forEach(section => errors = errors.concat(section.Errors));\n            sections = sections.concat(modelInfoSections);\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing model information: ${err.message}`\n            }))\n        }\n\n        try {\n            let isSectionEnabled = sectionEnabled === undefined ?  this.isSectionEnabled(sections) : sectionEnabled;\n\n            let nestedIntentSections = this.extractNestedIntentSections(fileContent, content);\n            nestedIntentSections.forEach(section => errors = errors.concat(section.Errors));\n            if (isSectionEnabled) {\n                sections = sections.concat(nestedIntentSections);\n            } else {\n                nestedIntentSections.forEach(section => {\n                    let emptyIntentSection = new SimpleIntentSection();\n                    emptyIntentSection.Name = section.Name;\n                    emptyIntentSection.Id = `${emptyIntentSection.SectionType}_${emptyIntentSection.Name}`\n                    \n                    // get the end character index\n                    // this is default value\n                    // it will be reset in function extractSectionBody()\n                    let endCharacter = section.Name.length + 2;\n                   \n                    const range = new Range(section.Range.Start, new Position(section.Range.Start.Line, endCharacter))\n                    emptyIntentSection.Range = range;\n                    let errorMsg = `no utterances found for intent definition: \"# ${emptyIntentSection.Name}\"`\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: emptyIntentSection.Range,\n                        severity: DiagnosticSeverity.WARN\n                    })\n\n                    errors.push(error);\n                    sections.push(emptyIntentSection);\n\n                    section.SimpleIntentSections.forEach(subSection => {\n                        sections.push(subSection);\n                        errors = errors.concat(subSection.Errors);\n                    })\n                });\n            }\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing nested intent section: ${err.message}`\n            }))\n        }\n\n        try {\n            let simpleIntentSections = this.extractSimpleIntentSections(fileContent, content);\n            simpleIntentSections.forEach(section => errors = errors.concat(section.Errors));\n            sections = sections.concat(simpleIntentSections);\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing simple intent section: ${err.message}`\n            }))\n        }\n\n        try {\n            let entitySections = this.extractEntitiesSections(fileContent);\n            entitySections.forEach(section => errors = errors.concat(section.Errors));\n            sections = sections.concat(entitySections);\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing entities: ${err.message}`\n            }))\n        }\n\n        try {\n            let newEntitySections = this.extractNewEntitiesSections(fileContent);\n            newEntitySections.forEach(section => errors = errors.concat(section.Errors));\n            sections = sections.concat(newEntitySections);\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing new entities: ${err.message}`\n            }))\n        }\n\n        try {\n            let importSections = this.extractImportSections(fileContent);\n            importSections.forEach(section => errors = errors.concat(section.Errors));\n            sections = sections.concat(importSections);\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing import section: ${err.message}`\n            }))\n        }\n\n        try {\n            let qnaSections = this.extractQnaSections(fileContent);\n            qnaSections.forEach(section => errors = errors.concat(section.Errors));\n            sections = sections.concat(qnaSections);\n        } catch (err) {\n            errors.push(BuildDiagnostic({\n                message: `Error happened when parsing qna section: ${err.message}`\n            }))\n        }\n\n        sections = this.reconstractIntentSections(sections)\n\n        this.extractSectionBody(sections, content)\n        console.log(JSON.stringify({sections, content, errors}))\n\n        return new LUResource(sections, content, errors);\n    }\n\n    /**\n     * @param {string} text\n     */\n    static getFileContent(text) {\n        if (text === undefined\n            || text === ''\n            || text === null) {\n            \n            return undefined;\n        }\n\n        const chars = new antlr4.InputStream(text);\n        const lexer = new LUFileLexer(chars);\n        const tokens = new antlr4.CommonTokenStream(lexer);\n        const parser = new LUFileParser(tokens);\n        let errors = [];\n        const listener = new LUErrorListener(errors)\n        parser.removeErrorListeners();\n        parser.addErrorListener(listener);\n        parser.buildParseTrees = true;\n        const fileContent = parser.file();\n        \n        return { fileContent, errors };\n    }\n\n    /**\n     * @param {FileContext} fileContext\n     * @param {string} content \n     */\n    static extractNestedIntentSections(fileContext, content) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let nestedIntentSections = fileContext.paragraph()\n            .map(x => x.nestedIntentSection())\n            .filter(x => x !== undefined && x !== null);\n\n        let nestedIntentSectionList = nestedIntentSections.map(x => new NestedIntentSection(x, content));\n\n        return nestedIntentSectionList;\n    }\n\n    /**\n     * @param {FileContext} fileContext \n     * @param {string} content \n     */\n    static extractSimpleIntentSections(fileContext, content) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let simpleIntentSections = fileContext.paragraph()\n            .map(x => x.simpleIntentSection())\n            .filter(x => x && x.intentDefinition());\n\n        let simpleIntentSectionList = simpleIntentSections.map(x => new SimpleIntentSection(x, content));\n\n        return simpleIntentSectionList;\n    }\n\n    /**\n     * @param {FileContext} fileContext \n     */\n    static extractEntitiesSections(fileContext) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let entitySections = fileContext.paragraph()\n            .map(x => x.entitySection())\n            .filter(x => x && x.entityDefinition());\n\n        let entitySectionList = entitySections.map(x => new EntitySection(x));\n\n        return entitySectionList;\n    }\n\n    /**\n     * @param {FileContext} fileContext \n     */\n    static extractNewEntitiesSections(fileContext) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let newEntitySections = fileContext.paragraph()\n            .map(x => x.newEntitySection())\n            .filter(x => x && x.newEntityDefinition());\n        \n        let newEntitySectionList = newEntitySections.map(x => new NewEntitySection(x));\n\n        return newEntitySectionList;\n    }\n\n    /**\n     * @param {FileContext} fileContext \n     */\n    static extractImportSections(fileContext) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let importSections = fileContext.paragraph()\n            .map(x => x.importSection())\n            .filter(x => x !== undefined && x !== null);\n\n        let importSectionList = importSections.map(x => new ImportSection(x));\n\n        return importSectionList;\n    }\n\n    /**\n     * @param {FileContext} fileContext \n     */\n    static extractQnaSections(fileContext) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let qnaSections = fileContext.paragraph()\n            .map(x => x.qnaSection())\n            .filter(x => x !== undefined && x !== null);\n\n        let qnaSectionList = qnaSections.map(x => new QnaSection(x));\n\n        return qnaSectionList;\n    }\n\n    /**\n     * @param {FileContext} fileContext \n     */\n    static extractModelInfoSections(fileContext) {\n        if (fileContext === undefined\n            || fileContext === null) {\n                return [];\n        }\n\n        let modelInfoSections = fileContext.paragraph()\n            .map(x => x.modelInfoSection())\n            .filter(x => x !== undefined && x !== null);\n\n        let modelInfoSectionList = modelInfoSections.map(x => new ModelInfoSection(x));\n\n        return modelInfoSectionList;\n    }\n\n    /**\n     * @param {any[]} sections \n     */\n    static reconstractIntentSections(sections) {\n        let newSections = []\n        sections.sort((a, b) => a.Range.Start.Line - b.Range.Start.Line)\n        let index\n        for (index = 0; index < sections.length; index++) {\n            let section = sections[index]\n            if (index + 1 === sections.length) {\n                newSections.push(section)\n                break\n            }\n\n            if (section.SectionType === SectionType.NESTEDINTENTSECTION) {\n                if (sections[index + 1].SectionType === SectionType.ENTITYSECTION\n                    || sections[index + 1].SectionType === SectionType.NEWENTITYSECTION) {\n                    let simpleIntentSections = section.SimpleIntentSections\n                    simpleIntentSections[simpleIntentSections.length - 1].Entities.push(sections[index + 1])\n                    simpleIntentSections[simpleIntentSections.length - 1].Errors.push(...sections[index + 1].Errors)\n                    index++\n\n                    while (index + 1 < sections.length \n                        && (sections[index + 1].SectionType === SectionType.ENTITYSECTION\n                        || sections[index + 1].SectionType === SectionType.NEWENTITYSECTION\n                        || (sections[index + 1].SectionType === SectionType.SIMPLEINTENTSECTION && sections[index + 1].IntentNameLine.includes('##')))) {\n                        if (sections[index + 1].SectionType === SectionType.ENTITYSECTION\n                            || sections[index + 1].SectionType === SectionType.NEWENTITYSECTION) {\n                            simpleIntentSections[simpleIntentSections.length - 1].Entities.push(sections[index + 1])\n                            simpleIntentSections[simpleIntentSections.length - 1].Errors.push(...sections[index + 1].Errors)\n                        } else {\n                            simpleIntentSections.push(sections[index + 1])\n                        }\n\n                        index++\n                    }\n\n                    simpleIntentSections.forEach(s => section.Errors.push(...s.Errors))\n\n                    section.SimpleIntentSection = simpleIntentSections\n                }\n            } else if (section.SectionType === SectionType.SIMPLEINTENTSECTION) {\n                while (index + 1 < sections.length && (sections[index + 1].SectionType === SectionType.ENTITYSECTION\n                    || sections[index + 1].SectionType === SectionType.NEWENTITYSECTION)) {\n                    section.Entities.push(sections[index + 1])\n                    section.Errors.push(...sections[index + 1].Errors)\n                    index++\n                }\n            }\n\n            newSections.push(section)\n        }\n\n        return newSections\n    }\n\n    /**\n     * @param {any[]} sections\n     * @param {string} content\n     */\n    static extractSectionBody(sections, content) {\n        const originList = content.split(/\\r?\\n/)\n        let qnaSectionIndex = 0\n        sections.forEach(function (section, index) {\n            if (section.SectionType === SectionType.SIMPLEINTENTSECTION\n                || section.SectionType === SectionType.NESTEDINTENTSECTION\n                || section.SectionType === SectionType.QNASECTION) {\n                const startLine = section.Range.Start.Line - 1;\n                let stopLine\n                if (index + 1 < sections.length) {\n                    stopLine = sections[index + 1].Range.Start.Line - 1\n                    if (isNaN(startLine) || isNaN(stopLine) || startLine < 0 || startLine > stopLine) {\n                        throw new Error(\"index out of range.\")\n                    }\n                } else {\n                    stopLine = originList.length\n                }\n                section.Range.End.Line = stopLine;\n                section.Range.End.Character = originList[stopLine - 1].length\n\n                let destList\n                if (section.SectionType === SectionType.QNASECTION) {\n                    destList = originList.slice(startLine, stopLine)\n                    section.Id = qnaSectionIndex\n                    qnaSectionIndex++\n                } else {\n                    destList = originList.slice(startLine + 1, stopLine)\n                }\n\n                section.Body = destList.join(NEWLINE)\n\n                if (section.SectionType === SectionType.NESTEDINTENTSECTION) {\n                    LUParser.extractSectionBody(section.SimpleIntentSections, originList.slice(0, stopLine).join(NEWLINE))\n                }\n            }\n        })\n    }\n\n    static isSectionEnabled(sections) {\n        let modelInfoSections = sections.filter(s => s.SectionType === SectionType.MODELINFOSECTION);\n        let enableSections = false;\n        if (modelInfoSections && modelInfoSections.length > 0) {\n            for (const modelInfo of modelInfoSections) {\n                let line = modelInfo.ModelInfo\n                let kvPair = line.split(/@(enableSections).(.*)=/g).map(item => item.trim());\n                if (kvPair.length === 4) {\n                    if (kvPair[1] === 'enableSections' && kvPair[3] === 'true') {\n                        enableSections = true;\n                        break;\n                    }\n                }\n            }\n        }\n\n        return enableSections;\n    }\n}\n\nmodule.exports = LUParser;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/luResource.js",
    "content": "class LUResource {\n  /**\n   * @param {any[]} sections\n   * @param {string} content\n   * @param {any[]} errors\n   */\n  constructor(sections, content, errors) {\n    this.Sections = sections || [];\n    this.Content = content;\n    this.Errors = errors || [];\n  }\n}\n\nmodule.exports = LUResource;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/modelInfoSection.js",
    "content": "const ModelInfoSectionContext = require('./generated/LUFileParser').LUFileParser.ModelInfoSectionContext;\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes'); \nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass LUModelInfo  extends BaseSection {\n    /**\n     * \n     * @param {ModelInfoSectionContext} parseTree \n     */\n    constructor(parseTree) {\n        super();\n        this.SectionType = LUSectionTypes.MODELINFOSECTION;\n        this.ModelInfo = parseTree.modelInfoDefinition().getText();\n        this.Errors = [];\n        this.Id = `${this.SectionType}_${this.ModelInfo}`;\n        const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n        const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n        this.Range = new Range(startPosition, stopPosition);\n    }\n}\n\nmodule.exports = LUModelInfo;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/nestedIntentSection.js",
    "content": "const NestedIntentSectionContext = require('./generated/LUFileParser').LUFileParser.NestedIntentSectionContext\nconst SimpleIntentSection = require('./simpleIntentSection');\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes'); \nconst NEWLINE = require('os').EOL;\nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass NestedIntentSection  extends BaseSection {\n    /**\n     * \n     * @param {NestedIntentSectionContext} parseTree \n     */\n    constructor(parseTree, content) {\n        super();\n        this.SectionType = LUSectionTypes.NESTEDINTENTSECTION;\n        this.Name = this.ExtractName(parseTree);\n        this.Body = '';\n        this.SimpleIntentSections = this.ExtractSimpleIntentSections(parseTree, content);\n        this.Errors = [];\n        if (this.SimpleIntentSections && this.SimpleIntentSections.length > 0) {\n            this.SimpleIntentSections.forEach(section => {\n                this.Errors = this.Errors.concat(section.Errors);\n            });\n        }\n        \n        this.Id = `${this.SectionType}_${this.Name}`;\n        const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n        const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n        this.Range = new Range(startPosition, stopPosition);\n    }\n\n    ExtractName(parseTree) {\n        return parseTree.nestedIntentNameLine().nestedIntentName().getText().trim();\n    }\n\n    ExtractSimpleIntentSections(parseTree, content) {\n        let simpleIntentSections = [];\n        for(const subIntentDefinition of parseTree.nestedIntentBodyDefinition().subIntentDefinition()) {\n            let simpleIntentSection = new SimpleIntentSection(subIntentDefinition.simpleIntentSection(), content);\n            simpleIntentSection.Range.Start.Character = 0\n            simpleIntentSections.push(simpleIntentSection);\n        }\n\n        return simpleIntentSections;\n    }\n}\n\nmodule.exports = NestedIntentSection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/newEntitySection.js",
    "content": "const NewEntitySectionContext = require('./generated/LUFileParser').LUFileParser.NewEntitySectionContext;\nconst DiagnosticSeverity = require('./diagnostic').DiagnosticSeverity;\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes');\nconst InvalidCharsInIntentOrEntityName = require('./../utils/enums/invalidchars').InvalidCharsInIntentOrEntityName;\nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass NewEntitySection  extends BaseSection {\n    /**\n     * \n     * @param {NewEntitySectionContext} parseTree \n     */\n    constructor(parseTree) {\n        super();\n        this.SectionType = LUSectionTypes.NEWENTITYSECTION;\n        this.Errors = []\n        this.Name = this.ExtractName(parseTree);\n        this.Type = this.ExtractType(parseTree);\n        this.Roles = this.ExtractRoles(parseTree);\n        this.Features = this.ExtractFeatures(parseTree);\n        this.CompositeDefinition = this.ExtractCompositeDefinition(parseTree);\n        this.RegexDefinition = this.ExtractRegexDefinition(parseTree);\n        this.ListBody = this.ExtractSynonymsOrPhraseList(parseTree);\n        this.Id = `${this.SectionType}_${this.Name}`;\n        const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n        const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n        this.Range = new Range(startPosition, stopPosition);\n    }\n\n    ExtractName(parseTree) {\n        let entityName\n        if (parseTree.newEntityDefinition().newEntityLine().newEntityName()) {\n            entityName = parseTree.newEntityDefinition().newEntityLine().newEntityName().getText().trim();\n        } else if (parseTree.newEntityDefinition().newEntityLine().newEntityNameWithWS()) {\n            entityName = parseTree.newEntityDefinition().newEntityLine().newEntityNameWithWS().getText().trim();\n        } else {\n            this.Errors.push(BuildDiagnostic({\n                message: \"Invalid entity line, did you miss entity name after @\",\n                context: parseTree.newEntityDefinition().newEntityLine()\n            }))\n        }\n\n        if (entityName && InvalidCharsInIntentOrEntityName.some(x => entityName.includes(x))) {\n            this.Errors.push(BuildDiagnostic({\n                message: `Invalid entity line, entity name ${entityName} cannot contain any of the following characters: [<, >, *, %, &, :, \\\\, $]`,\n                context: parseTree.newEntityDefinition().newEntityLine()\n            }));\n        } else {\n            return entityName;\n        }\n    }\n\n    ExtractType(parseTree) {\n        if (parseTree.newEntityDefinition().newEntityLine().newEntityType()) {\n            return parseTree.newEntityDefinition().newEntityLine().newEntityType().getText().trim();\n        }\n    }\n\n    ExtractRoles(parseTree) {\n        if (parseTree.newEntityDefinition().newEntityLine().newEntityRoles()) {            \n            return parseTree.newEntityDefinition().newEntityLine().newEntityRoles().newEntityRoleOrFeatures().getText().trim();\n        }\n    }\n\n    ExtractFeatures(parseTree) {\n        if (parseTree.newEntityDefinition().newEntityLine().newEntityUsesFeatures()) {\n            return parseTree.newEntityDefinition().newEntityLine().newEntityUsesFeatures().newEntityRoleOrFeatures().getText().trim();\n        }\n    }\n\n    ExtractCompositeDefinition(parseTree) {\n        if (parseTree.newEntityDefinition().newEntityLine().newCompositeDefinition()) {\n            return parseTree.newEntityDefinition().newEntityLine().newCompositeDefinition().getText().trim();\n        }\n    }\n\n    ExtractRegexDefinition(parseTree) {\n        if (parseTree.newEntityDefinition().newEntityLine().newRegexDefinition()) {\n            return parseTree.newEntityDefinition().newEntityLine().newRegexDefinition().getText().trim();\n        }\n    }\n\n    ExtractSynonymsOrPhraseList(parseTree) {\n        let synonymsOrPhraseList = [];\n\n        if (parseTree.newEntityDefinition().newEntityListbody()) {\n            for (const errorItemStr of parseTree.newEntityDefinition().newEntityListbody().errorString()) {\n                if (errorItemStr.getText().trim() !== '') {\n                    this.Errors.push(BuildDiagnostic({\n                    message: \"Invalid list entity line, did you miss '-' at line begin\",\n                    context: errorItemStr\n                }))}\n            }\n\n            for (const normalItemStr of parseTree.newEntityDefinition().newEntityListbody().normalItemString()) {\n                synonymsOrPhraseList.push(normalItemStr.getText());\n            }\n        }\n\n        if (this.Type && this.Type.indexOf('=') > -1 && synonymsOrPhraseList.length === 0) {\n            let errorMsg = `no synonyms list found for list entity definition: \"${parseTree.newEntityDefinition().entityLine().getText()}\"`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                context: parseTree.newEntityDefinition().entityLine(),\n                severity: DiagnosticSeverity.WARN\n            })\n\n            this.Errors.push(error);\n        }\n\n        return synonymsOrPhraseList;\n    }\n}\n\nmodule.exports = NewEntitySection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/parseFileContents.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst LUISObjNameEnum = require('./../utils/enums/luisobjenum');\nconst PARSERCONSTS = require('./../utils/enums/parserconsts');\nconst builtInTypes = require('./../utils/enums/luisbuiltintypes');\nconst helpers = require('./../utils/helpers');\nconst SectionType = require('./../utils/enums/lusectiontypes');\nconst chalk = require('chalk');\nconst url = require('url');\nconst retCode = require('./../utils/enums/CLI-errors');\nconst parserObj = require('./classes/parserObject');\nconst qnaListObj = require('./../qna/qnamaker/qnaList');\nconst qnaMetaDataObj = require('./../qna/qnamaker/qnaMetaData');\nconst helperClass = require('./classes/hclasses');\nconst deepEqual = require('deep-equal');\nconst exception = require('./../utils/exception');\nconst qnaAlterations = require('./../qna/alterations/alterations');\nconst fetch = require('node-fetch');\nconst qnaFile = require('./../qna/qnamaker/qnaFiles');\nconst fileToParse = require('./classes/filesToParse');\nconst luParser = require('./luParser');\nconst DiagnosticSeverity = require('./diagnostic').DiagnosticSeverity;\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst EntityTypeEnum = require('./../utils/enums/luisEntityTypes');\nconst luisEntityTypeMap = require('./../utils/enums/luisEntityTypeNameMap');\nconst qnaContext = require('../qna/qnamaker/qnaContext');\nconst qnaPrompt = require('../qna/qnamaker/qnaPrompt');\nconst plAllowedTypes = [\"composite\", \"ml\"];\nconst featureTypeEnum = {\n    featureToModel: 'modelName',\n    modelToFeature: 'featureName'\n};\nconst featureProperties = {\n    entityFeatureToModel : {\n        'simple': 'Entity Extractor',\n        'list' : 'Closed List Entity Extractor',\n        'prebuilt': 'Prebuilt Entity Extractor',\n        'composite': 'Composite Entity Extractor',\n        'regex': 'Regex Entity Extractor',\n        'ml': 'Entity Extractor'\n    },\n    intentFeatureToModel: 'Intent Classifier',\n    phraseListFeature: 'phraselist'\n}\nconst INTENTTYPE = 'intent';\nconst PLCONSTS = {\n    DISABLED : 'disabled',\n    ENABLEDFORALLMODELS: 'enabledforallmodels',\n    DISABLEDFORALLMODELS: 'disabledforallmodels',\n    INTERCHANGEABLE: '(interchangeable)'\n};\nconst parseFileContentsModule = {\n    /**\n     * Main parser code to parse current file contents into LUIS and QNA sections.\n     * @param {string} fileContent current file content\n     * @param {boolean} log indicates if we need verbose logging.\n     * @param {string} locale LUIS locale code\n     * @returns {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    parseFile: async function (fileContent, log, locale) {\n        fileContent = helpers.sanitizeNewLines(fileContent);\n\n        let parsedContent = new parserObj();\n        \n        if (fileContent === '') {\n            return parsedContent;\n        }\n\n        await parseLuAndQnaWithAntlr(parsedContent, fileContent.toString(), log, locale);\n\n        return parsedContent;\n    },\n    /**\n     * Helper function to add an item to collection if it does not exist\n     * @param {object} collection contents of the current collection\n     * @param {LUISObjNameEnum} type item type\n     * @param {object} value value of the current item to examine and add\n     * @returns {void} nothing\n     */\n    addItemIfNotPresent: function (collection, type, value) {\n        let hasValue = false;\n        for (let i in collection[type]) {\n            if (collection[type][i].name === value) {\n                hasValue = true;\n                break;\n            }\n        }\n        if (!hasValue) {\n            let itemObj = {};\n            itemObj.name = value;\n            if (type == LUISObjNameEnum.PATTERNANYENTITY) {\n                itemObj.explicitList = [];\n            }\n            if (type !== LUISObjNameEnum.INTENT) {\n                itemObj.roles = [];\n            }\n            collection[type].push(itemObj);\n        }\n    },\n    /**\n     * Helper function to add an item to collection if it does not exist\n     * @param {object} collection contents of the current collection\n     * @param {LUISObjNameEnum} type item type\n     * @param {object} value value of the current item to examine and add\n     * @param {string []} roles possible roles to add to the item\n     * @returns {void} nothing\n     */\n    addItemOrRoleIfNotPresent: function (collection, type, value, roles) {\n        let existingItem = collection[type].filter(item => item.name == value);\n        if (existingItem.length !== 0) {\n            // see if the role exists and if so, merge\n            mergeRoles(existingItem[0].roles, roles);\n        } else {\n            let itemObj = {};\n            itemObj.name = value;\n            if (type == LUISObjNameEnum.PATTERNANYENTITY) {\n                itemObj.explicitList = [];\n            }\n            if (type == LUISObjNameEnum.COMPOSITES) {\n                itemObj.children = [];\n            }\n            if (type !== LUISObjNameEnum.INTENT) {\n                itemObj.roles = roles;\n            }\n            collection[type].push(itemObj);\n        }\n    }\n};\n\n/**\n * Main parser code to parse current file contents into LUIS and QNA sections.\n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {string} fileContent current file content\n * @param {boolean} log indicates if we need verbose logging.\n * @param {string} locale LUIS locale code\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseLuAndQnaWithAntlr = async function (parsedContent, fileContent, log, locale) {\n    fileContent = helpers.sanitizeNewLines(fileContent);\n    let luResource = luParser.parse(fileContent);\n\n    if (luResource.Errors && luResource.Errors.length > 0) {\n        if (log) {\n            var warns = luResource.Errors.filter(error => (error && error.Severity && error.Severity === DiagnosticSeverity.WARN));\n            if (warns.length > 0) {\n                process.stdout.write(warns.map(warn => warn.toString()).join('\\n').concat('\\n'));\n            }\n        }\n\n        var errors = luResource.Errors.filter(error => (error && error.Severity && error.Severity === DiagnosticSeverity.ERROR));\n        if (errors.length > 0) {\n            throw (new exception(retCode.errorCode.INVALID_LINE, errors.map(error => error.toString()).join('\\n'), errors));\n        }\n    }\n\n    // parse model info section\n    let enableMergeIntents = parseAndHandleModelInfoSection(parsedContent, luResource, log);\n\n    // parse reference section\n    await parseAndHandleImportSection(parsedContent, luResource);\n\n    // parse nested intent section\n    parseAndHandleNestedIntentSection(luResource, enableMergeIntents);\n\n    GetEntitySectionsFromSimpleIntentSections(luResource);\n\n    // parse entity definition v2 section\n    let featuresToProcess = parseAndHandleEntityV2(parsedContent, luResource, log, locale);\n    \n    // parse entity section\n    parseAndHandleEntitySection(parsedContent, luResource, log, locale);\n\n    // parse simple intent section\n    await parseAndHandleSimpleIntentSection(parsedContent, luResource);\n\n    // parse qna section\n    await parseAndHandleQnaSection(parsedContent, luResource);\n\n    if (featuresToProcess && featuresToProcess.length > 0) {\n        parseFeatureSections(parsedContent, featuresToProcess);\n    }\n\n    validateNDepthEntities(parsedContent.LUISJsonStructure.entities, parsedContent.LUISJsonStructure.flatListOfEntityAndRoles, parsedContent.LUISJsonStructure.intents);\n\n    // Update intent and entities with phrase lists if any\n    updateIntentAndEntityFeatures(parsedContent.LUISJsonStructure);\n\n    helpers.checkAndUpdateVersion(parsedContent.LUISJsonStructure);\n    \n}\n\nconst updateIntentAndEntityFeatures = function(luisObj) {\n    let plForAll = luisObj.model_features.filter(item => item.enabledForAllModels == undefined || item.enabledForAllModels == true);\n    plForAll.forEach(pl => {\n        luisObj.intents.forEach(intent => updateFeaturesWithPL(intent, pl.name));\n        luisObj.entities.forEach(entity => updateFeaturesWithPL(entity, pl.name));\n    })\n}\n\nconst updateFeaturesWithPL = function(collection, plName) {\n    if (collection === null || collection === undefined) return;\n    if (collection.hasOwnProperty(\"features\")) {\n        if (Array.isArray(collection.features) && collection.features.find(i => i.featureName == plName) === undefined) {\n            collection.features.push(new helperClass.featureToModel(plName, featureProperties.phraseListFeature));\n        }\n    } else {\n        collection.features = [new helperClass.featureToModel(plName, featureProperties.phraseListFeature)];\n    }\n}\n/**\n * Helper to update final LUIS model based on labelled nDepth entities.\n * @param {Object []} utterances \n * @param {Object []} entities \n */\nconst updateModelBasedOnNDepthEntities = function(utterances, entities) {\n    // filter to all utterances that have a labelled entity\n    let utterancesWithLabels = utterances.filter(utterance => utterance.entities && utterance.entities.length !== 0);\n    utterancesWithLabels.forEach(utterance => {\n        utterance.entities.forEach(entityInUtterance => {\n            // find this entity's root. There can be multiple and if there are, we need to delete the one that does not have children.\n            let entityFoundInMaster = [];\n            entities.forEach((entity, idx) => {\n                if (entity.name == entityInUtterance.entity) {\n                    entityFoundInMaster.push({id: idx, entityRoot: entity, path: '/'});\n                }\n                let entityPath = findEntityPath(entity, entityInUtterance.entity, \"\");\n                if (entityPath !== \"\") { \n                    entityFoundInMaster.push({id: idx, entityRoot: entity, path: entityPath});\n                }\n            });\n            let isParentLabelled = false;\n            entityFoundInMaster.forEach(entityInMaster => {\n                let splitPath = entityInMaster.path.split(\"/\").filter(item => item.trim() !== \"\");\n                if (entityFoundInMaster.length > 1 && splitPath.length === 0 && (!entityInMaster.entityRoot.children || entityInMaster.entityRoot.children.length === 0)) {\n                    // this child needs to be removed. Note: There can only be at most one more entity due to utterance validation rules.\n                    entities.splice(entityInMaster.id, 1);\n                } else { \n                    if (isParentLabelled === false) {\n                        let rSplitPath = splitPath.reverse();\n                        rSplitPath.splice(0, 1);\n                        rSplitPath.forEach(parent => {\n                            // Ensure each parent is also labelled in this utterance\n                            let parentLabelled = utterance.entities.find(entityUtt => entityUtt.entity == parent);\n                            if (!parentLabelled) {\n                                const errorMsg = `Every child entity labelled in an utterance must have its parent labelled in that utterance. Parent \"${parent}\" for child \"${entityInUtterance.entity}\" is not labelled in utterance \"${utterance.text}\" for intent \"${utterance.intent}\".`;\n                                const error = BuildDiagnostic({\n                                    message: errorMsg\n                                });\n                                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                            } else {\n                                isParentLabelled = true;\n                            }\n                        })\n                    }\n                }\n            })\n        })\n    })\n}\n/**\n * Helper function to recursively find the path to a child entity\n * @param {Object} obj \n * @param {String} entityName \n * @param {String} path \n */\nconst findEntityPath = function(obj, entityName, path) {\n    path = path || \"\";\n    var fullpath = \"\";\n    if (obj.name === entityName) {\n        return path;\n    } else if (obj.children && obj.children.length !== 0) {\n        obj.children.forEach(child => {\n            fullpath = findEntityPath(child, entityName, path + \"/\" + obj.name + \"/\" + child.name) || fullpath;\n        })\n    }\n    return fullpath;\n}\n/**\n * Helper function to validate and update nDepth entities\n * @param {Object[]} collection \n * @param {Object[]} entitiesAndRoles \n * @param {Object[]} intentsCollection \n */\nconst validateNDepthEntities = function(collection, entitiesAndRoles, intentsCollection) {\n    (collection || []).forEach(child => {\n        if(child.instanceOf) {\n            let baseEntityFound = entitiesAndRoles.find(i => i.name == child.instanceOf);\n            if (!baseEntityFound) {\n                let errorMsg = `Invalid child entity definition found. No definition for \"${child.instanceOf}\" in child entity definition \"${child.context.definition}\".`;\n                const error = BuildDiagnostic({\n                    message: errorMsg,\n                    line: child.context.line\n                });\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n            // base type can only be a list or regex or prebuilt.\n            if (![EntityTypeEnum.LIST, EntityTypeEnum.REGEX, EntityTypeEnum.PREBUILT, EntityTypeEnum.ML].includes(baseEntityFound.type)) {\n                let errorMsg = `Invalid child entity definition found. \"${child.instanceOf}\" is of type \"${baseEntityFound.type}\" in child entity definition \"${child.context.definition}\". Child cannot be only be an instance of \"${EntityTypeEnum.LIST}, ${EntityTypeEnum.REGEX} or ${EntityTypeEnum.PREBUILT}.`;\n                const error = BuildDiagnostic({\n                    message: errorMsg,\n                    line: child.context.line\n                });\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n\n        }\n\n        if (child.features) {\n            let featureHandled = false;\n            (child.features || []).forEach((feature, idx) => {\n                if (typeof feature === \"object\") return;\n                featureHandled = false;\n                feature = feature.replace(/[\"']/gi, '');\n                let featureExists = entitiesAndRoles.find(i => (i.name == feature || i.name == `${feature}(interchangeable)`));\n                if (featureExists) {\n                    // is feature phrase list?\n                    if (featureExists.type == EntityTypeEnum.PHRASELIST) {\n                        child.features[idx] = new helperClass.featureToModel(feature, featureProperties.phraseListFeature);\n                        featureHandled = true;\n                    } else if (featureExists.type == EntityTypeEnum.PATTERNANY) {\n                        let errorMsg = `Invalid child entity definition found. \"${feature}\" is of type \"${EntityTypeEnum.PATTERNANY}\" in child entity definition \"${child.context.definition}\". Child cannot include a usesFeature of type \"${EntityTypeEnum.PATTERNANY}\".`;\n                        const error = BuildDiagnostic({\n                            message: errorMsg,\n                            line: child.context.line\n                        });\n                        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                    } else {\n                        child.features[idx] = new helperClass.modelToFeature(feature, featureProperties.entityFeatureToModel[featureExists.type]);\n                        featureHandled = true;\n                    }\n                }\n                if (!featureHandled) {\n                    // find feature as intent\n                    let intentFeatureExists = intentsCollection.find(i => i.name == feature);\n                    if (intentFeatureExists) {\n                        child.features[idx] = new helperClass.modelToFeature(feature, featureProperties.intentFeatureToModel);\n                        featureHandled = true;\n                    } else {\n                        let errorMsg = `Invalid child entity definition found. No definition found for \"${feature}\" in child entity definition \"${child.context.definition}\". Features must be defined before they can be added to a child.`;\n                        const error = BuildDiagnostic({\n                            message: errorMsg,\n                            line: child.context.line\n                        });\n                        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                    }\n                }\n            })\n        }\n\n        if (child.children) {\n            validateNDepthEntities(child.children, entitiesAndRoles, intentsCollection);\n        }\n\n        if (child.context) {\n            delete child.context\n        }\n\n        if (child.features === \"\") {\n            delete child.features\n        }\n    })\n};\n/**\n * Helper function to validate if the requested feature addition is valid.\n * @param {String} srcItemType \n * @param {String} srcItemName \n * @param {String} tgtFeatureType \n * @param {String} tgtFeatureName \n * @param {Range} range \n */\nconst validateFeatureAssignment = function(srcItemType, srcItemName, tgtFeatureType, tgtFeatureName, range) {\n    switch(srcItemType) {\n        case INTENTTYPE:\n        case EntityTypeEnum.SIMPLE:\n        case EntityTypeEnum.ML:\n        case EntityTypeEnum.COMPOSITE:\n            // can use everything as a feature except pattern.any\n            if (tgtFeatureType === EntityTypeEnum.PATTERNANY) {\n                let errorMsg = `'patternany' entity cannot be added as a feature. Invalid definition found for \"@ ${srcItemType} ${srcItemName} usesFeature ${tgtFeatureName}\"`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    range: range\n                })\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n            break;\n        default:\n            // cannot have any features assigned\n            let errorMsg = `Invalid definition found for \"@ ${srcItemType} ${srcItemName} usesFeature ${tgtFeatureName}\". usesFeature is only available for intent, ${plAllowedTypes.join(', ')}`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                range: range\n            })\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            break;\n    }\n}\n/**\n * Helper function to add features to the parsed content scope.\n * @param {Object} tgtItem \n * @param {String} feature \n * @param {String} featureType \n * @param {Object} range \n */\nconst addFeatures = function(tgtItem, feature, featureType, range, featureProperties) {\n    // target item cannot have the same name as the feature name\n    if (tgtItem.name === feature) {\n        // Item must be defined before being added as a feature.\n        let errorMsg = `Source and target cannot be the same for usesFeature. e.g. x usesFeature x  is invalid. \"${tgtItem.name}\" usesFeature \"${feature}\" is invalid.`;\n        let error = BuildDiagnostic({\n            message: errorMsg,\n            range: range\n        })\n        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n    }\n    let featureAlreadyDefined = (tgtItem.features || []).find(item => item.modelName == feature || item.featureName == feature);\n    switch (featureType) {\n        case featureTypeEnum.featureToModel: {\n            if (tgtItem.features) {\n                if (!featureAlreadyDefined) tgtItem.features.push(new helperClass.featureToModel(feature, featureProperties));\n            } else {\n                tgtItem.features = new Array(new helperClass.featureToModel(feature, featureProperties));\n            }\n            break;\n        }\n        case featureTypeEnum.modelToFeature: {\n            if (tgtItem.features) {\n                if (!featureAlreadyDefined) tgtItem.features.push(new helperClass.modelToFeature(feature, featureProperties));\n            } else {\n                tgtItem.features = new Array(new helperClass.modelToFeature(feature, featureProperties));\n            }\n            break;\n        }\n        default: \n            break;\n    }\n}\n/**\n * Helper function to handle usesFeature definitions\n * @param {Object} parsedContent \n * @param {Object} featuresToProcess \n */\nconst parseFeatureSections = function(parsedContent, featuresToProcess) {\n    // We are only interested in extracting features and setting things up here.\n    (featuresToProcess || []).forEach(section => {\n        if (section.Type === INTENTTYPE) {\n            // Intents can only have features and nothing else.\n            if (section.Roles) {    \n                let errorMsg = `Intents can only have usesFeature and nothing else. Invalid definition for \"${section.Name}\".`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    range: section.Range\n                })\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n            if (!section.Features) return;\n            // verify intent exists\n            section.Name = section.Name.replace(/[\\'\\\"]/g, \"\");\n            let intentExists = parsedContent.LUISJsonStructure.intents.find(item => item.name === section.Name);\n            if (intentExists !== undefined) {\n                // verify the list of features requested have all been defined.\n                let featuresList = section.Features.split(/[,;]/g).map(item => item.trim().replace(/^[\\'\\\"]|[\\'\\\"]$/g, \"\"));\n                (featuresList || []).forEach(feature => {\n                    let entityExists = (parsedContent.LUISJsonStructure.flatListOfEntityAndRoles || []).find(item => item.name == feature || item.name == `${feature}(interchangeable)`);\n                    let featureIntentExists = (parsedContent.LUISJsonStructure.intents || []).find(item => item.name == feature);\n                    if (entityExists) {\n                        if (entityExists.type === EntityTypeEnum.PHRASELIST) {\n                            // de-dupe and add features to intent.\n                            validateFeatureAssignment(section.Type, section.Name, entityExists.type, feature, section.Range);\n                            addFeatures(intentExists, feature, featureTypeEnum.featureToModel, section.Range, featureProperties.phraseListFeature);\n                            // set enabledForAllModels on this phrase list\n                            let plEnity = parsedContent.LUISJsonStructure.model_features.find(item => item.name == feature);\n                            if (plEnity.enabledForAllModels === undefined) plEnity.enabledForAllModels = false;\n                        } else {\n                            // de-dupe and add model to intent.\n                            validateFeatureAssignment(section.Type, section.Name, entityExists.type, feature, section.Range);\n                            addFeatures(intentExists, feature, featureTypeEnum.modelToFeature, section.Range, featureProperties.entityFeatureToModel[entityExists.type]);\n                        }\n                    } else if (featureIntentExists) {\n                        // Add intent as a feature to another intent\n                        validateFeatureAssignment(section.Type, section.Name, INTENTTYPE, feature, section.Range);\n                        addFeatures(intentExists, feature, featureTypeEnum.modelToFeature, section.Range, featureProperties.intentFeatureToModel);\n                    } else {\n                        // Item must be defined before being added as a feature.\n                        let errorMsg = `Features must be defined before assigned to an intent. No definition found for feature \"${feature}\" in usesFeature definition for intent \"${section.Name}\"`;\n                        let error = BuildDiagnostic({\n                            message: errorMsg,\n                            range: section.Range\n                        })\n                        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                    }\n                })\n            } else {\n                let errorMsg = `Features can only be added to intents that have a definition. Invalid feature definition found for intent \"${section.Name}\".`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    range: section.Range\n                })\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n        } else {\n            // handle as entity\n            if (section.Features) {\n                let featuresList = section.Features.split(/[,;]/g).map(item => item.trim());\n                // Find the source entity from the collection and get its type\n                let srcEntityInFlatList = (parsedContent.LUISJsonStructure.flatListOfEntityAndRoles || []).find(item => item.name == section.Name);\n                let entityType = srcEntityInFlatList ? srcEntityInFlatList.type : undefined;\n                (featuresList || []).forEach(feature => {\n                    feature = feature.replace(/[\\'\\\"]/g, \"\");\n                    let featureExists = (parsedContent.LUISJsonStructure.flatListOfEntityAndRoles || []).find(item => item.name == feature || item.name == `${feature}(interchangeable)`);\n                    let featureIntentExists = (parsedContent.LUISJsonStructure.intents || []).find(item => item.name == feature);\n                    // find the entity based on its type.\n                    let srcEntity = (parsedContent.LUISJsonStructure[luisEntityTypeMap[entityType]] || []).find(item => item.name == section.Name);\n                    if (featureExists) {\n                        if (featureExists.type === EntityTypeEnum.PHRASELIST) {\n                            // de-dupe and add features to intent.\n                            validateFeatureAssignment(entityType, section.Name, featureExists.type, feature, section.Range);\n                            addFeatures(srcEntity, feature, featureTypeEnum.featureToModel, section.Range, featureProperties.phraseListFeature);\n                            // set enabledForAllModels on this phrase list\n                            let plEnity = parsedContent.LUISJsonStructure.model_features.find(item => item.name == feature);\n                            if (plEnity.enabledForAllModels === undefined) plEnity.enabledForAllModels = false;\n                        } else {\n                            // de-dupe and add model to intent.\n                            validateFeatureAssignment(entityType, section.Name, featureExists.type, feature, section.Range);\n                            addFeatures(srcEntity, feature, featureTypeEnum.modelToFeature, section.Range, featureProperties.entityFeatureToModel[featureExists.type]);\n                        }\n                    } else if (featureIntentExists) {\n                        // Add intent as a feature to another intent\n                        validateFeatureAssignment(entityType, section.Name, INTENTTYPE, feature, section.Range);\n                        addFeatures(srcEntity, feature, featureTypeEnum.modelToFeature, section.Range, featureProperties.intentFeatureToModel);\n                    } else {\n                        addFeatures(srcEntity, feature, featureTypeEnum.modelToFeature, section.Range, featureProperties.intentFeatureToModel);\n                    }\n                });\n            }\n        }\n    });\n\n    // Circular dependency for features is not allowed. E.g. A usesFeature B usesFeature A is not valid. \n    verifyNoCircularDependencyForFeatures(parsedContent);\n}\n\n/**\n * Helper function to update a list of dependencies for usesFeature\n * @param {String} type \n * @param {Object} parsedContent \n * @param {Object} dependencyList \n */\nconst updateDependencyList = function(type, parsedContent, dependencyList) {\n    // go through intents and capture dependency list\n    (parsedContent.LUISJsonStructure[type] || []).forEach(itemOfType => {\n        let srcName = itemOfType.name;\n        let copySrc, copyValue;\n        if (itemOfType.features) {\n            (itemOfType.features || []).forEach(feature => {\n                if (feature.modelName) feature = feature.modelName;\n                if (feature.featureName) feature = feature.featureName;\n                // find any items where this feature is the target\n                let featureDependencyEx = dependencyList.filter(item => srcName == (item.value ? item.value.slice(-1)[0] : undefined));\n                (featureDependencyEx || []).forEach(item => {\n                    item.key = `${item.key.split('::')[0]}::${feature}`;\n                    item.value.push(feature);\n                })\n                // find any items where this feature is the source\n                featureDependencyEx = dependencyList.find(item => feature == (item.value ? item.value.slice(0)[0] : undefined));\n                if (featureDependencyEx) {\n                    copySrc = featureDependencyEx.key.split('::')[1];\n                    copyValue = featureDependencyEx.value.slice(1);\n                }\n                let dependencyExists = dependencyList.find(item => item.key == `${srcName}::${feature}`);\n                if (!dependencyExists) {\n                    let lKey = copySrc ? `${srcName}::${copySrc}` : `${srcName}::${feature}`;\n                    let lValue = [srcName, feature];\n                    if (copyValue) copyValue.forEach(item => lValue.push(item));\n                    dependencyList.push({\n                        key : lKey,\n                        value : lValue\n                    })\n                } else {\n                    dependencyExists.key = `${dependencyExists.key.split('::')[0]}::${feature}`;\n                    dependencyExists.value.push(feature);\n                }\n                let circularItemFound = dependencyList.find(item => item.value && item.value.slice(0)[0] == item.value.slice(-1)[0]);\n                if (circularItemFound) {\n                    const errorMsg = `Circular dependency found for usesFeature. ${circularItemFound.value.join(' -> ')}`;\n                    const error = BuildDiagnostic({\n                        message: errorMsg\n                    });\n                    throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                }\n                \n            })\n        }\n    });\n}\n/**\n * Helper function to verify there are no circular dependencies in the parsed content.\n * @param {Object} parsedContent \n */\nconst verifyNoCircularDependencyForFeatures = function(parsedContent) {\n    let dependencyList = [];\n    updateDependencyList(LUISObjNameEnum.INTENT, parsedContent, dependencyList);\n    updateDependencyList(LUISObjNameEnum.ENTITIES, parsedContent, dependencyList);\n    updateDependencyList(LUISObjNameEnum.CLOSEDLISTS, parsedContent, dependencyList);\n    updateDependencyList(LUISObjNameEnum.COMPOSITES, parsedContent, dependencyList);\n    updateDependencyList(LUISObjNameEnum.PATTERNANYENTITY, parsedContent, dependencyList);\n    updateDependencyList(LUISObjNameEnum.PREBUILT, parsedContent, dependencyList);\n    updateDependencyList(LUISObjNameEnum.REGEX, parsedContent, dependencyList);\n}\n\n/**\n * Reference parser code to parse reference section.\n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {LUResouce} luResource resources extracted from lu file content\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseAndHandleImportSection = async function (parsedContent, luResource) {\n    // handle reference\n    let luImports = luResource.Sections.filter(s => s.SectionType === SectionType.IMPORTSECTION);\n    if (luImports && luImports.length > 0) {\n        for (const luImport of luImports) {\n            let linkValueText = luImport.Description.replace('[', '').replace(']', '');\n            let linkValue = luImport.Path.replace('(', '').replace(')', '');\n            let parseUrl = url.parse(linkValue);\n            if (parseUrl.host || parseUrl.hostname) {\n                let options = { method: 'HEAD' };\n                let response;\n                try {\n                    response = await fetch(linkValue, options);\n                } catch (err) {\n                    // throw, invalid URI\n                    let errorMsg = `URI: \"${linkValue}\" appears to be invalid. Please double check the URI or re-try this parse when you are connected to the internet.`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: luImport.Range\n                    })\n\n                    throw (new exception(retCode.errorCode.INVALID_URI, error.toString(), [error]));\n                }\n\n                if (!response.ok) {\n                    let errorMsg = `URI: \"${linkValue}\" appears to be invalid. Please double check the URI or re-try this parse when you are connected to the internet.`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: luImport.Range\n                    })\n\n                    throw (new exception(retCode.errorCode.INVALID_URI, error.toString(), [error]));\n                }\n\n                let contentType = response.headers.get('content-type');\n                if (!contentType.includes('text/html')) {\n                    if (parseUrl.pathname.toLowerCase().endsWith('.lu') || parseUrl.pathname.toLowerCase().endsWith('.qna')) {\n                        parsedContent.additionalFilesToParse.push(new fileToParse(linkValue));\n                    } else {\n                        parsedContent.qnaJsonStructure.files.push(new qnaFile(linkValue, linkValueText));\n                    }\n                } else {\n                    parsedContent.qnaJsonStructure.urls.push(linkValue);\n                }\n\n            } else {\n                parsedContent.additionalFilesToParse.push(new fileToParse(linkValue));\n            }\n        }\n    }\n}\n/**\n * Helper function to handle @ reference in patterns\n * @param {String} utterance \n * @param {String []} entitiesFound \n * @param {Object []} flatEntityAndRoles \n */\nconst handleAtForPattern = function(utterance, entitiesFound, flatEntityAndRoles) {\n    if (utterance.match(/{@/g)) {\n        utterance = utterance.replace(/{@/g, '{');\n        entitiesFound.forEach(entity => {\n            if (entity.entity.match(/^@/g)) {\n                entity = handleAtPrefix(entity, flatEntityAndRoles);\n                if (entity.entity && entity.role) {\n                    utterance = utterance.replace(`{${entity.role}}`, `{${entity.entity}:${entity.role}}`);\n                }\n            }\n        });\n    }\n    return utterance;\n}\n\n/**\n * Helper function to handle @ entity or @ role reference in utterances.\n * @param {Object} entity \n * @param {Object []} flatEntityAndRoles \n */\nconst handleAtPrefix = function(entity, flatEntityAndRoles) {\n    if (entity.entity.match(/^@/g)) {\n        entity.entity = entity.entity.replace(/^@/g, '').trim();\n        if (flatEntityAndRoles) {\n            // find the entity as a match by name\n            let entityMatch = flatEntityAndRoles.find(item => item.entityName == entity.entity);\n            if (entityMatch !== undefined) {\n                return entity;\n            }\n            // find the entity as a match by role\n            let roleMatch = flatEntityAndRoles.find(item => item.roles.includes(entity.entity));\n            if (roleMatch !== undefined) {\n                // we have a role match. \n                entity.role = entity.entity;\n                entity.entity = roleMatch.name;\n                return entity;\n            }\n        }\n    }\n    \n    return entity;\n}\n/**\n * Intent parser code to parse intent section.\n * @param {LUResouce} luResource resources extracted from lu file content\n * @param {boolean} enableMergeIntents enable functionality to merge intents in nested intent section or not\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseAndHandleNestedIntentSection = function (luResource, enableMergeIntents) {\n    // handle nested intent section\n    let sections = luResource.Sections.filter(s => s.SectionType === SectionType.NESTEDINTENTSECTION);\n    if (sections && sections.length > 0) {\n        sections.forEach(section => {\n            if (enableMergeIntents) {\n                let mergedIntentSection = section.SimpleIntentSections[0];\n                mergedIntentSection.Name = section.Name;\n                mergedIntentSection.Range = section.Range;\n                for (let idx = 1; idx < section.SimpleIntentSections.length; idx++) {\n                    mergedIntentSection.UtteranceAndEntitiesMap = mergedIntentSection.UtteranceAndEntitiesMap.concat(section.SimpleIntentSections[idx].UtteranceAndEntitiesMap);\n                    mergedIntentSection.Entities = mergedIntentSection.Entities.concat(section.SimpleIntentSections[idx].Entities);\n                }\n\n                luResource.Sections.push(mergedIntentSection);\n            } else {\n                section.SimpleIntentSections.forEach(subSection => {\n                    subSection.Name = section.Name + '.' + subSection.Name;\n                    luResource.Sections.push(subSection);\n                })\n            }\n        })\n    }\n}\n\n/**\n * Intent parser code to parse intent section.\n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {LUResouce} luResource resources extracted from lu file content\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseAndHandleSimpleIntentSection = async function (parsedContent, luResource) {\n    // handle intent\n    let intents = luResource.Sections.filter(s => s.SectionType === SectionType.SIMPLEINTENTSECTION);\n    let hashTable = {}\n    if (intents && intents.length > 0) {\n        for (const intent of intents) {\n            let intentName = intent.Name;\n            // insert only if the intent is not already present.\n            addItemIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.INTENT, intentName);\n            for (const utteranceAndEntities of intent.UtteranceAndEntitiesMap) {\n                // add utterance\n                let utterance = utteranceAndEntities.utterance.trim();\n                let uttHash = helpers.hashCode(utterance);\n                // Fix for BF-CLI #122. \n                // Ensure only links are detected and passed on to be parsed.\n                if (helpers.isUtteranceLinkRef(utterance || '')) {\n                    let parsedLinkUriInUtterance = await helpers.parseLinkURI(utterance);\n                    // examine and add these to filestoparse list.\n                    parsedContent.additionalFilesToParse.push(new fileToParse(parsedLinkUriInUtterance.fileName, false));\n                }\n\n                if (utteranceAndEntities.entities.length > 0) {\n                    let entitiesFound = utteranceAndEntities.entities;\n                    let havePatternAnyEntity = entitiesFound.find(item => item.type == LUISObjNameEnum.PATTERNANYENTITY);\n                    if (havePatternAnyEntity !== undefined) {\n                        utterance = handleAtForPattern(utterance, entitiesFound, parsedContent.LUISJsonStructure.flatListOfEntityAndRoles);\n                        let mixedEntity = entitiesFound.filter(item => item.type != LUISObjNameEnum.PATTERNANYENTITY);\n                        if (mixedEntity.length !== 0) {\n                            let errorMsg = `Utterance \"${utteranceAndEntities.contextText}\" has mix of entites with labelled values and ones without. Please update utterance to either include labelled values for all entities or remove labelled values from all entities.`;\n                            let error = BuildDiagnostic({\n                                message: errorMsg,\n                                range: utteranceAndEntities.range\n                            })\n\n                            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                        }\n\n                        let prebuiltEntities = entitiesFound.filter(item => builtInTypes.consolidatedList.includes(item.entity));\n                        prebuiltEntities.forEach(prebuiltEntity => {\n                            if (parsedContent.LUISJsonStructure.prebuiltEntities.findIndex(e => e.name === prebuiltEntity.entity) < 0) {\n                                let errorMsg = `Pattern \"${utteranceAndEntities.contextText}\" has prebuilt entity ${prebuiltEntity.entity}. Please define it explicitly with @ prebuilt ${prebuiltEntity.entity}.`;\n                                let error = BuildDiagnostic({\n                                    message: errorMsg,\n                                    range: utteranceAndEntities.range\n                                })\n\n                                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                            }\n                        })\n\n                        let newPattern = new helperClass.pattern(utterance, intentName);\n                        if (!hashTable[uttHash]) {\n                            parsedContent.LUISJsonStructure.patterns.push(newPattern);\n                            hashTable[uttHash] = newPattern;\n                        }\n\n                        // add all entities to pattern.Any only if they do not have another type.\n                        entitiesFound.forEach(entity => {\n                            let simpleEntityInMaster = parsedContent.LUISJsonStructure.entities.find(item => item.name == entity.entity);\n                            if (simpleEntityInMaster && entity.role) {\n                                addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entity.entity, [entity.role.trim()]);\n                            }\n                            let compositeInMaster = parsedContent.LUISJsonStructure.composites.find(item => item.name == entity.entity);\n                            if (compositeInMaster && entity.role) {\n                                addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.COMPOSITES, entity.entity, [entity.role.trim()]);\n                            }\n                            let listEntityInMaster = parsedContent.LUISJsonStructure.closedLists.find(item => item.name == entity.entity);\n                            if (listEntityInMaster && entity.role) {\n                                addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.CLOSEDLISTS, entity.entity, [entity.role.trim()]);\n                            }\n                            let regexEntityInMaster = parsedContent.LUISJsonStructure.regex_entities.find(item => item.name == entity.entity);\n                            if (regexEntityInMaster && entity.role) {\n                                addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.REGEX, entity.entity, [entity.role.trim()]);\n                            }\n                            let prebuiltInMaster = parsedContent.LUISJsonStructure.prebuiltEntities.find(item => item.name == entity.entity);\n                            if (prebuiltInMaster && entity.role) {\n                                addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PREBUILT, entity.entity, [entity.role.trim()]);\n                            }\n                            if (!simpleEntityInMaster &&\n                                !compositeInMaster &&\n                                !listEntityInMaster &&\n                                !regexEntityInMaster &&\n                                !prebuiltInMaster) {\n                                if (entity.role && entity.role !== '') {\n                                    addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PATTERNANYENTITY, entity.entity, [entity.role.trim()])\n                                } else {\n                                    addItemIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PATTERNANYENTITY, entity.entity);\n                                }\n                            }                             \n                        });\n                    } else {\n                        entitiesFound.forEach(entity => {\n                            // handle at prefix\n                            entity = handleAtPrefix(entity, parsedContent.LUISJsonStructure.flatListOfEntityAndRoles);\n                            // throw an error if phraselist entity is explicitly labelled in an utterance\n                            let nonAllowedPhrseListEntityInUtterance = (parsedContent.LUISJsonStructure.model_features || []).find(item => item.name == entity.entity);\n                            if (nonAllowedPhrseListEntityInUtterance !== undefined) {\n                                // Fix for #1137\n                                // Phrase list entity can have the same name as other entity types. Only throw if the phrase list has no other type definition and is labelled in an utterance.\n                                let otherEntities = (parsedContent.LUISJsonStructure.entities || []).concat(\n                                    (parsedContent.LUISJsonStructure.prebuiltEntities || []),\n                                    (parsedContent.LUISJsonStructure.closedLists || []),\n                                    (parsedContent.LUISJsonStructure.regex_entities || []),\n                                    (parsedContent.LUISJsonStructure.model_features || []),\n                                    (parsedContent.LUISJsonStructure.composites || [])\n                                );\n                                if ((otherEntities || []).find(item => item.name == entity.entity) === undefined) {\n                                    let errorMsg = `Utterance \"${utterance}\" has invalid reference to Phrase List entity \"${nonAllowedPhrseListEntityInUtterance.name}\". Phrase list entities cannot be given an explicit labelled value.`;\n                                    let error = BuildDiagnostic({\n                                        message: errorMsg,\n                                        range: utteranceAndEntities.range\n                                    });\n\n                                    throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                                }\n                            }\n\n                            // only add this entity if it has not already been defined as composite, list, prebuilt, regex\n                            let compositeExists = (parsedContent.LUISJsonStructure.composites || []).find(item => item.name == entity.entity);\n                            let listExists = (parsedContent.LUISJsonStructure.closedLists || []).find(item => item.name == entity.entity);\n                            let prebuiltExists = (parsedContent.LUISJsonStructure.prebuiltEntities || []).find(item => item.name == entity.entity);\n                            let regexExists = (parsedContent.LUISJsonStructure.regex_entities || []).find(item => item.name == entity.entity);\n                            let patternAnyExists = (parsedContent.LUISJsonStructure.patternAnyEntities || []).find(item => item.name == entity.entity);\n                            if (compositeExists === undefined && listExists === undefined && prebuiltExists === undefined && regexExists === undefined && patternAnyExists === undefined) {\n                                if (entity.role && entity.role !== '') {\n                                    addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entity.entity, [entity.role.trim()]);\n                                } else {\n                                    addItemIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entity.entity)\n                                }\n                            } else {\n                                if (compositeExists !== undefined) {\n                                    if (entity.role) {\n                                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.COMPOSITES, entity.entity, [entity.role.trim()]);\n                                    }\n                                } else if (listExists !== undefined) {\n                                    if (entity.role) {\n                                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.CLOSEDLISTS, entity.entity, [entity.role.trim()]);\n                                    } else {\n                                        if (!isChildEntity(entity, entitiesFound)) {\n                                            let errorMsg = `${entity.entity} has been defined as a LIST entity type. It cannot be explicitly included in a labelled utterance unless the label includes a role.`;\n                                            let error = BuildDiagnostic({\n                                                message: errorMsg,\n                                                range: utteranceAndEntities.range\n                                            });\n\n                                            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                                        }\n                                    }\n                                } else if (prebuiltExists !== undefined) {\n                                    if (entity.role) {\n                                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PREBUILT, entity.entity, [entity.role.trim()]);\n                                    } else {\n                                        if (!isChildEntity(entity, entitiesFound)) {\n                                            let errorMsg = `${entity.entity} has been defined as a PREBUILT entity type. It cannot be explicitly included in a labelled utterance unless the label includes a role.`;\n                                            let error = BuildDiagnostic({\n                                                message: errorMsg,\n                                                range: utteranceAndEntities.range\n                                            });\n\n                                            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                                        }\n                                    }\n                                } else if (regexExists !== undefined) {\n                                    if (entity.role) {\n                                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.REGEX, entity.entity, [entity.role.trim()]);\n                                    } else {\n                                        if (!isChildEntity(entity, entitiesFound)) {\n                                            let errorMsg = `${entity.entity} has been defined as a Regex entity type. It cannot be explicitly included in a labelled utterance unless the label includes a role.`;\n                                            let error = BuildDiagnostic({\n                                                message: errorMsg,\n                                                range: utteranceAndEntities.range\n                                            });\n\n                                            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                                        }\n                                    }\n                                } else if (patternAnyExists !== undefined) {\n                                    if (entity.value != '') {\n                                        // Verify and add this as simple entity.\n                                        let roles = (entity.role && entity.role.trim() !== \"\") ? [entity.role.trim()] : [];\n                                        patternAnyExists.roles.forEach(role => roles.push(role));\n                                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entity.entity, roles);\n                                        let patternAnyIdx = -1;\n                                        (parsedContent.LUISJsonStructure.patternAnyEntities || []).find((item, idx) => {\n                                            if (item.name === entity.entity) {\n                                                patternAnyIdx = idx;\n                                                return true;\n                                            }\n                                            return false;\n                                        });\n                                        // delete pattern any entity\n                                        if (patternAnyIdx > -1) parsedContent.LUISJsonStructure.patternAnyEntities.splice(patternAnyIdx, 1);\n\n                                    } else if (entity.role) {\n                                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PATTERNANYENTITY, entity.entity, [entity.role.trim()]);\n                                    }\n                                }\n                            }\n                        });\n\n                        // add utterance\n                        let utteranceObject;\n                        if (hashTable[uttHash]) {\n                            utteranceObject = hashTable[uttHash];\n                        } else {\n                            utteranceObject = new helperClass.uttereances(utterance, intentName, []);\n                            parsedContent.LUISJsonStructure.utterances.push(utteranceObject);\n                            hashTable[uttHash] = utteranceObject;\n                        }\n                        entitiesFound.forEach(item => {\n                            if (item.startPos > item.endPos) {\n                                let errorMsg = `No labelled value found for entity: \"${item.entity}\" in utterance: \"${utteranceAndEntities.contextText}\"`;\n                                let error = BuildDiagnostic({\n                                    message: errorMsg,\n                                    range: utteranceAndEntities.range\n                                })\n\n                                throw (new exception(retCode.errorCode.MISSING_LABELLED_VALUE, error.toString(), [error]));\n                            }\n\n                            let utteranceEntity = new helperClass.utteranceEntity(item.entity, item.startPos, item.endPos);\n                            if (item.role && item.role !== '') {\n                                utteranceEntity.role = item.role.trim();\n                            }\n                            if (!utteranceObject.entities.find(item => deepEqual(item, utteranceEntity))) utteranceObject.entities.push(utteranceEntity)\n                        });\n                    }\n\n                } else {\n                    // detect if utterance is a pattern and if so add it as a pattern\n                    if (helpers.isUtterancePattern(utterance)) {\n                        let patternObject = new helperClass.pattern(utterance, intentName);\n                        if (!hashTable[uttHash]) {\n                            parsedContent.LUISJsonStructure.patterns.push(patternObject);\n                            hashTable[uttHash] = patternObject;\n                        }\n                    } else {\n                        if(!hashTable[uttHash]) {\n                            let utteranceObject = new helperClass.uttereances(utterance, intentName, []);\n                            parsedContent.LUISJsonStructure.utterances.push(utteranceObject); \n                            hashTable[uttHash] = utteranceObject;\n                        } \n                    }\n                }\n            }\n        }\n    }\n}\n\nconst isChildEntity = function(entity, entitiesFound) {\n    // return true if the current entity is contained within a parent bounding label\n    return (entitiesFound || []).find(item => item.entity !== entity.entity && entity.startPos >= item.startPos && entity.endPos <= item.endPos) === undefined ? false : true;\n}\n\n/**\n * Helper function to get entity type based on a name match\n * @param {String} entityName name of entity to look up type for.\n * @param {Object[]} entities collection of entities in the current application\n */\nconst getEntityType = function(entityName, entities) {\n    let entityFound = (entities || []).find(item => item.Name == entityName || item.Name == `${entityName}(interchangeable)`);\n    if (entityFound && entityFound.Type !== undefined) return entityFound.Type\n    // see if this one of the prebuilt type\n    if (builtInTypes.consolidatedList.includes(entityName)) return EntityTypeEnum.PREBUILT\n    return undefined;\n};\n\n/**\n * Helper function to validate that new roles being added are unique at the application level.\n * @param {Object} parsedContent with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {String[]} roles string array of new roles to be added\n * @param {String} range range\n * @param {String} entityName name of the entity being added.\n */\nconst validateAndGetRoles = function(parsedContent, roles, range, entityName, entityType) {\n    let newRoles = roles ? roles.split(',').map(item => item.replace(/[\\'\\\"]/g, \"\").trim()) : [];\n    // de-dupe roles\n    newRoles = [...new Set(newRoles)];\n    // entity roles need to unique within the application\n    if(parsedContent.LUISJsonStructure.flatListOfEntityAndRoles) {\n        // Duplicate entity names are not allowed\n        // Entity name cannot be same as a role name\n        verifyUniqueEntityName(parsedContent, entityName, entityType, range);\n\n        newRoles.forEach(role => {\n            let roleFound = parsedContent.LUISJsonStructure.flatListOfEntityAndRoles.find(item => item.roles.includes(role) || item.name === role);\n            if (roleFound !== undefined) {\n                // PL entities use roles for things like interchangeable, disabled, enabled for all models. There are really not 'dupes'.\n                let hasBadNonPLRoles = (roleFound.roles || []).filter(item => item.toLowerCase() !== PLCONSTS.INTERCHANGEABLE && item.toLowerCase() !== PLCONSTS.ENABLEDFORALLMODELS && item.toLowerCase() !== PLCONSTS.DISABLED && item.toLowerCase() !== PLCONSTS.DISABLEDFORALLMODELS);\n                if (hasBadNonPLRoles.length !== 0) {\n                    let errorMsg = `Roles must be unique across entity types. Invalid role definition found \"${entityName}\". Prior definition - '@ ${roleFound.type} ${roleFound.name}${roleFound.roles.length > 0 ? ` hasRoles ${roleFound.roles.join(',')}` : ``}'`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: range\n                    })\n                    throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                } \n            } \n        });\n\n        let oldEntity = parsedContent.LUISJsonStructure.flatListOfEntityAndRoles.find(item => item.name === entityName && item.type === entityType);\n        if (oldEntity !== undefined) {\n            oldEntity.addRoles(newRoles);\n        } else {\n            parsedContent.LUISJsonStructure.flatListOfEntityAndRoles.push(new helperClass.entityAndRoles(entityName, entityType, newRoles))\n        }\n\n    } else {\n        parsedContent.LUISJsonStructure.flatListOfEntityAndRoles = new Array();\n        parsedContent.LUISJsonStructure.flatListOfEntityAndRoles.push(new helperClass.entityAndRoles(entityName, entityType, newRoles));\n    }\n    return newRoles;\n};\n\n/**\n * \n * @param {LUResouce} luResource resources extracted from lu file content\n */\nconst GetEntitySectionsFromSimpleIntentSections = function(luResource) {\n    let intents = luResource.Sections.filter(s => s.SectionType === SectionType.SIMPLEINTENTSECTION);\n    if (intents && intents.length > 0) {\n        intents.forEach(intent => luResource.Sections = luResource.Sections.concat(intent.Entities));\n    }\n}\n\n/**\n * \n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {LUResouce} luResource resources extracted from lu file content\n * @param {boolean} log indicates where verbose flag is set \n * @param {String} locale current target locale\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n * @returns {NewEntitySection[]} collection of NewEntitySection to process after all other sections are processed.\n */\nconst parseAndHandleEntityV2 = function (parsedContent, luResource, log, locale) {\n    let featuresToProcess = [];\n    // handle new entity definitions.\n    let entities = luResource.Sections.filter(s => s.SectionType === SectionType.NEWENTITYSECTION);\n    if (entities && entities.length > 0) {\n        for (const entity of entities) {\n            if (entity.Type !== INTENTTYPE) {\n                if (entity.Name.endsWith(PLCONSTS.INTERCHANGEABLE)) {\n                    entity.Name = entity.Name.slice(0, entity.Name.length - PLCONSTS.INTERCHANGEABLE.length).trim().replace(/^[\\'\\\"]|[\\'\\\"]$/g, \"\") + PLCONSTS.INTERCHANGEABLE\n                } else {\n                    entity.Name = entity.Name.replace(/^[\\'\\\"]|[\\'\\\"]$/g, \"\");\n                }\n                \n                let entityName = entity.Name.endsWith('=') ? entity.Name.slice(0, entity.Name.length - 1) : entity.Name;\n                let entityType = !entity.Type ? getEntityType(entity.Name, entities) : entity.Type;\n                if (!entityType) {\n                    let errorMsg = `No type definition found for entity \"${entityName}\". Supported types are ${Object.values(EntityTypeEnum).join(', ')}. Note: Type names are case sensitive.`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: entity.Range\n                    })\n                    throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                };\n\n                if (entityType === entityName) {\n                    let errorMsg = `Entity name \"${entityName}\" cannot be the same as entity type \"${entityType}\"`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: entity.Range\n                    })\n                    throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n                }\n                let entityRoles = validateAndGetRoles(parsedContent, entity.Roles, entity.Range, entityName, entityType);\n                let PAEntityRoles = RemoveDuplicatePatternAnyEntity(parsedContent, entityName, entityType, entity.Range);\n                if (PAEntityRoles.length > 0) {\n                    PAEntityRoles.forEach(role => {\n                        if (!entityRoles.includes(role)) entityRoles.push(role);\n                    })\n                }\n                switch(entityType) {\n                    case EntityTypeEnum.ML:\n                        handleNDepthEntity(parsedContent, entityName, entityRoles, entity.ListBody, entity.Range);\n                        break;\n                    case EntityTypeEnum.SIMPLE: \n                        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entityName, entityRoles);\n                        break;\n                    case EntityTypeEnum.COMPOSITE:\n                        let candidateChildren = [];\n                        if (entity.CompositeDefinition) {\n                            entity.CompositeDefinition.replace(/[\\[\\]]/g, '').split(/[,;]/g).map(item => item.trim()).forEach(item => candidateChildren.push(item));\n                        }\n                        if (entity.ListBody) {\n                            entity.ListBody.forEach(line => {\n                                line.trim().substr(1).trim().replace(/[\\[\\]]/g, '').split(/[,;]/g).map(item => item.trim()).forEach(item => candidateChildren.push(item));\n                            })\n                        }\n                        handleComposite(parsedContent, entityName,`[${candidateChildren.join(',')}]`, entityRoles, entity.Range, false, entity.Type !== undefined);\n                        break;\n                    case EntityTypeEnum.LIST:\n                        handleClosedList(parsedContent, entityName, entity.ListBody.map(item => item.trim()), entityRoles, entity.Range);\n                        break;\n                    case EntityTypeEnum.PATTERNANY:\n                        handlePatternAny(parsedContent, entityName, entityRoles, entity.Range);\n                        break;\n                    case EntityTypeEnum.PREBUILT:\n                        handlePrebuiltEntity(parsedContent, 'prebuilt', entityName, entityRoles, locale, log, entity.Range);\n                        break;\n                    case EntityTypeEnum.REGEX:\n                        if (entity.ListBody[0]) {\n                            handleRegExEntity(parsedContent, entityName, entity.ListBody[0].trim().substr(1).trim(), entityRoles, entity.Range);\n                        } else {\n                            handleRegExEntity(parsedContent, entityName, entity.RegexDefinition, entityRoles, entity.Range);\n                        } \n                        break;\n                    case EntityTypeEnum.ML:\n                        break;\n                    case EntityTypeEnum.PHRASELIST:\n                        handlePhraseList(parsedContent, entityName, entity.Type, entityRoles, entity.ListBody.map(item => item.trim().substr(1).trim()), entity.Range);\n                    default:\n                        //Unknown entity type\n                        break;\n                }\n                if (entity.Features !== undefined) {\n                    featuresToProcess.push(entity);\n                }\n            } else {\n                featuresToProcess.push(entity);\n            }\n        }\n    }\n\n    return featuresToProcess;\n};\n/**\n * Helper to handle ndepth entity definition.\n * @param {Object} parsedContent \n * @param {String} entityName \n * @param {String[]} entityRoles \n * @param {String[]} entityLines \n * @param {Object} range \n */\nconst handleNDepthEntity = function(parsedContent, entityName, entityRoles, entityLines, range) {\n    const SPACEASTABS = 4;\n    addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entityName, entityRoles);\n    let rootEntity = parsedContent.LUISJsonStructure.entities.find(item => item.name == entityName);\n    rootEntity.explicitlyAdded = true;\n    let defLine = range.Start.Line\n    let baseTabLevel = 0;\n    let entityIdxByLevel = [];\n    let currentParentEntity = undefined;\n    // process each entity line\n    entityLines.forEach(child => {\n        currentParentEntity = undefined;\n        defLine++;\n        let captureGroups = /^((?<leadingSpaces>[ ]*)|(?<leadingTabs>[\\t]*))-\\s*@\\s*(?<instanceOf>[^\\s]+) (?<entityName>(?:'[^']+')|(?:\"[^\"]+\")|(?:[^ '\"=]+))(?: uses?[fF]eatures? (?<features>[^=]+))?\\s*=?\\s*$/g;\n        let groupsFound = captureGroups.exec(child);\n        if (!groupsFound) {\n            let errorMsg = `Invalid child entity definition found for \"${child.trim()}\". Child definitions must start with '- @' and only include a type, name and optionally one or more usesFeature(s) definition.`;\n            const error = BuildDiagnostic({\n                message: errorMsg,\n                line: defLine\n            });\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n        let childEntityName = groupsFound.groups.entityName.replace(/^['\"]/g, '').replace(/['\"]$/g, '');\n        let childEntityType = groupsFound.groups.instanceOf.trim();\n        let childFeatures = groupsFound.groups.features ? groupsFound.groups.features.trim().split(/[,;]/g).map(item => item.trim()) : undefined;\n        \n        // Get current tab level\n        let tabLevel = Math.ceil(groupsFound.groups.leadingSpaces !== undefined ? groupsFound.groups.leadingSpaces.length / SPACEASTABS : 0) || (groupsFound.groups.leadingTabs !== undefined ? groupsFound.groups.leadingTabs.length : 0);\n        if (defLine === range.Start.Line + 1) {\n            // remember the tab level at the first line of child definition\n            baseTabLevel = tabLevel;\n            // Push the ID of the parent since we are proessing the first child entity\n            entityIdxByLevel.push({level : 0, entity : rootEntity});\n        } \n        \n        currentParentEntity = entityIdxByLevel.reverse().find(item => item.level == tabLevel - baseTabLevel);\n        entityIdxByLevel.reverse();\n        if (!currentParentEntity) {\n            let errorMsg = `[ERROR] line ${defLine}: Invalid definition found for child \"${child.trim()}\". Parent of each child entity must be of type \"${EntityTypeEnum.ML}\".`;\n            const error = BuildDiagnostic({\n                message: errorMsg,\n                line: defLine\n            });\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n        let context = {line : defLine, definition: child.trim()};\n        if (groupsFound.groups.instanceOf.toLowerCase().trim() === EntityTypeEnum.SIMPLE) {\n            pushNDepthChild(currentParentEntity.entity, childEntityName, context, childFeatures);\n        } else if (groupsFound.groups.instanceOf.toLowerCase().trim() === EntityTypeEnum.ML) {\n            pushNDepthChild(currentParentEntity.entity, childEntityName, context, childFeatures);\n            let newParent = currentParentEntity.entity.children.find(item => item.name == childEntityName);\n            // Push the ID of the parent since we are proessing the first child entity\n            entityIdxByLevel.push({level : tabLevel - baseTabLevel + 1, entity : newParent});\n        } else {\n            pushNDepthChild(currentParentEntity.entity, childEntityName, context, childFeatures, childEntityType);\n        }\n    });\n};\n/**\n * Helper to add an nDepth child entity to the collection.\n * @param {Object} entity \n * @param {String} childEntityName \n * @param {Object} context \n * @param {String []} childFeatures \n * @param {String} childEntityType \n * @param {Object []} children \n */\nconst pushNDepthChild = function(entity, childEntityName, context, childFeatures, childEntityType = \"\", children = []) {\n    if (!entity.children) {\n        entity.children = new Array(new helperClass.childEntity(childEntityName,childEntityType, context, children, childFeatures));\n    } else {\n        // de-dupe and push this child entity    \n        let childExists = (entity.children || []).find(item => item.name == childEntityName);\n        if (!childExists) {\n            entity.children.push(new helperClass.childEntity(childEntityName, childEntityType, context, children, childFeatures));\n        } \n    }\n}\n/**\n * Helper function to verify that the requested entity is unique.\n * @param {Object} parsedContent \n * @param {String} entityName \n * @param {String} entityType \n * @param {Object} range \n * @param {Boolean} checkTypesAlignment\n */\nconst verifyUniqueEntityName = function(parsedContent, entityName, entityType, range, checkTypesAlignment) {\n    // Duplicate entity names are not allowed\n    // Entity name cannot be same as a role name\n    let matchType = \"\";\n    let entityFound = parsedContent.LUISJsonStructure.flatListOfEntityAndRoles.find(item => {\n        if (item.name === entityName) {\n            if (!checkTypesAlignment && item.type !== entityType) {\n                matchType = `Entity names must be unique. Duplicate definition found for \"${entityName}\".`;\n                return true;\n            } else if (checkTypesAlignment) {\n                matchType = `Child entity names must be unique. Duplicate definition found for child entity \"${entityName}\".`;\n                return true;\n            }\n        } else if (item.roles.includes(entityName)) {\n            matchType = `Entity name cannot be the same as a role name. Duplicate definition found for \"${entityName}\".`;\n            return true;\n        }\n    });\n    if (entityFound !== undefined) {\n        let errorMsg = `${matchType} Prior definition - '@ ${entityFound.type} ${entityFound.name}${entityFound.roles.length > 0 ? ` hasRoles ${entityFound.roles.join(',')}` : ``}'`;\n        let error = BuildDiagnostic({\n            message: errorMsg,\n            range: range\n        })\n        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n    }\n}\n/**\n * Helper function to handle pattern.any entity\n * @param {Object} parsedContent parsed LUIS, QnA and QnA alteration object\n * @param {String} entityName entity name\n * @param {String} entityRoles collection of entity roles\n */\nconst handlePatternAny = function(parsedContent, entityName, entityRoles) {\n     // check if this patternAny entity is already labelled in an utterance and or added as a simple entity. if so, throw an error.\n     try {\n        let rolesImport = VerifyAndUpdateSimpleEntityCollection(parsedContent, entityName, 'Pattern.Any');\n        if (rolesImport.length !== 0) {\n            rolesImport.forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n        }\n    } catch (err) {\n        throw (err);\n    }\n\n    let PAExists = parsedContent.LUISJsonStructure.patternAnyEntities.find(item => item.name == entityName);\n    if (PAExists === undefined) {\n        parsedContent.LUISJsonStructure.patternAnyEntities.push(new helperClass.patternAnyEntity(entityName, [], entityRoles));\n    } else {\n        entityRoles.forEach(item => {\n            if (!PAExists.roles.includes) PAExists.roles.push(item);\n        })\n    }\n}\n/**\n * Helper function to remove duplicate pattern any definitions.\n * @param {Object} parsedContent Object containing current parsed content - LUIS, QnA, QnA alterations.\n * @param {String} pEntityName name of entity\n * @param {String} entityType type of entity\n * @param {String} range range\n */\nconst RemoveDuplicatePatternAnyEntity = function(parsedContent, pEntityName, entityType, range) {\n    // see if we already have this as Pattern.Any entity\n    // see if we already have this in patternAny entity collection; if so, remove it but remember the roles (if any)\n    let PAIdx = -1;\n    let entityRoles = [];\n    let PAEntityFound = parsedContent.LUISJsonStructure.patternAnyEntities.find(function(item, idx) {\n        if(item.name === pEntityName) {\n            PAIdx = idx;\n            return true\n        } else {\n            return false;\n        }\n    });\n    if (PAEntityFound !== undefined && PAIdx !== -1 && entityType != EntityTypeEnum.PATTERNANY) {\n        if (entityType.toLowerCase().trim().includes('phraselist')) {\n            let errorMsg = `Phrase lists cannot be used as an entity in a pattern \"${pEntityName}\"`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                range: range\n            })\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        } \n        entityRoles = (PAEntityFound.roles.length !== 0) ? PAEntityFound.roles : [];\n        parsedContent.LUISJsonStructure.patternAnyEntities.splice(PAIdx, 1);\n    }\n    return entityRoles;\n};\n\n/**\n * \n * @param {Object} parsedContent parsed content that includes LUIS, QnA, QnA alternations\n * @param {String} entityName entity name\n * @param {String} entityType entity type\n * @param {String []} entityRoles Array of roles\n * @param {String []} valuesList Array of individual lines to be processed and added to phrase list.\n */\nconst handlePhraseList = function(parsedContent, entityName, entityType, entityRoles, valuesList, range) {\n    let isPLEnabledForAllModels = undefined;\n    let isPLEnabled = undefined;\n    if (entityRoles.length !== 0) {\n        // Phrase lists cannot have roles; however we will allow inline definition of enabledForAllModels as well as disabled as a property on phrase list.\n        entityRoles.forEach(item => {\n            if (item.toLowerCase() === PLCONSTS.DISABLED) {\n                isPLEnabled = false;\n            } else if (item.toLowerCase() === PLCONSTS.ENABLEDFORALLMODELS) {\n                isPLEnabledForAllModels = true;\n            } else if (item.toLowerCase() === PLCONSTS.DISABLEDFORALLMODELS) {\n                isPLEnabledForAllModels = false;\n            } else if (item.toLowerCase() === PLCONSTS.INTERCHANGEABLE) {\n                entityName += item;\n            } else {\n                let errorMsg = `Phrase list entity ${entityName} has invalid role definition with roles = ${entityRoles.join(', ')}. Roles are not supported for Phrase Lists`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    context: currentLine\n                })\n        \n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n        })\n    }\n    // check if this phraselist entity is already labelled in an utterance and or added as a simple entity. if so, throw an error.\n    try {\n        let rolesImport = VerifyAndUpdateSimpleEntityCollection(parsedContent, entityName, 'Phrase List');\n        if (rolesImport.length !== 0) {\n            rolesImport.forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n        }\n    } catch (err) {\n        throw (err);\n    }\n    // is this interchangeable? \n    let intc = false;\n    if (entityType && entityName.toLowerCase().includes('interchangeable')) {\n        intc = true;\n        entityName = entityName.split(/\\(.*\\)/g)[0]   \n    }\n    // add this to phraseList if it doesnt exist\n    let pLValues = [];\n    for (const phraseListValues of valuesList) {\n        phraseListValues.split(/[,;]/g).map(item => item.trim()).forEach(item => pLValues.push(item));\n   }\n\n    let pLEntityExists = parsedContent.LUISJsonStructure.model_features.find(item => item.name == entityName);\n    if (pLEntityExists) {\n        if (entityType) {\n            if (pLEntityExists.mode !== intc) {\n                let errorMsg = `Phrase list: \"${entityName}\" has conflicting definitions. One marked interchangeable and another not interchangeable`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    range: range\n                })\n\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n        }\n        let wordsSplit = pLEntityExists.words.split(',');\n        pLValues.forEach(function (plValueItem) {\n            if (!wordsSplit.includes(plValueItem)) pLEntityExists.words += (pLEntityExists.words !== '' ? ',' : '') + plValueItem;\n        })\n    } else {\n        pLEntityExists = new helperClass.modelObj(entityName, intc, pLValues.join(','), true);\n        parsedContent.LUISJsonStructure.model_features.push(pLEntityExists);\n    }\n    if (isPLEnabled !== undefined) pLEntityExists.activated = isPLEnabled;\n    if (isPLEnabledForAllModels !== undefined) pLEntityExists.enabledForAllModels = isPLEnabledForAllModels;\n}\n\n/**\n * \n * @param {Object} parsedContent parsed LUIS, QnA and QnA alternations\n * @param {String} entityName entity name\n * @param {String} entityType entity type\n * @param {String []} entityRoles list of entity roles\n * @param {String} locale current locale\n * @param {Boolean} log boolean to indicate if errors should be sent to stdout\n * @param {String} range range\n */\nconst handlePrebuiltEntity = function(parsedContent, entityName, entityType, entityRoles, locale, log, range) {\n    locale = locale ? locale.toLowerCase() : 'en-us';\n    // check if this pre-built entity is already labelled in an utterance and or added as a simple entity. if so, throw an error.\n    try {\n        let rolesImport = VerifyAndUpdateSimpleEntityCollection(parsedContent, entityType, entityName);\n        if (rolesImport.length !== 0) {\n            rolesImport.forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n        }\n    } catch (err) {\n        throw (err);\n    }\n    // verify if the requested entityType is available in the requested locale\n    if (!builtInTypes.consolidatedList.includes(entityType)) {\n        let errorMsg = `Unknown PREBUILT entity '${entityType}'. Available pre-built types are ${builtInTypes.consolidatedList.join(',')}`;\n        let error = BuildDiagnostic({\n            message: errorMsg,\n            range: range\n        })\n\n        throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n    }\n    let prebuiltCheck = builtInTypes.perLocaleAvailability[locale][entityType];\n    if (prebuiltCheck === null) {\n        if (log) {\n            process.stdout.write(chalk.default.yellowBright('[WARN]: Requested PREBUILT entity \"' + entityType + ' is not available for the requested locale: ' + locale + '\\n'));\n            process.stdout.write(chalk.default.yellowBright('  Skipping this prebuilt entity..\\n'));\n        } else {\n            let errorMsg = `PREBUILT entity '${entityType}' is not available for the requested locale '${locale}'`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                range: range\n            })\n\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n    } else if (prebuiltCheck && prebuiltCheck.includes('datetime')) {\n        if (log) {\n            process.stdout.write(chalk.default.yellowBright('[WARN]: PREBUILT entity \"' + entityType + ' is not available for the requested locale: ' + locale + '\\n'));\n            process.stdout.write(chalk.default.yellowBright('  Switching to ' + builtInTypes.perLocaleAvailability[locale][entityType] + ' instead.\\n'));\n        }\n        entityType = builtInTypes.perLocaleAvailability[locale][entityType];\n        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PREBUILT, entityType, entityRoles);\n    } else {\n        // add to prebuiltEntities if it does not exist there.\n        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.PREBUILT, entityType, entityRoles);\n    }\n};\n/**\n * Helper function to handle composite entity definition.\n * @param {Object} parsedContent Object representing parsed content\n * @param {String} entityName entity name\n * @param {String} entityType entity type\n * @param {String []} entityRoles collection of roles\n * @param {String} range range\n * @param {Boolean} inlineChildRequired boolean to indicate if children definition must be defined inline.\n * @param {Boolean} isEntityTypeDefinition Type definition is included\n */\nconst handleComposite = function(parsedContent, entityName, entityType, entityRoles, range, inlineChildRequired, isEntityTypeDefinition) {\n    // remove simple entity definitions for composites but carry forward roles.\n    // Find this entity if it exists in the simple entity collection\n    let simpleEntityExists = (parsedContent.LUISJsonStructure.entities || []).find(item => item.name == entityName);\n    if (simpleEntityExists !== undefined) {\n        // take and add any roles into the roles list\n        (simpleEntityExists.roles || []).forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n        // remove this simple entity definition\n        for (var idx = 0; idx < parsedContent.LUISJsonStructure.entities.length; idx++) {\n            if (parsedContent.LUISJsonStructure.entities[idx].name === simpleEntityExists.name) {\n                parsedContent.LUISJsonStructure.entities.splice(idx, 1);\n            }\n        }\n    }\n    // handle composite entity definition\n    // drop [] and trim\n    let childDefinition = entityType.trim().replace('[', '').replace(']', '').trim();\n    if (childDefinition.length === 0 && inlineChildRequired) {\n        let errorMsg = `Composite entity: ${entityName} is missing child entity definitions. Child entities are denoted via [entity1, entity2] notation.`;\n        let error = BuildDiagnostic({\n            message: errorMsg,\n            range: range\n        })\n\n        throw (new exception(retCode.errorCode.INVALID_COMPOSITE_ENTITY, error.toString(), [error]));\n    }\n    // split the children based on ',' or ';' delimiter. Trim each child to remove white spaces.\n    let compositeChildren = childDefinition !== \"\" ? childDefinition.split(new RegExp(/[,;]/g)).map(item => item.trim()) : [];\n    // add this composite entity if it does not exist\n    let compositeEntity = (parsedContent.LUISJsonStructure.composites || []).find(item => item.name == entityName);\n    if (compositeEntity === undefined) {\n        // add new composite entity\n        parsedContent.LUISJsonStructure.composites.push(new helperClass.compositeEntity(entityName, compositeChildren, entityRoles));\n\n        // remove composite that might have been tagged as a simple entity due to inline entity definition in an utterance\n        parsedContent.LUISJsonStructure.entities = (parsedContent.LUISJsonStructure.entities || []).filter(entity => entity.name != entityName);\n    } else {\n        if (isEntityTypeDefinition) {\n            if (compositeEntity.children.length !== 0 && JSON.stringify(compositeChildren.sort()) !== JSON.stringify(compositeEntity.children.sort())) {\n                let errorMsg = `Composite entity: ${entityName} has multiple definition with different children. \\n 1. ${compositeChildren.join(', ')}\\n 2. ${compositeEntity.children.join(', ')}`;\n                let error = BuildDiagnostic({\n                    message: errorMsg,\n                    range: range\n                })\n    \n                throw (new exception(retCode.errorCode.INVALID_COMPOSITE_ENTITY, error.toString(), [error]));\n            }\n        }\n\n        // update roles\n        // update children\n        compositeChildren.forEach(item => compositeEntity.children.push(item));\n        addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.COMPOSITES, compositeEntity.name, entityRoles);\n    }\n};\n\n/**\n * Helper function to handle list entity definition\n * @param {Object} parsedContent parsed LUIS, QnA and QnA alternations content\n * @param {String} entityName entity name\n * @param {String []} listLines lines to parse for the list entity\n * @param {String []} entityRoles collection of roles found\n * @param {String} range range\n */\nconst handleClosedList = function (parsedContent, entityName, listLines, entityRoles, range) {\n    // check if this list entity is already labelled in an utterance and or added as a simple entity. if so, throw an error.\n    try {\n        let rolesImport = VerifyAndUpdateSimpleEntityCollection(parsedContent, entityName, 'List');\n        rolesImport.forEach(role => {\n            if (!entityRoles.includes(role)) {\n                entityRoles.push(role)\n            }\n        });\n    } catch (err) {\n        throw (err);\n    }\n    // Find closed list by this name if it exists\n    let closedListExists = parsedContent.LUISJsonStructure.closedLists.find(item => item.name == entityName);\n    let addCL = false;\n    if (closedListExists === undefined) {\n        closedListExists = new helperClass.closedLists(entityName);\n        addCL = true;\n    }\n    let addNV = false;    \n    let nvExists;\n    listLines.forEach(line => {\n        line = line.substr(1).trim();\n        if (line.toLowerCase().endsWith(':')) {\n            // close if we are in the middle of a sublist.\n            if (addNV) {\n                closedListExists.subLists.push(nvExists);\n                addNV = false;\n                nvExists = undefined;\n            }\n            // find the matching sublist and if none exists, create one. \n            let normalizedValue = line.replace(/:$/g, '').trim();\n            nvExists = closedListExists.subLists.find(item => item.canonicalForm == normalizedValue);\n            if (nvExists === undefined) {\n                nvExists = new helperClass.subList(normalizedValue);\n                addNV = true;\n            }\n        } else {\n            line.split(/[,;]/g).forEach(item => {\n                item = item.trim();\n                if (!nvExists || !nvExists.list) {\n                    let errorMsg = `Closed list ${entityName} has synonyms list \"${line}\" without a normalized value.`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: range\n                    })\n\n                    throw (new exception(retCode.errorCode.SYNONYMS_NOT_A_LIST, error.toString(), [error]));\n                }\n                nvExists.list.push(item);\n            })\n        }\n    });\n    // de-dupe the list\n    if (nvExists && nvExists.list)nvExists.list = [...new Set(nvExists.list)];\n    if (addNV) {\n        closedListExists.subLists.push(nvExists);\n    }\n    // merge roles\n    entityRoles.forEach(item => {\n        if(!closedListExists.roles.includes(item)) closedListExists.roles.push(item);\n    });\n\n    if (addCL) {\n        parsedContent.LUISJsonStructure.closedLists.push(closedListExists);\n    }\n}\n/**\n * Reference parser code to parse reference section.\n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {LUResouce} luResource resources extracted from lu file content\n * @param {boolean} log indicates if we need verbose logging.\n * @param {string} locale LUIS locale code\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseAndHandleEntitySection = function (parsedContent, luResource, log, locale) {\n    // handle entity\n    let entities = luResource.Sections.filter(s => s.SectionType === SectionType.ENTITYSECTION);\n    if (entities && entities.length > 0) {\n        for (const entity of entities) {\n            let entityName = entity.Name;\n            let entityType = entity.Type;\n            let parsedRoleAndType = helpers.getRolesAndType(entityType);\n            let entityRoles = parsedRoleAndType.roles;\n            entityType = parsedRoleAndType.entityType;\n            let pEntityName = (entityName.toLowerCase() === 'prebuilt') ? entityType : entityName;\n            \n            let PAEntityRoles = RemoveDuplicatePatternAnyEntity(parsedContent, pEntityName, entityType, entity.Range);\n            if (PAEntityRoles.length > 0) {\n                PAEntityRoles.forEach(role => {\n                    if (!entityRoles.includes(role)) entityRoles.push(role);\n                })\n            }\n\n            // add this entity to appropriate place\n            // is this a builtin type?\n            if (builtInTypes.consolidatedList.includes(entityType)) {\n                handlePrebuiltEntity(parsedContent, entityName, entityType, entityRoles, locale, log, entity.Range);\n            } else if (entityType.toLowerCase() === 'simple') {\n                // add this to entities if it doesnt exist\n                addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.ENTITIES, entityName, entityRoles);\n                let rootEntity = parsedContent.LUISJsonStructure.entities.find(item => item.name == entityName);\n                rootEntity.explicitlyAdded = true;\n            } else if (entityType.endsWith('=')) {\n                // is this qna maker alterations list? \n                if (entityType.includes(PARSERCONSTS.QNAALTERATIONS)) {\n                    let alterationlist = [entity.Name];\n                    if (entity.SynonymsOrPhraseList && entity.SynonymsOrPhraseList.length > 0) {\n                        alterationlist = alterationlist.concat(entity.SynonymsOrPhraseList);\n                        parsedContent.qnaAlterations.wordAlterations.push(new qnaAlterations().wordAlterations = {\"alterations\": alterationlist});\n                    } else {\n                        let errorMsg = `QnA alteration section: \"${alterationlist}\" does not have list decoration. Prefix line with \"-\" or \"+\" or \"*\"`;\n                        let error = BuildDiagnostic({\n                            message: errorMsg,\n                            range: entity.range\n                        })\n\n                        throw (new exception(retCode.errorCode.SYNONYMS_NOT_A_LIST, error.toString(), [error]));\n                    }\n                } else {\n                    // treat this as a LUIS list entity type\n                    let parsedEntityTypeAndRole = helpers.getRolesAndType(entityType);\n                    entityType = parsedEntityTypeAndRole.entityType;\n                    (parsedEntityTypeAndRole.roles || []).forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n\n                    // check if this list entity is already labelled in an utterance and or added as a simple entity. if so, throw an error.\n                    try {\n                        let rolesImport = VerifyAndUpdateSimpleEntityCollection(parsedContent, entityName, 'List');\n                        if (rolesImport.length !== 0) {\n                            rolesImport.forEach(role => {\n                                if (!entityRoles.includes(role)) {\n                                    entityRoles.push(role)\n                                }\n                            })\n                        }\n                    } catch (err) {\n                        throw (err);\n                    }\n                    // get normalized value\n                    let normalizedValue = entityType.substring(0, entityType.length - 1).trim();\n                    let synonymsList = entity.SynonymsOrPhraseList;\n                    let closedListExists = helpers.filterMatch(parsedContent.LUISJsonStructure.closedLists, 'name', entityName);\n                    if (closedListExists.length === 0) {\n                        parsedContent.LUISJsonStructure.closedLists.push(new helperClass.closedLists(entityName, [new helperClass.subList(normalizedValue, synonymsList)], entityRoles));\n                    } else {\n                        // closed list with this name already exists\n                        let subListExists = helpers.filterMatch(closedListExists[0].subLists, 'canonicalForm', normalizedValue);\n                        if (subListExists.length === 0) {\n                            closedListExists[0].subLists.push(new helperClass.subList(normalizedValue, synonymsList));\n                        } else {\n                            synonymsList.forEach(function (listItem) {\n                                if (!subListExists[0].list.includes(listItem)) subListExists[0].list.push(listItem);\n                            })\n                        }\n                        // see if the roles all exist and if not, add them\n                        mergeRoles(closedListExists[0].roles, entityRoles);\n                    }\n                }\n            } else if (entityType.toLowerCase().trim().indexOf('phraselist') === 0) {\n                if (entityType.toLowerCase().includes('interchangeable')) {\n                    entityName += '(interchangeable)';\n                }\n                handlePhraseList(parsedContent, entityName, entityType, entityRoles, entity.SynonymsOrPhraseList, entity.Range);\n            } else if (entityType.startsWith('[')) {\n                handleComposite(parsedContent, entityName, entityType, entityRoles, entity.Range, true, true);\n            } else if (entityType.startsWith('/')) {\n                if (entityType.endsWith('/')) {\n                    handleRegExEntity(parsedContent, entityName, entityType, entityRoles, entity.Range);\n                } else {\n                    let errorMsg = `RegEx entity: ${regExEntity.name} is missing trailing '/'. Regex patterns need to be enclosed in forward slashes. e.g. /[0-9]/`;\n                    let error = BuildDiagnostic({\n                        message: errorMsg,\n                        range: entity.Range\n                    })\n\n                    throw (new exception(retCode.errorCode.INVALID_REGEX_ENTITY, error.toString(), [error]));\n                }\n            } else {\n                // TODO: handle other entity types\n            }\n        }\n    }\n};\n/**\n * \n * @param {Object} parsedContent Object containing the parsed structure - LUIS, QnA, QnA alterations\n * @param {String} entityName name of entity\n * @param {String} entityType type of entity\n * @param {String []} entityRoles array of entity roles found\n * @param {String} range range\n */\nconst handleRegExEntity = function(parsedContent, entityName, entityType, entityRoles, range) {\n    // check if this regex entity is already labelled in an utterance and or added as a simple entity. if so, throw an error.\n    try {\n        let rolesImport = VerifyAndUpdateSimpleEntityCollection(parsedContent, entityName, 'RegEx');\n        if (rolesImport.length !== 0) {\n            rolesImport.forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n        }\n    } catch (err) {\n        throw (err);\n    }\n    let regex = '';\n    // handle regex entity \n    if (entityType) {\n        regex = entityType.slice(1, entityType.length - 1);\n        if (regex === '') {\n            let errorMsg = `RegEx entity: ${entityName} has empty regex pattern defined.`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                range: range\n            })\n\n            throw (new exception(retCode.errorCode.INVALID_REGEX_ENTITY, error.toString(), [error]));\n        }\n    }\n    \n    // add this as a regex entity if it does not exist\n    let regExEntity = (parsedContent.LUISJsonStructure.regex_entities || []).find(item => item.name == entityName);\n    if (regExEntity === undefined) {\n        parsedContent.LUISJsonStructure.regex_entities.push(new helperClass.regExEntity(entityName, regex, entityRoles))\n    } else {\n        // throw an error if the pattern is different for the same entity\n        if (regExEntity.regexPattern !== '' && regex !== '' && regExEntity.regexPattern !== regex) {\n            let errorMsg = `RegEx entity: ${regExEntity.name} has multiple regex patterns defined. \\n 1. /${regex}/\\n 2. /${regExEntity.regexPattern}/`;\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                range: range\n            })\n\n            throw (new exception(retCode.errorCode.INVALID_REGEX_ENTITY, error.toString(), [error]));\n        } else {\n            // update roles\n            addItemOrRoleIfNotPresent(parsedContent.LUISJsonStructure, LUISObjNameEnum.REGEX, regExEntity.name, entityRoles);\n            // add regex pattern\n            if (regExEntity.regexPattern === '') regExEntity.regexPattern = regex;\n        }\n    }\n}\n\n/**\n * Intent parser code to parse intent section.\n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {LUResouce} luResource resources extracted from lu file content\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseAndHandleQnaSection = async function (parsedContent, luResource) {\n    // handle QNA\n    let qnas = luResource.Sections.filter(s => s.SectionType === SectionType.QNASECTION);\n    if (qnas && qnas.length > 0) {\n        for (const qna of qnas) {\n            if (qna.QAPairId) {\n                qna.QAPairId = parseInt(qna.QAPairId);\n            } \n            let questions = qna.Questions;\n            // detect if any question is a reference\n            await Promise.all((questions || []).map(async question => {\n                // Ensure only links are detected and passed on to be parsed.\n                if (helpers.isUtteranceLinkRef(question || '')) {\n                    let parsedLinkUriInUtterance = await helpers.parseLinkURI(question);\n                    // examine and add these to filestoparse list.\n                    parsedContent.additionalFilesToParse.push(new fileToParse(parsedLinkUriInUtterance.fileName, false));\n                }\n            }))\n            let filterPairs = qna.FilterPairs;\n            let metadata = [];\n            if (filterPairs && filterPairs.length > 0) {\n                filterPairs.forEach(pair => metadata.push(new qnaMetaDataObj(pair.key, pair.value)));\n            }\n\n            let answer = qna.Answer;\n            let context = new qnaContext();\n            if (qna.prompts) {\n                (qna.prompts || []).forEach((prompt, idx) => {\n                    let contextOnly = prompt.contextOnly ? true : false;\n                    context.prompts.push(new qnaPrompt(prompt.displayText, prompt.linkedQuestion, undefined, contextOnly, idx));\n                })\n            }\n            parsedContent.qnaJsonStructure.qnaList.push(new qnaListObj(qna.QAPairId || 0, answer.trim(), qna.source, questions, metadata, context));\n        }\n    }\n}\n\n/**\n * Intent parser code to parse intent section.\n * @param {parserObj} Object with that contains list of additional files to parse, parsed LUIS object and parsed QnA object\n * @param {LUResouce} luResource resources extracted from lu file content\n * @param {boolean} log indicates if we need verbose logging.\n * @throws {exception} Throws on errors. exception object includes errCode and text.\n */\nconst parseAndHandleModelInfoSection = function (parsedContent, luResource, log) {\n    // handle model info\n    let enableMergeIntents = true;\n    let modelInfos = luResource.Sections.filter(s => s.SectionType === SectionType.MODELINFOSECTION);\n    if (modelInfos && modelInfos.length > 0) {\n        for (const modelInfo of modelInfos) {\n            let line = modelInfo.ModelInfo\n            let kvPair = line.split(/@(app|kb|intent|entity|enableSections|enableMergeIntents|patternAnyEntity).(.*)=/g).map(item => item.trim());\n            \n            // avoid to throw invalid model info when meeting enableSections info which is handled in luParser.js\n            if (kvPair[1] === 'enableSections') continue\n\n            if (kvPair.length === 4) {\n                if (kvPair[1] === 'enableMergeIntents') {\n                    enableMergeIntents = kvPair[3] === 'false' ? false : true;\n                    continue;\n                }\n\n                let hasError = false;\n                kvPair.forEach(item => {\n                    if (item.trim() === '') {\n                        if (log) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid model info found. Skipping \"' + line + '\"\\n'));\n                        }\n\n                        hasError = true;\n                    }\n                })\n\n                if(hasError) {\n                    continue;\n                }\n\n                if (kvPair[1].toLowerCase() === 'app') {\n                    if (kvPair[2].toLowerCase().startsWith('settings')) {\n                        let settingsRegExp = /^settings.(?<property>.*?$)/gmi;\n                        let settingsPair = settingsRegExp.exec(kvPair[2]);\n                        if (settingsPair && settingsPair.groups && settingsPair.groups.property) {\n                            if (!parsedContent.LUISJsonStructure.settings) {\n                                parsedContent.LUISJsonStructure.settings = [{name : settingsPair.groups.property, value : kvPair[3] === \"true\"}];\n                            } else {\n                                // find the setting\n                                let sFound = parsedContent.LUISJsonStructure.settings.find(setting => setting.name == settingsPair.groups.property);\n                                if (sFound) {\n                                    sFound.value = kvPair[3] === \"true\";\n                                } else {\n                                    parsedContent.LUISJsonStructure.settings.push({name : settingsPair.groups.property, value : kvPair[3] === \"true\"})\n                                }\n                            }\n                        }\n                    } else {\n                        parsedContent.LUISJsonStructure[kvPair[2]] = kvPair[3];\n                    }\n                } else if (kvPair[1].toLowerCase() === 'kb') {\n                    parsedContent.qnaJsonStructure[kvPair[2]] = kvPair[3];\n                } else if (kvPair[1].toLowerCase() === 'intent') {\n                    if (kvPair[2].toLowerCase() === 'inherits') {\n                        let inheritsProperties = kvPair[3].split(/[:;]/g).map(item => item.trim());\n                        if (inheritsProperties.length !== 6) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid intent inherits information found. Skipping \"' + line + '\"\\n'));\n                        } else {\n                            // find the intent\n                            let intent = parsedContent.LUISJsonStructure.intents.find(item => item.name == inheritsProperties[1]);\n                            if (intent === undefined) {\n                                let newIntent = {\n                                    \"name\": inheritsProperties[1],\n                                    \"inherits\": {}\n                                };\n                                newIntent['inherits'][inheritsProperties[2]] = inheritsProperties[3];\n                                newIntent['inherits'][inheritsProperties[4]] = inheritsProperties[5];\n                                parsedContent.LUISJsonStructure.intents.push(newIntent);\n                            } else {\n                                if (intent['inherits'] === undefined) intent['inherits'] = {};\n                                intent['inherits'][inheritsProperties[2]] = inheritsProperties[3];\n                                intent['inherits'][inheritsProperties[4]] = inheritsProperties[5];\n                            }\n                        }\n                    } else {\n                        if (log) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid intent inherits information found. Skipping \"' + line + '\"\\n'));\n                        }\n                    }\n                } else if (kvPair[1].toLowerCase() === 'entity') {\n                    if (kvPair[2].toLowerCase() === 'inherits') {\n                        let inheritsProperties = kvPair[3].split(/[:;]/g).map(item => item.trim());\n                        if (inheritsProperties.length !== 6) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid entity inherits information found. Skipping \"' + line + '\"\\n'));\n                        } else {\n                            // find the intent\n                            let entity = parsedContent.LUISJsonStructure.entities.find(item => item.name == inheritsProperties[1]);\n                            if (entity === undefined) {\n                                let newEntity = {\n                                    \"name\": inheritsProperties[1],\n                                    \"inherits\": {}\n                                };\n                                newEntity['inherits'][inheritsProperties[2]] = inheritsProperties[3];\n                                newEntity['inherits'][inheritsProperties[4]] = inheritsProperties[5];\n                                parsedContent.LUISJsonStructure.entities.push(newEntity);\n                            } else {\n                                if (entity['inherits'] === undefined) entity['inherits'] = {};\n                                entity['inherits'][inheritsProperties[2]] = inheritsProperties[3];\n                                entity['inherits'][inheritsProperties[4]] = inheritsProperties[5];\n                            }\n                        }\n                    } else {\n                        if (log) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid entity inherits information found. Skipping \"' + line + '\"\\n'));\n                        }\n                    }\n                } else if (kvPair[1].toLowerCase() === 'patternanyentity') {\n                    if (kvPair[2].toLowerCase() === 'inherits') {\n                        let inheritsProperties = kvPair[3].split(/[:;]/g).map(item => item.trim());\n                        if (inheritsProperties.length !== 6) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid Pattern.Any inherits information found. Skipping \"' + line + '\"\\n'));\n                        } else {\n                            // find the intent\n                            let entity = parsedContent.LUISJsonStructure.patternAnyEntities.find(item => item.name == inheritsProperties[1]);\n                            if (entity === undefined) {\n                                let newEntity = new helperClass.patternAnyEntity(inheritsProperties[1]);\n                                newEntity.inherits = {};\n                                newEntity['inherits'][inheritsProperties[2]] = inheritsProperties[3];\n                                newEntity['inherits'][inheritsProperties[4]] = inheritsProperties[5];\n                                parsedContent.LUISJsonStructure.patternAnyEntities.push(newEntity);\n                            } else {\n                                if (entity['inherits'] === undefined) entity['inherits'] = {};\n                                entity['inherits'][inheritsProperties[2]] = inheritsProperties[3];\n                                entity['inherits'][inheritsProperties[4]] = inheritsProperties[5];\n                            }\n                        }\n                    } else {\n                        if (log) {\n                            process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid entity inherits information found. Skipping \"' + line + '\"\\n'));\n                        }\n                    }\n                }\n            } else {\n                if (log) {\n                    process.stdout.write(chalk.default.yellowBright('[WARN]: Invalid model info found. Skipping \"' + line + '\"\\n'));\n                }\n            }\n        }\n    }\n\n    return enableMergeIntents;\n}\n\n\n/**\n * Helper function to verify that the requested entity does not already exist\n * @param {parserObj} parsedContent parserObj containing current parsed content\n * @param {String} entityName \n * @param {String} entityType \n * @returns {String[]} Possible roles found to import into the explicitly defined entity type.\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst VerifyAndUpdateSimpleEntityCollection = function (parsedContent, entityName, entityType) {\n    let entityRoles = [];\n    // Find this entity if it exists in the simple entity collection\n    let simpleEntityExists = (parsedContent.LUISJsonStructure.entities || []).find(item => item.name == entityName);\n    if (simpleEntityExists !== undefined) {\n        // take and add any roles into the roles list\n        (simpleEntityExists.roles || []).forEach(role => !entityRoles.includes(role) ? entityRoles.push(role) : undefined);\n        // remove this simple entity definition\n        // Fix for #1137.\n        // Current behavior does not allow for simple and phrase list entities to have the same name. \n        if (entityType != 'Phrase List') {\n            for (var idx = 0; idx < parsedContent.LUISJsonStructure.entities.length; idx++) {\n                if (parsedContent.LUISJsonStructure.entities[idx].name === simpleEntityExists.name) {\n                    parsedContent.LUISJsonStructure.entities.splice(idx, 1);\n                }\n            }\n        }\n    }\n    // Find if this entity is referred in a labelled utterance\n    let entityExistsInUtteranceLabel = (parsedContent.LUISJsonStructure.utterances || []).find(item => {\n        let entityMatch = (item.entities || []).find(entity => entity.entity == entityName)\n        if (entityMatch !== undefined) return true;\n        return false;\n    });\n\n    if (entityExistsInUtteranceLabel !== undefined) {\n        let entityMatch = entityExistsInUtteranceLabel.entities.filter(item => item.entity == entityName);\n        entityMatch.forEach(entity => {\n            if (entity.role !== undefined) {\n                if (!entityRoles.includes(entity.role)) {\n                    entityRoles.push(entity.role);\n                }\n            } else if (entityType !== 'Phrase List') {              // Fix for # 1151. Phrase lists can have same name as other entities.\n                let errorMsg = `'${entityType}' entity: \"${entityName}\" is added as a labelled entity in utterance \"${entityExistsInUtteranceLabel.text}\". ${entityType} cannot be added with explicit labelled values in utterances.`\n                let error = BuildDiagnostic({\n                    message: errorMsg\n                });\n\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n        });\n    }\n    return entityRoles;\n}\n\n/**\n * Helper function to recursively pull entities from parsed utterance text\n * @param {parserEntity} list\n * @param {Object} retObj {entitiesFound, utteranceWithoutEntityLabel}\n * @param {number} parentIdx index where this list occurs in the parent\n * @returns {string[]} resolved values to add to the parent list\n * @throws {exception} Throws on errors. exception object includes errCode and text.  \n */\nconst flattenLists = function (list, retObj, parentIdx) {\n    let retValue = []\n    if (list.entity !== undefined) list.entity = list.entity.trim();\n    if (list.role !== undefined) list.role = list.role.trim();\n    if (list.startPos !== undefined) list.startPos = parentIdx;\n    let offset = 0;\n    list.value.forEach((item, idx) => {\n        if (item instanceof helperClass.parserEntity) {\n            let valuesToInsert = flattenLists(item, retObj, offset + parentIdx);\n            if (valuesToInsert.length > 0) {\n                retValue = retValue.concat(valuesToInsert);\n                offset += valuesToInsert.length;\n            }\n        } else {\n            retValue.push(item);\n            if (item === ' ') {\n                if (idx !== 0 && idx !== (list.value.length - 1)) {\n                    offset++;\n                }\n            } else {\n                offset++;\n            }\n        }\n    });\n    if (list.value.length === 0) {\n        list.type = LUISObjNameEnum.PATTERNANYENTITY;\n        if (list.role != '') {\n            retValue = `{${list.entity}:${list.role}}`.split('');\n        } else {\n            retValue = `{${list.entity}}`.split('');\n        }\n    } else {\n        list.type = LUISObjNameEnum.ENTITIES;\n    }\n    retValue = retValue.join('').trim();\n    if (list.endPos !== undefined) list.endPos = parentIdx + retValue.length - 1;\n    retObj.entitiesFound.push(new helperClass.parserEntity(undefined, list.startPos, list.entity, retValue, list.endPos, list.type, list.role));\n    return retValue.split('');\n};\n\n/**\n * Helper function to add an item to collection if it does not exist\n * @param {object} collection contents of the current collection\n * @param {LUISObjNameEnum} type item type\n * @param {object} value value of the current item to examine and add\n * @returns {void} nothing\n */\nconst addItemIfNotPresent = function (collection, type, value) {\n    let hasValue = false;\n    for (let i in collection[type]) {\n        if (collection[type][i].name === value) {\n            hasValue = true;\n            break;\n        }\n    }\n    if (!hasValue) {\n        let itemObj = {};\n        itemObj.name = value;\n        if (type == LUISObjNameEnum.PATTERNANYENTITY) {\n            itemObj.explicitList = [];\n        }\n        if (type !== LUISObjNameEnum.INTENT) {\n            itemObj.roles = [];\n        }\n        collection[type].push(itemObj);\n    }\n};\n\n/**\n * Helper function to add an item to collection if it does not exist\n * @param {object} collection contents of the current collection\n * @param {LUISObjNameEnum} type item type\n * @param {object} value value of the current item to examine and add\n * @param {string []} roles possible roles to add to the item\n * @returns {void} nothing\n */\nconst addItemOrRoleIfNotPresent = function (collection, type, value, roles) {\n    let existingItem = collection[type].filter(item => item.name == value);\n    if (existingItem.length !== 0) {\n        // see if the role exists and if so, merge\n        if (existingItem[0].roles === undefined) {\n            existingItem[0].roles = [];\n        }\n\n        mergeRoles(existingItem[0].roles, roles);\n    } else {\n        let itemObj = {};\n        itemObj.name = value;\n        if (type == LUISObjNameEnum.PATTERNANYENTITY) {\n            itemObj.explicitList = [];\n        }\n        if (type !== LUISObjNameEnum.INTENT) {\n            itemObj.roles = roles;\n        }\n        collection[type].push(itemObj);\n    }\n}\n\n/**\n * Helper function merge roles\n * @param {string []} srcEntityRoles contents of the current collection\n * @param {string []} tgtEntityRoles target entity roles collection to merge\n * @returns {void} nothing\n */\nconst mergeRoles = function (srcEntityRoles, tgtEntityRoles) {\n    const rolesMap = srcEntityRoles.reduce((map, role) => (map[role] = true, map), {});\n    tgtEntityRoles.forEach(role => {\n        if (!rolesMap[role]) {\n            srcEntityRoles.push(role);\n        }\n    });\n}\n\n/**\n * Helper function that returns true if the item exists. Merges roles before returning \n * @param {Object} collection contents of the current collection\n * @param {string} entityName name of entity to look for in the current collection\n * @param {string []} entityRoles target entity roles collection to merge\n * @returns {void} nothing\n */\nconst itemExists = function (collection, entityName, entityRoles) {\n    let matchInClosedLists = helpers.filterMatch(collection, 'name', entityName);\n    if (matchInClosedLists.length !== 0) {\n        // merge roles if there are any roles in the pattern entity\n        if (entityRoles.length !== 0) {\n            mergeRoles(matchInClosedLists[0].roles, entityRoles);\n        }\n        return true;\n    }\n    return false;\n}\n\nmodule.exports = parseFileContentsModule;\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/qnaSection.js",
    "content": "const QnaSectionContext = require('./generated/LUFileParser').LUFileParser.QnaSectionContext;\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes');\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst QNA_GENERIC_SOURCE = \"custom editorial\";\nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass QnaSection extends BaseSection {\n    /**\n     * \n     * @param {QnaSectionContext} parseTree \n     */\n    constructor(parseTree) {\n        super();\n        this.SectionType = LUSectionTypes.QNASECTION;\n        this.Questions = [this.ExtractQuestion(parseTree)];\n        let result = this.ExtractMoreQuestions(parseTree);\n        this.Questions = this.Questions.concat(result.questions);\n        this.Errors = result.errors;\n        result = this.ExtractFilterPairs(parseTree);\n        this.FilterPairs = result.filterPairs;\n        this.Errors = this.Errors.concat(result.errors);\n        this.Answer = this.ExtractAnswer(parseTree);\n        result = this.ExtractPrompts(parseTree);\n        this.prompts = result.promptDefinitions;\n        this.promptsText = result.promptTextList;\n        this.Errors = this.Errors.concat(result.errors);\n        this.QAPairId = this.ExtractAssignedId(parseTree);\n        this.source = this.ExtractSourceInfo(parseTree);\n        const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n        const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n        this.Range = new Range(startPosition, stopPosition);\n    }\n\n    ExtractSourceInfo(parseTree) {\n        let srcAssignment = parseTree.qnaDefinition().qnaSourceInfo()\n        if (srcAssignment) {\n            let srcRegExp = /^[ ]*\\>[ ]*!#[ ]*@qna.pair.source[ ]*=[ ]*(?<sourceInfo>.*?)$/gmi;\n            let srcParsed = srcRegExp.exec(srcAssignment.getText().trim());\n            return srcParsed.groups.sourceInfo || QNA_GENERIC_SOURCE;\n        }\n        return QNA_GENERIC_SOURCE\n    }\n    \n    ExtractAssignedId(parseTree) {\n        let idAssignment = parseTree.qnaDefinition().qnaIdMark()\n        if (idAssignment) {\n            let idTextRegExp = /^\\<a[ ]*id[ ]*=[ ]*[\\\"\\'](?<idCaptured>.*?)[\\\"\\'][ ]*>[ ]*\\<\\/a\\>$/gmi;\n            let idTextParsed = idTextRegExp.exec(idAssignment.getText().trim());\n            return idTextParsed.groups.idCaptured || undefined;\n        }\n        return undefined;\n    }\n\n    ExtractPrompts(parseTree) {\n        let promptDefinitions = [];\n        let promptTextList = []\n        let errors = [];\n        let promptSection = parseTree.qnaDefinition().promptSection();\n        if (!promptSection) {\n            return { promptDefinitions, errors };\n        }\n        if (promptSection.errorFilterLine() !== undefined) {\n            for (const errorFilterLineStr of promptSection.errorFilterLine()) {\n                if (errorFilterLineStr.getText().trim() !== '') {\n                    errors.push(BuildDiagnostic({\n                    message: \"Invalid QnA prompt line, expecting '-' prefix for each line.\",\n                    context: errorFilterLineStr\n                }))}\n            }\n        }\n        \n        for (const promptLine of promptSection.filterLine()) {\n            let filterLineText = promptLine.getText().trim();\n            filterLineText = filterLineText.substr(1).trim();\n            promptTextList.push(filterLineText);\n            let promptConfigurationRegExp = /^\\[(?<displayText>.*?)]\\([ ]*\\#[ ]*[ ?]*(?<linkedQuestion>.*?)\\)[ ]*(?<contextOnly>\\`context-only\\`)?.*?$/gmi;\n            let splitLine = promptConfigurationRegExp.exec(filterLineText);\n            if (!splitLine) {\n                errors.push(BuildDiagnostic({\n                    message: \"Invalid QnA prompt definition. Unable to parse prompt. Please verify syntax as well as question link`.\",\n                    context: filterLineText\n                }))\n            }\n            promptDefinitions.push(splitLine.groups);\n        }\n        return { promptDefinitions, promptTextList, errors };\n    }\n\n    ExtractQuestion(parseTree) {\n        return parseTree.qnaDefinition().qnaQuestion().questionText().getText().trim();\n    }\n\n    ExtractMoreQuestions(parseTree) {\n        let questions = [];\n        let errors = [];\n        let questionsBody = parseTree.qnaDefinition().moreQuestionsBody();\n        for (const errorQuestionStr of questionsBody.errorQuestionString()) {\n            if (errorQuestionStr.getText().trim() !== '') {\n                errors.push(BuildDiagnostic({\n                message: \"Invalid QnA question line, did you miss '-' at line begin\",\n                context: errorQuestionStr\n            }))}\n        }\n\n        for (const question of questionsBody.moreQuestion()) {\n            let questionText = question.getText().trim();\n            questions.push(questionText.substr(1).trim());\n        }\n\n        return { questions, errors };\n    }\n\n    ExtractFilterPairs(parseTree) {\n        let filterPairs = [];\n        let errors = [];\n        let filterSection = parseTree.qnaDefinition().qnaAnswerBody().filterSection();\n        if (filterSection) {\n            if (filterSection.errorFilterLine() !== undefined) {\n                for (const errorFilterLineStr of filterSection.errorFilterLine()) {\n                    if (errorFilterLineStr.getText().trim() !== '') {\n                        errors.push(BuildDiagnostic({\n                        message: \"Invalid QnA filter line, did you miss '-' at line begin\",\n                        context: errorFilterLineStr\n                    }))}\n                }\n            }\n            \n            for (const filterLine of filterSection.filterLine()) {\n                let filterLineText = filterLine.getText().trim();\n                filterLineText = filterLineText.substr(1).trim()\n                let filterPair = filterLineText.split('=');\n                let key = filterPair[0].trim();\n                let value = filterPair[1].trim();\n                filterPairs.push({ key, value });\n            }\n        } \n\n        return { filterPairs, errors };\n    }\n\n    ExtractAnswer(parseTree) {\n        let multiLineAnswer = parseTree.qnaDefinition().qnaAnswerBody().multiLineAnswer().getText().trim();\n        // trim first and last line\n        let answerRegexp = /^```(markdown)?\\r*\\n(?<answer>(.|\\n|\\r\\n|\\t| )*)\\r?\\n.*?```$/gim;\n        let answer = answerRegexp.exec(multiLineAnswer);\n        return answer.groups.answer !== undefined ? answer.groups.answer : '';\n    }\n}\n\nmodule.exports = QnaSection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/read-text-file.js",
    "content": "const fs = require('fs');\n\nconst readTextFile = {\n    readSync: function(file){\n        try {\n            let fileBuffer = fs.readFileSync(file);\n            if(fileBuffer) {\n                // If the data starts with BOM, we know it is UTF\n                if( fileBuffer[0] === 0xEF && fileBuffer[1] === 0xBB && fileBuffer[2] === 0xBF) {\n                    // EF BB BF  UTF-8 with BOM\n                    fileBuffer = fileBuffer.slice(3);\n                } else if(fileBuffer[0] === 0xFF && fileBuffer[1] === 0xFE && fileBuffer[2] === 0x00  && fileBuffer[3] === 0x00) {\n                    // FF FE 00 00  UTF-32, little-endian BOM\n                    fileBuffer = fileBuffer.slice(4);\n                } else if(fileBuffer[0] === 0x00 && fileBuffer[1] === 0x00 && fileBuffer[2] === 0xFE  && fileBuffer[3] === 0xFF) {\n                    // 00 00 FE FF  UTF-32, big-endian BOM\n                    fileBuffer = fileBuffer.slice(4);\n                } else if(fileBuffer[0] === 0xFE && fileBuffer[1] === 0xFF && fileBuffer[2] === 0x00  && fileBuffer[3] === 0x00) {\n                    // FE FF 00 00  UCS-4, unusual octet order BOM (3412)\n                    fileBuffer = fileBuffer.slice(4);\n                } else if(fileBuffer[0] === 0x00 && fileBuffer[1] === 0x00 && fileBuffer[2] === 0xFF  && fileBuffer[3] === 0xFE) {\n                    // 00 00 FF FE  UCS-4, unusual octet order BOM (2143)\n                    fileBuffer = fileBuffer.slice(4);\n                } else if(fileBuffer[0] === 0xFF && fileBuffer[1] === 0xFE) {\n                    // FF FE  UTF-16, little endian BOM\n                    fileBuffer = fileBuffer.slice(2);\n                } else if(fileBuffer[0] === 0xFE && fileBuffer[1] === 0xFF) {\n                    // FE FF  UTF-16, big endian BOM\n                    fileBuffer = fileBuffer.slice(2);\n                }\n            }\n        \n            return fileBuffer.toString('utf8').replace(/\\0/g, '');\n        } catch(err) {\n            if (err.message.match(/ENOENT: no such file or directory/)) {\n                throw err;\n            } \n            throw (new Error('Invalid Input', `Sorry, unable to parse file: \\n\\n ${JSON.stringify(err, null, 2)}\\n\\n`));\n        }\n    }\n}\n\nmodule.exports = readTextFile;\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/sectionOperator.js",
    "content": "const luParser = require('./luParser');\nconst helpers = require('./../utils/helpers');\nconst NEWLINE = require('os').EOL;\nconst LUResource = require('./luResource');\nconst LUSectionTypes = require('../utils/enums/lusectiontypes');\n\nclass SectionOperator {\n\n  /**\n   * @param {LUResource} luresource \n   */\n  constructor(luresource) {\n    this.Luresource = JSON.parse(JSON.stringify(luresource));\n  }\n\n  // After CRUD, section Ids will keep same unless you change section name.\n  addSection(sectionContent) {\n    sectionContent = helpers.sanitizeNewLines(sectionContent);\n\n    const newResource = luParser.parseWithRef(sectionContent, this.Luresource);\n    if (!newResource) {\n      return this.Luresource;\n    }\n\n    if (this.Luresource.Sections.some(u => u.Id === newResource.Id)) {\n      throw new Error(`Section with id: ${newResource.Id} exists.`);\n    }\n\n    const offset = !this.Luresource.Content ? 0 : this.Luresource.Content.split(/\\r?\\n/).length;\n\n    this.Luresource.Content = this.Luresource.Content !== '' ? `${this.Luresource.Content}${NEWLINE}${sectionContent}` : sectionContent;\n\n    // add a NestedIntentSection may appears multiple sections\n    this.adjustRangeForAddSection(newResource.Sections, offset);\n    this.Luresource.Sections.push(...newResource.Sections);\n\n    this.adjustRangeForErrors(newResource.Errors, offset);\n    this.Luresource.Errors.push(...newResource.Errors);\n\n    luParser.extractSectionBody(this.Luresource.Sections, this.Luresource.Content);\n    return this.Luresource;\n  }\n\n  updateSection(id, sectionContent) {\n    sectionContent = helpers.sanitizeNewLines(sectionContent);\n    const sectionIndex = this.Luresource.Sections.findIndex(u => u.Id === id);\n    if (sectionIndex < 0) {\n      return this.Luresource;\n    }\n\n    const oldSection = this.Luresource.Sections[sectionIndex];\n    const newResource = luParser.parseWithRef(sectionContent, this.Luresource);\n    if (!newResource) {\n      return this.Luresource;\n    }\n\n    // add a NestedIntentSection may appears multiple sections\n    const startLine = oldSection.Range.Start.Line;\n    const endLine = oldSection.Range.End.Line;\n\n    this.removeErrors(this.Luresource.Errors, startLine, endLine);\n\n    // adjust original errors\n    const newLineRange = sectionContent.split(/\\r?\\n/).length;\n    const originalRange = endLine - startLine + 1;\n    this.adjustRangeForErrors(this.Luresource.Errors, newLineRange - originalRange, endLine);\n\n    // adjust updated sections' errors\n    const offset = oldSection.Range.Start.Line - newResource.Sections[0].Range.Start.Line;\n    this.adjustRangeForErrors(newResource.Errors, offset);\n    this.Luresource.Errors.push(...newResource.Errors);\n\n    this.Luresource.Content = this.replaceRangeContent(this.Luresource.Content, oldSection.Range.Start.Line - 1, oldSection.Range.End.Line - 1, sectionContent);\n    this.adjustRangeForUpdateSection(sectionIndex, newResource.Sections);\n\n    luParser.extractSectionBody(this.Luresource.Sections, this.Luresource.Content);\n    return this.Luresource;\n  }\n\n  deleteSection(id) {\n    const sectionIndex = this.Luresource.Sections.findIndex(u => u.Id === id);\n    if (sectionIndex < 0) {\n      return this;\n    }\n\n    const oldSection = this.Luresource.Sections[sectionIndex];\n    const startLine = oldSection.Range.Start.Line;\n    const endLine = oldSection.Range.End.Line;\n\n    this.removeErrors(this.Luresource.Errors, startLine, endLine);\n    this.adjustRangeForErrors(this.Luresource.Errors, startLine - endLine, endLine);\n\n    this.Luresource.Sections.splice(sectionIndex, 1);\n    this.Luresource.Content = this.replaceRangeContent(this.Luresource.Content, startLine - 1, endLine - 1, undefined);\n\n    const offset = endLine - startLine + 1;\n    this.adjustRangeForDeleteSection(sectionIndex, offset);\n    luParser.extractSectionBody(this.Luresource.Sections, this.Luresource.Content);\n    return this.Luresource;\n  }\n\n  insertSection(id, sectionContent) {\n    // insert into the front of the old section\n    sectionContent = helpers.sanitizeNewLines(sectionContent);\n    const sectionIndex = this.Luresource.Sections.findIndex(u => u.Id === id);\n\n    if (sectionIndex < 0 && this.Luresource.Sections.length > 0) {\n      return this.Luresource;\n    }\n\n    // if secionIndex < 0 and the luresource is empty, just add it\n    if (sectionIndex < 0 && this.Luresource.Sections.length === 0) {\n      return this.addSection(sectionContent);\n    }\n\n    const newResource = luParser.parseWithRef(sectionContent, this.Luresource);\n    if (!newResource) {\n      return this.Luresource;\n    }\n\n    // add a NestedIntentSection may appears multiple sections\n\n    // adjust original errors\n    const newLineRange = sectionContent.split(/\\r?\\n/).length;\n    const startLine = sectionIndex <= 0 ? 1 : this.Luresource.Sections[sectionIndex].Range.Start.Line;\n    this.adjustRangeForErrors(this.Luresource.Errors, newLineRange, startLine);\n\n    // adjust the insert errors of section\n    this.adjustRangeForErrors(newResource.Errors, startLine - 1);\n    this.Luresource.Errors.push(...newResource.Errors);\n\n    this.Luresource.Content = this.replaceRangeContent(this.Luresource.Content, startLine - 1, startLine - 2, sectionContent);\n    this.adjustRangeForInsertSection(sectionIndex, newResource.Sections);\n\n    luParser.extractSectionBody(this.Luresource.Sections, this.Luresource.Content);\n    return this.Luresource;\n  }\n\n  removeErrors(errors, startLine, endLine) {\n    if (errors && startLine >= 0 && endLine >= startLine) {\n      let index = -1;\n\n      while ((index = errors.findIndex(u =>\n        u.Range && ((u.Range.Start.Line >= startLine && u.Range.Start.Line <= endLine)\n        || (u.Range.End.Line >= startLine && u.Range.End.Line <= endLine)))) >= 0) {\n        this.Luresource.Errors.splice(index, 1);\n      }\n    }\n  }\n\n  adjustRangeForErrors(errors, offset, startLine, endLine) {\n    if (errors) {\n      if (startLine === undefined && endLine === undefined) {\n        errors.forEach(u => {\n          this.adjustErrorRange(u, offset);\n        });\n      } else if (startLine >= 0 && (endLine === undefined || endLine < startLine)) {\n        errors.forEach(u => {\n          if (u.Range.Start.Line >= startLine) {\n            this.adjustErrorRange(u, offset);\n          }\n        });\n      } else if (startLine >= 0 && endLine >= startLine) {\n        errors.forEach(u => {\n          if (u.Range.Start.Line >= startLine && u.Range.End.Line <= endLine) {\n            this.adjustErrorRange(u, offset);\n          }\n        });\n      }\n    }\n  }\n  \n  adjustErrorRange(error, offset) {\n    if (error && error.Range) {\n      error.Range.Start.Line += offset;\n      error.Range.End.Line += offset;\n    }\n  }\n\n  adjustRangeForAddSection(newSections, offset) {\n    newSections.forEach(u => {\n      this.adjustSectionRange(u, offset);\n    });\n  }\n\n  adjustSectionRange(section, offset) {\n    if (section) {\n      if (section.SimpleIntentSections && section.SectionType === LUSectionTypes.NESTEDINTENTSECTION && section.SimpleIntentSections) {\n        section.SimpleIntentSections.forEach(k => {\n          k.Range.Start.Line += offset;\n          k.Range.End.Line += offset;\n        });\n      }\n  \n      section.Range.Start.Line += offset;\n      section.Range.End.Line += offset;\n    }\n  }\n\n  adjustRangeForDeleteSection(index, offset) {\n    for (let i = index; i < this.Luresource.Sections.length; i++) {\n      const section = this.Luresource.Sections[i];\n      this.adjustSectionRange(section, -offset) \n    }\n  }\n\n  adjustRangeForUpdateSection(oldIndex, newSections) {\n    const sectionsSize = newSections.length;\n    const oldStartLine = this.Luresource.Sections[oldIndex].Range.Start.Line;\n    const oldEndLine = this.Luresource.Sections[oldIndex].Range.End.Line;\n    const newStartLine = newSections[0].Range.Start.Line;\n    const newEndLine = newSections[newSections.length - 1].Range.End.Line;\n\n    this.Luresource.Sections.splice(oldIndex, 1, ...newSections);\n\n    // adjust updated sections' range\n    const updateOffset = oldStartLine - this.Luresource.Sections[oldIndex].Range.Start.Line;\n    for (let i = oldIndex; i < oldIndex + sectionsSize; i++) {\n      const section = this.Luresource.Sections[i];\n      this.adjustSectionRange(section, updateOffset);\n    }\n\n    // adjust remaining sections' range\n    const remainingOffset = (newEndLine - newStartLine) - (oldEndLine - oldStartLine);\n    for (let i = oldIndex + sectionsSize; i < this.Luresource.Sections.length; i++) {\n      const section = this.Luresource.Sections[i];\n      this.adjustSectionRange(section, remainingOffset);\n    }\n  }\n\n  adjustRangeForInsertSection(postIndex, newSections) {\n    const sectionsSize = newSections.length;\n    const insertOffset = postIndex <= 0 ? 0 : this.Luresource.Sections[postIndex].Range.Start.Line - 1;\n    const newStartLine = newSections[0].Range.Start.Line;\n    const newEndLine = newSections[newSections.length - 1].Range.End.Line;\n\n    this.Luresource.Sections.splice(postIndex, 0, ...newSections);\n\n    // adjust inserted sections' range\n    for (let i = postIndex; i < postIndex + sectionsSize; i++) {\n      const section = this.Luresource.Sections[i];\n      this.adjustSectionRange(section, insertOffset);\n    }\n\n    // adjust remaining sections' range\n    const remainingOffset = newEndLine - newStartLine + 1;\n    for (let i = postIndex + sectionsSize; i < this.Luresource.Sections.length; i++) {\n      const section = this.Luresource.Sections[i];\n      this.adjustSectionRange(section, remainingOffset);\n    }\n  }\n\n  replaceRangeContent(originString, startLine, stopLine, replaceString) {\n    const originList = originString.split(/\\r?\\n/);\n    let destList = [];\n    if (isNaN(startLine) || isNaN(stopLine) || startLine < 0 || startLine > stopLine + 1) {\n      throw new Error(\"index out of range.\");\n    }\n\n    destList.push(...originList.slice(0, startLine));\n\n    if (replaceString) {\n      destList.push(replaceString);\n    }\n\n    destList.push(...originList.slice(stopLine + 1));\n\n    return destList.join(NEWLINE);\n  }\n}\n\nmodule.exports = SectionOperator;\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/simpleIntentSection.js",
    "content": "const SimpleIntentSectionContext = require('./generated/LUFileParser').LUFileParser.SimpleIntentSectionContext;\nconst EntitySection = require('./entitySection');\nconst NewEntitySection = require('./newEntitySection');\nconst visitor = require('./visitor');\nconst DiagnosticSeverity = require('./diagnostic').DiagnosticSeverity;\nconst BuildDiagnostic = require('./diagnostic').BuildDiagnostic;\nconst LUSectionTypes = require('./../utils/enums/lusectiontypes');\nconst NEWLINE = require('os').EOL;\nconst BaseSection = require('./baseSection');\nconst Range = require('./diagnostic').Range;\nconst Position = require('./diagnostic').Position;\n\nclass SimpleIntentSection  extends BaseSection {\n    /**\n     * \n     * @param {SimpleIntentSectionContext} parseTree \n     */\n    constructor(parseTree, content) {\n        super();\n        this.SectionType = LUSectionTypes.SIMPLEINTENTSECTION;\n        this.UtteranceAndEntitiesMap = [];\n        this.Entities = [];\n        this.Errors = [];\n        this.Body = '';\n        \n        if (parseTree) {\n            this.Name = this.ExtractName(parseTree);\n            this.IntentNameLine = this.ExtractIntentNameLine(parseTree);\n            let result = this.ExtractUtteranceAndEntitiesMap(parseTree);\n            this.UtteranceAndEntitiesMap = result.utteranceAndEntitiesMap;\n            this.Errors = result.errors;\n            this.Id = `${this.SectionType}_${this.Name}`;\n            const startPosition = new Position(parseTree.start.line, parseTree.start.column);\n            const stopPosition = new Position(parseTree.stop.line, parseTree.stop.column + parseTree.stop.text.length);\n            this.Range = new Range(startPosition, stopPosition);\n        }\n    }\n\n    ExtractName(parseTree) {\n        return parseTree.intentDefinition().intentNameLine().intentName().getText().trim();\n    }\n\n    ExtractIntentNameLine(parseTree) {\n        return parseTree.intentDefinition().intentNameLine().getText().trim();\n    }\n\n    ExtractUtteranceAndEntitiesMap(parseTree) {\n        let utteranceAndEntitiesMap = [];\n        let errors = [];\n        if (parseTree.intentDefinition().intentBody() && parseTree.intentDefinition().intentBody().normalIntentBody()) {\n            for (const errorIntentStr of parseTree.intentDefinition().intentBody().normalIntentBody().errorString()) {\n                if (errorIntentStr.getText().trim() !== '') {\n                    errors.push(BuildDiagnostic({\n                    message: \"Invalid intent body line, did you miss '-' at line begin\",\n                    context: errorIntentStr\n                }))}\n            }\n\n            for (const normalIntentStr of parseTree.intentDefinition().intentBody().normalIntentBody().normalIntentString()) {\n                let utteranceAndEntities;\n                try {\n                    utteranceAndEntities = visitor.visitNormalIntentStringContext(normalIntentStr);\n                }\n                catch (err) {\n                    errors.push(BuildDiagnostic({\n                        message: \"Invalid utterance definition found. Did you miss a '{' or '}'?\",\n                        context: normalIntentStr\n                    }))\n                };\n                if (utteranceAndEntities !== undefined) {\n                    utteranceAndEntities.contextText = normalIntentStr.getText();\n                    const startPosition = new Position(normalIntentStr.start.line, normalIntentStr.start.column);\n                    const stopPosition = new Position(normalIntentStr.stop.line, normalIntentStr.stop.column + normalIntentStr.stop.text.length);\n                    utteranceAndEntities.range = new Range(startPosition, stopPosition);\n                    \n                    utteranceAndEntitiesMap.push(utteranceAndEntities);\n                    utteranceAndEntities.errorMsgs.forEach(errorMsg => errors.push(BuildDiagnostic({\n                        message: errorMsg,\n                        context: normalIntentStr\n                    })));\n                }\n            }\n        }\n\n        if (utteranceAndEntitiesMap.length === 0) {\n            let errorMsg = `no utterances found for intent definition: \"# ${this.Name}\"`\n            let error = BuildDiagnostic({\n                message: errorMsg,\n                context: parseTree.intentDefinition().intentNameLine(),\n                severity: DiagnosticSeverity.WARN\n            })\n\n            errors.push(error);\n        }\n\n        return { utteranceAndEntitiesMap, errors };\n    }\n}\n\nmodule.exports = SimpleIntentSection;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/translate-helpers.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fetch = require('node-fetch');\nconst PARSERCONSTS = require('./../utils/enums/parserconsts');\nconst retCode = require('./../utils/enums/CLI-errors');\nconst chalk = require('chalk');\nconst exception = require('./../utils/exception');\nconst helpers = require('./../utils/helpers');\nconst NEWLINE = require('os').EOL;\nconst MAX_TRANSLATE_BATCH_SIZE = 25;\nconst MAX_CHAR_IN_REQUEST = 4990;\n\nconst translateHelpers = {\n    /**\n     * Helper function to parseAndTranslate lu file content\n     * @param {string} fileContent file content\n     * @param {string} subscriptionKey translate text API key\n     * @param {string} to_lang language code to translate content to\n     * @param {string} src_lang language code for source content\n     * @param {boolean} translate_comments translate comments in .lu files if this is set to true\n     * @param {boolean} translate_link_text translate URL or LU reference link text in .lu files if this is set to true\n     * @param {boolean} log indicates if this function should write verbose messages to process.stdout\n     * @param {number} batch_translate indicates number of input lines to batch up before calling translation API\n     * @returns {string} Localized file content\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    parseAndTranslate : async function(fileContent, subscriptionKey, to_lang, src_lang, translate_comments, translate_link_text, log, batch_translate) {\n        let batch_translate_size = batch_translate ? parseInt(batch_translate) : MAX_TRANSLATE_BATCH_SIZE;\n        fileContent = helpers.sanitizeNewLines(fileContent);\n        let linesInFile = fileContent.split(NEWLINE);\n        let linesToTranslate = [];\n        let localizedContent = '';\n        let currentSectionType = '';\n        let inAnswer = false;\n        let lineCtr = 0;\n        for(let lineIndex in linesInFile) {\n            lineCtr++;\n            let currentLine = linesInFile[lineIndex].trim();\n            // is current line a comment? \n            if(currentLine.indexOf(PARSERCONSTS.COMMENT) === 0) {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, currentLine, true);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n                if(translate_comments) {\n                    addSegment(linesToTranslate, currentLine.charAt(0), false);\n                    addSegment(linesToTranslate, currentLine.substring(1), true);\n                } else {\n                    addSegment(linesToTranslate, currentLine, false);\n                }\n            } else if (currentLine.indexOf(PARSERCONSTS.FILTER) === 0) {\n                addSegment(linesToTranslate, currentLine, false);\n                currentSectionType = PARSERCONSTS.FILTER;\n            } else if (currentLine.indexOf(PARSERCONSTS.INTENT) === 0) {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, currentLine, true);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n                let intentName = currentLine.substring(currentLine.indexOf(' ') + 1).trim();\n                //is this a QnA? \n                if(intentName.indexOf(PARSERCONSTS.QNA) === 0) {\n                    let beforeQuestion = currentLine.substring(0, currentLine.indexOf(' ') + 1);\n                    let question = intentName.slice(1).trim();\n                    addSegment(linesToTranslate, beforeQuestion + '? ', false);\n                    addSegment(linesToTranslate, question, true);\n                    currentSectionType = PARSERCONSTS.QNA;\n                } else {\n                    // we would not localize intent name but remember we are under intent section\n                    currentSectionType = PARSERCONSTS.INTENT;\n                    addSegment(linesToTranslate, currentLine, false);\n                }\n            } else if(currentLine.indexOf('-') === 0 || \n                    currentLine.indexOf('*') === 0 || \n                    currentLine.indexOf('+') === 0 ) {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, currentLine, true);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n                // Fix for #1191. Do not localize meta-data filters for QnA.\n                if (currentSectionType === PARSERCONSTS.FILTER) {\n                    addSegment(linesToTranslate, currentLine, false);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n                let listSeparator = '';\n                let content = '';\n                switch (currentSectionType) {\n                case PARSERCONSTS.INTENT: \n                listSeparator = currentLine.charAt(0);\n                addSegment(linesToTranslate, listSeparator + ' ', false);\n                content = currentLine.slice(1).trim();\n                let skipChars = ['{', '}', '(', ')', '[', ']', '|', '='] \n                for (let i = 0; i < content.length; i++) {\n                    let processedText = ''\n                    let tslt = false\n                    if (!skipChars.includes(content.charAt(i))) {  \n                        for (let j = i; j < content.length && !skipChars.includes(content.charAt(j)); j++) {\n                            processedText += content.charAt(j)\n                        } \n                        tslt = true  \n                    } else if (content.charAt(i) == '{') {\n                        for (let j = i; j < content.length && (content.charAt(j) !== '=' && content.charAt(j) !== '}'); j++) {\n                            processedText += content.charAt(j)\n                        }\n                    } else {\n                        processedText += content.charAt(i)\n                    }\n\n                    if (processedText.charAt(0) === ' ') {\n                        addSegment(linesToTranslate, ' ', false)\n                    }\n                    \n                    addSegment(linesToTranslate, processedText, tslt)\n                    content = content.slice(processedText.length)\n                    i--\n                }\n                break;\n                case PARSERCONSTS.NEWENTITY:\n                    // if current line is a normalized value, add it to the list to localize// strip line of the list separator\n                    listSeparator = currentLine.charAt(0);\n                    content = currentLine.slice(1).trim();\n                    if (content.trim().endsWith(':')) {\n                        let normalizedValueAsSynonym = content.replace(/:$/g, '').trim();\n                        addSegment(linesToTranslate, `\\t- ${normalizedValueAsSynonym}:`, false);\n                        addSegment(linesToTranslate, NEWLINE, false);\n                        addSegment(linesToTranslate, '\\t\\t- ', false);\n                        addSegment(linesToTranslate, normalizedValueAsSynonym, true);\n                    } else {\n                        addSegment(linesToTranslate, '\\t\\t- ', false);\n                        addSegment(linesToTranslate, content, true);\n                    }\n                    break;\n                case PARSERCONSTS.ENTITY:\n                case PARSERCONSTS.QNA:\n                default:\n                    // strip line of the list separator\n                    listSeparator = currentLine.charAt(0);\n                    content = currentLine.slice(1).trim();\n                    addSegment(linesToTranslate, listSeparator + ' ', false);\n                    addSegment(linesToTranslate, content, true);\n                    break;\n                }\n            } else if(currentLine.indexOf(PARSERCONSTS.ENTITY) === 0) {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, currentLine, true);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n                // we need to localize qna alterations if specified.\n                let entityDef = currentLine.replace(PARSERCONSTS.ENTITY, '').split(':');\n                let entityName = entityDef[0];\n                let entityType = entityDef[1];\n                if(entityType.includes(PARSERCONSTS.QNAALTERATIONS)) {\n                    addSegment(linesToTranslate, '$', false);\n                    addSegment(linesToTranslate, entityName.trim(), true);\n                    addSegment(linesToTranslate, ' : ' + PARSERCONSTS.QNAALTERATIONS + ' = ', false);\n                } else {\n                    // we would not localize entity line but remember we are under entity section for list entities\n                    // FIX for BF CLI # 121\n                    // If list entity, add normalized value to list of synonyms to translate.\n                    addSegment(linesToTranslate, currentLine, false);\n                    if (entityType.trim().endsWith('=')) {\n                        addSegment(linesToTranslate, NEWLINE, false);\n                        let normalizedValueAsSynonym = entityType.replace('=', '').trim();\n                        addSegment(linesToTranslate, '- ', false);\n                        addSegment(linesToTranslate, normalizedValueAsSynonym, true);\n                    } \n                }\n            } else if(currentLine.indexOf(PARSERCONSTS.ANSWER) === 0) {\n                if (inAnswer) {\n                    let answerData = '';\n                }\n                addSegment(linesToTranslate, currentLine, false);\n                inAnswer = !inAnswer;\n                currentSectionType = PARSERCONSTS.ANSWER;\n            } else if (currentLine.indexOf(PARSERCONSTS.URLORFILEREF) ===0) {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, currentLine, true);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n                currentSectionType = PARSERCONSTS.URLORFILEREF;\n                if(translate_link_text) {\n                    const linkValueRegEx = new RegExp(/\\(.*?\\)/g);\n                    let linkValueList = currentLine.trim().match(linkValueRegEx);\n                    let linkValue = linkValueList[0].replace('(','').replace(')','');\n                    const linkTextRegEx = new RegExp(/\\[.*\\]/g);\n                    let linkTextList = currentLine.trim().match(linkTextRegEx);\n                    let linkTextValue = linkTextList[0].replace('[','').replace(']','');\n                    addSegment(linesToTranslate, '[', false);\n                    addSegment(linesToTranslate, linkTextValue, true);\n                    addSegment(linesToTranslate, ']', false);\n                    addSegment(linesToTranslate, '(' + linkValue + ')', false);\n                } else {\n                    addSegment(linesToTranslate, currentLine, false);\n                }\n            } else if(currentLine === '') {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                }\n            } else if(currentLine.indexOf(PARSERCONSTS.NEWENTITY) === 0) {\n                // Nothing in the entity line should be localized.\n                addSegment(linesToTranslate, currentLine, false);\n                currentSectionType = PARSERCONSTS.NEWENTITY;\n            } else {\n                if (inAnswer) {\n                    addSegment(linesToTranslate, currentLine, true);\n                    addSegment(linesToTranslate, NEWLINE, false);\n                    continue;\n                } else {\n                    throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Error: Unexpected line encountered when parsing \\n' + '[' + lineIndex + ']:' + currentLine));\n                }\n            }\n            addSegment(linesToTranslate, NEWLINE, false);\n            // do we have any payload to localize? and have we hit the batch size limit?\n            if ((linesToTranslate.length !== 0) && (lineCtr % batch_translate_size === 0)) {\n                try {\n                    localizedContent += await batchTranslateText(linesToTranslate, subscriptionKey, to_lang, src_lang, log);\n                    linesToTranslate = [];\n                } catch (err) {\n                    throw (err)\n                }\n            }\n        }\n        if (linesToTranslate.length !== 0) {\n            try {\n                localizedContent += await batchTranslateText(linesToTranslate, subscriptionKey, to_lang, src_lang, log);\n                linesToTranslate = [];\n            } catch (err) {\n                throw (err)\n            }\n        }\n        return localizedContent;\n    },\n    \n    \n    \n    /**\n     * Helper function to call MT rest API to translate content\n     * @param {string} text Text to translate\n     * @param {string} subscriptionKey user provided subscription to text translation API\n     * @param {string} to_lang target language to localize to\n     * @param {string} from_lang source language of text\n     * @returns {object} response from MT call.\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    translateText: async function(text, subscriptionKey, to_lang, from_lang) {\n        let payload = Array.isArray(text) ? text : [{'Text' : text}];\n        let tUri = 'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=' + to_lang + '&includeAlignment=true';\n        if(from_lang) tUri += '&from=' + from_lang;\n        const options = {\n            method: 'POST',\n            body: JSON.stringify (payload),\n            headers: {\n                'Content-Type': 'application/json',\n                'Ocp-Apim-Subscription-Key' : subscriptionKey,\n                'X-ClientTraceId' : get_guid (),\n            }\n        };\n        const res = await fetch(tUri, options);\n        if (!res.ok) {\n            throw(new exception(retCode.errorCode.TRANSLATE_SERVICE_FAIL,'Text translator service call failed with [' + res.status + '] : ' + res.statusText + '.\\nPlease check key & language code validity'));\n        }\n        let data = await res.json();\n        return data;\n    }\n};\n/**\n * Helper function to break down input string if it is longer than MAX_CHAR_IN_REQUEST to translate API\n * @param {translateLine []} linesToTranslate Array of translateLine objects\n * @param {string} text text to translate\n * @param {boolean} localize indicates if the request should be localized or not.\n * @returns {void} \n */\nconst addSegment = function (linesToTranslate, text, localize) {\n    if (text.length >= MAX_CHAR_IN_REQUEST) {\n        // break it up into smaller segments and add it to the batchRequest payload\n        let splitRegExp = new RegExp(`(.{${MAX_CHAR_IN_REQUEST}})`);\n        let splitLine = text.split(splitRegExp).filter(O => O);\n        splitLine.forEach(item => {\n            linesToTranslate.push(new translateLine(item, localize));\n        })\n    } else {\n        linesToTranslate.push(new translateLine(text, localize));\n    }\n};\n/**\n * Helper function to batch calls to translate API\n * @param {translateLine []} linesToTranslate Array of translateLine objects\n * @param {string} subscriptionKey translate text API key\n * @param {string} to_lang language code to translate content to\n * @param {string} src_lang language code for source content\n * @param {boolean} log indicates if this function should write verbose messages to process.stdout\n * @returns {string} translated content\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst batchTranslateText = async function(linesToTranslate, subscriptionKey, to_lang, src_lang, log) {\n    // responsible for breaking localizable text into chunks that are \n    // - not more than 5000 characters in combined length \n    // - not more than 25 segments in one chunk\n    let retValue = '';\n    if (!Array.isArray(linesToTranslate) || linesToTranslate.length === 0) return retValue;\n    let charCountInChunk = 0;\n    let batchTranslate = [];\n    for (var idx in linesToTranslate) {\n        let item = linesToTranslate[idx];\n        if (item.text.length + charCountInChunk >= MAX_CHAR_IN_REQUEST) {\n            await translateAndMap(batchTranslate, subscriptionKey, to_lang, src_lang, linesToTranslate);\n            batchTranslate = [];\n            charCountInChunk = 0;\n        }\n        let currentBatchSize = batchTranslate.length > 0 ? batchTranslate.length : 1;\n        if (currentBatchSize % MAX_TRANSLATE_BATCH_SIZE === 0) {\n            await translateAndMap(batchTranslate, subscriptionKey, to_lang, src_lang, linesToTranslate);\n            batchTranslate = [];\n            charCountInChunk = 0;\n        }\n        if (item.localize) {\n            item.idx = batchTranslate.length; \n            batchTranslate.push({'Text': item.text});\n            charCountInChunk += item.text.length;\n        }\n    }\n    if (batchTranslate.length !== 0) {\n        await translateAndMap(batchTranslate, subscriptionKey, to_lang, src_lang, linesToTranslate);\n        batchTranslate = [];\n        charCountInChunk = 0;\n    }\n    linesToTranslate.forEach(item => retValue += item.text);\n    if(log) process.stdout.write(chalk.default.gray(retValue));\n    return retValue;\n};\n\n/**\n * Helper function to call translate and update text with localized result\n * @param {object []} batchRequest Array of {'Text':'value'} objects\n * @param {string} subscriptionKey translate text API key\n * @param {string} to_lang language code to translate content to\n * @param {string} src_lang language code for source content\n * @param {translateLine []} linesToTranslateCopy Array of translateLine objects\n * @returns {void} \n */\nconst translateAndMap = async function (batchRequest, subscriptionKey, to_lang, src_lang, linesToTranslateCopy) {\n    if (batchRequest.length === 0) return;\n    let data;\n    data = await translateHelpers.translateText(batchRequest, subscriptionKey, to_lang, src_lang);\n    data.forEach((item, idx) => {\n        // find the correponding item in linesToTranslate\n        let itemInLine = linesToTranslateCopy.find(item => item.idx === idx);\n        if (itemInLine) {\n            itemInLine.text = item.translations[0].text;\n            itemInLine.idx = -1;        \n        }\n    });\n};\n\n/**\n * Helper function to create a random guid\n  * @returns {string} GUID\n */\nconst get_guid = function () {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n        return v.toString(16);\n    });\n}\n\nclass translateLine{\n    constructor(text, localize, idx) {\n        this.text = text ? text: '';\n        this.localize = localize ? localize : false;\n        this.idx = idx ? idx : -1;\n    }\n}\n\nmodule.exports = translateHelpers;\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/visitor.js",
    "content": "const lp = require('./generated/LUFileParser').LUFileParser;\nconst LUISObjNameEnum = require('./../utils/enums/luisobjenum');\nconst InvalidCharsInIntentOrEntityName = require('./../utils/enums/invalidchars').InvalidCharsInIntentOrEntityName;\n\nclass Visitor {\n    /**\n     * @param {lp.NormalIntentStringContext} ctx\n     * @returns {object}\n     */\n    static visitNormalIntentStringContext(ctx) {\n        let utterance = '';\n        let entities = [];\n        let errorMsgs = [];\n        for (const node of ctx.children) {\n            const innerNode = node;\n            switch (innerNode.symbol.type) {\n                case lp.DASH: break;\n                case lp.EXPRESSION: {\n                    let tokUtt = this.tokenizeUtterance(innerNode.getText().trim());\n                    utterance = this.recurselyResolveTokenizedUtterance(tokUtt, entities, errorMsgs, utterance.trimLeft()); \n                    break;\n                }\n                default: {\n                    utterance = utterance.concat(innerNode.getText());\n                    break;\n                }\n            }\n        }\n\n        return { utterance: utterance.trim(), entities, errorMsgs };\n    }\n    /**\n     * \n     * @param {Object[]} tokUtt \n     * @param {Object[]} entities \n     * @param {Object[]} errorMsgs \n     * @param {String} srcUtterance \n     */\n    static recurselyResolveTokenizedUtterance(tokUtt, entities, errorMsgs, srcUtterance) {\n        for (const item of tokUtt) {\n            if (item === Object(item)) {\n                let entityName = item.entityName.trim()\n                if (entityName && InvalidCharsInIntentOrEntityName.some(x => entityName.includes(x))) {\n                    errorMsgs.push(`Invalid utterance line, entity name ${entityName} cannot contain any of the following characters: [<, >, *, %, &, :, \\\\, $]`);\n                    continue;\n                }\n\n                if (item.entityValue === undefined) {\n                    // we have a pattern.any entity\n                    const patternStr = item.role ? `{${item.entityName}:${item.role}}` : `{${item.entityName}}`\n                    srcUtterance += patternStr;\n                    entities.push({\n                        type: LUISObjNameEnum.PATTERNANYENTITY,\n                        entity: item.entityName.trim(),\n                        role: item.role.trim()\n                    })\n                } else {\n                    // we have a new entity\n                    let newEntity = {\n                        type: LUISObjNameEnum.ENTITIES,\n                        entity: item.entityName.trim(),\n                        role: item.role.trim(),\n                        startPos: srcUtterance.length,\n                        endPos: undefined\n                    };\n                    if (item.entityValue === undefined) {\n                        errorMsgs.push(`Composite entity \"${item.parent.entityName}\" includes pattern.any entity \"${item.entityName}\".\\r\\n\\tComposites cannot include pattern.any entity as a child.`)\n                    } else {\n                        srcUtterance = this.recurselyResolveTokenizedUtterance(item.entityValue, entities, errorMsgs, srcUtterance).trimLeft();\n                        newEntity.endPos = srcUtterance.length - 1;\n                        entities.push(newEntity);\n                    }\n                }\n            } else {\n                srcUtterance += item;\n            }\n        }\n        return srcUtterance;\n    }\n    /**\n     * @param {string} exp \n     * @returns {object}\n     */\n    static tokenizeUtterance(exp) {\n        let splitString = [];\n        let curList = splitString;\n        let curEntity = undefined;\n        let entityNameCapture = false;\n        let entityValueCapture = false;\n        let entityRoleCapture = false;\n        exp.split('').forEach(char => {\n            switch(char) \n            {\n                case '{':\n                    let newEntity = {entityName : '', role : '', entityValue : undefined, parent : curEntity};\n                    curList.push(newEntity);\n                    curEntity = newEntity;\n                    entityNameCapture = true;\n                    entityRoleCapture = false;\n                    entityValueCapture = false;\n                    break;\n                case '}':\n                    curEntity = curEntity.parent || undefined;\n                    curList = curEntity != undefined ? curEntity.entityValue : splitString;\n                    entityValueCapture = false;\n                    entityRoleCapture = false;\n                    entityNameCapture = false;\n                    break;\n                case '=':\n                    curEntity.entityValue = [];\n                    curList = curEntity.entityValue;\n                    entityNameCapture = false;\n                    entityValueCapture = true;\n                    entityRoleCapture = false;\n                    break;\n                case ':':\n                    if (curEntity !== undefined && curEntity.entityName !== '' && entityNameCapture === true) {\n                        entityRoleCapture = true;\n                        entityNameCapture = false;\n                        entityValueCapture = false;\n                    } else {\n                        curList.push(char);\n                    }\n                    break;\n                default :\n                    if (entityNameCapture) {\n                        curEntity.entityName += char;\n                    } else if (entityValueCapture) {\n                        if (char === ' ') {\n                            // we do not want leading spaces\n                            if (curList.length !== 0) {\n                                curList.push(char);\n                            }\n                        } else {\n                            curList.push(char);\n                        }\n                    } else if (entityRoleCapture) {\n                        curEntity.role += char;\n                    } else {\n                        curList.push(char);\n                    }\n                    break;\n            }\n        });\n        return splitString;\n    }\n}\n\nmodule.exports = Visitor;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luConverter.js",
    "content": "const NEWLINE = require('os').EOL;\nconst helperClasses = require('./../lufile/classes/hclasses')\nconst EntityTypeEnum = require('./../utils/enums/luisEntityTypes');\n\n/**\n * Parses a Luis object into Lu Content\n * @param {Luis} luisJSON\n * @returns {string} Lu Content\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst luisToLuContent = function(luisJSON){\n    let fileContent = '';\n    let luisObj = new helperClasses.rLuisObj();\n    (luisJSON.intents || []).forEach(function(intent) {\n        luisObj.intents.push(new helperClasses.intent(intent, []));\n    });\n    // add utterances to luisObj\n    updateUtterancesList(luisJSON.utterances, luisObj.intents, 'text');\n    // add patterns to luisObj\n    updateUtterancesList(luisJSON.patterns, luisObj.intents, 'pattern');\n\n    // Parse Intents\n    fileContent += parseIntentsToLu(luisObj, luisJSON)\n    fileContent += parseEntitiesToLu(luisJSON)\n    fileContent += parseToLuPrebuiltEntities(luisJSON)\n    fileContent += handlePhraseLists(luisJSON.model_features);\n    fileContent += handlePhraseLists(luisJSON.phraselists);\n    fileContent += parseToLuClosedLists(luisJSON)\n    fileContent += parseRegExEntitiesToLu(luisJSON.regex_entities)\n    // handle regexEntities in json returned from luis export api\n    // similar with regex_entities\n    fileContent += parseRegExEntitiesToLu(luisJSON.regexEntities)\n    fileContent += parseCompositesToLu(luisJSON)\n    fileContent += parsePatternAnyEntitiesToLu(luisJSON)\n    return fileContent\n}\n\nconst parseIntentsToLu = function(luisObj, luisJSON){\n    let fileContent = ''\n    fileContent += NEWLINE;\n    fileContent += addAppMetaData(luisJSON);\n    // Add test result if in test mode\n    if (luisJSON.test === true) {\n        fileContent += `> Total passed: ${luisJSON.passNumber}/${luisJSON.count}` + NEWLINE + NEWLINE\n    }\n    fileContent += '> # Intent definitions' + NEWLINE + NEWLINE;\n    \n    if(luisObj.intents.length <= 0) {\n        return fileContent\n    }\n    // write out intents and utterances..\n    luisObj.intents.forEach(function(intent) {\n        // Add inherits information if any\n        if (intent.intent.inherits !== undefined) {\n            // > !# @intent.inherits = {name = Web.WebSearch; domain_name = Web; model_name = WebSearch}\n            fileContent += '> !# @intent.inherits = name : ' + intent.intent.name;\n            if (intent.intent.inherits.domain_name !== undefined) {\n                fileContent += '; domain_name : ' + intent.intent.inherits.domain_name;\n            }\n            if (intent.intent.inherits.model_name !== undefined) {\n                fileContent += '; model_name : ' + intent.intent.inherits.model_name;\n            }\n            fileContent += NEWLINE + NEWLINE;\n        }\n        // Add test result if in test mode\n        if (luisJSON.test === true) {\n            fileContent += `> Utterance passed in this intent: ${intent.intent.passNumber}/${intent.intent.count}` + NEWLINE\n        }\n        fileContent += '## ' + intent.intent.name + NEWLINE;\n        fileContent += parseUtterancesToLu(intent.utterances, luisJSON)\n        fileContent += NEWLINE + NEWLINE;\n        if (intent.intent.features) {\n            let rolesAndFeatures = addRolesAndFeatures(intent.intent);\n            if (rolesAndFeatures !== '') {\n                fileContent += `@ intent ${intent.intent.name.includes(' ') ? `\"${intent.intent.name}\"` : `${intent.intent.name}`}`;\n                fileContent += rolesAndFeatures;\n                fileContent += NEWLINE + NEWLINE;\n            }\n        }\n    });\n    return fileContent\n}\n\nconst parseUtterancesToLu = function(utterances, luisJSON){\n    let fileContent = ''\n    utterances.forEach(function(utterance) {\n        let updatedText = utterance.text;\n        // Add test result if in test mode and utterance has test result\n        if(luisJSON.test === true && utterance.predictedResult !== undefined){\n            fileContent += parsePredictedResultToLu(utterance, luisJSON)\n        }\n        if(utterance.entities.length >= 0) {\n            // update utterance for each entity\n            let text = utterance.text;\n            // flatten entities\n            let flatEntities = [];\n            Object.assign([], utterance.entities).forEach(entity => flattenEntities(entity, flatEntities));\n            let sortedEntitiesList = objectSortByStartPos(flatEntities);\n            // remove all children\n            sortedEntitiesList.forEach(entity => delete entity.children);\n            let tokenizedText = text.split('');\n            // handle cases where we have both child as well as cases where more than one entity can have the same start position\n            // if there are multiple entities in the same start position, then order them by composite, nDepth, regular entity\n            getEntitiesByPositionList(sortedEntitiesList, tokenizedText);\n            updatedText = tokenizedText.join('');\n        }\n\n        // remove duplicated whitespaces between words inside utterance to make sure they are aligned with the luis portal\n        // as luis portal only keeps one whitespace between words even if you type multiple ones\n        // this will benefit the comparison of lu files that are converted from local and remote luis application\n        if(updatedText) fileContent += '- ' + updatedText.replace(/\\s+/g, ' ') + NEWLINE;\n    });\n    return fileContent\n}\n\nconst flattenEntities = function(entity, flatEntities)\n{\n    if (entity.children !== undefined && Array.isArray(entity.children) && entity.children.length !== 0) {\n        entity.children.forEach(child => flattenEntities(child, flatEntities));\n    }\n    flatEntities.push(Object.assign({}, entity));\n}\n\nconst getEntitiesByPositionList = function(entitiesList, tokenizedText) {\n    (entitiesList || []).forEach(entity => {\n        // does this entity have child labels?\n        (entity.children || []).forEach(child => {\n            getEntitiesByPositionList(child.children, tokenizedText);\n            updateTokenizedTextByEntity(tokenizedText, child);\n        })\n        updateTokenizedTextByEntity(tokenizedText, entity);\n    })\n};\n\nconst updateTokenizedTextByEntity = function(tokenizedText, entity) {\n    if (entity.role !== undefined) {\n        tokenizedText[parseInt(entity.startPos)] = `{@${entity.role}=${tokenizedText[parseInt(entity.startPos)]}`;    \n    } else {\n        tokenizedText[parseInt(entity.startPos)] = `{@${entity.entity}=${tokenizedText[parseInt(entity.startPos)]}`;    \n    }\n    tokenizedText[parseInt(entity.endPos)] = tokenizedText[parseInt(entity.endPos)] + '}';\n}\n\nconst parsePredictedResultToLu =  function(utterance, luisJSON){\n    let fileContent = ''\n    let updatedText = utterance.text;\n    let intents = []\n    // parse predicted result into the .lu content\n    if(utterance.predictedResult.predictedIntents!==undefined && utterance.predictedResult.predictedIntents.length > 0){\n        for(let intent of utterance.predictedResult.predictedIntents){\n            intents.push(`${intent.intent}(${intent.score})`);\n        }\n    }\n    let passText = utterance.predictedResult.IntentPass? \"> PASS.\" : \"> FAIL.\";\n    fileContent += passText + \" Predicted intent: \" + intents.join(', ')  + NEWLINE;\n\n    if(utterance.predictedResult.predictedEntities!==undefined) {\n        if (utterance.predictedResult.predictedEntities.length > 0){\n            // update utterance for each entity\n            let text = utterance.text;\n            let sortedEntitiesList = objectSortByStartPos(utterance.predictedResult.predictedEntities);\n            let tokenizedText = text.split('');\n            let nonCompositesInUtterance = sortedEntitiesList.filter(entity => luisJSON.composites.find(composite => composite.name == entity.entity) == undefined);\n            nonCompositesInUtterance.forEach(entity => {\n                if (entity.role !== undefined) {\n                    tokenizedText[parseInt(entity.startPos)] = `{@${entity.role}=${tokenizedText[parseInt(entity.startPos)]}`;    \n                } else {\n                    tokenizedText[parseInt(entity.startPos)] = `{@${entity.entity}=${tokenizedText[parseInt(entity.startPos)]}`;    \n                }\n                tokenizedText[parseInt(entity.endPos)] += `}`;\n            })\n            let compositeEntitiesInUtterance = sortedEntitiesList.filter(entity => luisJSON.composites.find(composite => composite.name == entity.entity) != undefined);\n            compositeEntitiesInUtterance.forEach(entity => {\n                if (entity.role !== undefined) {\n                    tokenizedText[parseInt(entity.startPos)] = `{@${entity.role}=${tokenizedText[parseInt(entity.startPos)]}`;\n                } else {\n                    tokenizedText[parseInt(entity.startPos)] = `{@${entity.entity}=${tokenizedText[parseInt(entity.startPos)]}`;\n                }\n                tokenizedText[parseInt(entity.endPos)] += `}`;\n            })\n            updatedText = tokenizedText.join(''); \n        }\n        let passText = utterance.predictedResult.EntityPass ? \"> PASS.\" : \"> FAIL.\";\n        if(updatedText) fileContent +=  passText + ' Predicted entities: ' + updatedText + NEWLINE;\n        updatedText = utterance.text;\n    }\n    return fileContent\n}\n\nconst parseEntitiesToLu =  function(luisJson){\n    let fileContent = ''\n    if(!luisJson.entities) {\n        return fileContent\n    }\n    \n    fileContent += '> # Entity definitions' + NEWLINE + NEWLINE;\n    luisJson.entities.forEach(function(entity) {\n        if (!entity.children || entity.children.length === 0) {\n            // Add inherits information if any\n            if (entity.inherits !== undefined) {\n                // > !# @intent.inherits = {name = Web.WebSearch; domain_name = Web; model_name = WebSearch}\n                fileContent += '> !# @entity.inherits = name : ' + entity.name;\n                if (entity.inherits.domain_name !== undefined) {\n                    fileContent += '; domain_name : ' + entity.inherits.domain_name;\n                }\n                if (entity.inherits.model_name !== undefined) {\n                    fileContent += '; model_name : ' + entity.inherits.model_name;\n                }\n                fileContent += NEWLINE + NEWLINE;\n            }\n            fileContent += `@ ${getEntityType(entity.features)} ${writeEntityName(entity.name)}`;\n            fileContent += addRolesAndFeatures(entity);\n            fileContent += NEWLINE + NEWLINE;\n        } else {\n            // handle n-depth entity\n            fileContent += handleNDepthEntity(entity);\n        }\n    });\n    fileContent += NEWLINE;\n    \n    return fileContent\n}\n\nconst writeEntityName = function(entityName) {\n    return entityName.includes(' ') ? `\"${entityName}\"` : `${entityName}`\n}\n\nconst parseToLuPrebuiltEntities = function(luisJson){\n    let fileContent = ''\n    if(!luisJson.prebuiltEntities){\n        return fileContent\n    }\n    fileContent += '> # PREBUILT Entity definitions' + NEWLINE + NEWLINE;\n    luisJson.prebuiltEntities.forEach(function(entity) {\n        fileContent += `@ prebuilt ${entity.name}`;\n        fileContent += addRolesAndFeatures(entity);\n        fileContent += NEWLINE + NEWLINE;\n    });\n    fileContent += NEWLINE;\n    return fileContent\n}\n\nconst parseToLuClosedLists = function(luisJson){\n    let fileContent = ''\n    if(!luisJson.closedLists){\n        return fileContent\n    }\n    fileContent += '> # List entities' + NEWLINE + NEWLINE;\n    luisJson.closedLists.forEach(function(ListItem) {\n        fileContent += `@ list `;\n        fileContent += ListItem.name.includes(' ') ? `\"${ListItem.name}\"` : `${ListItem.name}`;\n        fileContent += addRolesAndFeatures(ListItem);\n        if (ListItem.subLists.length !== 0) {\n            fileContent += ` = `;\n            fileContent += NEWLINE;\n        }\n        ListItem.subLists.forEach(function(list) {\n            fileContent += `\\t- ${list.canonicalForm} :`;\n            fileContent += NEWLINE;\n            list.list.forEach(function(listItem) {\n                fileContent += '\\t\\t- ' + listItem + NEWLINE;\n            });\n        });\n        fileContent += NEWLINE + NEWLINE;\n    });\n    return fileContent\n}\n\nconst parseRegExEntitiesToLu = function(regex_entities){\n    let fileContent = ''\n    if(!regex_entities) {\n        return fileContent\n    }\n    fileContent += '> # RegEx entities' + NEWLINE + NEWLINE; \n    regex_entities.forEach(function(regExEntity) {\n        fileContent += `@ regex `;\n        fileContent += regExEntity.name.includes(' ') ? `\"${regExEntity.name}\"` : regExEntity.name;\n        fileContent += addRolesAndFeatures(regExEntity);\n        if (regExEntity.regexPattern !== '') {\n            fileContent += ` = /${regExEntity.regexPattern}/`;\n        }\n        fileContent += NEWLINE;\n    });\n    fileContent += NEWLINE;\n    return fileContent\n}\n\nconst parseCompositesToLu = function(luisJson){\n    let fileContent = ''\n    // add composite entities if found in source LUIS JSON\n    if(!luisJson.composites || luisJson.composites.length <= 0) {\n        return fileContent\n    }\n    fileContent += '> # Composite entities' + NEWLINE + NEWLINE; \n    luisJson.composites.forEach(composite => {\n        fileContent += `@ composite `;\n        fileContent += composite.name.includes(' ') ? `\"${composite.name}\"` : composite.name;\n        fileContent += addRolesAndFeatures(composite);\n        if (composite.children.length > 0) {\n            fileContent += (typeof composite.children[0] == \"object\") ? ` = [${composite.children.map(item => item.name).join(', ')}]`: ` = [${composite.children.join(', ')}]`;\n        }\n        fileContent += NEWLINE;\n    })\n    return fileContent\n}\n\nconst parsePatternAnyEntitiesToLu = function(luisJson){\n    let fileContent = ''\n    if(!luisJson.patternAnyEntities || luisJson.patternAnyEntities.length <= 0) {\n        return fileContent;\n    }\n    fileContent += '> # Pattern.Any entities' + NEWLINE + NEWLINE;\n    luisJson.patternAnyEntities.forEach(patternAnyEntity => {\n        // Add inherits information if any\n        if (patternAnyEntity.inherits !== undefined) {\n            // > !# @intent.inherits = {name = Web.WebSearch; domain_name = Web; model_name = WebSearch}\n            fileContent += '> !# @patternAnyEntity.inherits = name : ' + patternAnyEntity.name;\n            if (patternAnyEntity.inherits.domain_name !== undefined) {\n                fileContent += '; domain_name : ' + patternAnyEntity.inherits.domain_name;\n            }\n            if (patternAnyEntity.inherits.model_name !== undefined) {\n                fileContent += '; model_name : ' + patternAnyEntity.inherits.model_name;\n            }\n            fileContent += NEWLINE + NEWLINE;\n        }\n        // For back compat we will only write this if the pattern.any has inherits information.\n        fileContent += `@ patternany `;\n        fileContent += patternAnyEntity.name.includes(' ') ? `\"${patternAnyEntity.name}\"` : patternAnyEntity.name;\n        fileContent += addRolesAndFeatures(patternAnyEntity);\n        fileContent += NEWLINE;\n    })\n    return fileContent;\n}\n\n/**\n * Helper to handle phrase lists both in the new and old property.\n * @param {Object[]} collection \n */\nconst handlePhraseLists = function(collection) {\n    let fileContent = ''\n    if(!collection) {\n        return fileContent\n    }\n    fileContent = '> # Phrase list definitions' + NEWLINE + NEWLINE;\n    collection.forEach(function(entity) {\n        let flags = '';\n        fileContent += `@ phraselist `;\n        fileContent += entity.name.includes(' ') ? `\"${entity.name}\"` : `${entity.name}`;\n        fileContent += `${(entity.mode ? `(interchangeable)` : ``)}`;\n        if (entity.activated !== undefined && !entity.activated) flags += `disabled`;\n        if (entity.enabledForAllModels !== undefined) {\n            if (entity.enabledForAllModels === true) {\n                flags += (flags !== '') ? `, enabledForAllModels` : `enabledForAllModels`;\n            } else {\n                flags += (flags !== '') ? `, disabledForAllModels` : `disabledForAllModels`;\n            }\n        } \n        if (flags !== '') fileContent += ` ${flags}`;\n        if (entity.words && entity.words !== '') {\n            fileContent += ` = ${NEWLINE}\\t- ${entity.words}`;\n        }\n        fileContent += NEWLINE + NEWLINE;\n    });\n    fileContent += NEWLINE;\n\n    return fileContent;\n}\n/**\n * Helper to add application inforamtion metadata\n * @param {Object} LUISJSON \n */\nconst addAppMetaData = function(LUISJSON) {\n    let fileContent = '';\n    if (LUISJSON.name) fileContent += `> !# @app.name = ${LUISJSON.name}` + NEWLINE;\n    if (LUISJSON.desc) fileContent += `> !# @app.desc = ${LUISJSON.desc}` + NEWLINE;\n    if (LUISJSON.versionId) fileContent += `> !# @app.versionId = ${LUISJSON.versionId}` + NEWLINE;\n    if (LUISJSON.culture) fileContent += `> !# @app.culture = ${LUISJSON.culture}` + NEWLINE;\n    if (LUISJSON.luis_schema_version) fileContent += `> !# @app.luis_schema_version = ${LUISJSON.luis_schema_version}` + NEWLINE;\n    if (LUISJSON.settings) {\n        LUISJSON.settings.forEach(setting => {\n            fileContent += `> !# @app.settings.${setting.name} = ${setting.value}` + NEWLINE;\n        })\n    }\n    if (LUISJSON.tokenizerVersion) fileContent += `> !# @app.tokenizerVersion = ${LUISJSON.tokenizerVersion}` + NEWLINE;\n    return fileContent === '' ? fileContent : `> LUIS application information` + NEWLINE + fileContent + NEWLINE + NEWLINE;\n}\n/**\n * Helper function to handle nDepth entity definition\n * @param {Object} entity \n */\nconst handleNDepthEntity = function(entity) {\n    let fileContent = '';\n    const BASE_TAB_STOP = 1;\n    fileContent += `@ ${getEntityType(entity.features)} ${writeEntityName(entity.name)}`;\n    fileContent += addRolesAndFeatures(entity);\n    fileContent += NEWLINE;\n    fileContent += addNDepthChildDefinitions(entity.children, BASE_TAB_STOP, fileContent) + NEWLINE + NEWLINE\n    return fileContent;\n}\n/**\n * Recursive helper function to add child definitions. \n * @param {Object[]} childCollection \n * @param {number} tabStop \n * @param {string} fileContent \n */\nconst addNDepthChildDefinitions = function(childCollection, tabStop, fileContent) {\n    let myFileContent = '';\n    (childCollection || []).forEach(child => {\n        myFileContent += \"\".padStart(tabStop * 4, ' ');\n        myFileContent += `- @ ${getEntityType(child.features)} ${writeEntityName(child.name)}`;\n        myFileContent += addRolesAndFeatures(child);\n        myFileContent += NEWLINE;\n        if (child.children && child.children.length !== 0) {\n            myFileContent += addNDepthChildDefinitions(child.children, tabStop + 1, myFileContent);\n        }\n    });\n    return myFileContent;\n}\nconst getEntityType = function(features) {\n    // find constraint\n    let constraint = (features || []).find(feature => feature.isRequired == true);\n    if (constraint !== undefined) {\n        return constraint.modelName;\n    } else {\n        return EntityTypeEnum.ML;\n    }\n}\n/**\n * Helper to construt role and features list for an entity\n * @param {Object} entity \n * @returns {String} file content to include.\n */\nconst addRolesAndFeatures = function(entity) {\n    let roleAndFeatureContent = ''\n    if (entity.roles && entity.roles.length > 0) {\n        roleAndFeatureContent += ` ${entity.roles.length > 1 ? `hasRoles` : `hasRole`} `;\n        entity.roles.forEach(item => {\n            roleAndFeatureContent += item.includes(' ') ? `\"${item}\",` : `${item},`;\n        })\n    }\n    roleAndFeatureContent = roleAndFeatureContent.substring(0, roleAndFeatureContent.length - 1);\n    if (!entity.features || entity.features.length <= 0) {\n        return roleAndFeatureContent\n    }\n\n    let featuresList = new Array();\n    entity.features.forEach(item => {\n        if (item.featureName) featuresList.push(item.featureName);\n        if (item.modelName) {\n            if (item.isRequired !== undefined) {\n                if (item.isRequired !== true) \n                    featuresList.push(item.modelName);\n            } else {\n                featuresList.push(item.modelName);\n            }\n        }\n    })\n    if (featuresList.length > 0) {\n        roleAndFeatureContent += ` ${featuresList.length > 1 ? `usesFeatures` : `usesFeature`} `;\n        featuresList.forEach(feature => {\n            roleAndFeatureContent += feature.includes(' ') ? `\"${feature}\",` : `${feature},`;\n        });\n        roleAndFeatureContent = roleAndFeatureContent.substring(0, roleAndFeatureContent.length - 1);\n    }\n    \n    //${featuresList.join(',')}`;\n    return roleAndFeatureContent\n}\n\n/**\n * helper function to add utterances to collection if it does not exist\n * @param {object[]} tgtCollection target collection of utterance objects\n * @param {object []} srcCollection source collection of utterance objects\n * @param {string} attribute attribute to check on and copy over\n * @returns {void}\n */\nconst updateUtterancesList = function (srcCollection, tgtCollection, attribute) {\n    (srcCollection || []).forEach(srcItem => {\n        let matchInTarget = tgtCollection.find(item => item.intent.name == srcItem.intent);\n        if(!matchInTarget || matchInTarget.utterances.length === 0) {\n            addUtteranceToCollection(attribute, srcItem, matchInTarget);\n            return;\n        }\n        if(!matchInTarget.utterances.find(item => item.text == srcItem[attribute])) {\n            addUtteranceToCollection(attribute, srcItem, matchInTarget);\n            return;\n        }\n    });\n}\n/**\n * helper function to add utterances to collection based on src type (pattern or utterance)\n * @param {string} attribute attribute to check on and copy over\n * @param {object} srcItem source object\n * @param {object []} matchInTarget target collection of objects\n * @returns {void}\n */\nconst addUtteranceToCollection = function (attribute, srcItem, matchInTarget) {\n    if(attribute === 'text') {\n        matchInTarget.utterances.push(srcItem); \n    } else {\n        matchInTarget.utterances.push(new helperClasses.uttereances(srcItem.pattern.replace('{', '{@'),srcItem.intent,[]));\n    }\n}\n\n/**\n * helper function sort entities list by starting position\n * @param {object} objectArray array of entity objects\n * @returns {object} sorted entities array by start position\n */\nconst objectSortByStartPos = function (objectArray) {\n    let ObjectByStartPos = objectArray.slice(0);\n    ObjectByStartPos.sort(function(a,b) {\n        if (a.startPos === b.startPos)\n            return a.endPos - b.endPos; \n        return a.startPos - b.startPos;\n    });\n    return ObjectByStartPos;\n}\n\nmodule.exports = luisToLuContent"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luis.js",
    "content": "const validator = require('./luisValidator')\nconst luConverter = require('./luConverter')\nconst helpers = require('./../utils/helpers')\nconst LU = require('./../lu/lu')\n\nclass Luis {\n    constructor(LuisJSON = null){\n        this.intents = [];\n        this.entities = [];\n        this.composites = [];\n        this.closedLists = [];\n        this.regex_entities = [];\n        this.model_features = [];\n        this.regex_features = [];\n        this.utterances = [];\n        this.patterns = [];\n        this.patternAnyEntities = [];\n        this.prebuiltEntities = [];\n        // fix for #255\n        this.luis_schema_version = \"3.2.0\";\n        this.versionId = \"0.1\";\n        this.name = \"\";\n        this.desc = \"\";\n        this.culture = \"en-us\";\n\n        if (LuisJSON) {\n            initialize(this, LuisJSON)\n        }\n    }\n\n    parseToLuContent(){\n        helpers.checkAndUpdateVersion(this)\n        helpers.cleanUpExplicitEntityProperty(this)\n        return luConverter(this)\n    }\n\n    parseToLU(){\n        return new LU(this.parseToLuContent())\n    }\n\n    validate() {\n        return validator(this)\n    }\n}\n\nmodule.exports = Luis\n\nconst initialize = function(instance, LuisJSON) {\n    for (let prop in instance) {\n        instance[prop] = LuisJSON[prop];\n    } \n\n    // add regexEntities property that returned from luis export api\n    const regexEntities = 'regexEntities';\n    if (Object.keys(LuisJSON).includes(regexEntities)) instance[regexEntities] = LuisJSON[regexEntities];\n\n    settingsAndTokenizerCheck(instance, LuisJSON) \n\n    initializeEntities(instance)\n}\n\nconst initializeEntities = function (instance) {\n    (instance.entities || []).forEach(e => e.explicitlyAdded = true)\n}\n\nconst settingsAndTokenizerCheck = function(instance, LuisJSON) {\n    const adds = ['tokenizerVersion', 'settings', 'phraselists']\n    for (let i = 0 ; i < adds.length; i++) {\n        if(!LuisJSON[adds[i]]) continue\n        instance[adds[i]]= LuisJSON[adds[i]];\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luisBuilder.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst Luis = require('./luis')\nconst parseFileContents = require('./../lufile/parseFileContents').parseFile\nconst build = require('./luisCollate').build\nconst LU = require('./../lu/lu')\nclass LuisBuilder {\n\n    /**\n     * Builds a Luis instance from a Luis json.\n     * @param {JSON} luisJson Luis json\n     * @returns {Luis} new Luis instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static fromJson(luisJson) {\n        return new Luis(luisJson)\n    }\n\n    /**\n     * Builds a Luis instance from a Lu Content.\n     * @param {string} luContent LU content\n     * @returns {Luis} new Luis instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromContentAsync(luContent) {\n        return await parseAndValidateLuFile(luContent)\n    }\n\n    /**\n     * Builds a Luis instance from a Lu list.\n     * @param {Array<LU>} luArray Array of LU files to be merge\n     * @param {function} luSearchFn function to retrieve the lu files found in the references\n     * @returns {Luis} new Luis instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromLUAsync(luArray, luSearchFn) {\n        if(!Array.isArray(luArray)){\n            if (luArray instanceof LU)\n                luArray = new Array(luArray)\n            else \n                luArray = new Array(new LU(luArray))\n        }\n        let parsedContent = await build(luArray, false, '', luSearchFn)\n        parsedContent.validate()\n        return parsedContent\n    }\n\n}\n\nmodule.exports = LuisBuilder\n\nconst parseAndValidateLuFile = async function(luContent, log = undefined, culture = undefined) {\n    let parsedContent = await parseFileContents(luContent, log, culture)\n    let LUISObj = new Luis(parsedContent.LUISJsonStructure)\n    LUISObj.validate()\n    return LUISObj\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luisCollate.js",
    "content": "\nconst deepEqual = require('deep-equal')\nconst LUISObjNameEnum = require('./../utils/enums/luisobjenum')\nconst Luis = require('./luis')\nconst helpers = require('./../utils/helpers')\nconst mergeLuFiles = require('./../lu/luMerger').Build\nconst exception = require('./../utils/exception')\nconst retCode = require('../utils/enums/CLI-errors')\n\n/**\n * Builds a Luis instance from a Lu list.\n * @param {Array<Lu>} luObjArray Array of LU files to be merge\n * @param {boolean} log indicates if we need verbose logging.\n * @param {string} luis_culture LUIS locale code\n * @param {function} luSearchFn function to retrieve the lu files found in the references\n * @returns {Luis} new Luis instance\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst build =  async function(luArray, verbose, luis_culture, luSearchFn) {\n    let mergedContent = await mergeLuFiles(luArray, verbose, luis_culture, luSearchFn)\n    let parsedLUISList = mergedContent.LUISContent.filter(item => item.includeInCollate)\n    if (parsedLUISList.length === 0) return new Luis()\n    let luisList = []\n    parsedLUISList.forEach(i => {\n        luisList.push(i.LUISJsonStructure)\n    });\n    return collate(luisList)\n}\n\n/**\n * Collates a list of Luis instances into one.\n * @param {Array<Luis>} luisList Array of Luis instances to be collate\n * @param {Luis} luisObject Luis instances to collate with\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst collate = function(luisList) {\n    if (luisList.length === 0) return\n    let luisObject = new Luis(luisList[0])\n    let hashTable = {};\n    initializeHash(luisObject, hashTable)\n    for(let i = 1; i < luisList.length; i++) {\n        let blob = luisList[i]\n        mergeResults(blob, luisObject, LUISObjNameEnum.INTENT);\n        mergeResults(blob, luisObject, LUISObjNameEnum.ENTITIES);\n        mergeNDepthEntities(blob.entities, luisObject.entities);\n        mergeResults_closedlists(blob, luisObject, LUISObjNameEnum.CLOSEDLISTS);\n        mergeResults(blob, luisObject, LUISObjNameEnum.PATTERNANYENTITY);\n        mergeResultsWithHash(blob, luisObject, LUISObjNameEnum.UTTERANCE, hashTable);\n        mergeResultsWithHash(blob, luisObject, LUISObjNameEnum.PATTERNS, hashTable);\n        buildRegex(blob, luisObject)\n        buildPrebuiltEntities(blob, luisObject)\n        buildModelFeatures(blob, luisObject)\n        buildComposites(blob, luisObject)\n        buildPatternAny(blob, luisObject)\n    }\n    helpers.checkAndUpdateVersion(luisObject)\n    helpers.cleanUpExplicitEntityProperty(luisObject)\n    cleanupEntities(luisObject)\n    return luisObject\n}\n\nmodule.exports = {\n    collate, \n    build\n}\n\nconst cleanupEntities = function(luisObject) {\n    let consolidatedList = [];\n    luisObject.composites.forEach(item => consolidatedList.push(item));\n    luisObject.closedLists.forEach(item => consolidatedList.push(item));\n    luisObject.regex_entities.forEach(item => consolidatedList.push(item));\n    luisObject.prebuiltEntities.forEach(item => consolidatedList.push(item));\n    let idxToRemove = [];\n    luisObject.entities.forEach((item, idx) => {\n        if (consolidatedList.find(e => e.name == item.name) !== undefined) idxToRemove.push(idx);\n    })\n    idxToRemove.sort((a, b) => a-b).forEach(idx => luisObject.entities.splice(idx, 1))\n}\n\nconst mergeResultsWithHash = function (blob, finalCollection, type, hashTable) {\n    if (blob[type] === undefined || blob[type].length === 0) { \n        return\n    }\n    blob[type].forEach(function (blobItem) {\n        // add if this item if it does not already exist by hash look up.\n        let hashCode = helpers.hashCode(JSON.stringify(blobItem));\n        if (!hashTable[hashCode]) {\n            finalCollection[type].push(blobItem);\n            hashTable[hashCode] = blobItem;\n        } else {\n            let item = hashTable[hashCode];\n\n            if (type !== LUISObjNameEnum.INTENT &&\n                type !== LUISObjNameEnum.PATTERNS &&\n                type !== LUISObjNameEnum.UTTERANCE &&\n                item.name === blobItem.name) {\n                    // merge roles\n                    (blobItem.roles || []).forEach(blobRole => {\n                        if (item.roles && \n                            !item.roles.includes(blobRole)) {\n                                item.roles.push(blobRole);\n                            }\n                    });\n            }            \n        }\n    });\n}\nconst mergeNDepthEntities = function (blob, finalCollection) {\n    let nDepthInBlob = (blob || []).filter(x => x.children !== undefined && Array.isArray(x.children) && x.children.length !== 0);\n    if (nDepthInBlob === undefined) return;\n    nDepthInBlob.forEach(item => {\n        let itemExistsInFinal = (finalCollection || []).find(x => x.name == item.name);\n        if (itemExistsInFinal === undefined) {\n            finalCollection.push(item);\n        } else {\n            // de-dupe and merge roles\n            (item.roles || []).forEach(r => {\n                if (itemExistsInFinal.roles === undefined) {\n                    itemExistsInFinal.roles = [r];\n                } else {\n                    if (!itemExistsInFinal.roles.includes(r)) {\n                        itemExistsInFinal.roles.push(r);\n                    }\n                }\n            })\n            // de-dupe and merge children\n            if (item.children !== undefined && Array.isArray(item.children) && item.children.length !== 0) {\n                recursivelyMergeChildrenAndFeatures(item.children, itemExistsInFinal.children)\n            }\n        }\n    })\n}\n\nconst recursivelyMergeChildrenAndFeatures = function(srcChildren, tgtChildren) {\n    if (tgtChildren === undefined || !Array.isArray(tgtChildren) || tgtChildren.length === 0) {\n        tgtChildren = srcChildren;\n        return;\n    }\n    (srcChildren || []).forEach(item => {\n        // find child in tgt\n        let itemExistsInFinal = (tgtChildren || []).find(x => x.name == item.name);\n        if (itemExistsInFinal === undefined) {\n            tgtChildren.push(item);\n        } else {\n            // merge features\n            if (item.features !== undefined && item.features.length !== 0) {\n                // merge and verify type\n                let typeForFinalItem = (itemExistsInFinal.features || []).find(t => t.isRequired == true);\n                let typeForItem = (item.features || []).find(t1 => t1.isRequired == true);\n                if (typeForFinalItem !== undefined) {\n                    if (typeForItem !== undefined) {\n                        if (typeForFinalItem.modelName !== typeForItem.modelName) {\n                            throw new exception(retCode.errorCode.INVALID_REGEX_ENTITY, `Child entity ${item.name} does not have consistent type definition. Please verify all definitions for this entity.`)\n                        }\n                    }\n                }\n                item.features.forEach(f => {\n                    let featureInFinal = (itemExistsInFinal.features || []).find(itFea => {\n                        return ((itFea.featureName !== undefined && itFea.featureName == f.featureName) || \n                                (itFea.modelName !== undefined && itFea.modelName == f.modelName))\n                    });\n                    if (featureInFinal === undefined) {\n                        itemExistsInFinal.features.push(f);\n                    } else {\n                        // throw if isRequired is not the same.\n                        if (featureInFinal.isRequired !== f.isRequired) {\n                            throw new exception(retCode.errorCode.INVALID_REGEX_ENTITY, `Feature ${f.featureName} does not have consistent definition for entity ${item.name}. Please verify all definitions for this feature for this entity.`)\n                        }\n                    }\n                })\n            }\n            // de-dupe and merge children\n            if (item.children !== undefined && Array.isArray(item.children) && item.children.length !== 0) {\n                recursivelyMergeChildrenAndFeatures(item.children, itemExistsInFinal.children)\n            }\n        }\n    })\n}\n/**\n * Helper function to merge item if it does not already exist\n *\n * @param {object} blob Contents of all parsed file blobs\n * @param {object} finalCollection Reference to the final collection of items\n * @param {LUISObjNameEnum} type Enum type of possible LUIS object types\n * @returns {void} Nothing\n */\nconst mergeResults = function (blob, finalCollection, type) {\n    if (blob[type] === undefined || blob[type].length === 0) { \n        return\n    }\n    blob[type].forEach(function (blobItem) {\n        if (finalCollection[type].length === 0) {\n            finalCollection[type].push(blobItem);\n            return;\n        }\n        // add if this item if it does not already exist in final collection\n        let itemExists = false;\n        for (let fIndex in finalCollection[type]) {\n            if (deepEqual(finalCollection[type][fIndex], blobItem)) {\n                itemExists = true;\n                break;\n            } \n\n            // if item name matches, merge roles if available for everything other than intent\n            if (type === LUISObjNameEnum.INTENT || \n                type === LUISObjNameEnum.PATTERNS || \n                type === LUISObjNameEnum.UTTERANCE ||\n                finalCollection[type][fIndex].name !== blobItem.name) {\n                    continue;\n            }\n    \n            itemExists = true;\n            (blobItem.roles || []).forEach(blobRole => {\n                if (finalCollection[type][fIndex].roles && \n                    !finalCollection[type][fIndex].roles.includes(blobRole)) {\n                        finalCollection[type][fIndex].roles.push(blobRole);\n                }\n            });\n       \n        }\n        if (!itemExists) {\n            finalCollection[type].push(blobItem);\n        }\n    });\n\n}\n\n/**\n * Helper function to merge closed list item if it does not already exist\n *\n * @param {object} blob Contents of all parsed file blobs\n * @param {object} finalCollection Reference to the final collection of items\n * @param {LUISObjNameEnum} type Enum type of possible LUIS object types\n * @returns {void} nothing\n */\nconst mergeResults_closedlists = function (blob, finalCollection, type) {\n    if (blob[type] === undefined || blob[type].length === 0) {\n        return\n    }\n\n    blob[type].forEach(function (blobItem) {\n        let listInFinal = helpers.filterMatch(finalCollection[type], 'name', blobItem.name);\n        if (listInFinal.length === 0) {\n            finalCollection[type].push(blobItem);\n        } else {\n            blobItem.subLists.forEach(function (blobSLItem) {\n                // see if there is a sublist match in listInFinal\n                let slInFinal = helpers.filterMatch(listInFinal[0].subLists, 'canonicalForm', blobSLItem.canonicalForm);\n                if (slInFinal.length === 0) {\n                    listInFinal[0].subLists.push(blobSLItem);\n                } else {\n                    // there is a canonical form match. See if the values all exist\n                    blobSLItem.list.forEach(function (listItem) {\n                        if (!slInFinal[0].list.includes(listItem)) slInFinal[0].list.push(listItem);\n                    })\n                }\n            });\n\n            // merge roles if they are different\n            (blobItem.roles || []).forEach(blobRole => {\n                if (!listInFinal[0].roles.includes(blobRole)) {\n                    listInFinal[0].roles.push(blobRole);\n                }\n            })\n        }\n    });\n}\n\nconst buildRegex = function(blob, FinalLUISJSON){\n    // do we have regex entities here?\n    if (blob.regex_entities === undefined || blob.regex_entities.length === 0) {\n        return\n    }\n    blob.regex_entities.forEach(function (regexEntity) {\n        // do we have the same entity in final?\n        let entityExistsInFinal = (FinalLUISJSON.regex_entities || []).find(item => item.name == regexEntity.name);\n        if (entityExistsInFinal === undefined) {\n            FinalLUISJSON.regex_entities.push(regexEntity);\n        } else {\n            // verify that the pattern is the same\n            if (entityExistsInFinal.regexPattern !== regexEntity.regexPattern) {\n                throw (new exception(retCode.errorCode.INVALID_REGEX_ENTITY, `[ERROR]: RegEx entity : ${regexEntity.name} has inconsistent pattern definitions. \\n 1. ${regexEntity.regexPattern} \\n 2. ${entityExistsInFinal.regexPattern}`));\n            }\n            // merge roles\n            if (entityExistsInFinal.roles.length > 0) {\n                (regexEntity.roles || []).forEach(function (role) {\n                    if (!entityExistsInFinal.roles.includes(role))\n                        entityExistsInFinal.roles.push(role);\n                })\n            }\n        }\n    })\n}\n\nconst buildPrebuiltEntities = function(blob, FinalLUISJSON){\n    // do we have prebuiltEntities here?\n    if (blob.prebuiltEntities === undefined || blob.prebuiltEntities.length === 0) {\n        return\n    }\n    blob.prebuiltEntities.forEach(function (prebuiltEntity) {\n        let prebuiltTypeExists = false;\n        for (let fIndex in FinalLUISJSON.prebuiltEntities) {\n            if (prebuiltEntity.name === FinalLUISJSON.prebuiltEntities[fIndex].name) {\n                // do we have all the roles? if not, merge the roles\n                prebuiltEntity.roles.forEach(function (role) {\n                    if (!FinalLUISJSON.prebuiltEntities[fIndex].roles.includes(role)) {\n                        FinalLUISJSON.prebuiltEntities[fIndex].roles.push(role);\n                    }\n                });\n                prebuiltTypeExists = true;\n                break;\n            }\n        }\n        if (!prebuiltTypeExists) {\n            FinalLUISJSON.prebuiltEntities.push(prebuiltEntity);\n        }\n    });\n}\n\nconst buildModelFeatures = function(blob, FinalLUISJSON){\n    // Find what scope to use in blob\n    let blobScope = blob.model_features || blob.phraselists || [];\n    if (blobScope.length === 0) return;\n\n    // Find the finalLuisJson scope to use\n    let finalScope = FinalLUISJSON.model_features || FinalLUISJSON.phraselists;\n\n    blobScope.forEach(function (modelFeature) {\n        let modelFeatureInMaster = helpers.filterMatch(finalScope, 'name', modelFeature.name);\n        if (modelFeatureInMaster.length === 0) {\n            finalScope.push(modelFeature);\n        } else {\n            if (modelFeatureInMaster[0].mode !== modelFeature.mode) {\n                // error.\n                throw (new exception(retCode.errorCode.INVALID_INPUT, '[ERROR]: Phrase list : \"' + modelFeature.name + '\" has conflicting definitions. One marked interchangeable and another not interchangeable'));\n            } else {\n                modelFeature.words.split(',').forEach(function (word) {\n                    if (!modelFeatureInMaster[0].words.includes(word)) modelFeatureInMaster[0].words += \",\" + word;\n                })\n            }\n        }\n    });\n}\n\nconst buildComposites = function(blob, FinalLUISJSON){\n    if (blob.composites === undefined) return;\n    // do we have composites? collate them correctly\n    (blob.composites || []).forEach(composite => {\n        let compositeInMaster = helpers.filterMatch(FinalLUISJSON.composites, 'name', composite.name);\n        if (compositeInMaster.length === 0) {\n            FinalLUISJSON.composites.push(composite);\n        } else {\n            if (JSON.stringify(composite.children.sort()) !== JSON.stringify(compositeInMaster[0].children.sort())) {\n                composite.children.forEach(child => {\n                    if (!compositeInMaster[0].children.includes(child)) compositeInMaster[0].children.push(child)\n                })\n            } else {\n                // merge roles\n                (composite.roles || []).forEach(blobRole => {\n                    if (!compositeInMaster[0].roles.includes(blobRole)) {\n                        compositeInMaster[0].roles.push(blobRole);\n                    }\n                })\n            }\n        }\n    });\n}\n\nconst buildPatternAny = function(blob, FinalLUISJSON){\n    if (blob.patternAnyEntities === undefined) return;\n    // do we have pattern.any entities here? \n    (blob.patternAnyEntities || []).forEach(patternAny => {\n        let paIdx = -1;\n        let patternAnyInMaster = FinalLUISJSON.patternAnyEntities.find((item, idx) => {\n            if (item.name === patternAny.name) {\n                paIdx = idx;\n                return true;\n            }\n            return false;\n        });\n        // verify that this patternAny entity does not exist as any other type\n        let simpleEntityInMaster = FinalLUISJSON.entities.find(item => item.name == patternAny.name);\n        let compositeInMaster = FinalLUISJSON.composites.find(item => item.name == patternAny.name);\n        let listEntityInMaster = FinalLUISJSON.closedLists.find(item => item.name == patternAny.name);\n        let regexEntityInMaster = FinalLUISJSON.regex_entities.find(item => item.name == patternAny.name);\n        let prebuiltInMaster = FinalLUISJSON.prebuiltEntities.find(item => item.name == patternAny.name);\n        if (!simpleEntityInMaster && \n            !compositeInMaster &&\n            !listEntityInMaster &&\n            !regexEntityInMaster &&\n            !prebuiltInMaster) {\n            if (patternAnyInMaster) {\n                (patternAny.roles || []).forEach(role => !patternAnyInMaster.roles.includes(role) ? patternAnyInMaster.roles.push(role) : undefined);\n            } else {\n                    FinalLUISJSON.patternAnyEntities.push(patternAny);\n            }\n        } else {\n            // remove the pattern.any from master if another entity type has this name.\n            if (patternAnyInMaster) {\n                if (paIdx !== -1) FinalLUISJSON.patternAnyEntities.splice(paIdx, 1);\n            }\n        }\n    })\n}\n\nconst initializeHash = function(LuisJSON, hashTable = undefined) {\n    for (let prop in LuisJSON) {\n        if (hashTable !== undefined && (prop === LUISObjNameEnum.UTTERANCE || prop === LUISObjNameEnum.PATTERNS)) {\n            (LuisJSON[prop] || []).forEach(item => hashTable[helpers.hashCode(JSON.stringify(item))] = item)\n        }\n    }   \n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luisGen.js",
    "content": "const Luis = require('./luis')\nconst propertyHelper = require('./propertyHelper')\n\nclass LuisGen extends Luis{\n    constructor(){\n        super()\n    }\n\n    getInstancesList() {\n        const prebuiltEntities = [];\n        const composites = [];\n        this.prebuiltEntities.forEach(entityList => {\n            prebuiltEntities.push(...entityList);\n        });\n        this.composites.forEach(composite => {\n            composites.push(composite.compositeName);\n            composites.push(...composite.attributes);\n        });\n        const entities = [\n            ...this.entities,\n            ...prebuiltEntities,\n            ...this.closedLists,\n            ...this.regex_entities,\n            ...this.patternAnyEntities,\n            ...composites\n        ].map(entity => propertyHelper.jsonPropertyName(entity)).sort();\n        let hi = [...new Set(entities)];\n        return hi;\n    }\n}\n\nmodule.exports = LuisGen\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luisGenBuilder.js",
    "content": "const LuisGen = require('./luisGen')\nconst propertyHelper = require('./propertyHelper')\nconst error = require('./../utils/exception')\nconst retCode = require('./../utils/enums/CLI-errors')\n\nclass LuisGenBuilder {\n    static build(luisApp) {\n        let buildWithVersion;\n        if (luisApp.luis_schema_version < \"5\") {\n            buildWithVersion = buildUpToVersion4;\n        } else if (luisApp.luis_schema_version >= \"6.0.0\") {\n            buildWithVersion = buildVersion6;\n        } else {\n            throw (new error(retCode.errorCode.INVALID_INPUT_FILE, \"Invalid LUIS JSON schema version.\"))\n        }\n\n        return buildWithVersion(luisApp);\n    }\n}\n\nmodule.exports = LuisGenBuilder\n\nconst buildUpToVersion4 = function(luisApp) {\n    let result = new LuisGen()\n    try {\n        result.intents = processIntents(luisApp.intents);\n        result.entities = extractEntities(luisApp.entities);\n        result.prebuiltEntities = extractEntities(luisApp.prebuiltEntities, true);\n        result.closedLists = extractEntities(luisApp.closedLists);\n        result.regex_entities = extractEntities(luisApp.regex_entities);\n        result.patternAnyEntities = extractEntities(luisApp.patternAnyEntities);\n        result.composites = extractComposites(luisApp.composites);\n    } catch (err) {\n        throw (new error(retCode.errorCode.INVALID_INPUT_FILE, \"Invalid LUIS JSON file content.\"))\n    }\n    return result\n}\n\nconst buildVersion6 = function(luisApp) {\n    let result = new LuisGen()\n    try {\n        result.intents = processIntents(luisApp.intents);\n        result.closedLists = extractEntities(luisApp.closedLists);\n        [result.entities, result.composites] = extractEntitiesV6(luisApp.entities, result.closedLists);\n        result.prebuiltEntities = extractEntities(luisApp.prebuiltEntities, true);\n        result.regex_entities = extractEntities(luisApp.regex_entities);\n        result.patternAnyEntities = extractEntities(luisApp.patternAnyEntities);\n    } catch (err) {\n        throw (new error(retCode.errorCode.INVALID_INPUT_FILE, \"Invalid LUIS JSON file content.\"))\n    }\n    return result\n}\n\nconst processIntents = function(intents) {\n    const result = [];\n    intents.forEach((intent) => {\n        result.push(propertyHelper.normalizeName(intent.name));\n    });\n    return result;\n}\n\nconst extractComposites = function(entities) {\n    const result = [];\n    entities.forEach(entity => {\n        const composite = { compositeName: propertyHelper.normalizeName(entity.name), attributes: [] };\n        entity.roles.sort();\n        entity.roles.forEach(role => {\n            composite.attributes.push(role);\n        });\n        entity.children.forEach(child => {\n            composite.attributes.push(child);\n        });\n        result.push(composite);\n    });\n    return result;\n}\n\nconst extractEntities = function(entities, builtIn = false) {\n    const result = [];\n    entities.forEach(entity => {\n        const aux = [];\n        aux.push(entity.name);\n        entity.roles.sort();\n        entity.roles.forEach(role => {\n            aux.push(role);\n        });\n        if (entity.children !== undefined) {\n            entity.children.forEach(child => {\n                aux.push(child);\n            });\n        }\n        if (builtIn) {\n            result.push(aux);\n        }\n        else {\n            result.push(...aux);\n        }\n    });\n    return result;\n}\n\nconst extractEntitiesV6 = function(entities, closedLists) {\n    // This method provides a simplified topological sort to\n    // solve potential instanceOf dependecies in the v6 entities\n\n    const simpleEntitiesResult = [];\n    const compositeEntitiesResult = [];\n    const simpleEntitiesWithType = {};\n\n    // Add 'closedList' entities as valid types for instanceOf\n    closedLists.forEach(listEntity => {\n        simpleEntitiesWithType[listEntity] = 'list'\n    });\n\n    const resolveEntityType = function(entityName) {\n        const entityStack = [];\n        let entityType = simpleEntitiesWithType[entityName];\n\n        while (simpleEntitiesWithType[entityType]){\n            entityStack.push(entityName);\n            entityName = entityType;\n            entityType = simpleEntitiesWithType[entityName];\n        }\n\n        while (entityName) {\n            simpleEntitiesWithType[entityName] = entityType;\n            entityName = entityStack.pop();\n        }\n    }\n\n    const firstPassStack = entities.slice();\n\n    while(firstPassStack.length) {\n        const entity = firstPassStack.pop();\n\n        if (Array.isArray(entity.children) && entity.children.length) {\n            firstPassStack.push(...entity.children);\n        } else if (!entity.children || (Array.isArray(entity.children) && entity.children.length == 0)) {\n            // is simple entity\n            if (entity.instanceOf) {\n                // If the entity order in the schema was not modified by hand,\n                // this algorithm will solve instanceOf dependencies.\n                const last_type = simpleEntitiesWithType[entity.instanceOf] || entity.instanceOf;\n                simpleEntitiesWithType[entity.name] = last_type;\n            }\n        } else {\n            throw CLIError(\"Malformed JSON: entity.children should be an array\");\n        }\n    }\n\n    // This is a second pass for simple entities.\n    // If the JSON was modified by hand and there's a dependency\n    // in the instanceOf field to an entity that appears later,\n    // the type won't be resolved correctly with one pass.\n    for (const entityName in simpleEntitiesWithType) {\n        resolveEntityType(entityName);\n    }\n\n    const processSimpleEntity = function(entity, listToAppend) {\n        listToAppend.push(\n            entity.instanceOf ? {name: entity.name, instanceOf: simpleEntitiesWithType[entity.instanceOf] || entity.instanceOf} : entity.name\n        )\n    }\n\n    const baseParseEntity = function(entityList, childList, topLevel=false) {\n        entityList.forEach(entity => {\n            if (Array.isArray(entity.children) && entity.children.length) {\n                const compositeEntity = { compositeName: propertyHelper.normalizeName(entity.name), attributes: [] };\n                baseParseEntity(entity.children, compositeEntity.attributes);\n                compositeEntitiesResult.push(compositeEntity);\n                if (!topLevel) {\n                    childList.push({name: entity.name, compositeInstanceOf: true})\n                }\n            } else {\n                processSimpleEntity(\n                    entity, \n                    topLevel ? simpleEntitiesResult : childList\n                )\n            }\n        });\n    }\n\n    baseParseEntity(entities, null, true);\n    return [simpleEntitiesResult, compositeEntitiesResult];\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/luisValidator.js",
    "content": "const retCode = require('./../utils/enums/CLI-errors')\nconst helpers = require('./../utils/helpers')\nconst exception = require('./../utils/exception')\nconst BuildDiagnostic = require('./../lufile/diagnostic').BuildDiagnostic;\nconst validateLUIS = function(luisJSON) {\n    // look for entity name collisions - list, simple, patternAny, phraselist\n    // look for list entities labelled\n    // look for prebuilt entity labels in utterances\n\n    let entitiesList = [];\n    let entityFound = '';\n    // add entities to entities list\n    addEntities(luisJSON, entitiesList)\n    // add closed lists to entities list\n    addClosedLists(luisJSON, entitiesList, entityFound)\n    // add pattern any entities to entities list\n    addPatternAnyEntities(luisJSON, entitiesList, entityFound)\n    //add regex entities to entities list.\n    addregexEntities(luisJSON, entitiesList, entityFound)\n    // add any composite entities to entities list.\n    addCompositeEntities(luisJSON, entitiesList, entityFound)\n    // add any pre-built entities to the entities list.\n    addPrebuiltEntities(luisJSON, entitiesList, entityFound)\n    // for each entityFound, see if there are duplicate definitions\n    validateEntities(entitiesList)\n    // do we have utterances with phraselist entities? \n    validateUtterances(luisJSON, entitiesList)\n    // validate composite entities\n    validateComposites(luisJSON, entitiesList)\n    // do boundary validation\n    validateBoundaries(luisJSON);\n    // validate feature assignments\n    validateFeatureAssignments(luisJSON);\n    return true;\n}\nconst validateBoundaries = function(luisJSON) {\n    // boundaries documented here - https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-boundaries\n\n    // intents: 500 per application: 499 custom intents, and the required None intent.\n    if (luisJSON.intents.length > retCode.boundaryLimits.MAX_NUM_INTENTS) {\n        validationError(retCode.errorCode.BOUNDARY_INTENTS, `${luisJSON.intents.length} intents found in application. At most ${retCode.boundaryLimits.MAX_NUM_INTENTS} is allowed.`)\n    }\n\n    // utterances: 15,000 per application - there is no limit on the number of utterances per intent\n    if (luisJSON.utterances.length > retCode.boundaryLimits.MAX_NUM_UTTERANCES) {\n        validationError(retCode.errorCode.BOUNDARY_UTTERANCES, `${luisJSON.utterances.length} utterances found in application. At most ${retCode.boundaryLimits.MAX_NUM_UTTERANCES} is allowed.`)\n    }\n\n    // pattern.any entities - 100 per application\n    if (luisJSON.patternAnyEntities.length > retCode.boundaryLimits.MAX_NUM_PATTERNANY_ENTITIES) {\n        validationError(retCode.errorCode.BOUNDARY_PATTERNANYENTITY, `${luisJSON.patternAnyEntities.length} pattern.any entities found in application. At most ${retCode.boundaryLimits.MAX_NUM_PATTERNANY_ENTITIES} is allowed.`)\n    }\n\n    // Utterances - 500 characters.\n    luisJSON.utterances.forEach(utt => {\n        if (utt.text.length > retCode.boundaryLimits.MAX_CHAR_IN_UTTERANCE) {\n            validationError(retCode.errorCode.BOUNDARY_UTTERANCE_CHAR_LENGTH, `utterance '${utt.text}' under intent '${utt.intent}' has ${utt.text.length} characters. At most ${retCode.boundaryLimits.MAX_CHAR_IN_UTTERANCE} is allowed.`)\n        }\n    })\n\n    // patterns - 500 patterns per application.\n    if (luisJSON.patterns.length > retCode.boundaryLimits.MAX_NUM_PATTERNS) {\n        validationError(retCode.errorCode.BOUNDARY_PATTERNS, `${luisJSON.patterns.length} patterns found in application. At most ${retCode.boundaryLimits.MAX_NUM_PATTERNS} is allowed.`)\n    }\n\n    // patterns - Maximum length of pattern is 400 characters.\n    luisJSON.patterns.forEach(utt => {\n        if (utt.pattern.length > retCode.boundaryLimits.MAX_CHAR_IN_PATTERNS) {\n            validationError(retCode.errorCode.BOUNDARY_PATTERN_CHAR_LIMIT, `Pattern '${utt.pattern}' under intent '${utt.intent}' has ${utt.pattern.length} characters. At most ${retCode.boundaryLimits.MAX_CHAR_IN_PATTERNS} characters are allowed in any pattern.`)\n        }\n    })\n\n    // regex entity - 20 entities.\n    if (luisJSON.regex_entities.length > retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES) {\n        validationError(retCode.errorCode.BOUNDARY_REGEX_ENTITY, `${luisJSON.regex_entities.length} regex entities found in application. At most ${retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES} is allowed.`)\n    }\n\n    // regex entity - 500 character max. per regular expression entity pattern\n    luisJSON.regex_entities.forEach(utt => {\n        if (utt.regexPattern.length > retCode.boundaryLimits.MAX_CHAR_REGEX_ENTITY_PATTERN) {\n            validationError(retCode.errorCode.BOUNDARY_REGEX_CHAR_LIMIT, `Regex entity '${utt.name}' with pattern /${utt.regexPattern}/ has ${utt.regexPattern.length} characters. At most ${retCode.boundaryLimits.MAX_CHAR_REGEX_ENTITY_PATTERN} is allowed.`)\n        }\n    })\n\n    // list entities: max 20000 synonyms.\n    luisJSON.closedLists.forEach(listEntity => {\n        listEntity.subLists.forEach(subList => {\n            if (subList.list.length > retCode.boundaryLimits.MAX_LIST_ENTITY_SYNONYMS) {\n                validationError(retCode.errorCode.BOUNDARY_SYNONYMS_LENGTH, `'${listEntity.name}' list entity for parent (normalized value) '${subList.canonicalForm}' has ${subList.list.length} synonyms. At most ${retCode.boundaryLimits.MAX_LIST_ENTITY_SYNONYMS} is allowed.`)\n            }\n        })\n    })\n\n    let phraseLists = luisJSON.model_features || luisJSON.phraseLists || [];\n    // phrase list - 500 phrase lists. \n    if (phraseLists.length > retCode.boundaryLimits.MAX_NUM_PHRASE_LISTS) {\n        validationError(retCode.errorCode.BOUNDARY_PHRASE_LIST_LIMIT, `${phraseLists.length} phrase lists found in application. At most ${retCode.boundaryLimits.MAX_NUM_PHRASE_LISTS} is allowed.`)\n    }\n\n    // phrase list - Maximum number of total phrases per application of 500,000 phrases.\n    let totalPhrasesInApp = 0;\n    phraseLists.forEach(item => totalPhrasesInApp += item.words.split(',').length);\n    if (totalPhrasesInApp > retCode.boundaryLimits.MAX_NUM_PHRASES_IN_ALL_PHRASE_LIST) {\n        validationError(retCode.errorCode.BOUNDARY_TOTAL_PHRASES, `${totalPhrasesInApp} phrases found across all phrase list definitions. At most ${retCode.boundaryLimits.MAX_NUM_PHRASES_IN_ALL_PHRASE_LIST} is allowed.`)\n    }\n\n    // phrase list - Interchangeable Phraselist has max of 50,000 phrases. \n    totalPhrasesInApp = 0;\n    phraseLists.filter(item => item.mode).forEach(item => {\n        if (item.words.split(',').length > retCode.boundaryLimits.MAX_INTERCHANGEABLE_PHRASES) {\n            validationError(retCode.errorCode.BOUNDARY_INTC_PHRASES_LIMIT, `${totalPhrasesInApp} phrases found across all interchangeable phrase list definitions. At most ${retCode.boundaryLimits.MAX_INTERCHANGEABLE_PHRASES} is allowed.`)\n        }\n    })\n\n    // phrase list - Non-interchangeable phraselist has max of 5,000 phrases. \n    totalPhrasesInApp = 0;\n    phraseLists.filter(item => !item.mode).forEach(item => {\n        if (item.words.split(',').length > retCode.boundaryLimits.MAX_NON_INTERCHANGEABLE_PHRASES) {\n            validationError(retCode.errorCode.BOUNDARY_NINTC_PHRASES_LIMIT, `${totalPhrasesInApp} phrases found across all non-interchangeable phrase list definitions. At most ${retCode.boundaryLimits.MAX_NON_INTERCHANGEABLE_PHRASES} is allowed.`)\n        }\n    })\n\n    // Roles - 10 roles per entity\n    let totalRoles = 0;\n    [\"prebuiltEntities\", \"patternAnyEntities\", \"regex_entities\", \"closedLists\", \"composites\", \"entities\"].forEach(scope => {\n        luisJSON[scope].forEach(item => {\n            if (item.roles.length > retCode.boundaryLimits.MAX_ROLES_PER_ENTITY) {\n                validationError(retCode.errorCode.BOUNDARY_ROLES_PER_ENTITY, `${scope.substring(0, scope.length - 1)} ${item.name} has ${item.roles.length} roles. At most ${retCode.boundaryLimits.MAX_ROLES_PER_ENTITY} is allowed.`)\n            } \n            totalRoles += item.roles.length; \n        })\n    })\n\n    // Roles - 300 roles per application \n    if (totalRoles > retCode.boundaryLimits.MAX_NUM_ROLES) {\n        validationError(retCode.errorCode.BOUNDARY_TOTAL_ROLES, `${totalRoles} role definitions found across all entity types. At most ${retCode.boundaryLimits.MAX_NUM_ROLES} is allowed.`)\n    }\n\n    // features - Maximum number of models that can be used as a descriptor (feature) to a specific model to be 10 models.\n    [\"intents\", \"entities\"].forEach(scope => {\n        luisJSON[scope].forEach(item => {\n            if (item.features && item.features.length > retCode.boundaryLimits.MAX_NUM_DESCRIPTORS_PER_MODEL) {\n                validationError(retCode.errorCode.BOUNDARY_FEATURE_PER_MODEL, `${scope.substring(0, scope.length - 1)} ${item.name} has ${item.features.length} descriptors (feature). At most ${retCode.boundaryLimits.MAX_NUM_DESCRIPTORS_PER_MODEL} is allowed.`)\n            }\n        })\n    })\n\n    // ml entities + roles - A limit of either 100 parent entities or 330 entities, whichever limit the user hits first. A role counts as an entity for the purpose of this boundary. An example is a composite with a simple entity, which has 2 roles is: 1 composite + 1 simple + 2 roles = 4 of the 330 entities.\n    let numberOfParentEntities = 0;\n    luisJSON.entities.forEach(item => {\n        if (item.children && item.children.length > 0) numberOfParentEntities += 1;\n    })\n\n    let totalNumberOfEntitiesAndRoles = 0;\n    [\"prebuiltEntities\", \"patternAnyEntities\", \"regex_entities\", \"closedLists\", \"composites\", \"entities\"].forEach(item => {\n        totalNumberOfEntitiesAndRoles += luisJSON[item].length;\n    })\n    totalNumberOfEntitiesAndRoles += totalRoles;\n\n    if (numberOfParentEntities > retCode.boundaryLimits.MAX_NUM_PARENT_ENTITIES) {\n        validationError(retCode.errorCode.BOUNDARY_PARENT_ENTITY_LIMIT, `${numberOfParentEntities} parent ml entities found in application. At most ${retCode.boundaryLimits.MAX_NUM_PARENT_ENTITIES} is allowed.`)\n    }\n    \n    if (totalNumberOfEntitiesAndRoles > retCode.boundaryLimits.MAX_TOTAL_ENTITES_AND_ROLES) {\n        validationError(retCode.errorCode.BOUNDARY_TOTAL_ENTITIES_AND_ROLES, `${totalNumberOfEntitiesAndRoles} combined roles and entity definitions found. At most ${retCode.boundaryLimits.MAX_TOTAL_ENTITES_AND_ROLES} is allowed.`)\n    }\n\n    // up to 50 list entities\n    if (luisJSON.closedLists.length > retCode.boundaryLimits.MAX_NUM_CLOSED_LISTS) {\n        validationError(retCode.errorCode.BOUNDARY_TOTAL_CLOSED_LISTS, `${luisJSON.closedLists.length} list entity definitions found. At most ${retCode.boundaryLimits.MAX_NUM_CLOSED_LISTS} is allowed.`)\n    }\n}\nconst validationError = function (code, errorMsg) {\n    let error = BuildDiagnostic({ message: errorMsg });\n    throw (new exception(code, error.toString(), [error]));\n}\nconst addEntities = function(luisJSON, entitiesList){\n    luisJSON.entities.forEach(function (entity) {\n        entitiesList.push(new validateLUISBlobEntity(entity.name, ['simple'], entity.roles));\n    });\n}\nconst addClosedLists = function(luisJSON, entitiesList, entityFound){\n    luisJSON.closedLists.forEach(function (entity) {\n        entityFound = helpers.filterMatch(entitiesList, 'name', entity.name);\n        if (entityFound.length === 0) {\n            entitiesList.push(new validateLUISBlobEntity(entity.name, ['list'], entity.roles));\n        } else {\n            entityFound[0].type.push('list');\n        }\n    });\n}\nconst addPatternAnyEntities = function(luisJSON, entitiesList, entityFound){\n    luisJSON.patternAnyEntities.forEach(function (entity) {\n        entityFound = helpers.filterMatch(entitiesList, 'name', entity.name);\n        if (entityFound.length === 0) {\n            entitiesList.push(new validateLUISBlobEntity(entity.name, ['patternAny'], entity.roles));\n        } else {\n            entityFound[0].type.push('patternAny');\n        }\n    });\n}\n\nconst addregexEntities = function(luisJSON, entitiesList, entityFound){\n    luisJSON.regex_entities.forEach(function (entity) {\n        entityFound = helpers.filterMatch(entitiesList, 'name', entity.name);\n        if (entityFound.length === 0) {\n            entitiesList.push(new validateLUISBlobEntity(entity.name, [`regEx:/${entity.regexPattern}/`], entity.roles));\n        } else {\n            if (entityFound[0].regexPattern !== undefined) {\n                if (entityFound[0].regexPattern !== entity.regexPattern)\n                    entityFound[0].type.push(`regEx:/${entity.regexPattern}/`);\n            } else {\n                entityFound[0].type.push(`regEx:/${entity.regexPattern}/`);\n            }\n        }\n    });\n}\n\nconst addCompositeEntities = function(luisJSON, entitiesList, entityFound){\n    (luisJSON.composites || []).forEach(entity => {\n        entityFound = helpers.filterMatch(entitiesList, 'name', entity.name);\n        if (entityFound.length === 0) {\n            entitiesList.push(new validateLUISBlobEntity(entity.name, ['composite'], entity.roles));\n        } else {\n            entityFound[0].type.push('composite');\n        }\n    })\n}\nconst addPrebuiltEntities = function(luisJSON, entitiesList, entityFound){\n    (luisJSON.prebuiltEntities || []).forEach(entity => {\n        entityFound = helpers.filterMatch(entitiesList, 'name', entity.name);\n        if (entityFound.length === 0) {\n            entitiesList.push(new validateLUISBlobEntity(entity.name, ['prebuilt'], entity.roles));\n        } else {\n            entityFound[0].type.push('prebuilt');\n        }\n    })\n}\nconst validateEntities = function(entitiesList){\n    entitiesList.forEach(function (entity) {\n        if (entity.type.length > 1) {\n            let errorMsg = `Entity ${entity.name} has duplicate definitions.\\r\\n\\t` + JSON.stringify(entity.type, 2, null);\n            let error = BuildDiagnostic({ message: errorMsg });\n\n            throw (new exception(retCode.errorCode.DUPLICATE_ENTITIES, error.toString(), [error]));\n        }\n    });\n}\n\nconst validateUtterances = function(luisJSON, entitiesList){\n    if (luisJSON.utterances.length <= 0) {\n        return\n    }\n    for (let entity in luisJSON.utterances.entities) {\n        let entityInList = helpers.filterMatch(entitiesList, 'name', entity.entity);\n        if (entityInList.length > 0) {\n            continue\n        }\n        if (entityInList[0].type.includes('phraseList')) {\n            let errorMsg = `Utterance \"${utterance.text}\" has reference to PhraseList. \\r\\n\\tYou cannot have utterances with phraselist references in them`;\n            let error = BuildDiagnostic({ message: errorMsg });\n\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n    }\n}\n\nconst validateComposites = function(luisJSON, entitiesList){\n    if (luisJSON.composites.length <= 0) {\n        return\n    }\n\n    luisJSON.composites.forEach(composite => {\n        // composites cannot include pattern.any entities as children\n        let patternAnyEntityInComposite = (luisJSON.patternAnyEntities || []).find(patternAnyEntity => {\n            return composite.children.includes(patternAnyEntity.name);\n        });\n        if (patternAnyEntityInComposite !== undefined) {\n            let errorMsg = `Composite entity \"${composite.name}\" includes pattern.any entity \"${patternAnyEntityInComposite.name}\".\\r\\n\\tComposites cannot include pattern.any entity as a child.`;\n            let error = BuildDiagnostic({ message: errorMsg });\n\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n        // composite entity definitions must have valid child entity type definitions. \n        validateCompositeChildren(composite, entitiesList)\n    })\n}\n\nconst validateCompositeChildren = function(composite, entitiesList){\n    composite.children.forEach(child => {\n        if (child instanceof Object) child = child.name;\n        // Fix for #1165\n        // Current implementation does not account for explicit role included in a child\n        let childEntityName = child;\n        let childEntityRole = '';\n        if (child.includes(':')) {\n            let childSplit = child.split(':').map(item => item.trim());\n            childEntityName = childSplit[0];\n            childEntityRole = childSplit[1];\n        }\n        let compositeChildEntityFound = (entitiesList || []).find(entity => entity.name == childEntityName);\n        if (compositeChildEntityFound === undefined) {\n            let errorMsg = `Composite entity \"${composite.name}\" includes an undefined child entity \"${childEntityName}\".\\r\\n\\tAll children of composite entities must be explicitly defined or implicitly defined via an utterance or a pattern`;\n            let error = BuildDiagnostic({ message: errorMsg });\n\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n        if (childEntityRole != '' && \n            !compositeChildEntityFound.roles.includes(childEntityRole)) {\n            let errorMsg = `Composite entity \"${composite.name}\" includes an undefined child entity role \"${childEntityName}:${childEntityRole}\".\\r\\n\\tAll children of composite entities must be explicitly defined or implicitly defined via an utterance or a pattern`;\n            let error = BuildDiagnostic({ message: errorMsg });\n\n            throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n        }\n    })\n}\n\nconst validateFeatureAssignments = function(luisJSON)\n{\n    const verifyList = [];\n    const featureCandidates = [];\n    const verifiedList = [];\n    addFeatureCandidates(luisJSON.prebuiltEntities, featureCandidates);\n    addFeatureCandidates(luisJSON.closedLists, featureCandidates);\n    addFeatureCandidates(luisJSON.regex_entities, featureCandidates);\n    addFeatureCandidates(luisJSON.phraselists, featureCandidates);\n    verifyAndExtractFeatures(luisJSON.intents, verifyList, featureCandidates, verifiedList);\n    verifyAndExtractFeatures(luisJSON.entities, verifyList, featureCandidates, verifiedList);\n    verifyAndExtractFeatures(luisJSON.composites, verifyList, featureCandidates, verifiedList);\n    if (verifyList.length !== 0) {\n        verifyList.forEach(item => {\n            if (!featureCandidates.includes(item)) {\n                let errorMsg = `Feature \"${item}\" does not have a definition. All features must be defined.`;\n                let error = BuildDiagnostic({ message: errorMsg });\n\n                throw (new exception(retCode.errorCode.INVALID_INPUT, error.toString(), [error]));\n            }\n        })\n    }\n}\n\nconst addFeatureCandidates = function(collection, featureCandidates)\n{\n    (collection || []).forEach(item => {\n        if (!featureCandidates.includes(item.name)) {\n            featureCandidates.push(item.name);\n        }\n    })\n}\n\nconst verifyAndExtractFeatures = function(collection = [], verifyList = [], featureCandidates = [], verifiedList = []) {\n    (collection || []).forEach(item => {\n        if (!featureCandidates.includes(item.name)) {\n            featureCandidates.push(item.name);\n        }\n        (item.features || []).forEach(feature => {\n            let featureName = feature.modelName || feature.featureName || undefined;\n            if (featureName !== undefined) {\n                if (!verifiedList.includes(featureName)) {\n                    if (!featureCandidates.includes(featureName)) {\n                        if (!verifyList.includes(featureName)) {\n                            verifyList.push(featureName);\n                        }\n                    }\n                }\n            }\n        })\n        if (item.children && Array.isArray(item.children) && item.children.length !== 0) verifyAndExtractFeatures(item.children, verifyList, featureCandidates, verifiedList);\n    })\n}\n\nclass validateLUISBlobEntity{\n    constructor(name, type, roles) {\n        this.name = name?name:'';\n        this.type = type?type:[];\n        this.roles = roles?roles:[];\n    }\n}\n\nmodule.exports = validateLUIS"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/luis/propertyHelper.js",
    "content": "\nmodule.exports = {\n    jsonPropertyName: function(property) {\n        if (typeof property === 'object') {\n            property = property.name\n        }\n        property+= ''\n        let name = property.split(':').slice(-1)[0];\n        if (!name.startsWith('geographyV2') &&\n            !name.startsWith('ordinalV2') &&\n            name.endsWith('V2')) {\n            name = name.substring(0, name.length - 2);\n        }\n        return this.normalizeName(name);\n    },\n    normalizeName: function(name) {\n        return name.replace(/\\./g, '_').replace(/ /g, '_');\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/alterations/alterations.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst qnaAlterationsToLuContent = require('./qnaConverter')\n\nclass Alterations {\n    constructor(alterations = null) {\n        if (alterations) {\n            for (let prop in alterations) {\n                this[prop] = alterations[prop];\n            }\n        } else {\n            this.wordAlterations = [];\n        }\n    }\n\n    parseToLuContent() {\n        return qnaAlterationsToLuContent(this)\n    }\n}\n\nmodule.exports = Alterations\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/alterations/qnaConverter.js",
    "content": "const NEWLINE = require('os').EOL;\n\n/**\n * Parses an Alterations object into Qna Content\n * @param {Alterations} alterationsJSON\n * @returns {string} Qna Content\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst qnaAlterationsToLuContent = function(alterationsJSON){\n    let fileContent = '> # QnA Alterations' + NEWLINE + NEWLINE;\n    if(alterationsJSON.wordAlterations && alterationsJSON.wordAlterations.length > 0) {\n        alterationsJSON.wordAlterations.forEach(function(alteration) {\n            fileContent += '$' + alteration.alterations[0] + ' : ' + 'qna-alterations = ' + NEWLINE;\n            alteration.alterations.splice(0, 1);\n            alteration.alterations.forEach(function(item) {\n                fileContent += '- ' + item + NEWLINE;\n            })\n            fileContent += NEWLINE;\n        });\n    }\n    return fileContent\n}\n\nmodule.exports = qnaAlterationsToLuContent"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/kb.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst qnaConverter = require('./qnaConverter')\n\nclass KB {\n    constructor(qnaJSON = null) {\n        if (qnaJSON) {\n            for (let prop in qnaJSON) {\n                this[prop] = qnaJSON[prop];\n            }\n        } else {\n            this.urls = [];\n            this.qnaList = [];\n            this.files = [];\n            this.name = '';\n        }\n    }\n\n    parseToLuContent() {\n        return qnaConverter(this)\n   }\n}\n\nmodule.exports = KB\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/kbCollate.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst KB = require('./kb')\nconst deepEqual = require('deep-equal')\nconst exception = require('../../utils/exception')\nconst retCode = require('../../utils/enums/CLI-errors').errorCode\nconst mergeLuFiles = require('./../../lu/luMerger').Build\nconst Alterations = require('./../alterations/alterations')\nconst QnAMaker = require('./qnamaker')\n\n/**\n * Builds a QnAMaker instance from a Qna list.\n * @param {Array<Qna>} qnaObjArray Array of QnA files to be merge\n * @param {boolean} verbose indicates if we need verbose logging.\n * @param {function} qnaSearchFn function to retrieve the lu files found in the references\n * @returns {QnAMaker} new QnAMaker instance\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst build = async function(qnaObjArray, verbose, qnaSearchFn) {\n    let mergedContent = await mergeLuFiles(qnaObjArray, verbose, '', qnaSearchFn)\n    let parsedQnAList = mergedContent.QnAContent.filter(item => item.includeInCollate)\n\n    let qnaList = []\n    parsedQnAList.forEach(index =>{\n        qnaList.push(index.qnaJsonStructure)\n    })\n    let kbResult = collate(qnaList)\n\n    let allParsedQnAAlterations = mergedContent.QnAAlterations.filter(item => item.includeInCollate)\n    let finalQnAAlterationsList = new Alterations()\n    allParsedQnAAlterations.forEach(function (alterationList) {\n        alterationList = alterationList.qnaAlterations;\n        if (alterationList.wordAlterations) {\n            alterationList.wordAlterations.forEach(function (alteration) {\n                finalQnAAlterationsList.wordAlterations.push(alteration);\n            })\n        }\n    })\n    return new QnAMaker(kbResult, finalQnAAlterationsList)\n}\n\nconst collate = function(qnaList) {\n    let result = new KB()\n    for (let i = 0; i < qnaList.length; i++) {\n        let blob = qnaList[i]\n        // does this blob have URLs?\n        collateUrls(result, blob)\n        // does this blob have files?\n        collateFiles(result, blob)\n        // does this blob have qnapairs?\n        collateQnAPairs(result, blob)\n\n        result.name = blob.name ? blob.name : result.name\n\n    };    \n    resolveMultiTurnReferences(result.qnaList)\n    resolveQnAIds(result.qnaList)\n    return result\n}\n\nmodule.exports = {\n    collate, \n    build\n}\n\nconst resolveMultiTurnReferences = function(qnaList) {\n    let qnaPairsWithMultiTurn = qnaList.filter(item => item.context.prompts.length !== 0);\n    // find the largetst auto-id\n    let largestAutoIdxList = qnaList.filter(item => item.id !== 0 && item.id.toString().startsWith('*auto*'));\n    let largestAutoIdx = 0;\n    if (largestAutoIdxList.length !== 0) {\n        let idx = largestAutoIdxList.reduce(function(max, obj) {\n            return parseInt(obj.id.replace('*auto*', '')) > parseInt(max.id.replace('*auto*', '')) ? obj : max;\n        });\n        largestAutoIdx = parseInt(idx.id.replace('*auto*', '')) + 1;\n    }\n\n    (qnaPairsWithMultiTurn || []).forEach(item => {\n        // find matching QnA id for each follow up prompt\n        (item.context.prompts || []).forEach(prompt => {\n            // find by ID first\n            let qnaId = qnaList.find(x => x.id === prompt.qnaId || x.id === parseInt(prompt.qnaId));\n            if (!qnaId) {\n                // find by question match\n                qnaId = qnaList.find(x => x.source.trim() !== 'crosstrained' && (x.questions.includes(prompt.qnaId) || x.questions.includes(prompt.qnaId.replace(/-/g, ' ').trim())))\n            }\n            if (qnaId === undefined) {\n                throw (new exception(retCode.INVALID_INPUT, `[ERROR]: Cannot find follow up prompt definition for '- [${prompt.displayText}](#?${prompt.qnaId}).`));\n            } else {\n                if (qnaId.id === 0) {\n                    qnaId.id = `*auto*${largestAutoIdx++}`;\n                }\n                prompt.qnaId = qnaId.id;\n                prompt.qna = null;\n                qnaId.context.isContextOnly = !qnaId.context.isContextOnly ? prompt.contextOnly : true;\n                delete prompt.contextOnly;\n            }\n        })\n    })\n}\n\nconst resolveQnAIds = function(qnaList) {\n    let qnaIdsAssigned = [];\n    let baseQnaId = 1;\n    // find all explicitly assigned IDs\n    let qnasWithId = qnaList.filter(pair => (pair.id !== 0) && (!pair.id.toString().startsWith('*auto*')));\n    qnasWithId.forEach(qna => {\n        let qnaId = 0;\n        // this is the only enforcement for IDs being numbers.\n        if (isNaN(qna.id)) throw (new exception(retCode.INVALID_INPUT, `[Error]: Explicitly assigned QnA Ids must be numbers. '${qna.id}' is not a number.`));\n        qnaId = parseInt(qna.id);\n        if(!qnaIdsAssigned.includes(qnaId)) qnaIdsAssigned.push(qnaId)\n    });\n    \n    // finalize IDs for everything that was auto id'd\n    let qnasWithAutoId = qnaList.filter(pair => (pair.id !== 0) && isNaN(pair.id) && (pair.id.toString().startsWith('*auto*')));\n    qnasWithAutoId.forEach(qna => {\n        // get a new ID\n        let newIdToAssign = getNewId(qnaIdsAssigned, baseQnaId++);\n        // find all child references to this id and update.\n        qnaList.forEach(pair => {\n            if (pair.context.prompts.length === 0) return;\n            pair.context.prompts.forEach(prompt => {\n                if (prompt.qnaId === qna.id) {\n                    prompt.qnaId = newIdToAssign;\n                }\n            })\n        });\n        qna.id = newIdToAssign;\n    })\n\n    // finalize IDs for everyone else.\n    let qnasWithoutId = qnaList.filter(pair => pair.id === 0);\n    qnasWithoutId.forEach(qna => {\n        if (qnasWithId.length !== 0 || qnasWithAutoId.length !== 0) {\n            qna.id = getNewId(qnaIdsAssigned, baseQnaId++);\n        } else {\n            // remove context for back compat.\n            delete qna.context;\n        }\n    })\n}\n\n\nconst getNewId = function(currentList, curId) {\n    while (currentList.includes(curId)) curId++;\n    currentList.push(curId)\n    return curId;\n}\n\nconst collateFiles = function(instance, qnaObject) {\n    if (qnaObject.files.length === 0) {\n        return\n    }\n    // add this url if this does not already exist in finaljson\n    qnaObject.files.forEach(function (qnaFile) {\n        if (instance.files.filter(item => { return item.fileUri == qnaFile.fileUri }).length === 0) {\n            instance.files.push(qnaFile);\n        }\n    });\n}\n\nconst collateQnAPairs = function(instance, qnaObject) {\n    if (qnaObject.qnaList.length === 0) {\n        return\n    }\n    // walk through each qnaPair and add it if it does not exist\n    qnaObject.qnaList.forEach(function (newQnAItem) {\n        if (instance.qnaList.length == 0) {\n            instance.qnaList.push(newQnAItem);\n        } else {\n            let qnaExists = false;\n            let fIndex = 0;\n            for (fIndex in instance.qnaList) {\n                if (deepEqual(instance.qnaList[fIndex], newQnAItem)) {\n                    qnaExists = true;\n                    break;\n                }\n            }\n            if (!qnaExists) instance.qnaList.push(newQnAItem);\n        }\n    });\n}\n\nconst collateUrls = function(instance, qnaObject) {\n    if (qnaObject.urls.length == 0) {\n        return\n    }\n    // add this url if this does not already exist in finaljson\n    qnaObject.urls.forEach(function (qnaUrl) {\n        if (!instance.urls.includes(qnaUrl)) {\n            instance.urls.push(qnaUrl);\n        }\n    });\n\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaContext.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nclass qnaContext { \n    /**\n     * @property {Boolean} isContextOnly\n     */\n    /**\n     * @property {qnaMetaData []} prompts\n     */\n    constructor(isContextOnly, prompts) {\n        this.isContextOnly = isContextOnly ? isContextOnly : false;\n        this.prompts = prompts ? prompts : [];\n    }\n}\n\nmodule.exports = qnaContext;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaConverter.js",
    "content": "const NEWLINE = require('os').EOL;\nconst exception = require('./../../utils/exception')\nconst retCode = require('./../../utils/enums/CLI-errors')\nconst QNA_GENERIC_SOURCE = \"custom editorial\";\n\n/**\n * Parses a QnAMaker object into Qna Content\n * @param {QnAMaker} qnaJSON\n * @returns {string} Qna Content\n * @throws {exception} Throws on errors. exception object includes errCode and text. \n */\nconst qnaToLuContent = function(qnaJSON){\n    let fileContent = '> # QnA pairs' + NEWLINE + NEWLINE;\n    let root = null;\n    if(qnaJSON.qnaDocuments) {\n        root = qnaJSON.qnaDocuments;\n    } else {\n        root = qnaJSON.qnaList;\n    }\n    \n    if (!root) {\n        throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'No input QnA content found '));\n    }\n\n    if(root.length <= 0) {\n        return fileContent\n    }\n    \n    root.forEach(function(qnaItem) {\n        fileContent += '> !# @qna.pair.source = ' + qnaItem.source + NEWLINE + NEWLINE;\n        fileContent += qnaItem.id.toString() !== \"0\" ? `<a id = \"${qnaItem.id}\"></a>` + NEWLINE + NEWLINE : '';\n        fileContent += '## ? ' + qnaItem.questions[0] + NEWLINE;\n        qnaItem.questions.splice(0,1);\n        qnaItem.questions.forEach(function(question) {\n            fileContent += '- ' + question + NEWLINE;\n        })\n        fileContent += NEWLINE;\n        if(qnaItem.metadata && qnaItem.metadata.length > 0) {\n            fileContent += '**Filters:**' + NEWLINE;\n            qnaItem.metadata.forEach(function(filter) {\n                fileContent += '- ' + filter.name + ' = ' + filter.value + NEWLINE;    \n            });\n            fileContent += NEWLINE;\n        }\n        fileContent += '```markdown' + NEWLINE;\n        fileContent += qnaItem.answer + NEWLINE;\n        fileContent += '```' + NEWLINE;\n        if (qnaItem.context && qnaItem.context.prompts && qnaItem.context.prompts.length !== 0) {\n            fileContent += NEWLINE + '**Prompts:**' + NEWLINE;\n            qnaItem.context.prompts.forEach(function(prompt) {\n                fileContent += `- [${prompt.displayText}](#${prompt.qnaId})`;\n                // See if the linked prompt is context only and if so, add the decoration.\n                let promptQnA = root.find(item => item.id == prompt.qnaId);\n                if (promptQnA) {\n                    fileContent += promptQnA.context.isContextOnly === true ? ` \\`context-only\\`` : '';\n                }\n                fileContent += NEWLINE;\n            })\n        }\n        fileContent += NEWLINE;\n    });\n\n    return fileContent\n}\n\nmodule.exports = qnaToLuContent\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaFiles.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nclass qnaFile { \n    /**\n     * @property {string} fileUri\n     */\n    /**\n     * @property {string} fileName\n     */\n    \n    constructor(fileUri, fileName) {\n        this.fileName = fileName?fileName:'';\n        this.fileUri = fileUri?fileUri:'';\n    }\n}\n\nmodule.exports = qnaFile;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaList.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst qnaContext = require('./qnaContext');\n\nclass qnaList { \n    /**\n     * @property {string} id\n     */\n    /**\n     * @property {string} answer\n     */\n    /**\n     * @property {string} source\n     */\n    /**\n     * @property {string []} questions\n     */\n    /**\n     * @property {qnaMetaData []} metadata\n     */\n    /** \n     * @property {qnaContext} context\n     */\n    constructor(id, answer, source, questions, metadata, context) {\n        this.id = id?id:0;\n        this.answer = answer?answer:'';\n        this.source = source?source:'custom editorial';\n        this.questions = questions?questions:[];\n        this.metadata = metadata?metadata:[];\n        this.context = context ? context : new qnaContext();\n    }\n}\n\nmodule.exports = qnaList;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaMakerBuilder.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst Alterations = require('./../alterations/alterations')\nconst QnAMaker = require('./qnamaker')\nconst KB = require('./kb')\nconst build = require('./kbCollate').build\nconst parseFileContents = require('./../../lufile/parseFileContents').parseFile\n\nclass QnABuilder{\n    /**\n     * Builds a QnAMaker instance from a KB json.\n     * @param {JSON} kbJson QnAMaker json\n     * @returns {QnAMaker} new QnAMaker instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromKB(kbJson) {\n        return new QnAMaker(new KB(kbJson))\n    }\n\n    /**\n     * Builds a QnAMaker instance from a Alterations Json.\n     * @param {JSON} alterationsJson QnAMaker json\n     * @returns {QnAMaker} new QnAMaker instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromAlterations(alterationsJson) {\n        return new QnAMaker('', new Alterations(alterationsJson))\n    }\n\n    /**\n     * Builds a QnAMaker instance from a KB and Alterations Json.\n     * @param {JSON} kbJson KB json\n     * @param {JSON} alterationsJsonson alterations json\n     * @returns {QnAMaker} new QnAMaker instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromKbAndAlterations(kbJson, alterationsJson) {\n        return new QnAMaker(new KB(kbJson), new Alterations(alterationsJson))\n    }\n\n    /**\n     * Builds a QnAMaker instance from a qna content.\n     * @param {Qna} qnaContent QnA content\n     * @returns {QnAMaker} new QnAMaker instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromContent(qnaContent) {\n        let parsedContent = await parseFileContents(qnaContent, false)\n        return new QnAMaker(new KB(parsedContent.qnaJsonStructure), new Alterations(parsedContent.qnaAlterations))\n    }\n\n    /**\n     * Builds a QnAMaker instance from a qna list.\n     * @param {Array<QnA>} qnaObjArray Array of LU files to be merge\n     * @param {function} qnaSearchFn function to retrieve the qna files found in the references\n     * @returns {QnAMaker} new QnAMaker instance\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    static async fromQna(qnaObjArray, qnaSearchFn) {\n        if(!Array.isArray(qnaObjArray)) {\n            new QnAMaker()\n        }\n\n        if(qnaObjArray.length === 1){\n            let parsedContent = await parseFileContents(qnaObjArray[0].content, false)\n            return new QnAMaker(new KB(parsedContent.qnaJsonStructure), new Alterations(parsedContent.qnaAlterations))\n        }\n\n        return build(qnaObjArray, false, qnaSearchFn)\n    }\n}\n\nmodule.exports = QnABuilder\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaMetaData.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nclass qnaMetaData {\n    /** \n     * @property {string} name\n     */\n    /**\n     * @property {string} value\n     */\n    constructor(name, value) {\n        this.name = name?name:'';\n        this.value = value?value:'';\n    }\n}\n\nmodule.exports = qnaMetaData;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaPrompt.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nclass qnaPrompt { \n    /**\n     * @property {String} displayOrder\n     */\n    /**\n     * @property {String} qnaId\n     */\n    /**\n     * @property {String} displayText\n     */\n    /**\n     * @property {Boolean} contextonly\n     */\n    /**\n     * @property {qnaList} qna\n     */\n    constructor(displayText, qnaId, qna, contextOnly = false, displayOrder = 0) {\n        this.displayText = displayText ? displayText : undefined;\n        this.qnaId = qnaId ? qnaId : undefined;\n        this.qna = qna ? qna : undefined;\n        this.contextOnly = contextOnly ? contextOnly : false;\n        this.displayOrder = displayOrder ? displayOrder : 0;\n    }\n}\n\nmodule.exports = qnaPrompt;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnamaker.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst KB = require('./kb')\nconst Alterations = require('./../alterations/alterations')\nconst QnA = require('./../../lu/qna')\n\nclass QnAMaker {\n    constructor(kb = null, alterations = null){\n        this.kb = kb instanceof KB ? kb : null\n        this.alterations = alterations instanceof Alterations ? alterations : null \n    }\n\n    parseToQnAContent() {\n        let content = this.kb ? this.kb.parseToLuContent() : ''\n        content += this.alterations ? this.alterations.parseToLuContent() : ''\n        return content\n   }\n\n   parseToQNA() {\n       return new QnA(this.parseToQnAContent())\n   }\n}\n\nmodule.exports = QnAMaker\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/builder.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {QnaBuildCore} from './core'\nimport {Settings} from './settings'\nimport {MultiLanguageRecognizer} from './multi-language-recognizer'\nimport {Recognizer} from './recognizer'\nimport {CrossTrainedRecognizer} from './cross-trained-recognizer'\nconst path = require('path')\nconst fs = require('fs-extra')\nconst delay = require('delay')\nconst fileHelper = require('./../../utils/filehelper')\nconst fileExtEnum = require('./../utils/helpers').FileExtTypeEnum\nconst retCode = require('./../utils/enums/CLI-errors')\nconst exception = require('./../utils/exception')\nconst qnaBuilderVerbose = require('./../qna/qnamaker/kbCollate')\nconst qnaMakerBuilder = require('./../qna/qnamaker/qnaMakerBuilder')\nconst qnaOptions = require('./../lu/qnaOptions')\nconst Content = require('./../lu/qna')\nconst KB = require('./../qna/qnamaker/kb')\nconst recognizerType = require('./../utils/enums/recognizertypes')\nconst LUOptions = require('./../lu/luOptions')\n\nexport class Builder {\n  private readonly handler: (input: string) => any\n\n  constructor(handler: any) {\n    this.handler = handler\n  }\n\n  async loadContents(\n    files: string[],\n    botName: string,\n    suffix: string,\n    region: string,\n    culture: string,\n    schema?: string,\n    importResolver?: object) {\n    let multiRecognizers = new Map<string, MultiLanguageRecognizer>()\n    let settings: any\n    let recognizers = new Map<string, Recognizer>()\n    let qnaContents = new Map<string, any>()\n    let crosstrainedRecognizers = new Map<string, CrossTrainedRecognizer>()\n    let qnaObjects = new Map<string, any[]>()\n\n    for (const file of files) {\n      let fileCulture: string\n      let fileName: string\n      let cultureFromPath = fileHelper.getCultureFromPath(file)\n      if (cultureFromPath) {\n        fileCulture = cultureFromPath\n        let fileNameWithCulture = path.basename(file, path.extname(file))\n        fileName = fileNameWithCulture.substring(0, fileNameWithCulture.length - cultureFromPath.length - 1)\n      } else {\n        fileCulture = culture\n        fileName = path.basename(file, path.extname(file))\n      }\n\n      const fileFolder = path.dirname(file)\n      const crossTrainedFileName = fileName + '.lu.qna.dialog'\n      const crossTrainedRecognizerPath = path.join(fileFolder, crossTrainedFileName)\n      if (!crosstrainedRecognizers.has(fileName)) {\n        let crosstrainedRecognizerContent = []\n        let crosstrainedRecognizerSchema = schema\n        if (fs.existsSync(crossTrainedRecognizerPath)) {\n          let crosstrainedRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(crossTrainedRecognizerPath))\n          crosstrainedRecognizerContent = crosstrainedRecognizerObject.recognizers\n          crosstrainedRecognizerSchema = crosstrainedRecognizerSchema || crosstrainedRecognizerObject.$schema\n          this.handler(`${crossTrainedRecognizerPath} loaded\\n`)\n        }\n\n        crosstrainedRecognizers.set(fileName, new CrossTrainedRecognizer(crossTrainedRecognizerPath, crosstrainedRecognizerContent, crosstrainedRecognizerSchema as string))\n      }\n\n      let qnaFiles = await fileHelper.getLuObjects(undefined, file, true, fileExtEnum.QnAFile)\n      this.handler(`${file} loaded\\n`)\n\n      // filter empty qna files\n      qnaFiles = qnaFiles.filter((file: any) => file.content !== '')\n      if (qnaFiles.length <= 0) continue\n\n      const multiRecognizerPath = path.join(fileFolder, `${fileName}.qna.dialog`)\n      if (!multiRecognizers.has(fileName)) {\n        let multiRecognizerContent = {}\n        let multiRecognizerSchema = schema\n        if (fs.existsSync(multiRecognizerPath)) {\n          let multiRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(multiRecognizerPath))\n          multiRecognizerContent = multiRecognizerObject.recognizers\n          multiRecognizerSchema = multiRecognizerSchema || multiRecognizerObject.$schema\n          this.handler(`${multiRecognizerPath} loaded\\n`)\n        }\n\n        multiRecognizers.set(fileName, new MultiLanguageRecognizer(multiRecognizerPath, multiRecognizerContent, multiRecognizerSchema as string))\n      }\n\n      if (settings === undefined) {\n        const settingsPath = path.join(fileFolder, `qnamaker.settings.${suffix}.${region}.json`)\n        let settingsContent = {}\n        if (fs.existsSync(settingsPath)) {\n          settingsContent = JSON.parse(await fileHelper.getContentFromFile(settingsPath)).qna\n          this.handler(`${settingsPath} loaded\\n`)\n        }\n\n        settings = new Settings(settingsPath, settingsContent)\n      }\n\n      const dialogName = `${fileName}.${fileCulture}.qna`\n      const dialogFile = path.join(fileFolder, dialogName + '.dialog')\n      let existingDialogObj: any\n      if (fs.existsSync(dialogFile)) {\n        existingDialogObj = JSON.parse(await fileHelper.getContentFromFile(dialogFile))\n        this.handler(`${dialogFile} loaded\\n`)\n      }\n\n      if (existingDialogObj && schema) {\n        existingDialogObj.$schema = schema\n      }\n\n      let recognizer = Recognizer.load(file, dialogName, dialogFile, settings, existingDialogObj, schema)\n      recognizers.set(dialogName, recognizer)\n\n      if (!qnaContents.has(fileCulture)) {\n        let contentPerCulture = new Content('', new qnaOptions(botName, true, fileCulture, file))\n        qnaContents.set(fileCulture, contentPerCulture)\n        qnaObjects.set(fileCulture, qnaFiles)\n      } else {\n        // merge contents of qna files with same culture\n        let qnaObject = qnaObjects.get(fileCulture)\n        if (qnaObject !== undefined) {\n          qnaObject.push(...qnaFiles)\n        }\n      }\n    }\n\n    await this.resolveMergedQnAContentIds(qnaContents, qnaObjects, importResolver)\n\n    return {qnaContents: [...qnaContents.values()], recognizers, multiRecognizers, settings, crosstrainedRecognizers}\n  }\n\n  async build(\n    qnaContents: any[],\n    recognizers: Map<string, Recognizer>,\n    subscriptionkey: string,\n    endpoint: string,\n    botName: string,\n    suffix: string,\n    fallbackLocale: string,\n    multiRecognizers?: Map<string, MultiLanguageRecognizer>,\n    settings?: Settings,\n    crosstrainedRecognizers?: Map<string, CrossTrainedRecognizer>,\n    dialogType?: string) {\n    // qna api TPS which means concurrent transactions to qna maker api in 1 second\n    let qnaApiTps = 3\n\n    // set qna maker call delay duration to 1100 millisecond because 1000 can hit corner case of rate limit\n    let delayDuration = 1100\n\n    //default returned recognizer values\n    let recognizerValues: Recognizer[] = []\n\n    let multiRecognizerValues: MultiLanguageRecognizer[] = []\n\n    let settingsValue: any\n\n    let crosstrainedRecognizerValues: CrossTrainedRecognizer[] = []\n\n    // filter if all qna contents are emtty\n    let isAllQnAEmpty = fileHelper.isAllFilesSectionEmpty(qnaContents)\n\n    if (!isAllQnAEmpty) {\n      const qnaBuildCore = new QnaBuildCore(subscriptionkey, endpoint)\n      const kbs = (await qnaBuildCore.getKBList()).knowledgebases\n\n      // here we do a while loop to make full use of qna tps capacity\n      while (qnaContents.length > 0) {\n        // get a number(set by qnaApiTps) of contents for each loop\n        const subQnaContents = qnaContents.splice(0, qnaApiTps)\n\n        // concurrently handle applications\n        await Promise.all(subQnaContents.map(async content => {\n          // init current kb object from qna content\n          const qnaObj = await this.initQnaFromContent(content, botName, suffix)\n          let currentKB = qnaObj.kb\n          let currentAlt = qnaObj.alterations\n          let culture = content.language as string\n\n          let hostName = ''\n\n          // get recognizer\n          let recognizersOfContentCulture: Recognizer[] = []\n          for (let [dialogFileName, recognizer] of recognizers) {\n            const fileNameSplit = dialogFileName.split('.')\n            if (fileNameSplit[fileNameSplit.length - 2] === culture) {\n              // find if there is a matched name with current kb under current authoring key\n              if (!recognizer.getKBId()) {\n                for (let kb of kbs) {\n                  if (kb.name === currentKB.name) {\n                    recognizer.setKBId(kb.id)\n                    hostName = kb.hostName\n                    break\n                  }\n                }\n              }\n\n              recognizersOfContentCulture.push(recognizer)\n            }\n          }\n\n          let needPublish = false\n\n          // compare models to update the model if a match found\n          // otherwise create a new kb\n          let recognizerWithKBId = recognizersOfContentCulture.find((r: Recognizer) => r.getKBId() !== '')\n          if (recognizerWithKBId !== undefined) {\n            // To see if need update the model\n            needPublish = await this.updateKB(currentKB, qnaBuildCore, recognizerWithKBId, delayDuration)\n          } else {\n            // create a new kb\n            needPublish = await this.createKB(currentKB, qnaBuildCore, recognizersOfContentCulture, delayDuration)\n          }\n\n          const publishRecognizer = recognizerWithKBId || recognizersOfContentCulture[0]\n\n          if (needPublish) {\n            // train and publish kb\n            await this.publishKB(qnaBuildCore, publishRecognizer, currentKB.name, delayDuration)\n          }\n\n          if (hostName === '') hostName = (await qnaBuildCore.getKB(publishRecognizer.getKBId())).hostName\n\n          hostName += '/qnamaker'\n\n          // update alterations if there are\n          if (currentAlt.wordAlterations && currentAlt.wordAlterations.length > 0) {\n            this.handler('Replacing alterations...\\n')\n            await qnaBuildCore.replaceAlt(currentAlt)\n          }\n\n          for (const recognizer of recognizersOfContentCulture) {\n            // update multiLanguageRecognizer asset\n            const dialogName = path.basename(recognizer.getDialogPath(), `.${culture}.qna.dialog`)\n            const dialogFileName = path.basename(recognizer.getDialogPath(), '.dialog')\n            if (multiRecognizers && multiRecognizers.has(dialogName)) {\n              let multiRecognizer = multiRecognizers.get(dialogName) as MultiLanguageRecognizer\n              multiRecognizer.recognizers[culture] = dialogFileName\n              if (culture.toLowerCase() === fallbackLocale.toLowerCase()) {\n                multiRecognizer.recognizers[''] = dialogFileName\n              }\n            }\n\n            if (crosstrainedRecognizers && crosstrainedRecognizers.has(dialogName)) {\n              let crosstrainedRecognizer = crosstrainedRecognizers.get(dialogName) as CrossTrainedRecognizer\n              if (!crosstrainedRecognizer.recognizers.includes(dialogName + '.qna')) {\n                crosstrainedRecognizer.recognizers.push(dialogName + '.qna')\n              }\n            }\n\n            // update settings asset\n            if (settings) {\n              settings.qna[dialogFileName.split('.').join('_').replace(/-/g, '_')] = recognizer.getKBId()\n              settings.qna.hostname = hostName\n            }\n          }\n        }))\n      }\n\n      // write dialog assets\n      if (recognizers) {\n        recognizerValues = Array.from(recognizers.values())\n      }\n\n      if (multiRecognizers) {\n        multiRecognizerValues = Array.from(multiRecognizers.values())\n      }\n\n      if (settings) {\n        settingsValue = settings as Settings\n      }\n    }\n\n    if (dialogType === recognizerType.CROSSTRAINED && crosstrainedRecognizers) {\n      crosstrainedRecognizerValues = Array.from(crosstrainedRecognizers.values())\n    }\n\n    const dialogContents = this.generateDeclarativeAssets(recognizerValues, multiRecognizerValues, settingsValue, crosstrainedRecognizerValues)\n\n    return dialogContents\n  }\n\n  async getEndpointKeys(subscriptionkey: string, endpoint: string) {\n    const qnaBuildCore = new QnaBuildCore(subscriptionkey, endpoint)\n    const endPointKeys = await qnaBuildCore.getEndpointKeys()\n\n    return endPointKeys\n  }\n\n  async importUrlReference(\n    url: string,\n    subscriptionkey: string,\n    endpoint: string,\n    kbName: string) {\n    const qnaBuildCore = new QnaBuildCore(subscriptionkey, endpoint)\n    const kbs = (await qnaBuildCore.getKBList()).knowledgebases\n\n    let kbId = ''\n    // find if there is a matched name with current kb under current authoring key\n    for (let kb of kbs) {\n      if (kb.name === kbName) {\n        kbId = kb.id\n        break\n      }\n    }\n\n    // delete the kb if it already exists\n    if (kbId !== '') {\n      await qnaBuildCore.deleteKB(kbId)\n    }\n\n    // create a new kb\n    kbId = await this.createUrlKB(qnaBuildCore, url, kbName)\n\n    const kbJson = await qnaBuildCore.exportKB(kbId, 'Test')\n    const kb = new KB(kbJson)\n    const kbToLuContent = kb.parseToLuContent()\n    await qnaBuildCore.deleteKB(kbId)\n\n    return kbToLuContent\n  }\n\n  async importFileReference(\n    fileName: string,\n    fileUri: string,\n    subscriptionkey: string,\n    endpoint: string,\n    kbName: string) {\n    const qnaBuildCore = new QnaBuildCore(subscriptionkey, endpoint)\n    const kbs = (await qnaBuildCore.getKBList()).knowledgebases\n\n    let kbId = ''\n    // find if there is a matched name with current kb under current authoring key\n    for (let kb of kbs) {\n      if (kb.name === kbName) {\n        kbId = kb.id\n        break\n      }\n    }\n\n    // delete the kb if it already exists\n    if (kbId !== '') {\n      await qnaBuildCore.deleteKB(kbId)\n    }\n\n    // create a new kb\n    kbId = await this.createFileKB(qnaBuildCore, fileName, fileUri, kbName)\n\n    const kbJson = await qnaBuildCore.exportKB(kbId, 'Test')\n    const kb = new KB(kbJson)\n    const kbToLuContent = kb.parseToLuContent()\n    await qnaBuildCore.deleteKB(kbId)\n\n    return kbToLuContent\n  }\n\n  async writeDialogAssets(contents: any[], force: boolean, out: string) {\n    let writeDone = false\n\n    for (const content of contents) {\n      let outFilePath\n      if (out) {\n        outFilePath = path.join(path.resolve(out), path.basename(content.path))\n      } else {\n        outFilePath = content.path\n      }\n\n      let fileExists = fs.existsSync(outFilePath)\n      if (fileExists && outFilePath.endsWith('.lu.qna.dialog')) {\n        let existingCTRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(outFilePath))\n        let currentCTRecognizerObject = JSON.parse(content.content)\n        let ctRecognizerToBeMerged = currentCTRecognizerObject.recognizers.filter((r: string) => !existingCTRecognizerObject.recognizers.includes(r))\n        existingCTRecognizerObject.recognizers = existingCTRecognizerObject.recognizers.concat(ctRecognizerToBeMerged)\n        content.content = JSON.stringify(existingCTRecognizerObject, null, 4)\n      }\n\n      if (force || !fileExists) {\n        this.handler(`Writing to ${outFilePath}\\n`)\n        await fs.writeFile(outFilePath, content.content, 'utf-8')\n        writeDone = true\n      }\n    }\n\n    return writeDone\n  }\n\n  generateDeclarativeAssets(recognizers: Array<Recognizer>, multiRecognizers: Array<MultiLanguageRecognizer>, settings: Settings, crosstrainedRecognizers: Array<CrossTrainedRecognizer>)\n    : Array<any> {\n    let contents = new Array<any>()\n    for (const recognizer of recognizers) {\n      let content = new Content(recognizer.save(), new LUOptions(path.basename(recognizer.getDialogPath()), true, '', recognizer.getDialogPath()))\n      contents.push(content)\n    }\n\n    for (const multiRecognizer of multiRecognizers) {\n      const multiLangContent = new Content(multiRecognizer.save(), new LUOptions(path.basename(multiRecognizer.getDialogPath()), true, '', multiRecognizer.getDialogPath()))\n      contents.push(multiLangContent)\n    }\n\n    if (settings) {\n      const settingsContent = new Content(settings.save(), new LUOptions(path.basename(settings.getSettingsPath()), true, '', settings.getSettingsPath()))\n      contents.push(settingsContent)\n    }\n\n    for (const crosstrainedRecognizer of crosstrainedRecognizers) {\n      const crosstrainedContent = new Content(crosstrainedRecognizer.save(), new LUOptions(path.basename(crosstrainedRecognizer.getDialogPath()), true, '', crosstrainedRecognizer.getDialogPath()))\n      contents.push(crosstrainedContent)\n    }\n\n    return contents\n  }\n\n  async initQnaFromContent(content: any, botName: string, suffix: string) {\n    let currentQna = await qnaMakerBuilder.fromContent(content.content)\n    if (!currentQna.kb.name) currentQna.kb.name = `${botName}(${suffix}).${content.language}.qna`\n\n    return {kb: currentQna.kb, alterations: currentQna.alterations}\n  }\n\n  async updateKB(currentKB: any, qnaBuildCore: QnaBuildCore, recognizer: Recognizer, delayDuration: number) {\n    await delay(delayDuration)\n    const existingKB = await qnaBuildCore.exportKB(recognizer.getKBId(), 'Prod')\n\n    // compare models\n    const isKBEqual = qnaBuildCore.isKBEqual(currentKB, existingKB)\n    if (!isKBEqual) {\n      try {\n        this.handler(`Updating to new version for kb ${currentKB.name}...\\n`)\n        await delay(delayDuration)\n        await qnaBuildCore.replaceKB(recognizer.getKBId(), currentKB)\n\n        this.handler(`Updating finished for kb ${currentKB.name}\\n`)\n      } catch (err) {\n        err.text = `Updating knowledge base failed: \\n${err.text}`\n        throw err\n      }\n\n      return true\n    } else {\n      this.handler(`kb ${currentKB.name} has no changes\\n`)\n      return false\n    }\n  }\n\n  async createKB(currentKB: any, qnaBuildCore: QnaBuildCore, recognizers: Recognizer[], delayDuration: number) {\n    this.handler(`Creating qnamaker KB: ${currentKB.name}...\\n`)\n    await delay(delayDuration)\n    const emptyKBJson = {\n      name: currentKB.name,\n      qnaList: [],\n      urls: [],\n      files: []\n    }\n    let response = await qnaBuildCore.importKB(emptyKBJson)\n    let operationId = response.operationId\n    let kbId = ''\n\n    try {\n      const opResult = await this.getKBOperationStatus(qnaBuildCore, operationId, delayDuration)\n      kbId = opResult.resourceLocation.split('/')[2]\n      await delay(delayDuration)\n      await qnaBuildCore.replaceKB(kbId, currentKB)\n\n      this.handler(`Creating finished for kb ${currentKB.name}\\n`)\n    } catch (err) {\n      err.text = `Creating knowledge base failed: \\n${err.text}`\n      throw err\n    }\n\n    recognizers.forEach((recogizer: Recognizer) => recogizer.setKBId(kbId))\n\n    return true\n  }\n\n  async createUrlKB(qnaBuildCore: QnaBuildCore, url: string, kbName: string) {\n    const kbJson = {\n      name: kbName,\n      qnaList: [],\n      urls: [url],\n      files: []\n    }\n\n    let response = await qnaBuildCore.importKB(kbJson)\n    let operationId = response.operationId\n    const opResult = await this.getKBOperationStatus(qnaBuildCore, operationId, 1000)\n    const kbId = opResult.resourceLocation.split('/')[2]\n\n    return kbId\n  }\n\n  async createFileKB(qnaBuildCore: QnaBuildCore, fileName: string, fileUri: string, kbName: string) {\n    let kbJson = {\n      name: kbName,\n      qnaList: [],\n      urls: [],\n      files: [{\n        fileName,\n        fileUri\n      }]\n    }\n\n    let response = await qnaBuildCore.importKB(kbJson)\n    let operationId = response.operationId\n    const opResult = await this.getKBOperationStatus(qnaBuildCore, operationId, 1000)\n    const kbId = opResult.resourceLocation.split('/')[2]\n\n    return kbId\n  }\n\n  async getKBOperationStatus(qnaBuildCore: QnaBuildCore, operationId: string, delayDuration: number) {\n    let opResult\n    let isGetting = true\n    while (isGetting) {\n      await delay(delayDuration)\n      opResult = await qnaBuildCore.getOperationStatus(operationId)\n\n      if (opResult.operationState === 'Failed') {\n        throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, JSON.stringify(opResult, null, 4)))\n      }\n\n      if (opResult.operationState === 'Succeeded') isGetting = false\n    }\n\n    return opResult\n  }\n\n  async publishKB(qnaBuildCore: QnaBuildCore, recognizer: Recognizer, kbName: string, delayDuration: number) {\n    // publish applications\n    this.handler(`Publishing kb ${kbName}...\\n`)\n    await delay(delayDuration)\n    await qnaBuildCore.publishKB(recognizer.getKBId())\n    this.handler(`Publishing finished for kb ${kbName}\\n`)\n  }\n\n  async resolveMergedQnAContentIds(contents: Map<string, any>, objects: Map<string, any[]>, importResolver?: object) {\n    for (const [name, content] of contents) {\n      let qnaObjects = objects.get(name)\n      try {\n        let result = await qnaBuilderVerbose.build(qnaObjects, true, importResolver)\n        let mergedContent = result.parseToQnAContent()\n        content.content = mergedContent\n        contents.set(name, content)\n      } catch (err) {\n        if (err.source) {\n          err.text = `Invalid QnA file ${err.source}: ${err.text}`\n        } else {\n          err.text = `Invalid QnA file ${content.path}: ${err.text}`\n        }\n        throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, err.text))\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/core.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst retCode = require('./../utils/enums/CLI-errors')\nconst exception = require('./../utils/exception')\nconst {ServiceBase} = require('./serviceBase')\nconst NEWLINE = require('os').EOL\n\nexport class QnaBuildCore {\n  private readonly service: any\n\n  constructor(subscriptionkey: string, endpoint: string) {\n    this.service = new ServiceBase(endpoint, subscriptionkey)\n  }\n\n  public async getKBList() {\n    const response = await this.service.createRequest('/knowledgebases', 'GET')\n    const text = await response.text()\n    const kbList = JSON.parse(text)\n    if (kbList.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return kbList\n  }\n\n  public async getKB(kbId: string) {\n    const response = await this.service.createRequest(`/knowledgebases/${kbId}`, 'GET')\n    const text = await response.text()\n    const kb = JSON.parse(text)\n    if (kb.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return kb\n  }\n\n  public async importKB(kbPayload: any) {\n    const response = await this.service.createRequest('/knowledgebases/createasync', 'POST', kbPayload)\n    const text = await response.text()\n    const status = JSON.parse(text)\n    if (status.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return status\n  }\n\n  public async getOperationStatus(operationId: string) {\n    const response = await this.service.createRequest(`/operations/${operationId}`, 'GET')\n    const text = await response.text()\n    const status = JSON.parse(text)\n    if (status.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return status\n  }\n\n  public async exportKB(kbId: string, environment: string) {\n    const response = await this.service.createRequest(`/knowledgebases/${kbId}/${environment}/qna`, 'GET')\n    const text = await response.text()\n    const kb = JSON.parse(text)\n    if (kb.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return kb\n  }\n\n  public async updateKB(kbId: string, replaceKb: any) {\n    const response = await this.service.createRequest(`/knowledgebases/${kbId}`, 'PATCH', replaceKb)\n    const text = await response.text()\n    const status = JSON.parse(text)\n    if (status.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return status\n  }\n\n  public async replaceKB(kbId: string, replaceKb: any) {\n    const response = await this.service.createRequest(`/knowledgebases/${kbId}`, 'PUT', replaceKb)\n    const text = await response.text()\n    if (text) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n  }\n\n  public async publishKB(kbId: string) {\n    const response = await this.service.createRequest(`/knowledgebases/${kbId}`, 'POST')\n    const text = await response.text()\n    if (text) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n  }\n\n  public async replaceAlt(altJson: any) {\n    const response = await this.service.createRequest('/alterations', 'PUT', altJson)\n    const text = await response.text()\n    if (text) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n  }\n\n  public async getEndpointKeys() {\n    const response = await this.service.createRequest('/endpointkeys', 'GET')\n    const text = await response.text()\n    const endpointKeys = JSON.parse(text)\n    if (endpointKeys.error) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n\n    return endpointKeys\n  }\n\n  public async deleteKB(kbId: string) {\n    const response = await this.service.createRequest(`/knowledgebases/${kbId}`, 'DELETE')\n    const text = await response.text()\n    if (text) {\n      throw (new exception(retCode.errorCode.LUIS_API_CALL_FAILED, text))\n    }\n  }\n\n  public isKBEqual(kbA: any, kbB: any): boolean {\n    const qnaListA = kbA.qnaList\n    const qnaListAToCompare = qnaListA.map((qna: any) => {\n      return {\n        id: qna.id,\n        answer: qna.answer,\n        source: qna.source,\n        questions: qna.questions.slice(),\n        metadata: qna.metadata.slice(),\n        context: qna.context\n      }\n    })\n\n    const qnaDocumentsB = kbB.qnaDocuments || []\n    const qnaListBToCompare = qnaDocumentsB.map((qna: any) => {\n      return {\n        id: qna.id,\n        answer: qna.answer,\n        source: qna.source,\n        questions: qna.questions,\n        metadata: qna.metadata,\n        context: qna.context\n      }\n    })\n\n    const equal = this.isQnaListEqual(qnaListAToCompare, qnaListBToCompare)\n\n    return equal\n  }\n\n  private isQnaListEqual(qnaListA: any, qnaListB: any) {\n    let kbAQnA = this.parseToQnAContent(qnaListA).toLowerCase()\n    let kbBQnA = this.parseToQnAContent(qnaListB).toLowerCase()\n\n    return kbAQnA === kbBQnA\n  }\n\n  private parseToQnAContent(qnaList: any) {\n    let fileContent = ''\n    qnaList.forEach((qnaItem: any) => {\n      fileContent += '<a id = \"0\"></a>' + NEWLINE + NEWLINE\n      fileContent += '> !# @qna.pair.source = ' + qnaItem.source + NEWLINE + NEWLINE\n      fileContent += '## ? ' + qnaItem.questions[0] + NEWLINE\n      qnaItem.questions.splice(0, 1)\n      qnaItem.questions.forEach((question: any) => {\n        fileContent += '- ' + question + NEWLINE\n      })\n      fileContent += NEWLINE\n      if (qnaItem.metadata && qnaItem.metadata.length > 0) {\n        fileContent += '**Filters:**' + NEWLINE\n        qnaItem.metadata.sort((a: any, b: any) => (a.name > b.name) ? 1 : -1).forEach((filter: any) => {\n          fileContent += '- ' + filter.name + ' = ' + filter.value + NEWLINE\n        })\n        fileContent += NEWLINE\n      }\n      fileContent += '```markdown' + NEWLINE\n      fileContent += qnaItem.answer + NEWLINE\n      fileContent += '```' + NEWLINE\n      if (qnaItem.context && qnaItem.context.prompts && qnaItem.context.prompts.length !== 0) {\n        fileContent += NEWLINE + '**Prompts:**' + NEWLINE\n        qnaItem.context.prompts.forEach((prompt: any) => {\n          fileContent += `- [${prompt.displayText}]`\n          // See if the linked prompt is context only and if so, add the decoration.\n          let promptQnA = qnaList.find((item: any) => item.id === prompt.qnaId)\n          if (promptQnA) {\n            fileContent += promptQnA.context.isContextOnly === true ? ' \\`context-only\\`' : ''\n          }\n          fileContent += NEWLINE\n        })\n      }\n      fileContent += NEWLINE\n    })\n\n    return fileContent\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/cross-trained-recognizer.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport class CrossTrainedRecognizer {\n  public recognizers: any\n  private readonly dialogPath: string\n  private readonly $schema: string | undefined\n\n  constructor(dialogPath: string, recognizers: any, schema?: string) {\n    this.dialogPath = dialogPath\n    this.recognizers = recognizers\n    this.$schema = schema\n  }\n\n  save(): string {\n    let output: any = {\n      $kind: 'Microsoft.CrossTrainedRecognizerSet',\n      recognizers: this.recognizers\n    }\n\n    if (this.$schema) {\n      output = {$schema: this.$schema, ...output}\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getDialogPath(): string {\n    return this.dialogPath\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/multi-language-recognizer.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst path = require('path')\n\nexport class MultiLanguageRecognizer {\n  public recognizers: any\n  private readonly id: string\n  private readonly dialogPath: string\n  private readonly $schema: string | undefined\n\n  constructor(dialogPath: string, recognizers: any, schema?: string) {\n    this.id = `QnA_${path.basename(dialogPath).split('.')[0]}`\n    this.dialogPath = dialogPath\n    this.recognizers = recognizers\n    this.$schema = schema\n  }\n\n  save(): string {\n    let output: any = {\n      $kind: 'Microsoft.MultiLanguageRecognizer',\n      id: this.id,\n      recognizers: this.recognizers\n    }\n\n    if (this.$schema) {\n      output = {$schema: this.$schema, ...output}\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getDialogPath(): string {\n    return this.dialogPath\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/recognizer.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {Settings} from './settings'\nimport * as path from 'path'\n\nexport class Recognizer {\n  static load(qnaFile: string, targetFileName: string, dialogPath: string, qnaSettings: Settings, existingRecognizer: any, schema?: string): Recognizer {\n    if (existingRecognizer) {\n      let recognizer = new Recognizer(qnaFile, targetFileName, schema)\n      recognizer.dialogPath = dialogPath\n      Object.assign(recognizer, existingRecognizer)\n      recognizer.setKBId(qnaSettings.qna[path.basename(qnaFile).split('.').join('_')])\n\n      return recognizer\n    }\n\n    let recognizer = new Recognizer(qnaFile, targetFileName, schema)\n    recognizer.dialogPath = dialogPath\n\n    return recognizer\n  }\n\n  private readonly id: string\n  private readonly knowledgeBaseId: string | undefined\n  private readonly hostname: string | undefined\n  private readonly endpointKey: string | undefined\n  private readonly $schema: string | undefined\n  private kbId: string\n  private dialogPath: string | undefined\n\n  constructor(private readonly qnaFile: string, targetFileName: string, schema?: string) {\n    this.kbId = ''\n    this.id = `QnA_${targetFileName.split('.')[0]}`\n    this.knowledgeBaseId = `=settings.qna.${targetFileName.split('.').join('_').replace(/-/g, '_')}`\n    this.hostname = '=settings.qna.hostname'\n    this.endpointKey = '=settings.qna.endpointKey'\n    this.$schema = schema\n  }\n\n  save(): string {\n    let output: any = {\n      $kind: 'Microsoft.QnAMakerRecognizer',\n      id: this.id,\n      knowledgeBaseId: this.knowledgeBaseId,\n      hostname: this.hostname,\n      endpointKey: this.endpointKey\n    }\n\n    if (this.$schema) {\n      output = {$schema: this.$schema, ...output}\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getKBId(): string {\n    return this.kbId\n  }\n\n  setKBId(kbId: string) {\n    this.kbId = kbId\n  }\n\n  getDialogPath(): string {\n    return this.dialogPath as string\n  }\n\n  getQnaPath() {\n    return this.qnaFile\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/serviceBase.js",
    "content": "/**\n * Copyright(c) Microsoft Corporation.All rights reserved.\n * Licensed under the MIT License.\n */\nconst os = require('os')\nconst packageJSON = require('./../../../package')\n\nconst fetch = require('node-fetch')\n\nglobal.fetch = function (...args) {\n  // No Proxy\n  if (!process.env.HTTPS_PROXY) {\n    return fetch(...args)\n  }\n  const [urlOrRequest, requestInit = {}, ...rest] = args\n  // URL is first param attach the proxy\n  // to the RequestInit\n  const HttpsProxyAgent = require('https-proxy-agent')\n  const agent = new HttpsProxyAgent(process.env.HTTPS_PROXY)\n  if (typeof urlOrRequest === 'string') {\n    requestInit.agent = agent\n  } else {\n    urlOrRequest.agent = agent\n  }\n  return fetch(urlOrRequest, requestInit, ...rest)\n}\n\n/**\n * Base class for all services\n */\nclass ServiceBase {\n  /**\n   *\n   * @param {string} rootEndpoint The root endpoint for this service\n   * @param {string} subscriptionkey The subscription key for this service\n   */\n  constructor(rootEndpoint, subscriptionkey) {\n    this.rootEndpoint = rootEndpoint\n    this.headers = this.commonHeaders(subscriptionkey)\n  }\n\n  /**\n   * Creates a request to the specified endpoint and returns\n   * a promise.\n   *\n   * @param {string} relativeEndpoint The relative endpoint for the request\n   * @param {'get'|'post'|'put'|'PATCH'|'delete'} method The method for the request\n   * @param {any} data The request data\n   * @returns {Promise<Response>} The promise representing the request\n   */\n  createRequest(relativeEndpoint, method, data) {\n    let URL = this.rootEndpoint + relativeEndpoint\n    let body\n    if (typeof data === 'string') {\n      URL += URL.includes('?') ? '&qnaformat=true' : '?qnaformat=true'\n      this.headers['Content-Type'] = 'application/text'\n      body = data\n    } else if (typeof data === 'object') {\n      this.headers['Content-Type'] = 'application/json'\n      body = JSON.stringify(data)\n    }\n    \n    return fetch(URL, {headers: this.headers, method, body})\n  }\n\n  commonHeaders(subscriptionKey) {\n    return {\n      'Content-Type': 'application/json',\n      'User-Agent': this.getUserAgent(),\n      'Ocp-Apim-Subscription-Key': subscriptionKey\n    }\n  }\n\n  getUserAgent() {\n    const packageUserAgent = `${packageJSON.name}/${packageJSON.version}`\n    const platformUserAgent = `(${os.arch()}-${os.type()}-${os.release()}; Node.js,Version=${process.version})`\n    const userAgent = `${packageUserAgent} ${platformUserAgent}`\n\n    return userAgent\n  }\n}\n\nmodule.exports = {ServiceBase}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/qnabuild/settings.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport class Settings {\n  public qna: any\n  private readonly settingsPath: string\n\n  constructor(settingsPath: string, qna: any) {\n    this.settingsPath = settingsPath\n    this.qna = qna\n  }\n\n  save(): string {\n    let output = {\n      qna: this.qna\n    }\n\n    return JSON.stringify(output, null, 4)\n  }\n\n  getSettingsPath(): string {\n    return this.settingsPath\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/test/testhelper.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst delay = require('delay')\n\nexport async function test(\n  client: any,\n  appId: string,\n  slotName: string,\n  options: {},\n  luisObject: any,\n  allowIntentsCount: number,\n  intentOnly: boolean,\n  resultLog: any[]) {\n  // luis api TPS which means 5 concurrent transactions to luis api in 1 second\n  // can set to other value if switched to a higher TPS(transaction per second) key\n  const concurrency = 5\n  const delayTime = 1000\n\n  // here we do a while loop to make full use of luis tps capacity\n  let index = 0\n  while (index < luisObject.utterances.length) {\n    const subUtterances = luisObject.utterances.slice(index, index + concurrency)\n    await Promise.all(subUtterances.map(async (utterance: any) => {\n      const predictionRequest: any = {}\n      predictionRequest.query = utterance.text\n      let predictedResult = await client.prediction.getSlotPrediction(appId, slotName, predictionRequest, options)\n      resultLog.push(predictedResult)\n      let result: any = new Object()\n      result.predictedIntents = []\n\n      let intentCount = 0\n      for (const intent of Object.keys(predictedResult.prediction.intents)) {\n        if (intentCount >= allowIntentsCount) {\n          break\n        }\n        const predictedIntents: any = {}\n        predictedIntents.intent = intent\n        predictedIntents.score = predictedResult.prediction.intents[intent].score\n        result.predictedIntents.push(predictedIntents)\n        intentCount++\n      }\n      result.IntentPass = compareIntent(result.predictedIntents, utterance)\n      if (!intentOnly) {\n        result.predictedEntities = []\n        ParseEntitiyResult(predictedResult.prediction.entities, result)\n        result.EntityPass = compareEntity(result.predictedEntities, utterance)\n      }\n      utterance.predictedResult = result\n    }))\n    await delay(delayTime)\n    index += concurrency\n  }\n\n  luisObject.intents.forEach((intent: any) => {\n    intent.count = 0\n    intent.passNumber = 0\n  })\n\n  luisObject.utterances.forEach((utterance: any) => {\n    let intent = luisObject.intents.find((item: any) => item.name === utterance.intent)\n    intent.count++\n    if (utterance.predictedResult.IntentPass && (utterance.predictedResult.EntityPass !== false)) {\n      intent.passNumber++\n    }\n  })\n\n  luisObject.test = true\n  luisObject.count = 0\n  luisObject.passNumber = 0\n  luisObject.intents.forEach((intent: any) => {\n    luisObject.count += intent.count\n    luisObject.passNumber += intent.passNumber\n  })\n}\n\n// we just check if the labeled intent is the same with the top-intent in predicted result\nfunction compareIntent(predictedIntents: any[], utterance: any) {\n  let pass = false\n  if (predictedIntents.length > 0) {\n    pass = predictedIntents[0].intent === utterance.intent ? true : false\n  }\n  return pass\n}\n\n// we just check if all the labeled entities are in the predicted result\nfunction compareEntity(predictedEntities: any[], utterance: any) {\n  let pass = true\n  for (const entity of utterance.entities) {\n    if (!predictedEntities.find((x: any) =>\n      (entity.role !== undefined && entity.role === x.role || entity.role === undefined && entity.entity === x.entity)\n      && entity.startPos === x.startPos\n      && entity.endPos === x.endPos)) {\n      pass = false\n      break\n    }\n  }\n  return pass\n}\n\n// convert the predicted result to specific format\nfunction ParseEntitiyResult(entities: any, result: any) {\n  for (const name of Object.keys(entities)) {\n    if (name === '$instance') {\n      for (const entityType of Object.keys(entities.$instance)) {\n        for (const entity of entities.$instance[entityType]) {\n          if (entity.modelTypeId === 1 || entity.modelTypeId === 4 || (entity.role !== undefined && entity.role !== '')) {\n            let newEntity: any = new Object()\n            newEntity.entity = entityType\n            newEntity.startPos = entity.startIndex\n            newEntity.endPos = entity.startIndex + entity.length - 1\n            if (entity.role !== undefined && entity.role !== '') {\n              newEntity.role = entity.role\n            }\n            result.predictedEntities.push(newEntity)\n          }\n        }\n      }\n    } else {\n      for (const subEntity of entities[name]) {\n        if (typeof subEntity === 'object') {\n          ParseEntitiyResult(subEntity, result)\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/translator/lutranslate.js",
    "content": "const exception = require('./../utils/exception')\nconst retCode = require('./../utils/enums/CLI-errors')\nconst translateHelpers = require('./../lufile/translate-helpers')\nconst Lu = require('./../lu/lu')\nconst LUOptions = require('./../lu/luOptions')\nconst Qna = require('./../lu/qna')\nconst QNAOptions = require('./../lu/qnaOptions')\n\nmodule.exports = {\n    translateLuList: async function(files, translate_key, to_lang, src_lang, translate_comments, translate_link_text) {\n        return await translateMarkDownList(files, translate_key, to_lang, src_lang, translate_comments, translate_link_text, true)\n    },\n    translateLu: async function(luObject, translate_key, to_lang, src_lang, translate_comments, translate_link_text) {\n        return await translateMarkDown(luObject, translate_key, to_lang, src_lang, translate_comments, translate_link_text, true)\n    },\n    translateQnAList: async function(files, translate_key, to_lang, src_lang, translate_comments, translate_link_text) {\n        return await translateMarkDownList(files, translate_key, to_lang, src_lang, translate_comments, translate_link_text, false)\n    },\n    translateQnA: async function(qnaObject, translate_key, to_lang, src_lang, translate_comments, translate_link_text) {\n        return await translateMarkDown(qnaObject, translate_key, to_lang, src_lang, translate_comments, translate_link_text, false)\n    }\n}\n\n\nconst translateMarkDownList = async function(files, translate_key, to_lang, src_lang, translate_comments, translate_link_text, isLu) {\n    let translation = {}\n    let i = 0\n    while(files.length > i) {\n        let luObject = files[i++]\n        try {\n            translation[luObject.id] = await translateMarkDown(luObject, translate_key, to_lang, src_lang, translate_comments, translate_link_text, isLu)      \n        } catch (err) {\n            throw(err);\n        }\n     }\n    return translation\n}\n\nconst translateMarkDown =  async function(luObject, translate_key, to_lang, src_lang, translate_comments, translate_link_text, isLu) {\n    let parsedLocContent = ''\n    let result = []\n    // Support multi-language specification for targets.\n    // Accepted formats are space or comma separated list of target language codes.\n    // Tokenize to_lang\n    let toLang = to_lang.split(/[, ]/g)\n    for (let idx in toLang) {\n        let tgt_lang = toLang[idx].trim();\n        if (tgt_lang === '') continue;\n        try {\n            parsedLocContent = await translateHelpers.parseAndTranslate(luObject.content, translate_key, tgt_lang, src_lang, translate_comments, translate_link_text, false)\n        } catch (err) {\n            throw(err);\n        }\n        if (!parsedLocContent) {\n            throw(new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Sorry, file : ' + file + 'had invalid content'));\n        } \n\n        result.push(isLu ? new Lu(parsedLocContent, new LUOptions(luObject.id, luObject.includeInCollate, tgt_lang)) : new Qna(parsedLocContent, new QNAOptions(luObject.id, luObject.includeInCollate, tgt_lang)))\n    }\n    return result\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/CLI-errors.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    errorCode: {\n        SUCCESS:                    0,\n        UNKNOWN_OPTIONS:            1,  \n        INVALID_INTENT:             2,  \n        INVALID_LINE:               3,  \n        OUTPUT_FOLDER_INVALID:      4,\n        OUTPUT_FILE_EXISTS:         5,\n        FILE_OPEN_ERROR:            6,\n        INVALID_INPUT_FILE:         7,\n        NO_LU_FILES_FOUND:          8,\n        UNABLE_TO_WRITE_FILE:       9,\n        DUPLICATE_ENTITIES:         10,\n        INVALID_INPUT:              11,\n        INVALID_URL_REF:            12,\n        INVALID_LU_FILE_REF:        13,\n        INVALID_QNA_FILTER_DEF:     14,\n        INVALID_QNA_QUESTION_DEF:   15,\n        INVALID_UTTERANCE_DEF:      16,\n        MISSING_LABELLED_VALUE:     17,\n        SYNONYMS_NOT_A_LIST:        18,\n        PHRASELIST_NOT_A_LIST:      19,\n        TRANSLATE_SERVICE_FAIL:     20,\n        INVALID_URI:                21,\n        INVALID_REGEX_ENTITY:       22,\n        INVALID_COMPOSITE_ENTITY:   23,\n        LUIS_API_CALL_FAILED:       24,\n        UNKNOWN_ERROR:              99,\n        BOUNDARY_INTENTS:           501,\n        BOUNDARY_PATTERNANYENTITY:  502,\n        BOUNDARY_UTTERANCES:        503,\n        BOUNDARY_UTTERANCE_CHAR_LENGTH: 504,\n        BOUNDARY_PATTERNS:          505,\n        BOUNDARY_PATTERN_CHAR_LIMIT:506,\n        BOUNDARY_REGEX_ENTITY:      507,\n        BOUNDARY_REGEX_CHAR_LIMIT:  508,\n        BOUNDARY_LIST_PARENT_LIMIT: 509,\n        BOUNDARY_SYNONYMS_LENGTH:   510,\n        BOUNDARY_PHRASE_LIST_LIMIT: 511,\n        BOUNDARY_TOTAL_PHRASES:     512,\n        BOUNDARY_INTC_PHRASES_LIMIT:513,\n        BOUNDARY_NINTC_PHRASES_LIMIT:514,\n        BOUNDARY_ROLES_PER_ENTITY:  515,\n        BOUNDARY_TOTAL_ROLES:       516,\n        BOUNDARY_FEATURE_PER_MODEL: 517,\n        BOUNDARY_PARENT_ENTITY_LIMIT:518,\n        BOUNDARY_TOTAL_ENTITIES_AND_ROLES:519,\n        BOUNDARY_TOTAL_CLOSED_LISTS:520\n    },\n    boundaryLimits: {\n        MAX_NUM_INTENTS:                    500,\n        MAX_NUM_UTTERANCES:                 15000,\n        MAX_NUM_PATTERNANY_ENTITIES:        100,\n        MAX_CHAR_IN_UTTERANCE:              500,\n        MAX_NUM_PATTERNS:                   500,\n        MAX_CHAR_IN_PATTERNS:               400,\n        MAX_NUM_REGEX_ENTITIES:             20,\n        MAX_CHAR_REGEX_ENTITY_PATTERN:      500,\n        MAX_LIST_ENTITY_CANONICAL_FORM:     50,\n        MAX_LIST_ENTITY_SYNONYMS:           20000,\n        MAX_NUM_PHRASE_LISTS:               500,\n        MAX_NUM_PHRASES_IN_ALL_PHRASE_LIST: 500000,\n        MAX_INTERCHANGEABLE_PHRASES:        50000,\n        MAX_NON_INTERCHANGEABLE_PHRASES:    5000,\n        MAX_ROLES_PER_ENTITY:               10,\n        MAX_NUM_ROLES:                      300,\n        MAX_NUM_DESCRIPTORS_PER_MODEL:      10,\n        MAX_NUM_PARENT_ENTITIES:            100,\n        MAX_TOTAL_ENTITES_AND_ROLES:        330,\n        MAX_NUM_CLOSED_LISTS:               50\n    }\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/invalidchars.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n // Invalid chars in intent or entity name\nmodule.exports = {\n    InvalidCharsInIntentOrEntityName: ['<', '>', '*', '%', '&', ':', '\\\\', '$']\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/luisEntityTypeNameMap.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    'simple': 'entities',\n    'prebuilt': 'prebuiltEntities',\n    'list': 'closedLists',\n    'regex': 'regex_entities',\n    'composite': 'composites',\n    'ml': 'entities',\n    'patternany':'patternAnyEntities',\n    'phraselist': 'model_features'\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/luisEntityTypes.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    SIMPLE: 'simple',\n    LIST: 'list',\n    REGEX: 'regex',\n    PREBUILT: 'prebuilt',\n    COMPOSITE: 'composite',\n    ML: 'ml',\n    PATTERNANY:'patternany',\n    PHRASELIST: 'phraselist'\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/luisbuiltintypes.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    consolidatedList: [\n        \"age\",\n        \"datetimeV2\",\n        \"dimension\",\n        \"email\",\n        \"geographyV2\",\n        \"keyPhrase\",\n        \"money\",\n        \"number\",\n        \"ordinal\",\n        \"ordinalV2\",\n        \"percentage\",\n        \"personName\",\n        \"phonenumber\",\n        \"temperature\",\n        \"url\",\n        \"datetime\"\n    ],\n    perLocaleAvailability: {\n        \"de-de\": {\n            \"datetime\": \"datetimeV2\",\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null\n        },\n        \"zh-cn\": {\n            \"datetime\": \"datetimeV2\",\n            \"keyPhrase\": null,\n            \"geographyV2\": null,\n            \"ordinalV2\": null\n        },\n        \"en-us\": {\n            \"datetime\": \"datetimeV2\"\n        },\n        \"fr-fr\": {\n            \"datetime\": \"datetimeV2\",\n            \"geographyV2\": null,\n            \"ordinalV2\": null,\n            \"personName\": null\n        },\n        \"fr-ca\": {\n            \"datetime\": \"datetimeV2\",\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null,\n            \"personName\": null\n        },\n        \"es-es\": {\n            \"datetime\": \"datetimeV2\",\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null\n        },\n        \"es-mx\": {\n            \"datetimeV2\": \"datetime\",\n            \"geographyV2\": null,\n            \"ordinalV2\": null,\n            \"personName\": null\n        },\n        \"it-it\": {\n            \"datetimeV2\": \"datetime\",\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null\n        },\n        \"ja-jp\": {\n            \"datetimeV2\": \"datetime\",\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null\n        },\n        \"pt-br\": {\n            \"datetime\": \"datetimeV2\",\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null\n        },\n        \"ko-kr\": {\n            \"datetimeV2\": null,\n            \"age\": null,\n            \"dimension\": null,\n            \"money\": null,\n            \"number\": null,\n            \"ordinal\": null,\n            \"percentage\": null,\n            \"temperature\": null,\n            \"datetime\": null,\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"ordinalV2\": null\n        },\n        \"nl-nl\": {\n            \"geographyV2\": null,\n            \"personName\": null,\n            \"datetimeV2\": null,\n            \"datetime\": null,\n            \"ordinalV2\": null\n        },\n        \"tr-tr\": {\n            \"age\": null,\n            \"datetimeV2\": null,\n            \"dimension\": null,\n            \"email\": null,\n            \"geographyV2\": null,\n            \"keyPhrase\": null,\n            \"money\": null,\n            \"number\": null,\n            \"ordinal\": null,\n            \"ordinalV2\": null,\n            \"percentage\": null,\n            \"personName\": null,\n            \"phonenumber\": null,\n            \"temperature\": null,\n            \"url\": null,\n            \"datetime\": null\n        }\n    }\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/luisobjenum.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    INTENT: \"intents\",\n    ENTITIES: \"entities\",\n    PATTERNANYENTITY: \"patternAnyEntities\",\n    CLOSEDLISTS: \"closedLists\",\n    PREBUILT: \"prebuiltEntities\",\n    UTTERANCE: \"utterances\",\n    PATTERNS: \"patterns\",\n    REGEX: \"regex_entities\",\n    COMPOSITES: \"composites\",\n    MACHINELEARNED: \"ml\"\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/lusectiontypes.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    SIMPLEINTENTSECTION: \"simpleIntentSection\",\n    NESTEDINTENTSECTION: \"nestedIntentSection\",\n    ENTITYSECTION: \"entitySection\",\n    NEWENTITYSECTION: \"newEntitySection\",\n    IMPORTSECTION: \"importSection\",\n    MODELINFOSECTION: \"modelInfoSection\",\n    QNASECTION: \"qnaSection\"\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/parsecommands.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst cmdEnum = {\n    luis: 'luis',\n    qna: 'qna'\n};\n\nmodule.exports = cmdEnum;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/parserconsts.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    FILEREF: \"#ref\",\n    INTENT: \"#\",\n    ENTITY: \"$\",\n    QNA: \"?\",\n    URLREF: \"#url\",\n    COMMENT: \">\",\n    URLORFILEREF: \"[\",\n    QNATABLE: \"|\",\n    ANSWER: \"```\",\n    FILTER: \"**\",\n    QNAALTERATIONS: \"qna-alterations\",\n    MODELINFO: \"!#\",\n    NEWENTITY: \"@\"\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/enums/recognizertypes.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports = {\n    LUIS: 'luis',\n    QNAMAKER: 'qnamaker',\n    MULTILANGUAGE: 'multiLanguage',\n    CROSSTRAINED: 'crosstrained'\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/exception.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst exception = class {\n    /**\n     * \n     * @param {string} errCode \n     * @param {string} text \n     * @param {any[]} diagnostics\n     */\n    constructor(errCode, text, diagnostics) {\n        if(errCode === Object(errCode)) {\n            this.text = errCode.text?errCode.text:'';\n            this.errCode = errCode.errCode?errCode.errCode:99;\n        } else {\n            this.text = text?text:'';\n            this.errCode = errCode?errCode:99;\n        }\n\n        this.diagnostics = diagnostics\n    }\n};\n\nmodule.exports = exception;"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/utils/helpers.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst fs = require('fs');\nconst path = require('path');\nconst retCode = require('./enums/CLI-errors');\nconst exception = require('./exception');\nconst NEWLINE = require('os').EOL;\nconst ANY_NEWLINE = /\\r\\n|\\r|\\n/g;\nconst url = require('url');\nconst hClasses = require('../lufile/classes/hclasses');\nconst helpers = {\n\n    /**\n     * \n     * @param {string} fileContent string content of file may contain any new line chars.\n     * @returns {string} string content of file using current OS new line char\n     */\n    sanitizeNewLines(fileContent) {\n        return fileContent.replace(ANY_NEWLINE, NEWLINE);\n    },\n    /**\n     * Enumeration of supported file extension types\n     */\n    FileExtTypeEnum: {\n        LUFile : '.lu',\n        QnAFile : '.qna'\n    },\n    /**\n     * Helper function to recursively get all .lu files\n     * @param {string} inputfolder input folder name\n     * @param {boolean} getSubFolder indicates if we should recursively look in sub-folders as well\n     * @param {FileExtTypeEnum} extType indicates if we should look for LUFile or QnAFile\n     * @returns {Array} Array of .lu files found\n    */\n    findLUFiles: function (inputFolder, getSubFolders, extType = this.FileExtTypeEnum.LUFile) {\n        let results = [];\n        fs.readdirSync(inputFolder).forEach(function (dirContent) {\n            dirContent = path.resolve(inputFolder, dirContent);\n            if (getSubFolders && fs.statSync(dirContent).isDirectory()) {\n                results = results.concat(helpers.findLUFiles(dirContent, getSubFolders, extType));\n            }\n            if (fs.statSync(dirContent).isFile()) {\n                if (dirContent.endsWith(extType)) {\n                    results.push(dirContent);\n                }\n            }\n        });\n        return results;\n    },\n    /**\n     * Helper function to get config.json files\n     * @param {string} inputfolder input folder name\n     * @returns {string} config.json file path found\n    */\n    findConfigFile: function (inputFolder) {\n        const dirContent = path.resolve(inputFolder, 'config.json')\n        try{\n            if (fs.statSync(dirContent).isFile()) {\n                return dirContent\n            }\n        } catch {\n            throw new Error(`No config.json file found under folder ${path.resolve(inputFolder)}`)\n        }        \n    },\n    /**\n     * Helper function to parse link URIs in utterances\n     * @param {String} utterance\n     * @param {String} srcId\n     * @param {Object} luSearchFn\n     * @returns {Object} Object that contains luFile and ref. ref can be Intent-Name or ? or * or **\n     * @throws {exception} Throws on errors. exception object includes errCode and text. \n     */\n    parseLinkURI: async function (utterance, srcId = null, luSearchFn = null) {\n        let linkValueList = utterance.trim().match(new RegExp(/\\(.*?\\)/g));\n        let linkValue = linkValueList[0].replace('(', '').replace(')', '');\n        if (linkValue === '') throw (new exception(retCode.errorCode.INVALID_LU_FILE_REF, `[ERROR]: Invalid LU File Ref: \"${utterance}\"`));\n        // reference can either be #<Intent-Name> or #? or /*#? or /**#? or #*utterance* or #<Intent-Name>*patterns*\n        let splitRegExp = new RegExp(/^(?<fileName>.*?)(?<segment>#|\\*+)(?<path>.*?)$/gim);\n        let splitReference = splitRegExp.exec(linkValue);\n        if (!splitReference) throw (new exception(retCode.errorCode.INVALID_LU_FILE_REF, `[ERROR]: Invalid LU File Ref: \"${utterance}\".\\n Reference needs a qualifier - either a #Intent-Name or #? or *#? or **#? or #*utterances* etc.`));\n        if (splitReference.groups.fileName && srcId && luSearchFn) {\n            let luObjects = await luSearchFn(srcId, [{filePath: splitReference.groups.fileName, includeInCollate: false}])\n            if (luObjects && luObjects.length > 0) splitReference.groups.fileName = luObjects[0].id\n        }\n        if (splitReference.groups.segment.includes('*')) {\n            if (splitReference.groups.path === '') {\n                throw (new exception(retCode.errorCode.INVALID_LU_FILE_REF, `[ERROR]: Invalid LU File Ref: \"${utterance}\".\\n '*' and '**' can only be used with QnA qualitifier. e.g. *#? and **#?`));\n            }\n            splitReference.groups.fileName += '*';\n        }\n        return splitReference.groups;\n    },\n    /**\n     * Helper function to do a filter operation based search over an Array\n     * @param {Array} srcList Object to filter on\n     * @param {string} property Property to evaluate\n     * @param {string} searchValue Target value to compare\n     * @returns {Array} Array of matching values\n     */\n    filterMatch: function (srcList, property, searchValue) {\n        return srcList.filter(function (item) {\n            return item[property] == searchValue;\n        });\n    },\n    /**\n     * Helper function to get roles if defined via the entity type definition\n     * @param {String} entityType entity type definition passed in.\n     * @returns {Object} roles and entityType parsed out. roles is always a list even if no role definitions are found\n     */\n    getRolesAndType: function (entityType) {\n        let returnValue = {\n            roles: [],\n            entityType: ''\n        };\n        let RoleDetectionRegEx = new RegExp(/[Rr]ole[s]*[\\s?]*=/g);\n        let RolesSplitRegEx = new RegExp(/[;,]/g);\n        let [parsedEntityType, parsedRoleDefinition] = entityType.split(RoleDetectionRegEx).map(item => item.trim());\n        returnValue.entityType = parsedEntityType;\n        if (parsedRoleDefinition !== undefined) {\n            returnValue.roles = parsedRoleDefinition.replace('[', '').replace(']', '').split(RolesSplitRegEx).map(item => item.trim());\n        }\n        return returnValue;\n    },\n    /**\n     * Helper function to detect if a given text is a link reference\n     * @param {String} utterance utterance text to examine\n     * @returns {Boolean} true if input is a link reference\n     */\n    isUtteranceLinkRef: function (utterance) {\n        utterance = utterance || '';\n        // Ensure only links are detected and passed on to be parsed.\n        // Valid link: [bar](xyz)\n        // Not a link: [bar](xyz|123), [bar[tar]](xyz), abc [foo](bar)\n        let linkDetectRegex = /^\\[[^\\[]+\\]\\([^|]+\\)$/gi;\n        return linkDetectRegex.test(utterance);\n    },\n    /**\n     * Helper function to detect if a given text is a pattern.\n     * @param {String} utterance\n     * @returns {Boolean} true if utterance is a pattern \n     */\n    isUtterancePattern: function (utterance) {\n        utterance = utterance || '';\n        // link references cannot be a pattern\n        if (this.isUtteranceLinkRef(utterance)) return false;\n\n        // patterns must have at least one [optional] and or one (group | text)\n        let detectPatternRegex = /(\\[.*?\\])|(\\(.*?(\\|.*?)+\\))/gi;\n        return detectPatternRegex.test(utterance);\n    },\n    hashCode : function(s) {\n        return s.split(\"\").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);              \n    },\n    /**\n     * Helper to detect luis schema version based on content and update the final payload as needed.\n     * @param {LUIS} finalLUISJSON \n     */\n    checkAndUpdateVersion : function(finalLUISJSON) {\n        if (!finalLUISJSON) return;\n        // clean up house keeping\n        if (finalLUISJSON.flatListOfEntityAndRoles)  delete finalLUISJSON.flatListOfEntityAndRoles\n        if (finalLUISJSON.utteranceHash) delete finalLUISJSON.utteranceHash\n        // Detect if there is content specific to 5.0.0 schema\n        // any entity with children\n        if (!finalLUISJSON) {\n            return\n        }\n        updateToV7(finalLUISJSON);\n    },\n    cleanUpExplicitEntityProperty : function(finalLUISJSON) {\n        (finalLUISJSON.entities || []).forEach(e => {\n            if (e.explicitlyAdded !== undefined) delete e.explicitlyAdded;\n        })\n    },\n    fixBuffer : function(fileBuffer) {\n        if (fileBuffer) {\n          // If the data starts with BOM, we know it is UTF\n          if (fileBuffer[0] === 0xEF && fileBuffer[1] === 0xBB && fileBuffer[2] === 0xBF) {\n            // EF BB BF  UTF-8 with BOM\n            fileBuffer = fileBuffer.slice(3)\n          } else if (fileBuffer[0] === 0xFF && fileBuffer[1] === 0xFE && fileBuffer[2] === 0x00 && fileBuffer[3] === 0x00) {\n            // FF FE 00 00  UTF-32, little-endian BOM\n            fileBuffer = fileBuffer.slice(4)\n          } else if (fileBuffer[0] === 0x00 && fileBuffer[1] === 0x00 && fileBuffer[2] === 0xFE && fileBuffer[3] === 0xFF) {\n            // 00 00 FE FF  UTF-32, big-endian BOM\n            fileBuffer = fileBuffer.slice(4)\n          } else if (fileBuffer[0] === 0xFE && fileBuffer[1] === 0xFF && fileBuffer[2] === 0x00 && fileBuffer[3] === 0x00) {\n            // FE FF 00 00  UCS-4, unusual octet order BOM (3412)\n            fileBuffer = fileBuffer.slice(4)\n          } else if (fileBuffer[0] === 0x00 && fileBuffer[1] === 0x00 && fileBuffer[2] === 0xFF && fileBuffer[3] === 0xFE) {\n            // 00 00 FF FE  UCS-4, unusual octet order BOM (2143)\n            fileBuffer = fileBuffer.slice(4)\n          } else if (fileBuffer[0] === 0xFF && fileBuffer[1] === 0xFE) {\n            // FF FE  UTF-16, little endian BOM\n            fileBuffer = fileBuffer.slice(2)\n          } else if (fileBuffer[0] === 0xFE && fileBuffer[1] === 0xFF) {\n            // FE FF  UTF-16, big endian BOM\n            fileBuffer = fileBuffer.slice(2)\n          }\n        }\n        return fileBuffer.toString('utf8').replace(/\\0/g, '');\n      }\n      \n};\n\nmodule.exports = helpers;\n\nconst updateToV7 = function(finalLUISJSON) {\n    let v7DefFound = false;\n    v7DefFound = (finalLUISJSON.entities || []).find(i => i.children || i.features) ||\n        (finalLUISJSON.intents || []).find(i => i.features) ||\n        (finalLUISJSON.composites || []).find(i => i.features) ||\n        (finalLUISJSON.luis_schema_version === '6.0.0' || \n        (finalLUISJSON.luis_schema_version === '7.0.0'));\n    if (v7DefFound) {\n        finalLUISJSON.luis_schema_version = \"7.0.0\";\n        if (finalLUISJSON.hasOwnProperty(\"model_features\")) {\n            if (finalLUISJSON.model_features !== undefined) {\n                finalLUISJSON.phraselists = finalLUISJSON.phraselists || [];\n                finalLUISJSON.model_features.forEach(item => {\n                    if (item.enabledForAllModels === undefined)\n                        item.enabledForAllModels = true;\n                    finalLUISJSON.phraselists.push(Object.assign({}, item));\n                });\n            }\n            delete finalLUISJSON.model_features;\n        }\n        (finalLUISJSON.composites || []).forEach(composite => {\n            let children = composite.children;\n            composite.children = [];\n            children.forEach(c => {\n                if (c.name === undefined) {\n                    composite.children.push({ name: c });\n                }\n                else {\n                    composite.children.push(c);\n                }\n            });\n        });\n        (finalLUISJSON.entities || []).forEach(entity => transformAllEntityConstraintsToFeatures(entity));\n        (finalLUISJSON.intents || []).forEach(intent => addIsRequiredProperty(intent));\n        // do we have nDepthEntities?\n        let nDepthEntityExists = (finalLUISJSON.entities || []).find(x => x.children !== undefined && Array.isArray(x.children) && x.children.length !== 0);\n        if (nDepthEntityExists !== undefined) {\n            // Remove dead ML entity definitions. \n            removeDeadMLEntityDefinitions(finalLUISJSON);\n            let entityParentTree = {};\n            const curPath = [\"$root$\"];\n            constructEntityParentTree(finalLUISJSON.entities, entityParentTree, curPath);\n            updateEntityParentTreeWithAllEntityTypes(finalLUISJSON, entityParentTree);\n            \n            // Verify that all parents of a child entity are labelled.\n            updateModelBasedOnNDepthEntities(finalLUISJSON.utterances, entityParentTree);\n            \n            transformUtterancesWithNDepthEntities(finalLUISJSON, entityParentTree)\n            verifyPatternsDoNotHaveChildEntityReferences(finalLUISJSON, entityParentTree)    \n        }\n    }\n}\n\nconst removeDeadMLEntityDefinitions = function(finalLUISJSON) {\n    let idxToRemove = [];\n    (finalLUISJSON.entities || []).forEach((entity, idx) => {\n        if (entity.explicitlyAdded === undefined || entity.explicitlyAdded !== true) {\n            // is this entity a child to a composite?\n            let compositeChild = (finalLUISJSON.composites || []).find(c => {\n                let x = c.children.find(x => {\n                    return x.name == entity.name\n                })\n                return x != undefined;\n            });\n            if (compositeChild !== undefined) return;\n            // is not the same name as a phrase list\n            let entityIsPL = (finalLUISJSON.phraselists || []).find(x => x.name == entity.name);\n            if (entityIsPL !== undefined) return;\n            idxToRemove.push(idx)\n        }\n    })\n    if (idxToRemove.length !== 0) {\n        idxToRemove.reverse().forEach(i => finalLUISJSON.entities.splice(i, 1))\n    }\n}\n\nconst updateModelBasedOnNDepthEntities = function(utterances, entityParentTree) \n{\n    let utterancesWithLabels = utterances.filter(utterance => utterance.entities && utterance.entities.length !== 0);\n    utterancesWithLabels.forEach(utterance => {\n        utterance.entities.forEach(entityInUtterance => {\n            let parentsForEntity = entityParentTree[entityInUtterance.entity];\n            if (parentsForEntity === undefined) return;\n            // do not proceed further if there isnt at least one non root parent\n            let nonRootParents = parentsForEntity.filter(t => t[0] != \"$root$\");\n            if (nonRootParents.length === 0) return;\n            let parentIsLabelled = false;\n            nonRootParents.forEach(tree => {\n                if (tree.length === 1 && tree[0] === \"$root$\") return;\n                if (parentIsLabelled) return;\n                tree.forEach(parent => {\n                    if (parent === \"$root$\") return;\n                    if (parentIsLabelled) return;\n                    let parentInUtterance = utterance.entities.find(x => x.entity == parent);\n                    if (parentInUtterance !== undefined) {\n                        parentIsLabelled = true;\n                    }\n                })\n            })\n            if (!parentIsLabelled) {\n                // Is the entity a root entity? \n                let isRootEntity = parentsForEntity.find(t => t[0] == \"$root$\")\n                if (isRootEntity === undefined) {\n                    const errorMsg = `Every child entity labelled in an utterance must have its parent labelled in that utterance. Child entity \"${entityInUtterance.entity}\" does not have its parent labelled in utterance \"${utterance.text}\" for intent \"${utterance.intent}\".`;\n                    throw (new exception(retCode.errorCode.INVALID_INPUT, errorMsg));\n                }\n            }\n        })\n    })\n}\n\nconst verifyPatternsDoNotHaveChildEntityReferences = function(finalLUISJSON, entityParentTree)\n{\n    if (finalLUISJSON.patterns === undefined || !Array.isArray(finalLUISJSON.patterns) || finalLUISJSON.patterns.length === 0) return;\n     (finalLUISJSON.patterns || []).forEach(pattern => {\n        // detect if pattern has an entity definition\n        let entitiesRegExp = /{(?<entity>[^{,}]+)}/gmi;\n        let entitiesFound = pattern.pattern.match(entitiesRegExp);\n        if (entitiesFound !== null) {\n            // verify that each entity is not a child entity\n            entitiesFound.forEach(entity => {\n                entity = entity.replace(/[{}]/g, '');\n                let entityInTree = entityParentTree[entity]\n                if (entityInTree !== undefined) {\n                    // at least one of these need to be a root entity.\n                    let isEntityAlsoRoot = entityInTree.find(item => item[0] === \"$root$\");\n                    if (isEntityAlsoRoot === undefined) {\n                        throw (new exception(retCode.errorCode.INVALID_INPUT, `Patterns cannot contain references to child entities. Pattern: \"${pattern.pattern}\" has reference to \"{${entity}}\".`));\n                    }                \n                }\n            })\n        }\n    })\n}\n\nconst updateEntityParentTreeWithAllEntityTypes = function(finalLUISJSON, entityParentTree)\n{\n    let collection = [\"prebuiltEntities\", \"patternAnyEntities\" ,\"model_features\", \"phraselists\", \"regex_entities\", \"closedLists\", \"composites\"];\n    collection.forEach(item => {\n        (finalLUISJSON[item] || []).forEach(entity => addEntityToParentTree(entityParentTree, entity.name));\n    })\n}\n\nconst addEntityToParentTree = function(entityParentTree, entityName)\n{\n    if (entityParentTree[entityName] === undefined) {\n        entityParentTree[entityName] = [[\"$root$\"]];\n    } else {\n        entityParentTree[entityName].push([\"$root$\"]);\n    }\n}\n\nconst constructEntityParentTree = function(entityCollection, entityParentTree, curPath)\n{\n    entityCollection.forEach(entity => {\n        if (entity.children !== undefined && Array.isArray(entity.children) && entity.children.length !== 0) {\n            constructEntityParentTree(entity.children, entityParentTree, curPath.concat(entity.name));\n        }\n        updateTreeWithNode(curPath, entity.name, entityParentTree)\n    })\n}\nconst updateTreeWithNode = function(curPath, entityName, entityParentTree) {\n    let revPath = JSON.parse(JSON.stringify(curPath.reverse()));\n    if (entityParentTree[entityName] === undefined) {\n        entityParentTree[entityName] = [revPath];\n    }\n    else {\n        if (entityParentTree[entityName].find(item => item.join('->') == revPath.join('->')) === undefined)\n            entityParentTree[entityName].push(revPath);\n    }\n    curPath.reverse();\n}\n\nconst transformUtterancesWithNDepthEntities = function (finalLUISJSON, entityParentTree) {\n    (finalLUISJSON.utterances || []).forEach(utt => {\n        if (utt.entities !== undefined && Array.isArray(utt.entities) && utt.entities.length !== 0) {\n            // sort all entities by start and end position\n            utt.entities = objectSortByStartPos(utt.entities)\n            let entityIdsToRemove = [];\n            utt.entities.forEach((item, idx) => {\n                // find the immediate parents of this entity\n                // if the enity has a role, find by that\n                let entityToFind = item.role || item.entity;\n                \n                if (entityParentTree[entityToFind] === undefined) {\n                    return;\n                }\n                let parentPathsForEntity = entityParentTree[entityToFind];\n                let parentIdx = [];\n                parentPathsForEntity.forEach(path => {\n                    utt.entities.find((i, id) => {\n                        if (i.entity === path[0] && i.startPos <= item.startPos && i.endPos >= item.endPos) {\n                            parentIdx.push(id);\n                        } \n                    })\n                })\n                if (parentIdx.length !== 0) {\n                    parentIdx.forEach(id => {\n                        if (item.role !== undefined) {\n                            item.entity = item.role;\n                            delete item.role;\n                        }\n                        if (utt.entities[id].children === undefined) {\n                            utt.entities[id].children = [item]\n                        } else {\n                            utt.entities[id].children.push(item);\n                        }\n                    })\n                    entityIdsToRemove.push(idx);\n                }\n            })\n            if (entityIdsToRemove.length !== 0) {\n                entityIdsToRemove.sort((a, b) => b - a).forEach(id => {\n                    utt.entities.splice(id, 1);\n                })\n            }\n            // remove any children that are not a root entity\n            removeNonRootChildren(utt.entities, finalLUISJSON.entities)\n        }\n    })\n}\n\nconst removeNonRootChildren = function(entitiesList, allEntitiesList) {\n    let idxToRemove = [];\n    entitiesList.forEach((entity, idx) => {\n        if (!isRootEntity(entity.entity, allEntitiesList)) {\n            idxToRemove.push(idx)\n        }\n    })\n    if (idxToRemove.length !== 0) {\n        idxToRemove.sort((a,b) => b-a).forEach(id => entitiesList.splice(id, 1));\n        idxToRemove = [];\n    }\n    // de-dupe children\n    deDupeChildren(entitiesList);\n}\n\nconst deDupeChildren = function(collection) {\n    collection.forEach(entity => {\n        if (entity.children !== undefined && Array.isArray(entity.children) && entity.children.length !== 0) {\n            let childAsStr = entity.children.map(item => JSON.stringify(item));\n            var newList = [];\n            childAsStr.forEach(item => {\n                if (newList.indexOf(item) === -1) newList.push(item)\n            })\n            entity.children = newList.map(item => JSON.parse(item))\n            deDupeChildren(entity.children)\n        }\n    })\n}\n\nconst isRootEntity = function (entityName, entitiesCollection) {\n    if ((entitiesCollection || []).find(ecEntity => ecEntity.name == entityName) !== undefined)\n        return true\n    return false\n}\n\nconst findParent = function (entityInUtt, entityCollection, parentTree, curParent) {\n    let numOfParentsFound = 0;\n    entityCollection.forEach(childEntity => {\n        if (childEntity.name == entityInUtt.entity) {\n            parentTree[curParent] = childEntity.name;\n            numOfParentsFound++;\n        }\n        if (childEntity.children !== undefined && Array.isArray(childEntity.children) && childEntity.children.length !== 0) {\n            parentTree[childEntity.name] = {};\n            numOfParentsFound += findParent(entityInUtt, childEntity.children, parentTree[childEntity.name], childEntity.name)\n        }\n    });\n    return numOfParentsFound;\n}\n\nconst objectSortByStartPos = function (objectArray) {\n    let ObjectByStartPos = objectArray.slice(0);\n    ObjectByStartPos.sort(function (a, b) {\n        if (a.startPos === b.startPos)\n            return a.endPos - b.endPos;\n        return a.startPos - b.startPos;\n    })\n    return ObjectByStartPos\n}\n\nconst transformAllEntityConstraintsToFeatures = function(entity) {\n    addIsRequiredProperty(entity);\n    if (entity.hasOwnProperty(\"instanceOf\") && entity.instanceOf !== null) {\n        if (entity.hasOwnProperty(\"features\") && Array.isArray(entity.features)) {\n            let featureFound = (entity.features || []).find(i => i.modelName == entity.instanceOf);\n            if (featureFound !== undefined) {\n                if (featureFound.featureType === undefined)\n                    featureFound.isRequired = true;\n            }\n            else {\n                entity.features.push(new hClasses.entityFeature(entity.instanceOf, true));\n            }\n        }\n        else {\n            if (entity.instanceOf !== \"\" && entity.instanceOf !== null)\n            entity.features = [new hClasses.entityFeature(entity.instanceOf, true)];\n        }\n    }\n    delete entity.instanceOf;\n    if (!entity.children || entity.children.length === 0)\n        return;\n    entity.children.forEach(c => transformAllEntityConstraintsToFeatures(c));\n};\n\nconst addIsRequiredProperty = function(item) {\n    (item.features || []).forEach(feature => {\n        if (feature.isRequired === undefined)\n            feature.isRequired = false;\n        delete feature.featureType;\n        delete feature.modelType;\n    });\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/utils/filehelper.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {readTextFile} from './textfilereader'\nimport Lu = require('../parser/lu/lu')\nconst exception = require('./../parser/utils/exception')\nconst retCode = require('./../parser/utils/enums/CLI-errors')\nconst fs = require('fs-extra')\nconst path = require('path')\nconst helpers = require('./../parser/utils/helpers')\nconst LUOptions = require('./../parser/lu/luOptions')\nconst luParser = require('./../parser/lufile/luParser')\nconst LUSectionTypes = require('./../parser/utils/enums/lusectiontypes')\nconst globby = require('globby')\n\n/* tslint:disable:prefer-for-of no-unused*/\n\nexport async function getLuObjects(stdin: string, input: string | undefined, recurse = false, extType: string | undefined) {\n  let luObjects: any = []\n  if (input) {\n    let luFiles = await getLuFiles(input, recurse, extType)\n    for (let i = 0; i < luFiles.length; i++) {\n      let luContent = await getContentFromFile(luFiles[i])\n      const opts = new LUOptions(path.resolve(luFiles[i]))\n      luObjects.push(new Lu(luContent, opts))\n    }\n  } else {\n    luObjects.push(new Lu(stdin, new LUOptions('stdin')))\n  }\n\n  return luObjects\n}\n\nexport async function getLuFiles(input: string | undefined, recurse = false, extType: string | undefined): Promise<Array<any>> {\n  let filesToParse: any[] = []\n  let fileStat = await fs.stat(input)\n  if (fileStat.isFile()) {\n    filesToParse.push(path.resolve(input))\n    return filesToParse\n  }\n\n  if (!fileStat.isDirectory()) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Sorry, ' + input + ' is not a folder or does not exist'))\n  }\n\n  filesToParse = helpers.findLUFiles(input, recurse, extType)\n\n  return filesToParse\n}\n\nexport async function getContentFromFile(file: string) {\n  // catch if input file is a folder\n  if (fs.lstatSync(file).isDirectory()) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Sorry, \"' + file + '\" is a directory! Unable to read as a file'))\n  }\n  if (!fs.existsSync(path.resolve(file))) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Sorry [' + file + '] does not exist'))\n  }\n  let fileContent\n  try {\n    fileContent = await readTextFile(file)\n  } catch (err) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Sorry, error reading file: ' + file))\n  }\n  return fileContent\n}\n\nexport async function generateNewFilePath(outFileName: string, inputfile: string, isLu: boolean, prefix = '', extType: string = helpers.FileExtTypeEnum.LUFile): Promise<string> {\n  let base = path.resolve(outFileName)\n  let root = path.dirname(base)\n  if (!fs.existsSync(root)) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Path not found: ' + root))\n  }\n\n  let extension = path.extname(base)\n  if (extension) {\n    return path.join(root, prefix + path.basename(base))\n  }\n\n  let name = ''\n  let inputStat = await fs.stat(inputfile)\n  if (inputStat.isFile()) {\n    name += path.basename(inputfile, path.extname(inputfile)) + (isLu ? '.json' : extType)\n  } else {\n    name += isLu ? 'converted.json' : `converted.${extType}`\n  }\n  return path.join(base, prefix + name)\n}\n\nexport async function generateNewTranslatedFilePath(fileName: string, translatedLanguage: string, output: string): Promise<string> {\n  let newPath = path.resolve(output)\n\n  let extension = path.extname(newPath)\n  if (extension) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Output can only be writen to a folder'))\n  }\n\n  if (!fs.existsSync(newPath)) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Path not found: ' + newPath))\n  }\n\n  newPath = path.join(output, translatedLanguage)\n  await fs.mkdirp(newPath)\n  return path.join(newPath, path.basename(fileName))\n}\n\nexport function validatePath(outputPath: string, defaultFileName: string, forceWrite = false): string {\n  let completePath = path.resolve(outputPath)\n  const containingDir = path.dirname(completePath)\n\n  // If the cointaining folder doesnt exist\n  if (!fs.existsSync(containingDir)) throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Containing directory path doesn't exist: ${containingDir}`))\n\n  const baseElement = path.basename(completePath)\n  const pathAlreadyExist = fs.existsSync(completePath)\n\n  // If the last element in the path is a file\n  if (baseElement.includes('.')) {\n    return pathAlreadyExist && !forceWrite ? enumerateFileName(completePath) : completePath\n  }\n\n  // If the last element in the path is a folder\n  if (!pathAlreadyExist) throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Target directory path doesn't exist: ${completePath}`))\n  completePath = path.join(completePath, defaultFileName)\n  return fs.existsSync(completePath) && !forceWrite ? enumerateFileName(completePath) : completePath\n}\n\nfunction enumerateFileName(filePath: string): string {\n  const fileName = path.basename(filePath)\n  const containingDir = path.dirname(filePath)\n\n  if (!fs.existsSync(containingDir)) throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Containing directory path doesn't exist: ${containingDir}`))\n\n  const extension = path.extname(fileName)\n  const baseName = path.basename(fileName, extension)\n  let nextNumber = 0\n  let newPath = ''\n\n  do {\n    newPath = path.join(containingDir, baseName + `(${++nextNumber})` + extension)\n  } while (fs.existsSync(newPath))\n\n  return newPath\n}\n\nexport async function detectLuContent(stdin: string, input: string) {\n  if (!stdin && !input) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Missing input. Please use stdin or pass a file location with --in flag'))\n  }\n\n  if (!stdin) {\n    if (!fs.existsSync(path.resolve(input))) {\n      throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Sorry unable to open [${input}]`))\n    }\n\n    let inputStat = await fs.stat(input)\n    return !inputStat.isFile() ? true : (path.extname(input) === '.lu' || path.extname(input) === '.qna')\n  }\n\n  try {\n    await JSON.parse(stdin)\n  } catch (error) {\n    return true\n  }\n  return false\n}\n\nexport async function getFilesContent(input: string, extType: string) {\n  let fileStat = await fs.stat(input)\n  if (fileStat.isFile()) {\n    const filePath = path.resolve(input)\n    const content = await getContentFromFile(input)\n    return [{id: filePath, content}]\n  }\n\n  if (!fileStat.isDirectory()) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'Sorry, ' + input + ' is not a folder or does not exist'))\n  }\n  const paths = await globby([`**/*${extType}`], {cwd: input, dot: true})\n  return Promise.all(paths.map(async (item: string) => {\n    const itemPath = path.resolve(path.join(input, item))\n    const content = await getContentFromFile(itemPath)\n    return {id: itemPath, content}\n  }))\n}\n\nexport async function getConfigContent(input: string) {\n  const luConfigFile = await getConfigFile(input)\n  const content = await getContentFromFile(luConfigFile)\n  return {id: luConfigFile, content}\n}\n\nasync function getConfigFile(input: string): Promise<string> {\n  let fileStat = await fs.stat(input)\n  if (fileStat.isFile()) {\n    return input\n  }\n\n  if (!fileStat.isDirectory()) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Sorry, ${input} is not a folder or does not exist`))\n  }\n\n  const defaultConfigFile = helpers.findConfigFile(input)\n\n  if (defaultConfigFile === undefined || defaultConfigFile === '') {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Sorry, no config file found in folder ${input}.`))\n  }\n\n  return defaultConfigFile\n}\n\nexport function getParsedObjects(contents: {id: string, content: string}[]) {\n  const parsedObjects = contents.map(content => {\n    const opts = new LUOptions(content.id)\n    return new Lu(content.content, opts)\n  })\n\n  return parsedObjects\n}\n\nexport function getConfigObject(configContent: any, intentName: string, verbose: boolean) {\n  let finalLuConfigObj = Object.create(null)\n  let rootLuFiles: string[] = []\n  const configFileDir = path.dirname(configContent.id)\n  const luConfigContent = configContent.content\n  if (luConfigContent && luConfigContent !== '') {\n    try {\n      const luConfigObj = JSON.parse(luConfigContent)\n      for (const rootluFilePath of Object.keys(luConfigObj)) {\n        const rootLuFileFullPath = path.resolve(configFileDir, rootluFilePath)\n        const triggerObj = luConfigObj[rootluFilePath]\n        for (const triggerObjKey of Object.keys(triggerObj)) {\n          if (triggerObjKey === 'rootDialog') {\n            if (triggerObj[triggerObjKey]) {\n              rootLuFiles.push(rootLuFileFullPath)\n            }\n          } else if (triggerObjKey === 'triggers') {\n            const triggers = triggerObj[triggerObjKey]\n            for (const triggerKey of Object.keys(triggers)) {\n              const destLuFiles = triggers[triggerKey] instanceof Array ? triggers[triggerKey] : [triggers[triggerKey]]\n              for (const destLuFile of destLuFiles) {\n                const destLuFileFullPath = destLuFile && destLuFile !== '' ? path.resolve(configFileDir, destLuFile) : destLuFile\n                if (rootLuFileFullPath in finalLuConfigObj) {\n                  const finalIntentToDestLuFiles = finalLuConfigObj[rootLuFileFullPath]\n                  if (finalIntentToDestLuFiles[triggerKey]) {\n                    finalIntentToDestLuFiles[triggerKey].push(destLuFileFullPath)\n                  } else {\n                    finalIntentToDestLuFiles[triggerKey] = [destLuFileFullPath]\n                  }\n                } else {\n                  let finalIntentToDestLuFiles = Object.create(null)\n                  finalIntentToDestLuFiles[triggerKey] = [destLuFileFullPath]\n                  finalLuConfigObj[rootLuFileFullPath] = finalIntentToDestLuFiles\n                }\n              }\n            }\n          }\n        }\n      }\n    } catch (err) {\n      throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Sorry, invalid cross training config: ${err}`))\n    }\n  }\n\n  if (rootLuFiles.length > 0) {\n    let crossTrainConfig = {\n      rootIds: rootLuFiles,\n      triggerRules: finalLuConfigObj,\n      intentName,\n      verbose\n    }\n\n    return crossTrainConfig\n  } else {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, 'rootDialog property is required in config file'))\n  }\n}\n\nexport function parseJSON(input: string, appType: string) {\n  try {\n    return JSON.parse(input)\n  } catch (error) {\n    throw (new exception(retCode.errorCode.INVALID_INPUT_FILE, `Sorry, error parsing content as ${appType} JSON`))\n  }\n}\n\nexport function getCultureFromPath(file: string): string | null {\n  let fn = path.basename(file, path.extname(file))\n  let lang = path.extname(fn).substring(1)\n  switch (lang.toLowerCase()) {\n  case 'en-us':\n  case 'zh-cn':\n  case 'nl-nl':\n  case 'fr-fr':\n  case 'fr-ca':\n  case 'de-de':\n  case 'it-it':\n  case 'ja-jp':\n  case 'ko-kr':\n  case 'pt-br':\n  case 'es-es':\n  case 'es-mx':\n  case 'tr-tr':\n    return lang\n  default:\n    return null\n  }\n}\n\nexport function isAllFilesSectionEmpty(contents: Lu[]): boolean {\n  let isAllFilesSectionEmpty = true\n  for (const content of contents) {\n    let resource = luParser.parse(content.content)\n    if (resource.Sections.filter((s: any) => s.SectionType !== LUSectionTypes.MODELINFOSECTION).length > 0) {\n      isAllFilesSectionEmpty = false\n      break\n    }\n  }\n\n  return isAllFilesSectionEmpty\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/utils/textfilereader.ts",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = require('fs-extra')\nconst error = require('./../parser/utils/exception')\nconst retCode = require('./../parser/utils/enums/CLI-errors')\nconst helpers = require('./../parser/utils/helpers')\n\nexport async function readTextFile(file: any): Promise<string> {\n  return new Promise(async (resolve, reject) => {\n    try {\n      if (!fs.existsSync(file)) {\n        return reject('ENOENT: no such file or directory, ' + file)\n      }\n      let fileBuffer = await fs.readFile(file)\n      return resolve(helpers.fixBuffer(fileBuffer))\n    } catch (err) {\n      if (err.message.match(/ENOENT: no such file or directory/)) {\n        return reject(new error(retCode.errorCode.INVALID_INPUT_FILE, err.message))\n      }\n\n      return reject(`Invalid Input. Sorry, unable to parse file: ${err}`)\n    }\n  })\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/commands/luis/convert.test.js",
    "content": "const fs = require('fs-extra')\nconst path = require('path')\nconst NEWLINE = require('os').EOL\nvar chai = require('chai');\nvar assert = chai.assert;\nconst LuisBuilder = require('./../../../src/parser/luis/luisBuilder')\n\nconst loadLuFile = async function(filePath) {\n    let fileContent = await fs.readFile(path.join(__dirname, filePath))\n    return sanitize(fileContent)\n}\n\nconst sanitize = function(content) {\n    return content.toString().replace(/\\r\\n/g, \"\\n\")\n}\n  \nconst loadJsonFile = async function(filePath) {\n    let result = await fs.readJson(path.join(__dirname, filePath))\n    result = sanitizeExampleJson(JSON.stringify(result))\n    return JSON.parse(result)\n}\n\nfunction sanitizeExampleJson(fileContent) {\n    let escapedExampleNewLine = JSON.stringify('\\r\\n').replace(/\"/g, '').replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    let escapedNewLine = JSON.stringify(NEWLINE).replace(/\"/g, '');\n    return fileContent.replace(new RegExp(escapedExampleNewLine, 'g'), escapedNewLine);\n}\n\nconst assertToLu = async function(srcJSONFile, tgtLUFile) {\n    let testInputFile = await loadJsonFile(srcJSONFile)\n    let testInputJSON = LuisBuilder.fromJson(testInputFile)\n    let testContent = testInputJSON.parseToLuContent();\n    let verifiedContent = await loadLuFile(tgtLUFile)\n    assert.deepEqual(sanitize(testContent), verifiedContent)\n}\n\nconst assertToJSON = async function(srcLUFile, tgtJSONFile, name = undefined) {\n    let testInputFile = await loadLuFile(srcLUFile)\n    let testContent = await LuisBuilder.fromLUAsync(testInputFile)\n    if (name !== undefined) testContent.name = name\n    let verifiedContent = await loadJsonFile(tgtJSONFile)\n    assert.deepEqual(testContent, verifiedContent)\n}\n\ndescribe('luis:convert', () => {\n    it('luis:convert successfully reconstructs a markdown file from a LUIS input file with out of order entity references', async () => {\n        await assertToLu('./../../fixtures/testcases/test269-d.json', './../../fixtures/verified/test269-d.lu')\n    })\n\n    it('luis:convert successfully reconstructs a markdown file from a LUIS input file', async () => {\n        await assertToLu('./../../fixtures/verified/all.json', './../../fixtures/verified/allGen.lu')\n    })\n\n    it('luis:convert successfully reconstructs a markdown file from a LUIS input file (phrase list as feature)', async () => {\n        await assertToLu('./../../fixtures/verified/plFeatures.json', './../../fixtures/verified/plFeatures.lu')\n    })\n\n    it('luis:convert successfully reconstructs a markdown file from a LUIS input file (model as features)', async () => {\n        await assertToLu('./../../fixtures/verified/modelAsFeatures.json', './../../fixtures/verified/modelAsFeatureGen.lu')\n    })\n    it('luis:convert successfully reconstructs a markdown file from a LUIS input file (with nDepth entity definitions in utterances)', async () => {\n        await assertToLu('./../../fixtures/verified/nDepthEntityInUtterance.json', './../../fixtures/verified/nDepthEntityInUtterance.lu')\n    })\n\n    it('luis:convert Simple intent and utterances are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/1.lu', './../../fixtures/verified/1.json', '1')\n    })\n\n    it('luis:convert Multiple intent and utterance definition sections are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/3.lu', './../../fixtures/verified/3.json', '3')\n    })\n\n    it('luis:convert Uttearnces with labelled values are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/4.lu', './../../fixtures/verified/4.json', '4')\n    })\n\n    it('luis:convert Simple entity declaration is parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/5.lu', './../../fixtures/verified/5.json', '5')\n    })\n\n    it('luis:convert Prebuilt entity types are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/6.lu', './../../fixtures/verified/6.json', '6')\n    })\n    it('luis:convert Pattern.any entity types are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/7.lu', './../../fixtures/verified/7.json', '7')\n    })\n\n    it('luis:convert List entity types are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/9.lu', './../../fixtures/verified/9.json', '9')\n    })\n\n    it('luis:convert list entity definitions and intent definitions can be split up and will be parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/9a.lu', './../../fixtures/verified/9a.json', '9a')\n    })\n\n    it('luis:convert phraselist entity types are parsed correctly', async () => {\n        await assertToJSON('./../../fixtures/examples/13.lu', './../../fixtures/verified/13.json', '13')\n    })\n\n    it('Parse to LU instance', async () => {\n        let luFile = `\n        @ ml test\n        # test\n        - this is a {@test = one}\n        `;\n\n        let result = `\n> LUIS application information\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n## test\n- this is a {@test=one}\n\n\n> # Entity definitions\n\n@ ml test\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n`\n        const luisObject = await LuisBuilder.fromLUAsync(luFile)\n        const newLU = luisObject.parseToLU()\n        assert.equal(sanitize(newLU.content), result); \n    });\n})\ndescribe('luis:convert version 7 upgrade test', () => {\n    it('luis:convert successfully converts a lu file with depth information preserved in entity and utterances', async () => {\n        await assertToJSON('./../../fixtures/examples/v7UpgradeTest.lu', './../../fixtures/verified/v7UpgradeTest.json')\n    })\n\n    it('luis:convert successfully converts a JSON file with depth information preserved in entity and utterances', async () => {\n        await assertToLu('./../../fixtures/verified/v7UpgradeTest.json', './../../fixtures/verified/v7UpgradeTest.lu')\n    })\n\n    it('V7 json from LUIS team converts correctly to lu format', async () => {\n        await assertToLu('./../../fixtures/testcases/v7app.json', './../../fixtures/verified/v7app.lu')\n    })\n\n    it('V7 LU (from LUIS team) converts correctly to JSON format', async () => {\n        await assertToJSON('./../../fixtures/verified/v7app.lu', './../../fixtures/verified/v7app_c.json')\n    })\n\n    it('luis:convert successfully reconstructs a markdown file from a LUIS input file with v5 constructs', async () => {\n        await assertToJSON('./../../fixtures/verified/v5UpgradeTest.lu', './../../fixtures/verified/v5Upgrade.json')\n    })\n  \n    it('luis:convert successfully converts LU with ndepth entity and features to LUIS JSON model', async () => {\n        await assertToJSON('./../../fixtures/examples/newEntityWithFeatures.lu', './../../fixtures/verified/newEntityWithFeatures.json')\n    })\n  \n    it('luis:convert successfully converts LUIS JSON model with nDepth entity and features to LU', async () => {\n        await assertToLu('./../../fixtures/verified/newEntityWithFeatures.json', './../../fixtures/verified/newEntityWithFeatures.lu')\n    })\n  \n    it('luis:convert successfully converts LUIS JSON model with empty intent feature descriptors', async () => {\n        await assertToLu('./../../fixtures/testcases/emptyIntentDescriptors.json', './../../fixtures/verified/emptyIntentDescriptors.lu')\n    })\n\n    it('luis:convert successfully converts LUIS JSON model with no phrase lists (output must have phraselists if any v6 concepts are present in the .lu file)', async () => {\n        await assertToJSON('./../../fixtures/testcases/v6WithoutPhraseLists.lu', './../../fixtures/verified/v6WithoutPhraseLists.json')\n    })\n  \n    it('luis:convert successfully converts LUIS JSON model with no phrase lists (output must have phraselists if any v6 concepts are present in the .lu file)', async () => {\n        await assertToJSON('./../../fixtures/testcases/plWithFlags.lu', './../../fixtures/verified/plWithFlags.json')\n    })\n\n    it('Child entities names with spaces in them parse correctly to .lu format', async () => {\n        await assertToLu('./../../fixtures/testcases/Child_Entity_With_Spaces.json', './../../fixtures/verified/Child_Entity_With_Spaces.lu')\n    })\n  })\n\ndescribe('luis:convert negative tests', () => {\n    it('luis:convert should show ERR message when no utterances are found for an intent', (done) => {\n        loadLuFile('./../../fixtures/testcases/bad3.lu')\n            .then(res => {\n                LuisBuilder.fromLUAsync(res)\n                    .then(res => done(res))\n                    .catch(err => {\n                        assert.isTrue(err.text.includes(`[ERROR] line 4:0 - line 4:16: Invalid intent body line, did you miss \\'-\\' at line begin`))\n                        done()\n                    })\n            })    \n        \n    })\n  \n    it('luis:convert should show ERR message when no labelled value is found for an entity', (done) => {\n        loadLuFile('./../../fixtures/testcases/bad3a.lu')    \n            .then(res => {\n                LuisBuilder.fromLUAsync(res)\n                    .then(res => done(res))\n                    .catch(err => {\n                        assert.isTrue(err.text.includes(`[ERROR] line 4:0 - line 4:19: No labelled value found for entity: \"tomato\" in utterance: \"- i wangt {tomato=}\"`))\n                        done()\n                    })\n            })\n        \n    })\n  \n    it('luis:convert should show ERR message when no labelled value is found for an entity', (done) => {\n        loadLuFile('./../../fixtures/testcases/bad2.lu')    \n            .then(res => {\n                LuisBuilder.fromLUAsync(res)\n                .then(res => done(res))\n                .catch(err => {\n                    assert.isTrue(err.text.includes(`[ERROR] line 1:0 - line 1:1: syntax error: invalid input 'f' detected.`))\n                    done()\n                })\n            })\n        \n    })\n\n    it('luis:convert should show ERR message when prebuilt entity in pattern is not explicitly defined', (done) => {\n        loadLuFile('./../../fixtures/testcases/bad4.lu')    \n            .then(res => {\n                LuisBuilder.fromLUAsync(res)\n                .then(res => done(res))\n                .catch(err => {\n                    assert.isTrue(err.text.includes(`[ERROR] line 2:0 - line 2:27: Pattern \"- hi {@personName:userName}\" has prebuilt entity personName. Please define it explicitly with @ prebuilt personName.`))\n                    done()\n                })\n            })\n        \n    })\n\n    it('luis:convert should show ERR message when entity name contains invalid char', (done) => {\n        loadLuFile('./../../fixtures/testcases/bad5.lu')\n            .then(res => {\n                LuisBuilder.fromLUAsync(res)\n                    .then(res => done(res))\n                    .catch(err => {\n                        assert.isTrue(err.text.includes('[ERROR] line 2:0 - line 2:26: Invalid utterance line, entity name @addto*Property cannot contain any of the following characters: [<, >, *, %, &, :, \\\\, $]'))\n                        assert.isTrue(err.text.includes('[ERROR] line 4:0 - line 4:20: Invalid entity line, entity name delete$Property cannot contain any of the following characters: [<, >, *, %, &, :, \\\\, $]'))\n                        done()\n                    })\n            })\n    })\n  })\n\ndescribe('luis:convert new entity format', () => {\n    it('luis:convert with new entity format correctly produces a LU file', async () => {\n        await assertToLu('./../../fixtures/testcases/newEntity1.json', './../../fixtures/verified/newEntity1.lu')\n    })\n  \n    it('luis:convert with new entity format and single roles correctly produces a LU file', async () => {\n        await assertToLu('./../../fixtures/testcases/newEntity1.json', './../../fixtures/verified/newEntity1.lu')\n     })\n})\n\ndescribe('luis:convert with pattern.any inherits information', () => {\n    it('luis:convert with pattern.any inherits information correctly produces a LUIS app', async () => {\n        assertToJSON('./../../fixtures/verified/LUISAppWithPAInherits.lu', './../../fixtures/verified/LUISAppWithPAInherits.lu.json')\n    })\n\n    it('luis:convert with pattern.any inherits information correctly produces a LUIS app', async () => {\n        assertToLu('./../../fixtures/testcases/LUISAppWithPAInherits.json', './../../fixtures/verified/LUISAppWithPAInherits.lu')\n    })\n})\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/empty.json",
    "content": ""
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/empty.lu",
    "content": ""
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/es/file.lu",
    "content": "> # Intent definitions\n\n## Calendar.Add\n- añadir un nuevo evento el 27 - apr\n- añadir una nueva tarea de terminar la asignación\n- añadir un evento para leer sobre las noticias de Adam Lambert\n- añadir un evento para visitar 209 nashville gimnasio\n- añadir teatro imax a mis próximos eventos\n- calendario i ' estaré en el garaje de 8 a 3 este sábado\n- dunmore pa sonidos sónicos viernes por la mañana por favor\n- reunirse con mi gerente\n- guardar la fecha mayo 17 fotos fiesta\n- programar cita para mañana por favor\n- la reunión durará una hora\n\n\n## Calendar.Find\n- calendario para noviembre de 1948\n- mostrar planes de fin de semana\n- ¿Tengo algo el miércoles?\n- ¿cuántos días hay entre el 13 de marzo de 2015 y hoy?\n- tirar de mi cita averiguar cuánto tiempo tengo antes de mi próxima cita\n- buscar reuniones con Chris\n- mostrarme mañana ' hora de la fiesta de bodas\n- dime los detalles del evento\n- voz activada lectura de citas esta semana\n\n\n## None\n- soy libre de estar con amigos sábado ?\n- cita con Johnson tiene que ser la próxima semana\n- llamar a papá Mike\n- cambiar la reunión con Chris a 9 : 00 am\n- correo electrónico clony john\n- extender la reunión de almuerzo 30 minutos extra\n- Quiero reprogramar la reunión en el club de la fuerza aérea\n- reuniones de marketing los martes ahora será todos los miércoles por favor cambiar en mi calendario\n- mover la fiesta de barbacoa al viernes\n- el taller durará 10 horas\n\n\n> # Entity definitions\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/1.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/10.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n# Help\n- can you help\n\n> you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> You can have references to external .lu files\n\n[None intent definition](./none.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/11.lu",
    "content": "> You can have an lu file that just has references to other lu files\n\n[Intent collection 9](./9.lu)\n\n[Change Alarm intent](./changeAlarm.lu)\n\n[None intent](./none.lu)\n\n[QnA1](./qna3.lu)\n\n[QnA7](./qna7.lu)\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/12.lu",
    "content": "> # Intents\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n## Help\n- help\n- I need help\n- please help\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n## DeleteAlarm\n- delete alarm\n- delete the {alarmTime} alarm\n\n\n\n## CommunicationPreference\n- set call as my communication preference\n- I prefer to receive text messages\n\n## Help\n- can you help\n\n\n\n> # Entity Types\n$userName:simple\n\n$PREBUILT:datetimeV2\n\n> # SYNONYMS\n\n> **NOTE:** your synonym definitions can be defined anywhere chunks, interleaved within a .lu file or even spread across .lu files.\n\n> This defines that **$comPreference** should map synonyms -> canonical **list** value\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n> This defines that **$comPreference** should map synonyms -> canonical **text** value\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n> This defines that **$comPreference** should map synonyms -> canonical **fax** value\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> This is a phrase list\n\n$ChocolateType:phraseList\n- m&m\n- mars\n- mints\n- spearmings\n- payday\n- jelly\n- kit kat\n- kitkat\n- twix\n\n> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How can I change the default message from QnA Maker?\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ?How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> # QnA URLs \n\n[External URL link for QnAMaker](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n> # File ref urls\n\n[None Intent definition](./none.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/13.lu",
    "content": "> LUIS application information\n> !# @app.name = myskillen-us_MySkill\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n> !# @app.tokenizerVersion = 1.0.0\n\n# Application\n\n@ intent Application usesFeature \"Application Synonyms\"\n\n@ phraselist \"Application Synonyms\"(interchangeable) disabledForAllModels = \n\t- Application,Web pages,Sites"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/2.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/3.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- vishwac\n- I'm vishwac\n- call me vishwac\n- my name is vishwac\n- vishwac is my name\n- you can call me vishwac"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/4.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/5.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/6.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/7.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/8.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> These are defined as patterns with commPreference as pattern.any entity type\n# CommunicationPreference\n- set {commPreference} as my communication preference\n- I prefer to receive {commPreference}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/9.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/9a.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n# Help\n- can you help\n\n> you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/README.MD",
    "content": "This folder contains several different examples of .lu files. \n\n## Usage\n\n```bash\nludown parse [toluis | toqna] --in ./Examples/all.lu\n```\n\nludown tool will output:\n- LUIS json file if any LUIS concept definitions are found in the .lu file(s)\n- QnA json file if any QnAMaker.ai concept definitions are found in the .lu file(s)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/all.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n# Help\n- can you help\n\n> you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> You can have references to external .lu files\n\n[None intent definition](./none.lu)\n\n[Buy chocolate definition](./buyChocolate.lu)\n\n> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> FAQ URLs for QnA maker to ingest.\n\n[QnA maker reference](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n[QnA reference](./qna7.lu)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/all.md",
    "content": "> parser can handle .md files as well! \n\n# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n# Help\n- can you help\n\n> you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> You can have references to external .lu files\n\n[None intent definition](./none.lu)\n\n[Buy chocolate definition](./buyChocolate.lu)\n\n> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> FAQ URLs for QnA maker to ingest.\n\n[QnA maker reference](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n[QnA reference](./qna7.lu)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/all.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> FAQ URLs for QnA maker to ingest.\n\n[QnA maker reference](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n[QnA reference](./qna7.lu)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/buyChocolate.lu",
    "content": "> reference to phrase lists for this bot\n\n[Phrase list definitions](./phraseLists.lu)\n\n# Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/changeAlarm.lu",
    "content": "# changeAlarm\n- change an alarm\n- change {remTime} to {newTime}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/comment.lu",
    "content": "> This is a comment\n# Greeting\n- Hi\n- Hello\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/compositeEntities.lu",
    "content": "# setThermostat\n> This utterance labels ‘thermostat to 72’ as composite entity deviceTemperature\n    - Please set {deviceTemperature = thermostat to 72}\n> This is an example utterance that labels ‘owen’ as customDevice (simple entity) and wraps ‘owen to 72’ with the ‘deviceTemperature’ composite entity\n    - Set {deviceTemperature = {customDevice = owen} to 72}\n\n> Define a composite entity ‘deviceTemperature’ that has device (list entity), customDevice (simple entity), temperature (pre-built entity) as children\n$deviceTemperature: [device, customDevice, temperature]\n\n$device : thermostat=\n    - Thermostat\n    - Heater\n    - AC\n    - Air conditioner\n\n$device : refrigerator=\n    - Fridge\n    - Cooler\n\n$customDevice : simple\n\n$PREBUILT : temperature\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/en-us/changeAlarm.lu",
    "content": "# changeAlarm\n- change an alarm\n- change {remTime} to {newTime}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/en-us/none.lu",
    "content": "# None\n* who is your ceo?\n- santa wants a blue ribbon\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/en-us/qna4.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? who is the ceo?\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/en-us/root.lu",
    "content": "> this is just an example that shows how you can group per-language x locale lu files with a root file that ties them together.\n\n[None intent](./none.lu)\n\n[QnA pairs](./qna4.lu)\n\n[Change alarm](./changeAlarm.lu)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/fr-fr/changeAlarm.lu",
    "content": "# changer d'alarme\n-changer une alarme\n-change {remTime} en {newTime}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/fr-fr/none.lu",
    "content": "# None\n*qui est votre PDG?\n-Santa veut un ruban bleu"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/fr-fr/qna4.lu",
    "content": "> QnA Maker only supports English at this point. http://qnamaker.ai\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/fr-fr/root.lu",
    "content": "> Ceci est juste un exemple qui montre comment vous pouvez regrouper des fichiers locaux lu x par langue avec un fichier racine qui les lie ensemble.\n\n[aucune intention] (./None.lu)\n\n[paires QnA] (./qna4.lu)\n\n[changement d'alarme] (./changeAlarm.lu)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/luFileReference1.lu",
    "content": "> You can include references to other .lu files\n[All LU files](./all.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/luFileReference2.lu",
    "content": "> References to other files can have wildcards in them\n[en-us](./en-us/*)\n\n> References to other lu files can include sub-folders as well. \n> /** indicates to the parser to recursively look for .lu files in all subfolders as well.\n> Note: this sample will fail to parse due to negative examples in the examples folder\n[all LU files](../**)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/luFileReference3.lu",
    "content": "> You can include deep references to intents defined in a .lu file in utterances\n# None\n- [None uttearnces](./all.lu#Help)\n\n> With the above statement, the parser will parse all.lu and extract out all utterances associated with the 'Help' intent and add them under 'None' intent as defined in this file.\n\n> NOTE: This **only** works for utterances as entities that are referenced by the uttearnces in the 'Help' intent will not be brought forward to this .lu file."
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/luFileReference4.lu",
    "content": "> You can include deep references to QnA maker questions defined in a .lu file in utterances\n# None\n- [QnA questions](./qna1.lu#?)\n\n> With the above statement, the parser will parse qna1.lu and extract out all questions from QnA pairs in that file and add them under 'None' intent as defined in this file.\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/luFileReference5.lu",
    "content": "> You can include wild cards with deep references to QnA maker questions defined in a .lu file in utterances\n# None\n- [QnA questions](./*#?)\n\n> With the above statement, the parser will parse **all** .lu files under ./, extract out all questions from QnA pairs in those files and add them under 'None' intent as defined in this file.\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/luFileReference6.lu",
    "content": "# All utterances\n> you can use the *utterances* wild card to include all utterances from a lu file. This includes utterances across all intents defined in that .lu file. \n- [all.lu](./all.lu#*utterances*)\n> you can use the *patterns* wild card to include all patterns from a lu file. \n> - [all.lu](./all.lu#*patterns*)\n> you can use the *utterancesAndPatterns* wild card to include all utterances and patterns from a lu file. \n> - [all.lu](./all.lu#*utterancesAndPatterns*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/negativeCase1.lu",
    "content": "# Greeting\nfoobar\n\n$e:simple\n\ntomato"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/negativeCase2.lu",
    "content": "# ? this is a question \n\n# greeting \n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/negativeCase3.lu",
    "content": "# Menu\n- I want {foodType=pizza} for {meal=dinner}\n\n$foodType:list\n\n$foodType:pizza=\n- pizza\n- cheese pizza"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/negativeCase4.lu",
    "content": "> This will fail due to duplicate entity definitions.\n\n# Menu\n\n- What food do you have?\n- What's on the menu?\n- Menu?\n- When is {specials=steak night}?\n- Do you serve {mealtimes=breakfast}?\n\n$PREBUILT:datetimeV2\n$specials:list\n$mealtimes:list\n\n$specials:breakfast=\n - brunch\n$specials:lunch=\n$specials:dinner=\n - supper\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/negativeCase5.lu",
    "content": "> This will fail because of missing list decoration. \n> List decoration is required for utterances (Intent), synonyms (List entity, Phrase lists), Question variations in QnA pairs\n\n# Greeting\nHi\nHello"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/newEntityWithFeatures.lu",
    "content": "> LUIS application information\n> !# @app.name = test nDepth entity with features\n> !# @app.desc = this is a test application\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 6.0.0\n\n# Greeting\n- Hi\n- Hello\n\n# GetUserProfile\n- I'm {@userProfile = {@userAge = 36}} years old\n- My age is {@userProfile = {@userAge = 36}}\n- My name is {@userProfile = {@userName = {@firstName = vishwac}}}\n- My last name is {@userProfile = {@userName = {@lastName = kannan}}}\n- {@userProfile = {@userName = {@firstName = vishwac}}}\n- {@userProfile = {@userAge = 36}}\n\n> Featurize intent\n@ intent GetUserProfile usesFeatures userProfile, profileDefinition\n\n> Prebuilt entities\n@ prebuilt age\n@ prebuilt personName\n\n> Phrase list\n@ phraselist profileDefinition(interchangeable) = \n    - I'm \n    - my\n    - I am\n\n> Define a userProfile ML entity\n@ ml userProfile =\n    - @ ml userName usesFeatures personName\n        - @ personName firstName\n        - @ personName lastName\n    - @ age userAge\n    - @ cities userCity\n    - @ zipCode userZipCode\n\n> Define a list entity for user city\n@ list cities = \n    - seattle :\n        - SEA\n        - Seatac\n    - redmond : \n        - microsoft\n        - REA\n\n> Define a regex entity for user zip code\n@ regex zipCode = /[0-9]{5}/\n\n@ userProfile usesFeatures personName, cities, zipCode"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/none.lu",
    "content": "# None\n* who is your ceo?\n- santa wants a blue ribbon\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/patterns.lu",
    "content": "> You can use roles in patterns using the entityName:role notation.\n# getUserName\n- call me {name=vishwac}\n- call me {name:userName}\n- I'm {name:userName}\n- my name is {name:userName}\n\n# getUserFirstName\n> this is another role for the same 'name' entity\n- [[my] first name is] {name:userFirstName}\n\n# BookFlight\n> roles can be specified for list entity types as well - in this case fromCity and toCity are added as roles to the 'city' list entity defined further below\n- book flight from {city:fromCity} to {city:toCity}\n- [can you] get me a flight from {city:fromCity} to {city:toCity}\n- get me a flight to {city:toCity}\n- I need to fly from {city:fromCity}\n\n$city:Seattle=\n- Seattle\n- Tacoma\n- SeaTac\n- SEA\n\n$city:Portland=\n- Portland\n- PDX\n\n# setAlarm\n> prebuilt entitities can have roles as well.\n- create alarm for {datetimeV2:startTime}\n\n# deleteAlarm\n- remove the {datetimeV2:deleteTime} alarm\n\n> This is just defining datetimeV2 as a prebuilt entity type. If an explicit type is not specified, by default entities in patterns will be set to pattern.any entity type\n$PREBUILT:datetimeV2\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/patterns1.lu",
    "content": "> patterns can have references to any other entity types. So if there is a pattern.any entity that is also defined as another type then the pattern.any entity type will not be added\n\n# addAlarm\n- create an alarm for 7AM\n- create an alarm for {datetimeV2} \n\n$PREBUILT:datetimeV2\n\n# Menu\n- I want {foodType=sandwich}\n- can you get me some {foodType}\n- please get me a {drinkType}\n- get me some {drinkType}\n\n$drinkType:soda=\n- pop\n- fountain drink"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/phraseLists.lu",
    "content": "$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n\n$question:PhraseList interchangeable\n- are you\n- you are"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna-alterations.lu",
    "content": "> You can describe alternations list for QnA Maker using .lu files\n\n> https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/concepts/best-practices\n\n> https://westus.dev.cognitive.microsoft.com/docs/services/5a93fcf85b4ccd136866eb37/operations/5ac266295b4ccd1554da75fd\n\n> You can use qnamaker replace alterations\n\n$botframework : qna-alterations=\n- bot framework\n- Azure bot service\n\n$qnamaker : qna-alterations=\n- qna maker\n- QnA Maker\n- question and answer pairs\n\n$webchat : qna-alterations=\n- web chat\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna1.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna2.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna3.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n> You can add files for QnA maker to ingest using the URL reference scheme. If the URI's content-type is not text/html, then the ludown parser will add it to files collection for QnA Maker to ingest. \n[SurfaceManual.pdf](https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna4.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna5.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna6.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n\n\n> You can include LUIS intent and entity definitions in the same .lu file\n# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/qna7.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? What is Ludown? \n- ludown cli\n- where can i get more information about ludown cli?\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/regexEntity.lu",
    "content": "> Regex entitiy as identified by /pattern/. regex pattern MUST be enclosed in forward slash \n$HRF-number:/hrf-[0-9]{6}/"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/examples/v7UpgradeTest.lu",
    "content": "@ ml userProfile = \n    - @ ml userAge\n        - @ age candidateAge\n    \n@ ml userName\n    - @ personName firstName\n    - @ personName middleName\n    - @ personName lastName\n\n@ prebuilt age\n@ prebuilt personName\n@ personName firstName\n@ personName lastName\n\n# test\n- my initials are {@userName = {@middleName = VSK}}\n- i'm {@userProfile = {@userAge = 32} years old}\n- my name is {@userName = {@firstName = vishwac sena} {@lastName = kannan}}\n- my first name is {@userName = {@firstName = vishwac}}\n- last name is {@userName = {@lastName = kannan}}\n- my {@userName = name is {@firstName = vishwac} {@middleName = sena} {@lastName = kannan}} and {@userProfile = I'm {@userAge = {@candidateAge = 32} years old}} \n\n> Construct a hierarchy tree of labels\n> prefer local entity names in case of nDepth entity"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/file.lu",
    "content": "> # Intent definitions\n\n## Calendar.Add\n- add a new event on 27 - apr\n- add a new task finish assignment\n- add an event to read about adam lambert news\n- add an event to visit 209 nashville gym\n- add imax theater to my upcoming events\n- calendar i ' ll be at the garage from 8 till 3 this saturday\n- dunmore pa sonic sounds friday morning please\n- meeting my manager\n- save the date may 17 pictures party\n- schedule appointment for tomorrow please\n- the meeting will last for one hour\n\n\n## Calendar.Find\n- calendar for november 1948\n- display weekend plans\n- do i have anything on wednesday ?\n- how many days are there between march 13th 2015 and today ?\n- pull up my appointment find out how much time i have before my next appointment\n- search for meetings with chris\n- show me tomorrow ' s wedding party time\n- tell me the event details\n- voice activated reading of appointments this week\n\n\n## None\n- am i free to be with friends saturday ?\n- appointment with johnson needs to be next week\n- call dad mike\n- change the meeting with chris to 9 : 00 am\n- email cloney john\n- extend lunch meeting 30 minutes extra\n- i want to reschedule the meeting at the air force club\n- marketing meetings on tuesdays will now be every wednesday please change on my calendar\n- move the bbq party to friday\n- the workshop will last for 10 hours\n\n\n> # Entity definitions\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/fr/file.lu",
    "content": "> # Intent definitions\n\n## Calendar.Add\n- ajouter un nouvel événement le 27 - avr\n- ajouter une nouvelle tâche d'affectation de finition\n- ajouter un événement à lire sur adam lambert nouvelles\n- ajouter un événement pour visiter 209 nashville gym\n- ajouter du théâtre imax à mes événements à venir\n- calendrier i ' ll être au garage de 8 à 3 ce samedi\n- dunmore pa sons sonores vendredi matin s'il vous plaît\n- rencontrer mon manager\n- enregistrer la date mai 17 photos partie\n- rendez-vous pour demain s'il vous plaît\n- la réunion durera une heure\n\n\n## Calendar.Find\n- calendrier pour novembre 1948\n- afficher les plans de week-end\n- ai-je quelque chose le mercredi?\n- Combien de jours y a-t-il entre le 13 mars 2015 et aujourd'hui ?\n- tirer vers le haut de mon rendez-vous savoir combien de temps j'ai avant mon prochain rendez-vous\n- recherche de rencontres avec Chris\n- montrez-moi l'heure de la fête de mariage de demain\n- dites-moi les détails de l'événement\n- voix activée lecture des rendez-vous cette semaine\n\n\n## None\n- suis-je libre d'être avec des amis samedi ?\n- rendez-vous avec Johnson doit être la semaine prochaine\n- appeler papa mike\n- changer la réunion avec Chris à 9: 00 h\n- email cloney john\n- prolonger la réunion du déjeuner 30 minutes de plus\n- Je veux reprogrammer la réuni on au club de l'armée de l'air\n- réunions de marketing le mardi sera maintenant tous les mercredis s'il vous plaît changer sur mon calendrier\n- déplacer la fête bbq à vendredi\n- l'atelier durera 10 heures\n\n\n> # Entity definitions\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/ClosedLists.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Lists\n            public string[][] Airline;\n            public string[][] Buyer;\n            public string[][] Seller;\n\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] Airline;\n                public InstanceData[] Buyer;\n                public InstanceData[] Seller;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/ClosedLists.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"Airline\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Delta\",\n          \"list\": [\n            \"DL\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Alaska\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"United\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"Virgin\",\n          \"list\": [\n            \"DL\"\n          ]\n        }\n      ],\n      \"roles\": [\n        \"Buyer\",\n        \"Seller\"\n      ]\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/CompositeEntities.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Simple entities\n            public string[] City;\n            public string[] To;\n            public string[] From;\n            public string[] Name;\n            public string[] likee;\n            public string[] liker;\n            public string[] State;\n            public string[] Weather_Location;\n            public string[] destination;\n            public string[] source;\n\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] City;\n                public InstanceData[] From;\n                public InstanceData[] Name;\n                public InstanceData[] State;\n                public InstanceData[] To;\n                public InstanceData[] Weather_Location;\n                public InstanceData[] destination;\n                public InstanceData[] likee;\n                public InstanceData[] liker;\n                public InstanceData[] source;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/CompositeEntities.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [],\n  \"entities\": [\n    {\n      \"name\": \"Name\",\n      \"roles\": [\n        \"likee\",\n        \"liker\"\n      ]\n    },\n    {\n      \"name\": \"State\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Weather.Location\",\n      \"roles\": [\n        \"source\",\n        \"destination\"\n      ]\n    },\n    {\n      \"name\": \"City\",\n      \"children\": [\n        \"To\",\n        \"From\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/ContosoApp.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n            Cancel,\n            Delivery,\n            EntityTests,\n            Greeting,\n            Help,\n            None,\n            Roles,\n            search,\n            SpecifyName,\n            Travel,\n            Weather_GetForecast\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Simple entities\n            public string[] City;\n            public string[] To;\n            public string[] From;\n            public string[] Name;\n            public string[] likee;\n            public string[] liker;\n            public string[] State;\n            public string[] Weather_Location;\n            public string[] destination;\n            public string[] source;\n\n            // Built-in entities\n            public Age[] age;\n            public Age[] begin;\n            public Age[] end;\n            public DateTimeSpec[] datetime;\n            public DateTimeSpec[] arrive;\n            public DateTimeSpec[] leave;\n            public Dimension[] dimension;\n            public Dimension[] length;\n            public Dimension[] width;\n            public string[] email;\n            public string[] receiver;\n            public string[] sender;\n            public GeographyV2[] geographyV2;\n            public GeographyV2[] endloc;\n            public GeographyV2[] startloc;\n            public Money[] money;\n            public Money[] max;\n            public Money[] min;\n            public double[] number;\n            public double[] ordinal;\n            public double[] start;\n            public OrdinalV2[] ordinalV2;\n            public OrdinalV2[] endpos;\n            public OrdinalV2[] startpos;\n            public double[] percentage;\n            public double[] maximum;\n            public double[] minimum;\n            public string[] personName;\n            public string[] child;\n            public string[] parent;\n            public string[] phonenumber;\n            public string[] newPhone;\n            public string[] old;\n            public Temperature[] temperature;\n            public Temperature[] a;\n            public Temperature[] b;\n            public string[] url;\n            public string[] oldURL;\n\n            // Lists\n            public string[][] Airline;\n            public string[][] Buyer;\n            public string[][] Seller;\n\n            // Regex entities\n            public string[] Part;\n            public string[] buy;\n            public string[] sell;\n\n            // Pattern.any\n            public string[] person;\n            public string[] from;\n            public string[] to;\n            public string[] subject;\n            public string[] extra;\n\n\n            // Composites\n            public class _InstanceAddress\n            {\n                public InstanceData[] Destination;\n                public InstanceData[] Source;\n                public InstanceData[] number;\n                public InstanceData[] State;\n            }\n            public class AddressClass\n            {\n                public string[] Destination;\n                public string[] Source;\n                public double[] number;\n                public string[] State;\n                [JsonProperty(\"$instance\")]\n                public _InstanceAddress _instance;\n            }\n            public AddressClass[] Address;\n\n            public class _InstanceComposite1\n            {\n                public InstanceData[] age;\n                public InstanceData[] datetime;\n                public InstanceData[] dimension;\n                public InstanceData[] email;\n                public InstanceData[] money;\n                public InstanceData[] number;\n                public InstanceData[] ordinal;\n                public InstanceData[] percentage;\n                public InstanceData[] phonenumber;\n                public InstanceData[] temperature;\n            }\n            public class Composite1Class\n            {\n                public Age[] age;\n                public DateTimeSpec[] datetime;\n                public Dimension[] dimension;\n                public string[] email;\n                public Money[] money;\n                public double[] number;\n                public double[] ordinal;\n                public double[] percentage;\n                public string[] phonenumber;\n                public Temperature[] temperature;\n                [JsonProperty(\"$instance\")]\n                public _InstanceComposite1 _instance;\n            }\n            public Composite1Class[] Composite1;\n\n            public class _InstanceComposite2\n            {\n                public InstanceData[] Airline;\n                public InstanceData[] City;\n                public InstanceData[] url;\n                public InstanceData[] From;\n                public InstanceData[] To;\n                public InstanceData[] Weather_Location;\n            }\n            public class Composite2Class\n            {\n                public string[][] Airline;\n                public string[] City;\n                public string[] url;\n                public string[] From;\n                public string[] To;\n                public string[] Weather_Location;\n                [JsonProperty(\"$instance\")]\n                public _InstanceComposite2 _instance;\n            }\n            public Composite2Class[] Composite2;\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] Address;\n                public InstanceData[] Airline;\n                public InstanceData[] Buyer;\n                public InstanceData[] City;\n                public InstanceData[] Composite1;\n                public InstanceData[] Composite2;\n                public InstanceData[] Destination;\n                public InstanceData[] From;\n                public InstanceData[] Name;\n                public InstanceData[] Part;\n                public InstanceData[] Seller;\n                public InstanceData[] Source;\n                public InstanceData[] State;\n                public InstanceData[] To;\n                public InstanceData[] Weather_Location;\n                public InstanceData[] a;\n                public InstanceData[] age;\n                public InstanceData[] arrive;\n                public InstanceData[] b;\n                public InstanceData[] begin;\n                public InstanceData[] buy;\n                public InstanceData[] child;\n                public InstanceData[] datetime;\n                public InstanceData[] destination;\n                public InstanceData[] dimension;\n                public InstanceData[] email;\n                public InstanceData[] end;\n                public InstanceData[] endloc;\n                public InstanceData[] endpos;\n                public InstanceData[] extra;\n                public InstanceData[] from;\n                public InstanceData[] geographyV2;\n                public InstanceData[] leave;\n                public InstanceData[] length;\n                public InstanceData[] likee;\n                public InstanceData[] liker;\n                public InstanceData[] max;\n                public InstanceData[] maximum;\n                public InstanceData[] min;\n                public InstanceData[] minimum;\n                public InstanceData[] money;\n                public InstanceData[] newPhone;\n                public InstanceData[] number;\n                public InstanceData[] old;\n                public InstanceData[] oldURL;\n                public InstanceData[] ordinal;\n                public InstanceData[] ordinalV2;\n                public InstanceData[] parent;\n                public InstanceData[] percentage;\n                public InstanceData[] person;\n                public InstanceData[] personName;\n                public InstanceData[] phonenumber;\n                public InstanceData[] receiver;\n                public InstanceData[] sell;\n                public InstanceData[] sender;\n                public InstanceData[] source;\n                public InstanceData[] start;\n                public InstanceData[] startloc;\n                public InstanceData[] startpos;\n                public InstanceData[] subject;\n                public InstanceData[] temperature;\n                public InstanceData[] to;\n                public InstanceData[] url;\n                public InstanceData[] width;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/ContosoApp.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Delivery\"\n    },\n    {\n      \"name\": \"EntityTests\"\n    },\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Roles\"\n    },\n    {\n      \"name\": \"search\"\n    },\n    {\n      \"name\": \"SpecifyName\"\n    },\n    {\n      \"name\": \"Travel\"\n    },\n    {\n      \"name\": \"Weather.GetForecast\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Name\",\n      \"roles\": [\n        \"likee\",\n        \"liker\"\n      ]\n    },\n    {\n      \"name\": \"State\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Weather.Location\",\n      \"roles\": [\n        \"source\",\n        \"destination\"\n      ]\n    },\n    {\n      \"name\": \"City\",\n      \"children\": [\n        \"To\",\n        \"From\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"Address\",\n      \"children\": [\n        \"number\",\n        \"State\"\n      ],\n      \"roles\": [\n        \"Source\",\n        \"Destination\"\n      ]\n    },\n    {\n      \"name\": \"Composite1\",\n      \"children\": [\n        \"age\",\n        \"datetimeV2\",\n        \"dimension\",\n        \"email\",\n        \"money\",\n        \"number\",\n        \"ordinal\",\n        \"percentage\",\n        \"phonenumber\",\n        \"temperature\"\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"Composite2\",\n      \"children\": [\n        \"Airline\",\n        \"City\",\n        \"url\",\n        \"City::From\",\n        \"City::To\",\n        \"Weather.Location\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"Airline\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Delta\",\n          \"list\": [\n            \"DL\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Alaska\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"United\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"Virgin\",\n          \"list\": [\n            \"DL\"\n          ]\n        }\n      ],\n      \"roles\": [\n        \"Buyer\",\n        \"Seller\"\n      ]\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"person\",\n      \"roles\": [\n        \"from\",\n        \"to\"\n      ],\n      \"explicitList\": []\n    },\n    {\n      \"name\": \"subject\",\n      \"roles\": [\n        \"extra\"\n      ],\n      \"explicitList\": []\n    }\n  ],\n  \"regex_entities\": [\n    {\n      \"name\": \"Part\",\n      \"regexPattern\": \"kb[0-9]+\",\n      \"roles\": [\n        \"buy\",\n        \"sell\"\n      ]\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": [\n        \"begin\",\n        \"end\"\n      ]\n    },\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": [\n        \"arrive\",\n        \"leave\"\n      ]\n    },\n    {\n      \"name\": \"dimension\",\n      \"roles\": [\n        \"width\",\n        \"length\"\n      ]\n    },\n    {\n      \"name\": \"email\",\n      \"roles\": [\n        \"receiver\",\n        \"sender\"\n      ]\n    },\n    {\n      \"name\": \"geographyV2\",\n      \"roles\": [\n        \"startloc\",\n        \"endloc\"\n      ]\n    },\n    {\n      \"name\": \"money\",\n      \"roles\": [\n        \"min\",\n        \"max\"\n      ]\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": [\n        \"start\"\n      ]\n    },\n    {\n      \"name\": \"ordinalV2\",\n      \"roles\": [\n        \"startpos\",\n        \"endpos\"\n      ]\n    },\n    {\n      \"name\": \"percentage\",\n      \"roles\": [\n        \"minimum\",\n        \"maximum\"\n      ]\n    },\n    {\n      \"name\": \"personName\",\n      \"roles\": [\n        \"child\",\n        \"parent\"\n      ]\n    },\n    {\n      \"name\": \"phonenumber\",\n      \"roles\": [\n        \"newPhone\",\n        \"old\"\n      ]\n    },\n    {\n      \"name\": \"temperature\",\n      \"roles\": [\n        \"b\",\n        \"a\"\n      ]\n    },\n    {\n      \"name\": \"url\",\n      \"roles\": [\n        \"oldURL\"\n      ]\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"deliver from {Address:Source} to {Address:Destination}\",\n      \"intent\": \"Roles\"\n    },\n    {\n      \"pattern\": \"email from {person:from} to {person:to}\",\n      \"intent\": \"search\"\n    },\n    {\n      \"pattern\": \"email about {subject} [from {person}] [and also {subject:extra}]\",\n      \"intent\": \"search\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"\\\" i need to know the temperature at bangor , sme \\\"\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\" tell me perth weather , sclimate & temperature at australia \\\"\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"$2 and $4.25\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"$4 and $4.25\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"$4 and $99\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"$4.25 and $4\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"$99 and $4.50\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"10 years old and 4 years old\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"12 years old and 3 days old\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"12 years old and 3 days old and monday july 3rd and every monday and between 3am and 5:30am and 4 acres and 4 pico meters and chrimc@hotmail.com and $4 and $4.25 and also 32 and 210.4 and first and 10% and 10.5% and 425-555-1234 and 3 degrees and -27.5 degrees c and the next one and the previous one\",\n      \"intent\": \"EntityTests\",\n      \"entities\": [\n        {\n          \"entity\": \"Composite1\",\n          \"startPos\": 0,\n          \"endPos\": 299\n        }\n      ]\n    },\n    {\n      \"text\": \"12% and 8%\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"12% to 8%\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"minimum\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        },\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"maximum\",\n          \"startPos\": 7,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"3 degrees and -27.5 degrees c\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"3 inches long by 2 inches wide\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"dimension\",\n          \"role\": \"length\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"dimension\",\n          \"role\": \"width\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"3 inches long by 2 inches wide and 5% to 10% and are you between 6 years old and 8 years old and can i trade kb457 for kb922 and change 425-777-1212 to 206-666-4123 and did delta buy virgin and did the rain from hawaii get to redmond and http://foo.com changed to http://blah.com and i like between 68 degrees and 72 degrees and john likes mary and leave 3pm and arrive 5pm and pay between $400 and $500 and send chrimc@hotmail.com from emad@gmail.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"dimension\",\n          \"role\": \"length\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"dimension\",\n          \"role\": \"width\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"minimum\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"maximum\",\n          \"startPos\": 41,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"age\",\n          \"role\": \"begin\",\n          \"startPos\": 65,\n          \"endPos\": 75\n        },\n        {\n          \"entity\": \"age\",\n          \"role\": \"end\",\n          \"startPos\": 81,\n          \"endPos\": 91\n        },\n        {\n          \"entity\": \"Part\",\n          \"role\": \"buy\",\n          \"startPos\": 119,\n          \"endPos\": 123\n        },\n        {\n          \"entity\": \"Airline\",\n          \"role\": \"Buyer\",\n          \"startPos\": 173,\n          \"endPos\": 177\n        },\n        {\n          \"entity\": \"Airline\",\n          \"role\": \"Seller\",\n          \"startPos\": 183,\n          \"endPos\": 188\n        },\n        {\n          \"entity\": \"Weather.Location\",\n          \"role\": \"source\",\n          \"startPos\": 212,\n          \"endPos\": 217\n        },\n        {\n          \"entity\": \"Weather.Location\",\n          \"role\": \"destination\",\n          \"startPos\": 226,\n          \"endPos\": 232\n        },\n        {\n          \"entity\": \"temperature\",\n          \"role\": \"b\",\n          \"startPos\": 314,\n          \"endPos\": 323\n        },\n        {\n          \"entity\": \"Name\",\n          \"role\": \"liker\",\n          \"startPos\": 329,\n          \"endPos\": 332\n        },\n        {\n          \"entity\": \"Name\",\n          \"role\": \"likee\",\n          \"startPos\": 340,\n          \"endPos\": 343\n        },\n        {\n          \"entity\": \"datetimeV2\",\n          \"role\": \"leave\",\n          \"startPos\": 355,\n          \"endPos\": 357\n        },\n        {\n          \"entity\": \"datetimeV2\",\n          \"role\": \"arrive\",\n          \"startPos\": 370,\n          \"endPos\": 372\n        },\n        {\n          \"entity\": \"money\",\n          \"role\": \"min\",\n          \"startPos\": 390,\n          \"endPos\": 393\n        },\n        {\n          \"entity\": \"money\",\n          \"role\": \"max\",\n          \"startPos\": 399,\n          \"endPos\": 402\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 413,\n          \"endPos\": 430\n        }\n      ]\n    },\n    {\n      \"text\": \"4% and 5%\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"4% to 12%\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"minimum\",\n          \"startPos\": 0,\n          \"endPos\": 1\n        },\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"maximum\",\n          \"startPos\": 6,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"425-555-1212\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"425-555-1234\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"5% to 10%\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"minimum\",\n          \"startPos\": 0,\n          \"endPos\": 1\n        },\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"maximum\",\n          \"startPos\": 6,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"8% and 12%\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"8% and 14%\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"8% and 9%\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"8% to 12%\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"minimum\",\n          \"startPos\": 0,\n          \"endPos\": 1\n        },\n        {\n          \"entity\": \"percentage\",\n          \"role\": \"maximum\",\n          \"startPos\": 6,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"9 feet long by 4 feet wide\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"dimension\",\n          \"role\": \"length\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        },\n        {\n          \"entity\": \"dimension\",\n          \"role\": \"width\",\n          \"startPos\": 15,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"9.2% and 10.3%\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"abort\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and $10 and $20\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and $4 and $4.25\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and 4$\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and 425-765-5555\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and can i trade kb457 for kb922\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Part\",\n          \"role\": \"sell\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Part\",\n          \"role\": \"buy\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"are you between 13 years old and 16 years old\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"age\",\n          \"role\": \"begin\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"age\",\n          \"role\": \"end\",\n          \"startPos\": 33,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"are you between 4 years old and 7 years old\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"age\",\n          \"role\": \"begin\",\n          \"startPos\": 16,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"age\",\n          \"role\": \"end\",\n          \"startPos\": 32,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"are you between 6 years old and 10 years old\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"age\",\n          \"role\": \"begin\",\n          \"startPos\": 16,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"age\",\n          \"role\": \"end\",\n          \"startPos\": 32,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"are you between 6 years old and 8 years old\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"age\",\n          \"role\": \"end\",\n          \"startPos\": 32,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"assist\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bart simpson\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bart simpson helps homer simpson\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"personName\",\n          \"role\": \"child\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"personName\",\n          \"role\": \"parent\",\n          \"startPos\": 19,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"bart simpson is parent of lisa simpson to move calcutta to london\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"personName\",\n          \"role\": \"parent\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"personName\",\n          \"role\": \"child\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"startloc\",\n          \"startPos\": 47,\n          \"endPos\": 54\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"endloc\",\n          \"startPos\": 59,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"calcutta\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i trade kb457 for kb922\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Part\",\n          \"role\": \"sell\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Part\",\n          \"role\": \"buy\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"can i trade kb922 for kb457\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Part\",\n          \"role\": \"sell\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Part\",\n          \"role\": \"buy\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Delivery\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change 425-765-1111 to 425-888-4444\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"phonenumber\",\n          \"role\": \"old\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"phonenumber\",\n          \"role\": \"newPhone\",\n          \"startPos\": 23,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"change 425-777-1212 to 206-666-4123\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"phonenumber\",\n          \"role\": \"old\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"phonenumber\",\n          \"role\": \"newPhone\",\n          \"startPos\": 23,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"deliver 12345 va to 12346 wa\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 14,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 26,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delivery address is in 45654 ga\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 29,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"did delta buy virgin\",\n      \"intent\": \"Roles\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"did delta buy virgin?\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Airline\",\n          \"role\": \"Buyer\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Airline\",\n          \"role\": \"Seller\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"did the rain from hawaii get to redmond\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"role\": \"source\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Weather.Location\",\n          \"role\": \"destination\",\n          \"startPos\": 32,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"did virgin buy delta\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Airline\",\n          \"role\": \"Buyer\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Airline\",\n          \"role\": \"Seller\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"disregard\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do not do it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do not do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"email about dogs from chris and also cats\",\n      \"intent\": \"search\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forecast in celcius\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get florence temperature in september\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"get for me the weather conditions in sonoma county\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 37,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"get the daily temperature greenwood indiana\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 26,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"get the forcast for me\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the weather at saint george utah\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"go from 3rd to 5th\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"ordinalV2\",\n          \"role\": \"startpos\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"ordinalV2\",\n          \"role\": \"endpos\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"go from first to last\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"ordinalV2\",\n          \"role\": \"startpos\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ordinalV2\",\n          \"role\": \"endpos\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"go from next to last to last move london to jakarta and homer simpson is the parent of lisa simpson\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"ordinalV2\",\n          \"role\": \"startpos\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ordinalV2\",\n          \"role\": \"endpos\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"personName\",\n          \"role\": \"parent\",\n          \"startPos\": 56,\n          \"endPos\": 68\n        },\n        {\n          \"entity\": \"personName\",\n          \"role\": \"child\",\n          \"startPos\": 87,\n          \"endPos\": 98\n        }\n      ]\n    },\n    {\n      \"text\": \"good afternoon\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good night\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"he is yousef\",\n      \"intent\": \"SpecifyName\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"startPos\": 6,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"hello\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me please\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help please\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi emad\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"his name is tom\",\n      \"intent\": \"SpecifyName\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"hiya\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"homer simpson is parent of bart simpson\",\n      \"intent\": \"Roles\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"homer simpson is parent of bart simpson to move jakarta to calcutta\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"personName\",\n          \"role\": \"child\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"startloc\",\n          \"startPos\": 48,\n          \"endPos\": 54\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"endloc\",\n          \"startPos\": 59,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"homer simpson is parent of lisa simpson\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"personName\",\n          \"role\": \"parent\",\n          \"startPos\": 0,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"personName\",\n          \"role\": \"child\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how are you\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how are you doing today?\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how are you doing?\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how are you today?\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much rain does chambersburg get a year\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 19,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"howdy\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how's it goig\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"http://blah.com changed to http://foo.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"url\",\n          \"role\": \"oldURL\",\n          \"startPos\": 0,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"http://blah.com is where you can fly from dallas to seattle via denver\",\n      \"intent\": \"EntityTests\",\n      \"entities\": [\n        {\n          \"entity\": \"Composite2\",\n          \"startPos\": 0,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 52,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"City\",\n          \"startPos\": 64,\n          \"endPos\": 69\n        }\n      ]\n    },\n    {\n      \"text\": \"http://foo.com\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"http://foo.com changed to http://blah.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"url\",\n          \"role\": \"oldURL\",\n          \"startPos\": 0,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"http://foo.com is ok\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"http://foo.com is where you can fly from seattle to dallas via denver\",\n      \"intent\": \"EntityTests\",\n      \"entities\": [\n        {\n          \"entity\": \"Composite2\",\n          \"startPos\": 0,\n          \"endPos\": 68\n        },\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 41,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 52,\n          \"endPos\": 57\n        },\n        {\n          \"entity\": \"City\",\n          \"startPos\": 63,\n          \"endPos\": 68\n        }\n      ]\n    },\n    {\n      \"text\": \"http://woof.com\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"http://woof.com is where you can fly from seattle to dallas via chicago\",\n      \"intent\": \"EntityTests\",\n      \"entities\": [\n        {\n          \"entity\": \"Composite2\",\n          \"startPos\": 0,\n          \"endPos\": 70\n        },\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 53,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"City\",\n          \"startPos\": 64,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"http://woof.com is where you can fly from seattle to dallas via chicago on delta\",\n      \"intent\": \"EntityTests\",\n      \"entities\": [\n        {\n          \"entity\": \"Composite2\",\n          \"startPos\": 0,\n          \"endPos\": 79\n        },\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 53,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"City\",\n          \"startPos\": 64,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"https://foo.com is where you can get weather for seattle\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Composite2\",\n          \"startPos\": 0,\n          \"endPos\": 55\n        },\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 49,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"i am lili\",\n      \"intent\": \"SpecifyName\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"i am stuck\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like between 68 degrees and 72 degrees\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"temperature\",\n          \"role\": \"a\",\n          \"startPos\": 15,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"i like between 72 degrees and 80 degrees\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"temperature\",\n          \"role\": \"a\",\n          \"startPos\": 15,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"temperature\",\n          \"role\": \"b\",\n          \"startPos\": 30,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"i want this in 98052 wa\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 21,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to arrive at newyork\",\n      \"intent\": \"Travel\",\n      \"entities\": [\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to fly out of seattle\",\n      \"intent\": \"Travel\",\n      \"entities\": [\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know the temperature at death valley\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to travel\",\n      \"intent\": \"Travel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to travel from seattle to dallas\",\n      \"intent\": \"Travel\",\n      \"entities\": [\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'll be leaving from cairo to paris\",\n      \"intent\": \"Travel\",\n      \"entities\": [\n        {\n          \"entity\": \"City::From\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"City::To\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm stuck\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"joeseph@hotmail.com\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"john likes mary\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"role\": \"liker\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"Name\",\n          \"role\": \"likee\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"kb409 is cool\",\n      \"intent\": \"EntityTests\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"leave 3pm and arrive 5pm\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"datetimeV2\",\n          \"role\": \"leave\",\n          \"startPos\": 6,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"datetimeV2\",\n          \"role\": \"arrive\",\n          \"startPos\": 21,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"mayday\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move calcutta to mumbai\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"startloc\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"endloc\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"move jakarta to london\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"startloc\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"endloc\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"move london to calcutta\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"startloc\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"endloc\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"move london to jakarta\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"startloc\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"geographyV2\",\n          \"role\": \"endloc\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is emad\",\n      \"intent\": \"SpecifyName\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my water bottle is green.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pay between $4 and $4.25\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"money\",\n          \"role\": \"min\",\n          \"startPos\": 12,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"money\",\n          \"role\": \"max\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"pay between $4 and $40\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"money\",\n          \"role\": \"min\",\n          \"startPos\": 12,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"money\",\n          \"role\": \"max\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"pay between $400 and $500\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"money\",\n          \"role\": \"min\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"money\",\n          \"role\": \"max\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"please cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please deliver february 2nd 2001\",\n      \"intent\": \"Delivery\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please deliver to 98033 wa\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"please delivery it to 98033 wa\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 28,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"please disregard\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please stop\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"provide me by toronto weather please\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"send bob@foo.com from chris@ark.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 22,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send bob@hob.com from main@gmail.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"send cancel@foo.com from help@h.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 25,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send chrimc@hotmail.com from emad@gmail.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 29,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"send chris@ark.com from bob@foo.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 24,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send ham@ham.com from chr@live.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"send help@h.com from cancel@foo.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 21,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send tom@foo.com from john@hotmail.com\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"email\",\n          \"role\": \"receiver\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"email\",\n          \"role\": \"sender\",\n          \"startPos\": 22,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"show average rainfall for boise\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the forecast at alabama\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"soliciting today ' s weather\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sos\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start with the first one\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"ordinal\",\n          \"role\": \"start\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"stop\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"temperature of delhi in celsius please\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"the address is 66666 fl\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 21,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"there is a large deep dish pizza in your future.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is chris\",\n      \"intent\": \"SpecifyName\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"this is requested in 55555 ny\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"State\",\n          \"startPos\": 27,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"tom likes susan\",\n      \"intent\": \"Roles\",\n      \"entities\": [\n        {\n          \"entity\": \"Name\",\n          \"role\": \"liker\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        },\n        {\n          \"entity\": \"Name\",\n          \"role\": \"likee\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"was last year about this time as wet as it is now in the south ?\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 57,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s the weather going to be like in hawaii ?\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s the weather like in minneapolis\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 29,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"what can i say\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you help me with\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do i do now?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do i do?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the rain volume in sonoma county ?\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather in redmond ?\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather today at 10 day durham ?\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"what to wear in march in california\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 25,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be tomorrow in accord new york ?\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 37,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"why doesn't this work ?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it be raining in ranchi\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": [\n        {\n          \"entity\": \"Weather.Location\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"will it rain this weekend\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it snow today\",\n      \"intent\": \"Weather.GetForecast\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/FlightBooking.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class FlightBooking: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n            BookFlight,\n            Cancel,\n            GetWeather,\n            None\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Built-in entities\n            public DateTimeSpec[] datetime;\n\n            // Lists\n            public string[][] Airport;\n\n\n            // Composites\n            public class _InstanceFrom\n            {\n                public InstanceData[] Airport;\n            }\n            public class FromClass\n            {\n                public string[][] Airport;\n                [JsonProperty(\"$instance\")]\n                public _InstanceFrom _instance;\n            }\n            public FromClass[] From;\n\n            public class _InstanceTo\n            {\n                public InstanceData[] Airport;\n            }\n            public class ToClass\n            {\n                public string[][] Airport;\n                [JsonProperty(\"$instance\")]\n                public _InstanceTo _instance;\n            }\n            public ToClass[] To;\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] Airport;\n                public InstanceData[] From;\n                public InstanceData[] To;\n                public InstanceData[] datetime;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<FlightBooking>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/FlightBooking.json",
    "content": "{\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"FlightBooking\",\n    \"desc\": \"Luis Model for CoreBot\",\n    \"culture\": \"en-us\",\n    \"tokenizerVersion\": \"1.0.0\",\n    \"intents\": [\n      {\n        \"name\": \"BookFlight\"\n      },\n      {\n        \"name\": \"Cancel\"\n      },\n      {\n        \"name\": \"GetWeather\"\n      },\n      {\n        \"name\": \"None\"\n      }\n    ],\n    \"entities\": [],\n    \"composites\": [\n      {\n        \"name\": \"From\",\n        \"children\": [\n          \"Airport\"\n        ],\n        \"roles\": []\n      },\n      {\n        \"name\": \"To\",\n        \"children\": [\n          \"Airport\"\n        ],\n        \"roles\": []\n      }\n    ],\n    \"closedLists\": [\n      {\n        \"name\": \"Airport\",\n        \"subLists\": [\n          {\n            \"canonicalForm\": \"Paris\",\n            \"list\": [\n              \"paris\",\n              \"cdg\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"London\",\n            \"list\": [\n              \"london\",\n              \"lhr\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"Berlin\",\n            \"list\": [\n              \"berlin\",\n              \"txl\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"New York\",\n            \"list\": [\n              \"new york\",\n              \"jfk\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"Seattle\",\n            \"list\": [\n              \"seattle\",\n              \"sea\"\n            ]\n          }\n        ],\n        \"roles\": []\n      }\n    ],\n    \"patternAnyEntities\": [],\n    \"regex_entities\": [],\n    \"prebuiltEntities\": [\n      {\n        \"name\": \"datetimeV2\",\n        \"roles\": []\n      }\n    ],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"patterns\": [],\n    \"utterances\": [\n      {\n        \"text\": \"book a flight\",\n        \"intent\": \"BookFlight\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"book a flight from new york\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 19,\n            \"endPos\": 26\n          }\n        ]\n      },\n      {\n        \"text\": \"book a flight from seattle\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 19,\n            \"endPos\": 25\n          }\n        ]\n      },\n      {\n        \"text\": \"book a hotel in new york\",\n        \"intent\": \"None\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"book a restaurant\",\n        \"intent\": \"None\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"book flight from london to paris on feb 14th\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 17,\n            \"endPos\": 22\n          },\n          {\n            \"entity\": \"To\",\n            \"startPos\": 27,\n            \"endPos\": 31\n          }\n        ]\n      },\n      {\n        \"text\": \"book flight to berlin on feb 14th\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"To\",\n            \"startPos\": 15,\n            \"endPos\": 20\n          }\n        ]\n      },\n      {\n        \"text\": \"book me a flight from london to paris\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 22,\n            \"endPos\": 27\n          },\n          {\n            \"entity\": \"To\",\n            \"startPos\": 32,\n            \"endPos\": 36\n          }\n        ]\n      },\n      {\n        \"text\": \"bye\",\n        \"intent\": \"Cancel\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"cancel booking\",\n        \"intent\": \"Cancel\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"exit\",\n        \"intent\": \"Cancel\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"find an airport near me\",\n        \"intent\": \"None\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"flight to paris\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"To\",\n            \"startPos\": 10,\n            \"endPos\": 14\n          }\n        ]\n      },\n      {\n        \"text\": \"flight to paris from london on feb 14th\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"To\",\n            \"startPos\": 10,\n            \"endPos\": 14\n          },\n          {\n            \"entity\": \"From\",\n            \"startPos\": 21,\n            \"endPos\": 26\n          }\n        ]\n      },\n      {\n        \"text\": \"fly from berlin to paris on may 5th\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 9,\n            \"endPos\": 14\n          },\n          {\n            \"entity\": \"To\",\n            \"startPos\": 19,\n            \"endPos\": 23\n          }\n        ]\n      },\n      {\n        \"text\": \"go to paris\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"To\",\n            \"startPos\": 6,\n            \"endPos\": 10\n          }\n        ]\n      },\n      {\n        \"text\": \"going from paris to berlin\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 11,\n            \"endPos\": 15\n          },\n          {\n            \"entity\": \"To\",\n            \"startPos\": 20,\n            \"endPos\": 25\n          }\n        ]\n      },\n      {\n        \"text\": \"i'd like to rent a car\",\n        \"intent\": \"None\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"ignore\",\n        \"intent\": \"Cancel\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"travel from new york to paris\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"From\",\n            \"startPos\": 12,\n            \"endPos\": 19\n          },\n          {\n            \"entity\": \"To\",\n            \"startPos\": 24,\n            \"endPos\": 28\n          }\n        ]\n      },\n      {\n        \"text\": \"travel to new york\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"To\",\n            \"startPos\": 10,\n            \"endPos\": 17\n          }\n        ]\n      },\n      {\n        \"text\": \"travel to paris\",\n        \"intent\": \"BookFlight\",\n        \"entities\": [\n          {\n            \"entity\": \"To\",\n            \"startPos\": 10,\n            \"endPos\": 14\n          }\n        ]\n      },\n      {\n        \"text\": \"what's the forecast for this friday?\",\n        \"intent\": \"GetWeather\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"what's the weather like for tomorrow\",\n        \"intent\": \"GetWeather\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"what's the weather like in new york\",\n        \"intent\": \"GetWeather\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"what's the weather like?\",\n        \"intent\": \"GetWeather\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"winter is coming\",\n        \"intent\": \"None\",\n        \"entities\": []\n      }\n    ],\n    \"settings\": []\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/FlightBooking.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n  BookFlight: IntentData\n  Cancel: IntentData\n  GetWeather: IntentData\n  None: IntentData\n}\n\nexport interface GeneratedInstanceFrom {\n  Airport?: InstanceData[]\n}\nexport interface From {\n  Airport?: string[][]\n  $instance?: GeneratedInstanceFrom\n}\n\nexport interface GeneratedInstanceTo {\n  Airport?: InstanceData[]\n}\nexport interface To {\n  Airport?: string[][]\n  $instance?: GeneratedInstanceTo\n}\n\nexport interface GeneratedInstance {\n  Airport?: InstanceData[]\n  From?: InstanceData[]\n  To?: InstanceData[]\n  datetime?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n\n  // Built-in entities\n  datetime?: DateTimeSpec[]\n\n  // Lists\n  Airport?: string[][]\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  From?: From[]\n  To?: To[]\n  $instance: GeneratedInstance\n}\n\nexport interface FlightBooking {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/Intents.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n            Cancel,\n            Delivery,\n            EntityTests,\n            Greeting,\n            Help,\n            None,\n            Roles,\n            search,\n            SpecifyName,\n            Travel,\n            Weather_GetForecast\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n\n            // Instance\n            public class _Instance\n            {\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/Intents.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Delivery\"\n    },\n    {\n      \"name\": \"EntityTests\"\n    },\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Roles\"\n    },\n    {\n      \"name\": \"search\"\n    },\n    {\n      \"name\": \"SpecifyName\"\n    },\n    {\n      \"name\": \"Travel\"\n    },\n    {\n      \"name\": \"Weather.GetForecast\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/NamespaceClass.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Test.Namespace\n{\n    public partial class NameOfTheClass: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Simple entities\n            public string[] City;\n            public string[] To;\n            public string[] From;\n            public string[] Name;\n            public string[] likee;\n            public string[] liker;\n            public string[] State;\n            public string[] Weather_Location;\n            public string[] destination;\n            public string[] source;\n\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] City;\n                public InstanceData[] From;\n                public InstanceData[] Name;\n                public InstanceData[] State;\n                public InstanceData[] To;\n                public InstanceData[] Weather_Location;\n                public InstanceData[] destination;\n                public InstanceData[] likee;\n                public InstanceData[] liker;\n                public InstanceData[] source;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<NameOfTheClass>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/PatternEntities.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Pattern.any\n            public string[] person;\n            public string[] from;\n            public string[] to;\n            public string[] subject;\n            public string[] extra;\n\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] extra;\n                public InstanceData[] from;\n                public InstanceData[] person;\n                public InstanceData[] subject;\n                public InstanceData[] to;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/PatternEntities.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"person\",\n      \"roles\": [\n        \"from\",\n        \"to\"\n      ],\n      \"explicitList\": []\n    },\n    {\n      \"name\": \"subject\",\n      \"roles\": [\n        \"extra\"\n      ],\n      \"explicitList\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/PrebuiltEntities.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Built-in entities\n            public Age[] age;\n            public Age[] begin;\n            public Age[] end;\n            public DateTimeSpec[] datetime;\n            public DateTimeSpec[] arrive;\n            public DateTimeSpec[] leave;\n            public Dimension[] dimension;\n            public Dimension[] length;\n            public Dimension[] width;\n            public string[] email;\n            public string[] receiver;\n            public string[] sender;\n            public GeographyV2[] geographyV2;\n            public GeographyV2[] endloc;\n            public GeographyV2[] startloc;\n            public Money[] money;\n            public Money[] max;\n            public Money[] min;\n            public double[] number;\n            public double[] ordinal;\n            public double[] start;\n            public OrdinalV2[] ordinalV2;\n            public OrdinalV2[] endpos;\n            public OrdinalV2[] startpos;\n            public double[] percentage;\n            public double[] maximum;\n            public double[] minimum;\n            public string[] personName;\n            public string[] child;\n            public string[] parent;\n            public string[] phonenumber;\n            public string[] newPhone;\n            public string[] old;\n            public Temperature[] temperature;\n            public Temperature[] a;\n            public Temperature[] b;\n            public string[] url;\n            public string[] oldURL;\n\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] a;\n                public InstanceData[] age;\n                public InstanceData[] arrive;\n                public InstanceData[] b;\n                public InstanceData[] begin;\n                public InstanceData[] child;\n                public InstanceData[] datetime;\n                public InstanceData[] dimension;\n                public InstanceData[] email;\n                public InstanceData[] end;\n                public InstanceData[] endloc;\n                public InstanceData[] endpos;\n                public InstanceData[] geographyV2;\n                public InstanceData[] leave;\n                public InstanceData[] length;\n                public InstanceData[] max;\n                public InstanceData[] maximum;\n                public InstanceData[] min;\n                public InstanceData[] minimum;\n                public InstanceData[] money;\n                public InstanceData[] newPhone;\n                public InstanceData[] number;\n                public InstanceData[] old;\n                public InstanceData[] oldURL;\n                public InstanceData[] ordinal;\n                public InstanceData[] ordinalV2;\n                public InstanceData[] parent;\n                public InstanceData[] percentage;\n                public InstanceData[] personName;\n                public InstanceData[] phonenumber;\n                public InstanceData[] receiver;\n                public InstanceData[] sender;\n                public InstanceData[] start;\n                public InstanceData[] startloc;\n                public InstanceData[] startpos;\n                public InstanceData[] temperature;\n                public InstanceData[] url;\n                public InstanceData[] width;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/PrebuiltEntities.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": [\n        \"begin\",\n        \"end\"\n      ]\n    },\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": [\n        \"arrive\",\n        \"leave\"\n      ]\n    },\n    {\n      \"name\": \"dimension\",\n      \"roles\": [\n        \"width\",\n        \"length\"\n      ]\n    },\n    {\n      \"name\": \"email\",\n      \"roles\": [\n        \"receiver\",\n        \"sender\"\n      ]\n    },\n    {\n      \"name\": \"geographyV2\",\n      \"roles\": [\n        \"startloc\",\n        \"endloc\"\n      ]\n    },\n    {\n      \"name\": \"money\",\n      \"roles\": [\n        \"min\",\n        \"max\"\n      ]\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": [\n        \"start\"\n      ]\n    },\n    {\n      \"name\": \"ordinalV2\",\n      \"roles\": [\n        \"startpos\",\n        \"endpos\"\n      ]\n    },\n    {\n      \"name\": \"percentage\",\n      \"roles\": [\n        \"minimum\",\n        \"maximum\"\n      ]\n    },\n    {\n      \"name\": \"personName\",\n      \"roles\": [\n        \"child\",\n        \"parent\"\n      ]\n    },\n    {\n      \"name\": \"phonenumber\",\n      \"roles\": [\n        \"newPhone\",\n        \"old\"\n      ]\n    },\n    {\n      \"name\": \"temperature\",\n      \"roles\": [\n        \"b\",\n        \"a\"\n      ]\n    },\n    {\n      \"name\": \"url\",\n      \"roles\": [\n        \"oldURL\"\n      ]\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/RegexEntities.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n\n            // Instance\n            public class _Instance\n            {\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/RegexEntities.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [\n    {\n      \"name\": \"Part\",\n      \"regexPattern\": \"kb[0-9]+\",\n      \"roles\": [\n        \"buy\",\n        \"sell\"\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/SimpleEntities.cs",
    "content": "// <auto-generated>\n// Code generated by luis:generate:cs\n// Tool github: https://github.com/microsoft/botframework-cli\n// Changes may cause incorrect behavior and will be lost if the code is\n// regenerated.\n// </auto-generated>\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.AI.Luis;\nnamespace Luis\n{\n    public partial class ContosoApp: IRecognizerConvert\n    {\n        [JsonProperty(\"text\")]\n        public string Text;\n\n        [JsonProperty(\"alteredText\")]\n        public string AlteredText;\n\n        public enum Intent {\n        };\n        [JsonProperty(\"intents\")]\n        public Dictionary<Intent, IntentScore> Intents;\n\n        public class _Entities\n        {\n            // Simple entities\n            public string[] City;\n            public string[] To;\n            public string[] From;\n            public string[] Name;\n            public string[] likee;\n            public string[] liker;\n            public string[] State;\n            public string[] Weather_Location;\n            public string[] destination;\n            public string[] source;\n\n\n            // Instance\n            public class _Instance\n            {\n                public InstanceData[] City;\n                public InstanceData[] From;\n                public InstanceData[] Name;\n                public InstanceData[] State;\n                public InstanceData[] To;\n                public InstanceData[] Weather_Location;\n                public InstanceData[] destination;\n                public InstanceData[] likee;\n                public InstanceData[] liker;\n                public InstanceData[] source;\n            }\n            [JsonProperty(\"$instance\")]\n            public _Instance _instance;\n        }\n        [JsonProperty(\"entities\")]\n        public _Entities Entities;\n\n        [JsonExtensionData(ReadData = true, WriteData = true)]\n        public IDictionary<string, object> Properties {get; set; }\n\n        public void Convert(dynamic result)\n        {\n            var app = JsonConvert.DeserializeObject<ContosoApp>(\n                JsonConvert.SerializeObject(\n                    result,\n                    new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Error = OnError }\n                )\n            );\n            Text = app.Text;\n            AlteredText = app.AlteredText;\n            Intents = app.Intents;\n            Entities = app.Entities;\n            Properties = app.Properties;\n        }\n\n        private static void OnError(object sender, ErrorEventArgs args)\n        {\n            // If needed, put your custom error logic here\n            Console.WriteLine(args.ErrorContext.Error.Message);\n            args.ErrorContext.Handled = true;\n        }\n\n        public (Intent intent, double score) TopIntent()\n        {\n            Intent maxIntent = Intent.None;\n            var max = 0.0;\n            foreach (var entry in Intents)\n            {\n                if (entry.Value.Score > max)\n                {\n                    maxIntent = entry.Key;\n                    max = entry.Value.Score.Value;\n                }\n            }\n            return (maxIntent, max);\n        }\n    }\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/SimpleEntities.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"GeoPeople\",\n  \"name\": \"Contoso App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [],\n  \"entities\": [\n    {\n      \"name\": \"Name\",\n      \"roles\": [\n        \"likee\",\n        \"liker\"\n      ]\n    },\n    {\n      \"name\": \"State\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Weather.Location\",\n      \"roles\": [\n        \"source\",\n        \"destination\"\n      ]\n    },\n    {\n      \"name\": \"City\",\n      \"children\": [\n        \"To\",\n        \"From\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/closed-lists.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n}\n\nexport interface GeneratedInstance {\n  Airline?: InstanceData[]\n  Buyer?: InstanceData[]\n  Seller?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n\n  // Built-in entities\n\n  // Lists\n  Airline?: string[][]\n  Buyer?: string[][]\n  Seller?: string[][]\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/composite-entities.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n}\n\nexport interface GeneratedInstance {\n  City?: InstanceData[]\n  From?: InstanceData[]\n  Name?: InstanceData[]\n  State?: InstanceData[]\n  To?: InstanceData[]\n  Weather_Location?: InstanceData[]\n  destination?: InstanceData[]\n  likee?: InstanceData[]\n  liker?: InstanceData[]\n  source?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n  City?: string[]\n  To?: string[]\n  From?: string[]\n  Name?: string[]\n  likee?: string[]\n  liker?: string[]\n  State?: string[]\n  Weather_Location?: string[]\n  destination?: string[]\n  source?: string[]\n\n  // Built-in entities\n\n  // Lists\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/contoso-app.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n  Cancel: IntentData\n  Delivery: IntentData\n  EntityTests: IntentData\n  Greeting: IntentData\n  Help: IntentData\n  None: IntentData\n  Roles: IntentData\n  search: IntentData\n  SpecifyName: IntentData\n  Travel: IntentData\n  Weather_GetForecast: IntentData\n}\n\nexport interface GeneratedInstanceAddress {\n  Destination?: InstanceData[]\n  Source?: InstanceData[]\n  number?: InstanceData[]\n  State?: InstanceData[]\n}\nexport interface Address {\n  Destination?: string[]\n  Source?: string[]\n  number?: number[]\n  State?: string[]\n  $instance?: GeneratedInstanceAddress\n}\n\nexport interface GeneratedInstanceComposite1 {\n  age?: InstanceData[]\n  datetime?: InstanceData[]\n  dimension?: InstanceData[]\n  email?: InstanceData[]\n  money?: InstanceData[]\n  number?: InstanceData[]\n  ordinal?: InstanceData[]\n  percentage?: InstanceData[]\n  phonenumber?: InstanceData[]\n  temperature?: InstanceData[]\n}\nexport interface Composite1 {\n  age?: NumberWithUnits[]\n  datetime?: DateTimeSpec[]\n  dimension?: NumberWithUnits[]\n  email?: string[]\n  money?: NumberWithUnits[]\n  number?: number[]\n  ordinal?: number[]\n  percentage?: number[]\n  phonenumber?: string[]\n  temperature?: NumberWithUnits[]\n  $instance?: GeneratedInstanceComposite1\n}\n\nexport interface GeneratedInstanceComposite2 {\n  Airline?: InstanceData[]\n  City?: InstanceData[]\n  url?: InstanceData[]\n  From?: InstanceData[]\n  To?: InstanceData[]\n  Weather_Location?: InstanceData[]\n}\nexport interface Composite2 {\n  Airline?: string[][]\n  City?: string[]\n  url?: string[]\n  From?: string[]\n  To?: string[]\n  Weather_Location?: string[]\n  $instance?: GeneratedInstanceComposite2\n}\n\nexport interface GeneratedInstance {\n  Address?: InstanceData[]\n  Airline?: InstanceData[]\n  Buyer?: InstanceData[]\n  City?: InstanceData[]\n  Composite1?: InstanceData[]\n  Composite2?: InstanceData[]\n  Destination?: InstanceData[]\n  From?: InstanceData[]\n  Name?: InstanceData[]\n  Part?: InstanceData[]\n  Seller?: InstanceData[]\n  Source?: InstanceData[]\n  State?: InstanceData[]\n  To?: InstanceData[]\n  Weather_Location?: InstanceData[]\n  a?: InstanceData[]\n  age?: InstanceData[]\n  arrive?: InstanceData[]\n  b?: InstanceData[]\n  begin?: InstanceData[]\n  buy?: InstanceData[]\n  child?: InstanceData[]\n  datetime?: InstanceData[]\n  destination?: InstanceData[]\n  dimension?: InstanceData[]\n  email?: InstanceData[]\n  end?: InstanceData[]\n  endloc?: InstanceData[]\n  endpos?: InstanceData[]\n  extra?: InstanceData[]\n  from?: InstanceData[]\n  geographyV2?: InstanceData[]\n  leave?: InstanceData[]\n  length?: InstanceData[]\n  likee?: InstanceData[]\n  liker?: InstanceData[]\n  max?: InstanceData[]\n  maximum?: InstanceData[]\n  min?: InstanceData[]\n  minimum?: InstanceData[]\n  money?: InstanceData[]\n  newPhone?: InstanceData[]\n  number?: InstanceData[]\n  old?: InstanceData[]\n  oldURL?: InstanceData[]\n  ordinal?: InstanceData[]\n  ordinalV2?: InstanceData[]\n  parent?: InstanceData[]\n  percentage?: InstanceData[]\n  person?: InstanceData[]\n  personName?: InstanceData[]\n  phonenumber?: InstanceData[]\n  receiver?: InstanceData[]\n  sell?: InstanceData[]\n  sender?: InstanceData[]\n  source?: InstanceData[]\n  start?: InstanceData[]\n  startloc?: InstanceData[]\n  startpos?: InstanceData[]\n  subject?: InstanceData[]\n  temperature?: InstanceData[]\n  to?: InstanceData[]\n  url?: InstanceData[]\n  width?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n  City?: string[]\n  To?: string[]\n  From?: string[]\n  Name?: string[]\n  likee?: string[]\n  liker?: string[]\n  State?: string[]\n  Weather_Location?: string[]\n  destination?: string[]\n  source?: string[]\n\n  // Built-in entities\n  age?: NumberWithUnits[]\n  begin?: string[]\n  end?: string[]\n  datetime?: DateTimeSpec[]\n  arrive?: string[]\n  leave?: string[]\n  dimension?: NumberWithUnits[]\n  length?: string[]\n  width?: string[]\n  email?: string[]\n  receiver?: string[]\n  sender?: string[]\n  geographyV2?: GeographyV2[]\n  endloc?: string[]\n  startloc?: string[]\n  money?: NumberWithUnits[]\n  max?: string[]\n  min?: string[]\n  number?: number[]\n  ordinal?: number[]\n  start?: string[]\n  ordinalV2?: OrdinalV2[]\n  endpos?: string[]\n  startpos?: string[]\n  percentage?: number[]\n  maximum?: string[]\n  minimum?: string[]\n  personName?: string[]\n  child?: string[]\n  parent?: string[]\n  phonenumber?: string[]\n  newPhone?: string[]\n  old?: string[]\n  temperature?: NumberWithUnits[]\n  a?: string[]\n  b?: string[]\n  url?: string[]\n  oldURL?: string[]\n\n  // Lists\n  Airline?: string[][]\n  Buyer?: string[][]\n  Seller?: string[][]\n\n  // Regex entities\n  Part?: string[]\n  buy?: string[]\n  sell?: string[]\n\n  // Pattern.any\n  person?: string[]\n  from?: string[]\n  to?: string[]\n  subject?: string[]\n  extra?: string[]\n\n  // Composites\n  Address?: Address[]\n  Composite1?: Composite1[]\n  Composite2?: Composite2[]\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/intents.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n  Cancel: IntentData\n  Delivery: IntentData\n  EntityTests: IntentData\n  Greeting: IntentData\n  Help: IntentData\n  None: IntentData\n  Roles: IntentData\n  search: IntentData\n  SpecifyName: IntentData\n  Travel: IntentData\n  Weather_GetForecast: IntentData\n}\n\nexport interface GeneratedInstance {\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n\n  // Built-in entities\n\n  // Lists\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/invalid.json",
    "content": "{\n    \"luis_schema_version\": \"3.2.0\",\n    \"name\": \"invalid\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/pattern-entities.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n}\n\nexport interface GeneratedInstance {\n  extra?: InstanceData[]\n  from?: InstanceData[]\n  person?: InstanceData[]\n  subject?: InstanceData[]\n  to?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n\n  // Built-in entities\n\n  // Lists\n\n  // Regex entities\n\n  // Pattern.any\n  person?: string[]\n  from?: string[]\n  to?: string[]\n  subject?: string[]\n  extra?: string[]\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/prebuilt-entities.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n}\n\nexport interface GeneratedInstance {\n  a?: InstanceData[]\n  age?: InstanceData[]\n  arrive?: InstanceData[]\n  b?: InstanceData[]\n  begin?: InstanceData[]\n  child?: InstanceData[]\n  datetime?: InstanceData[]\n  dimension?: InstanceData[]\n  email?: InstanceData[]\n  end?: InstanceData[]\n  endloc?: InstanceData[]\n  endpos?: InstanceData[]\n  geographyV2?: InstanceData[]\n  leave?: InstanceData[]\n  length?: InstanceData[]\n  max?: InstanceData[]\n  maximum?: InstanceData[]\n  min?: InstanceData[]\n  minimum?: InstanceData[]\n  money?: InstanceData[]\n  newPhone?: InstanceData[]\n  number?: InstanceData[]\n  old?: InstanceData[]\n  oldURL?: InstanceData[]\n  ordinal?: InstanceData[]\n  ordinalV2?: InstanceData[]\n  parent?: InstanceData[]\n  percentage?: InstanceData[]\n  personName?: InstanceData[]\n  phonenumber?: InstanceData[]\n  receiver?: InstanceData[]\n  sender?: InstanceData[]\n  start?: InstanceData[]\n  startloc?: InstanceData[]\n  startpos?: InstanceData[]\n  temperature?: InstanceData[]\n  url?: InstanceData[]\n  width?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n\n  // Built-in entities\n  age?: NumberWithUnits[]\n  begin?: string[]\n  end?: string[]\n  datetime?: DateTimeSpec[]\n  arrive?: string[]\n  leave?: string[]\n  dimension?: NumberWithUnits[]\n  length?: string[]\n  width?: string[]\n  email?: string[]\n  receiver?: string[]\n  sender?: string[]\n  geographyV2?: GeographyV2[]\n  endloc?: string[]\n  startloc?: string[]\n  money?: NumberWithUnits[]\n  max?: string[]\n  min?: string[]\n  number?: number[]\n  ordinal?: number[]\n  start?: string[]\n  ordinalV2?: OrdinalV2[]\n  endpos?: string[]\n  startpos?: string[]\n  percentage?: number[]\n  maximum?: string[]\n  minimum?: string[]\n  personName?: string[]\n  child?: string[]\n  parent?: string[]\n  phonenumber?: string[]\n  newPhone?: string[]\n  old?: string[]\n  temperature?: NumberWithUnits[]\n  a?: string[]\n  b?: string[]\n  url?: string[]\n  oldURL?: string[]\n\n  // Lists\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/regex-entities.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n}\n\nexport interface GeneratedInstance {\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n\n  // Built-in entities\n\n  // Lists\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/generate/simple-entities.ts",
    "content": "/**\n * <auto-generated>\n * Code generated by luis:generate:ts\n * Tool github: https://github.com/microsoft/botframework-cli\n * Changes may cause incorrect behavior and will be lost if the code is\n * regenerated.\n * </auto-generated>\n */\nimport {DateTimeSpec, GeographyV2, InstanceData, IntentData, NumberWithUnits, OrdinalV2} from 'botbuilder-ai'\n\nexport interface GeneratedIntents {\n}\n\nexport interface GeneratedInstance {\n  City?: InstanceData[]\n  From?: InstanceData[]\n  Name?: InstanceData[]\n  State?: InstanceData[]\n  To?: InstanceData[]\n  Weather_Location?: InstanceData[]\n  destination?: InstanceData[]\n  likee?: InstanceData[]\n  liker?: InstanceData[]\n  source?: InstanceData[]\n}\n\nexport interface GeneratedEntities {\n  // Simple entities\n  City?: string[]\n  To?: string[]\n  From?: string[]\n  Name?: string[]\n  likee?: string[]\n  liker?: string[]\n  State?: string[]\n  Weather_Location?: string[]\n  destination?: string[]\n  source?: string[]\n\n  // Built-in entities\n\n  // Lists\n\n  // Regex entities\n\n  // Pattern.any\n\n  // Composites\n  $instance: GeneratedInstance\n}\n\nexport interface ContosoApp {\n  text: string\n  alteredText?: string\n  intents: GeneratedIntents\n  entities: GeneratedEntities\n  [propName: string]: any\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/none.lu",
    "content": "# None\n* who is your ceo?\n- santa wants a blue ribbon\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/qna.lu",
    "content": "> # Intents\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n## Help\n- help\n- I need help\n- please help\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n## DeleteAlarm\n- delete alarm\n- delete the {alarmTime} alarm\n\n\n\n## CommunicationPreference\n- set call as my communication preference\n- I prefer to receive text messages\n\n## Help\n- can you help\n\n\n\n> # Entity Types\n$userName:simple\n\n$PREBUILT:datetimeV2\n\n> # SYNONYMS\n\n> **NOTE:** your synonym definitions can be defined anywhere chunks, interleaved within a .lu file or even spread across .lu files.\n\n> This defines that **$comPreference** should map synonyms -> canonical **list** value\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n> This defines that **$comPreference** should map synonyms -> canonical **text** value\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n> This defines that **$comPreference** should map synonyms -> canonical **fax** value\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> This is a phrase list\n\n$ChocolateType:phraseList\n- m&m\n- mars\n- mints\n- spearmings\n- payday\n- jelly\n- kit kat\n- kitkat\n- twix\n\n> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How can I change the default message from QnA Maker?\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ?How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> # QnA URLs \n\n[External URL link for QnAMaker](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n> # File ref urls\n\n[None Intent definition](./none.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/root.luis.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Calendar.Add\"\n    },\n    {\n      \"name\": \"Calendar.Find\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"add a new event on 27 - apr\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a new task finish assignment\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add an event to read about adam lambert news\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add an event to visit 209 nashville gym\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add imax theater to my upcoming events\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"calendar i ' ll be at the garage from 8 till 3 this saturday\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dunmore pa sonic sounds friday morning please\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"meeting my manager\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"save the date may 17 pictures party\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule appointment for tomorrow please\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the meeting will last for one hour\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"calendar for november 1948\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display weekend plans\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have anything on wednesday ?\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how many days are there between march 13th 2015 and today ?\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pull up my appointment find out how much time i have before my next appointment\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search for meetings with chris\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me tomorrow ' s wedding party time\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me the event details\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"voice activated reading of appointments this week\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i free to be with friends saturday ?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"appointment with johnson needs to be next week\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call dad mike\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change the meeting with chris to 9 : 00 am\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"email cloney john\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"extend lunch meeting 30 minutes extra\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to reschedule the meeting at the air force club\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"marketing meetings on tuesdays will now be every wednesday please change on my calendar\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move the bbq party to friday\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the workshop will last for 10 hours\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"file\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/1-intent-pattern-prebuilt.lu",
    "content": "// add these as patterns\n#DeleteAlarm\n~delete alarm\n~(delete|remove) the {alarmTime} alarm\n\n// alarmTime is a role for prebuilt datetimev2 entity\n$alarmTime:datetimeV2"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/1-intent.lu",
    "content": "#Greeting\nHi\nHello\nGood morning\nGood evening"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/8.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> These are defined as patterns with commPreference as pattern.any entity type\n# CommunicationPreference\n- set {commPreference} as my communication preference\n- I prefer to receive {commPreference}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Child_Entity_With_Spaces.json",
    "content": "{\n  \"luis_schema_version\": \"7.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"CancelOrder\",\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"Confirmation\",\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"Delivery\",\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"Greetings\",\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"ModifyOrder\",\n      \"features\": [\n        {\n          \"featureName\": \"ToppingDescriptor\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"SizeDescriptor\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"QuantityDescriptor\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"ModifierDescriptor\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"ScopeDescriptor\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"CrustDescriptor\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"None\",\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Address\",\n      \"children\": [\n        {\n          \"name\": \"Building Number\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"number\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"Street\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"District\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"City\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"geographyV2\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        }\n      ],\n      \"roles\": [],\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"Order\",\n      \"children\": [\n        {\n          \"name\": \"FullPizzaWithModifiers\",\n          \"children\": [\n            {\n              \"name\": \"PizzaType\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"featureName\": \"GreetingDescriptor\",\n                  \"isRequired\": false\n                }\n              ]\n            },\n            {\n              \"name\": \"Size\",\n              \"instanceOf\": \"SizeList\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"featureName\": \"SizeDescriptor\",\n                  \"isRequired\": false\n                },\n                {\n                  \"featureName\": \"GreetingDescriptor\",\n                  \"isRequired\": false\n                }\n              ]\n            },\n            {\n              \"name\": \"Quantity\",\n              \"instanceOf\": \"number\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"featureName\": \"QuantityDescriptor\",\n                  \"isRequired\": false\n                },\n                {\n                  \"featureName\": \"GreetingDescriptor\",\n                  \"isRequired\": false\n                }\n              ]\n            },\n            {\n              \"name\": \"Crust\",\n              \"instanceOf\": \"CrustList\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"featureName\": \"CrustDescriptor\",\n                  \"isRequired\": false\n                },\n                {\n                  \"featureName\": \"GreetingDescriptor\",\n                  \"isRequired\": false\n                }\n              ]\n            },\n            {\n              \"name\": \"ToppingModifiers\",\n              \"children\": [\n                {\n                  \"name\": \"Topping\",\n                  \"instanceOf\": \"ToppingList\",\n                  \"children\": [],\n                  \"features\": [\n                    {\n                      \"featureName\": \"ToppingDescriptor\",\n                      \"isRequired\": false\n                    },\n                    {\n                      \"featureName\": \"GreetingDescriptor\",\n                      \"isRequired\": false\n                    }\n                  ]\n                },\n                {\n                  \"name\": \"Modifier\",\n                  \"instanceOf\": \"ModifierList\",\n                  \"children\": [],\n                  \"features\": [\n                    {\n                      \"featureName\": \"ModifierDescriptor\",\n                      \"isRequired\": false\n                    },\n                    {\n                      \"featureName\": \"RemoveDescriptor\",\n                      \"isRequired\": false\n                    },\n                    {\n                      \"featureName\": \"AddDescriptor\",\n                      \"isRequired\": false\n                    },\n                    {\n                      \"featureName\": \"GreetingDescriptor\",\n                      \"isRequired\": false\n                    }\n                  ]\n                },\n                {\n                  \"name\": \"Scope\",\n                  \"instanceOf\": \"ScopeList\",\n                  \"children\": [],\n                  \"features\": [\n                    {\n                      \"featureName\": \"ScopeDescriptor\",\n                      \"isRequired\": false\n                    },\n                    {\n                      \"featureName\": \"GreetingDescriptor\",\n                      \"isRequired\": false\n                    }\n                  ]\n                }\n              ],\n              \"features\": [\n                {\n                  \"featureName\": \"ToppingDescriptor\",\n                  \"isRequired\": false\n                },\n                {\n                  \"featureName\": \"ModifierDescriptor\",\n                  \"isRequired\": false\n                },\n                {\n                  \"featureName\": \"ScopeDescriptor\",\n                  \"isRequired\": false\n                },\n                {\n                  \"featureName\": \"GreetingDescriptor\",\n                  \"isRequired\": false\n                }\n              ]\n            }\n          ],\n          \"features\": [\n            {\n              \"featureName\": \"ToppingDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"SizeDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"QuantityDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"ModifierDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"ScopeDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"CrustDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"SideOrder\",\n          \"children\": [\n            {\n              \"name\": \"SideProduct\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"featureName\": \"GreetingDescriptor\",\n                  \"isRequired\": false\n                }\n              ]\n            }\n          ],\n          \"features\": [\n            {\n              \"featureName\": \"SideOrderDescriptor\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"Time\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"datetimeV2\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"GreetingDescriptor\",\n              \"isRequired\": false\n            }\n          ]\n        }\n      ],\n      \"roles\": [],\n      \"features\": [\n        {\n          \"featureName\": \"GreetingDescriptor\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"hierarchicals\": [],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"CrustList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Deep Dish\",\n          \"list\": [\n            \"deep dish\",\n            \"deep dish crust\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Pan\",\n          \"list\": [\n            \"regular\",\n            \"normal\",\n            \"original\",\n            \"regular crust\",\n            \"normal crust\",\n            \"original crust\",\n            \"pan crust\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Stuffed Crust\",\n          \"list\": [\n            \"stuffed criust\",\n            \"stuffed crusts\",\n            \"stuffed crust\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Thin\",\n          \"list\": [\n            \"thin\",\n            \"skinny\",\n            \"thin crust\",\n            \"skinny crust\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ModifierList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Add\",\n          \"list\": [\n            \"with\",\n            \"with extra\",\n            \"extra\",\n            \"add\",\n            \"more of\",\n            \"needs\",\n            \"just\",\n            \"replaced with\",\n            \"with some\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Remove\",\n          \"list\": [\n            \"without\",\n            \"substitute\",\n            \"no\",\n            \"hold\",\n            \"hold the\",\n            \"replace\",\n            \"instead of\",\n            \"with no\",\n            \"leave off\",\n            \"not want\",\n            \"dont want\",\n            \"except\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ScopeList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Half\",\n          \"list\": [\n            \"on half\",\n            \"on one half\",\n            \"the other half\",\n            \"half with\",\n            \"on one side\",\n            \"one side\",\n            \"1/2\",\n            \"on the other half\",\n            \"other half\",\n            \"the other\",\n            \"half\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Half And Half\",\n          \"list\": [\n            \"half and half\",\n            \"half & half\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"On One\",\n          \"list\": [\n            \"on one\",\n            \"on one of them\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SizeList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Extra Large\",\n          \"list\": [\n            \"XL\",\n            \"huge\",\n            \"super big\",\n            \"massive\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Large\",\n          \"list\": [\n            \"large\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Medium\",\n          \"list\": [\n            \"medium\",\n            \"regular\",\n            \"individual\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Party Size\",\n          \"list\": [\n            \"party size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Small\",\n          \"list\": [\n            \"small\",\n            \"smallest\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ToppingList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Alfredo Sauce\",\n          \"list\": [\n            \"alfredo\",\n            \"alfredo sauce\",\n            \"white sauce\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"All\",\n          \"list\": [\n            \"everything\",\n            \"various toppings\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Anchovies\",\n          \"list\": [\n            \"anchovie\",\n            \"anchovies\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Artichokes\",\n          \"list\": [\n            \"artichokes\",\n            \"artichoke\",\n            \"artichockes\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Bacon\",\n          \"list\": [\n            \"bacon\",\n            \"bacon strips\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Banana Pepper\",\n          \"list\": [\n            \"yellow peppers\",\n            \"yellow pepper\",\n            \"banana pepper\",\n            \"banana peppers\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Barbecue\",\n          \"list\": [\n            \"BBQ\",\n            \"barbeque\",\n            \"barbecue\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Basil\",\n          \"list\": [\n            \"basil\",\n            \"basils\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Beef\",\n          \"list\": [\n            \"beef\",\n            \"ground beef\",\n            \"meat\",\n            \"hamburger\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Broccoli\",\n          \"list\": [\n            \"broccoli\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Canadian Bacon\",\n          \"list\": [\n            \"canadian bacon\",\n            \"canada bacon\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Cheddar\",\n          \"list\": [\n            \"cheddar\",\n            \"cheddar cheese\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Cheese\",\n          \"list\": [\n            \"cheeses\",\n            \"cheese\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Chicken\",\n          \"list\": [\n            \"chicken\",\n            \"chickens\",\n            \"grilled chicken\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Corn\",\n          \"list\": [\n            \"corn\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Dip\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"Eggplant\",\n          \"list\": [\n            \"eggplant\",\n            \"eggplants\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Everything\",\n          \"list\": [\n            \"various toppings\",\n            \"everything\",\n            \"works\",\n            \"the works\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Garlic\",\n          \"list\": [\n            \"garlic\",\n            \"garlics\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Green Olive\",\n          \"list\": [\n            \"green olive\",\n            \"green olives\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Ham\",\n          \"list\": [\n            \"ham\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Hot Sauce\",\n          \"list\": [\n            \"hot sauce\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Jalapeno\",\n          \"list\": [\n            \"Jalapenos\",\n            \"jalapeno\",\n            \"jalapeno peppers\",\n            \"jalapeno pepper\",\n            \"spicy peppers\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Lettuce\",\n          \"list\": [\n            \"lettuce\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Meatballs\",\n          \"list\": [\n            \"meatball\",\n            \"meatballs\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Mozzarella\",\n          \"list\": [\n            \"mozzarella\",\n            \"mozzarella cheese\",\n            \"mozzerella\",\n            \"mozzerella cheese\",\n            \"mozarela cheese\",\n            \"mozarela\",\n            \"mozzaralla ranch\",\n            \"mozzerella ranch\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Mushroom\",\n          \"list\": [\n            \"Mushrooms\",\n            \"mushroom\",\n            \"muhsroom\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Olive\",\n          \"list\": [\n            \"olive\",\n            \"black olive\",\n            \"black olives\",\n            \"olives\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Onions\",\n          \"list\": [\n            \"onion\",\n            \"onions\",\n            \"grilled onions\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Oregano\",\n          \"list\": [\n            \"oregano\",\n            \"oreganos\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Parmesan Cheese\",\n          \"list\": [\n            \"parmesan cheese\",\n            \"parmisan cheese\",\n            \"parmesan\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Pepperoni\",\n          \"list\": [\n            \"pepperoni\",\n            \"pepperonis\",\n            \"peperoni\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Peppers\",\n          \"list\": [\n            \"green peppers\",\n            \"green pepper\",\n            \"pepper\",\n            \"peppers\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Pesto\",\n          \"list\": [\n            \"pesto\",\n            \"pesto sauce\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Pineapple\",\n          \"list\": [\n            \"pineapple\",\n            \"pineapples\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Ranch\",\n          \"list\": [\n            \"ranch\",\n            \"ranch sauce\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Red Peppers\",\n          \"list\": [\n            \"red pepper\",\n            \"red peppers\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Salami\",\n          \"list\": [\n            \"salami\",\n            \"salamis\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Sauce\",\n          \"list\": [\n            \"sauce\",\n            \"red sauce\",\n            \"red sauces\",\n            \"pizza sauce\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Sausage\",\n          \"list\": [\n            \"italian sausage\",\n            \"sausage\",\n            \"sausages\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Spinach\",\n          \"list\": [\n            \"spinach\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Sun Dried Tomato\",\n          \"list\": [\n            \"sun-dried tomato\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Tomato\",\n          \"list\": [\n            \"tomato\",\n            \"tomatos\",\n            \"tomatoes\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Turkey\",\n          \"list\": [\n            \"turkey\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Zuccini\",\n          \"list\": [\n            \"zuccinis\",\n            \"zuccini\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"geographyV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"17, orouba street, nasr city, cairo\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 0,\n          \"endPos\": 34,\n          \"children\": [\n            {\n              \"entity\": \"Building Number\",\n              \"startPos\": 0,\n              \"endPos\": 1,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Street\",\n              \"startPos\": 4,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"District\",\n              \"startPos\": 19,\n              \"endPos\": 27,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 30,\n              \"endPos\": 34,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"a cheese pizza medium with some pineapple and chicken\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 0,\n          \"endPos\": 52,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 0,\n              \"endPos\": 52,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 15,\n                  \"endPos\": 20,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 22,\n                  \"endPos\": 52,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 22,\n                      \"endPos\": 30,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 32,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 46,\n                      \"endPos\": 52,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"add 5 party size marinera pizzas and i will pick them up at 6pm\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 0,\n          \"endPos\": 62,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 4,\n              \"endPos\": 31,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 4,\n                  \"endPos\": 4,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 6,\n                  \"endPos\": 15,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 17,\n                  \"endPos\": 31,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"address is 675, gamal abd el nasser street, giza\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 11,\n          \"endPos\": 47,\n          \"children\": [\n            {\n              \"entity\": \"Building Number\",\n              \"startPos\": 11,\n              \"endPos\": 13,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Street\",\n              \"startPos\": 16,\n              \"endPos\": 41,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 44,\n              \"endPos\": 47,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"awesome\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get 3 pepperoni pizzas and a four cheese pizza with a large house salad and a large fries\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 94,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 27,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 10,\n                  \"endPos\": 10,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 12,\n                  \"endPos\": 27,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 33,\n              \"endPos\": 51,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 35,\n                  \"endPos\": 51,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 53,\n              \"endPos\": 94,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 58,\n                  \"endPos\": 76,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 82,\n                  \"endPos\": 94,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a large veggie pizza but can i get it without onions\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 61,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 61,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 16,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 18,\n                  \"endPos\": 29,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 48,\n                  \"endPos\": 61,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 48,\n                      \"endPos\": 54,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 56,\n                      \"endPos\": 61,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a medium cheese pizza with sausage on half and chicken on the other half\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 81,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 81,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 19,\n                  \"endPos\": 30,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 32,\n                  \"endPos\": 51,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 32,\n                      \"endPos\": 35,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 37,\n                      \"endPos\": 43,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 45,\n                      \"endPos\": 51,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 57,\n                  \"endPos\": 81,\n                  \"children\": [\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 57,\n                      \"endPos\": 63,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 65,\n                      \"endPos\": 81,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a medium pepperoni pizza with extra cheese and mushrooms plus some ranch dip for delivery paying cash\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 110,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 65,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 19,\n                  \"endPos\": 33,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 35,\n                  \"endPos\": 65,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 35,\n                      \"endPos\": 44,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 46,\n                      \"endPos\": 51,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 57,\n                      \"endPos\": 65,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 67,\n              \"endPos\": 85,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 77,\n                  \"endPos\": 85,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a medium sausage pizza and fries delivered\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 51,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 31,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 19,\n                  \"endPos\": 31,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 37,\n              \"endPos\": 41,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 37,\n                  \"endPos\": 41,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a pepperoni pizza and a can of coke please\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 44,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 26,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 12,\n                  \"endPos\": 26,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 32,\n              \"endPos\": 44,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 41,\n                  \"endPos\": 44,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a small pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 22,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 22,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 16,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 18,\n                  \"endPos\": 22,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a small pizza with onions peppers and olives\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 53,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 53,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 16,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 18,\n                  \"endPos\": 22,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 24,\n                  \"endPos\": 53,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 24,\n                      \"endPos\": 27,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 29,\n                      \"endPos\": 34,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 36,\n                      \"endPos\": 42,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 48,\n                      \"endPos\": 53,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get an extra large canadian pizza with half ground beef and half chicken\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 77,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 77,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 13,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 25,\n                  \"endPos\": 38,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 40,\n                  \"endPos\": 60,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 40,\n                      \"endPos\": 43,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 45,\n                      \"endPos\": 48,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 50,\n                      \"endPos\": 60,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 66,\n                  \"endPos\": 77,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 66,\n                      \"endPos\": 69,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 71,\n                      \"endPos\": 77,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i order 2 large canadian pizzas and can i add chicken on one of them please\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 12,\n          \"endPos\": 78,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 12,\n              \"endPos\": 78,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 12,\n                  \"endPos\": 12,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 14,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 20,\n                  \"endPos\": 34,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 46,\n                  \"endPos\": 71,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 46,\n                      \"endPos\": 48,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 50,\n                      \"endPos\": 56,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 61,\n                      \"endPos\": 71,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i order a small cheese pizza and a medium sausage and mushroom pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 12,\n          \"endPos\": 71,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 12,\n              \"endPos\": 31,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 14,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 20,\n                  \"endPos\": 31,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 37,\n              \"endPos\": 71,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 39,\n                  \"endPos\": 44,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 46,\n                  \"endPos\": 71,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i please order a large meatlovers pizza but without ground beef please\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 18,\n          \"endPos\": 66,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 18,\n              \"endPos\": 66,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 21,\n                  \"endPos\": 25,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 27,\n                  \"endPos\": 42,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 48,\n                  \"endPos\": 66,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 48,\n                      \"endPos\": 54,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 56,\n                      \"endPos\": 66,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"can i please place an order for an extra large hawaiian pizza including bacon pineapple and some cheddar cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 32,\n          \"endPos\": 110,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 32,\n              \"endPos\": 110,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 35,\n                  \"endPos\": 45,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 47,\n                  \"endPos\": 60,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 62,\n                  \"endPos\": 110,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 62,\n                      \"endPos\": 70,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 72,\n                      \"endPos\": 76,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 78,\n                      \"endPos\": 86,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 97,\n                      \"endPos\": 110,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it i dont want it anymore\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it please\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my order\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel order\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that order\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the order\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirming\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"correct\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could i get a large sheet pizza and do half with pepperoni and the other just cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 12,\n          \"endPos\": 83,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 12,\n              \"endPos\": 83,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 14,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 20,\n                  \"endPos\": 30,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 36,\n                  \"endPos\": 57,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 39,\n                      \"endPos\": 47,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 49,\n                      \"endPos\": 57,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 63,\n                  \"endPos\": 83,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 63,\n                      \"endPos\": 71,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 78,\n                      \"endPos\": 83,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"could i get a pepperoni pizza with salami instead and a ham and pineapple pizza with bacon instead of ham\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 12,\n          \"endPos\": 104,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 12,\n              \"endPos\": 48,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 14,\n                  \"endPos\": 28,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 30,\n                  \"endPos\": 48,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 30,\n                      \"endPos\": 33,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 35,\n                      \"endPos\": 40,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 54,\n              \"endPos\": 104,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 54,\n                  \"endPos\": 78,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 80,\n                  \"endPos\": 89,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 80,\n                      \"endPos\": 83,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 85,\n                      \"endPos\": 89,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 91,\n                  \"endPos\": 104,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 91,\n                      \"endPos\": 100,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 102,\n                      \"endPos\": 104,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"could i get a pizza that's half pepperoni sausage and onion and the other half with just plain cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 12,\n          \"endPos\": 100,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 12,\n              \"endPos\": 100,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 14,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 27,\n                  \"endPos\": 58,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 27,\n                      \"endPos\": 30,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 32,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 42,\n                      \"endPos\": 48,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 54,\n                      \"endPos\": 58,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 64,\n                  \"endPos\": 100,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 64,\n                      \"endPos\": 77,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 95,\n                      \"endPos\": 100,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"deliver it at 13, giza square\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 14,\n          \"endPos\": 28,\n          \"children\": [\n            {\n              \"entity\": \"Building Number\",\n              \"startPos\": 14,\n              \"endPos\": 15,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Street\",\n              \"startPos\": 18,\n              \"endPos\": 28,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"delivery for a small pepperoni pizza with parsley and parmesan cheese plus a garlic dip paying cash\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 0,\n          \"endPos\": 98,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 13,\n              \"endPos\": 68,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 15,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 21,\n                  \"endPos\": 35,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 37,\n                  \"endPos\": 68,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 37,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 42,\n                      \"endPos\": 48,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 54,\n                      \"endPos\": 68,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 70,\n              \"endPos\": 86,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 77,\n                  \"endPos\": 86,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"delivery order for a large cheese pizza with ham and olives and a side of cheese dip\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 0,\n          \"endPos\": 83,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 19,\n              \"endPos\": 58,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 21,\n                  \"endPos\": 25,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 27,\n                  \"endPos\": 38,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 40,\n                  \"endPos\": 58,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 40,\n                      \"endPos\": 43,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 45,\n                      \"endPos\": 47,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 53,\n                      \"endPos\": 58,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 64,\n              \"endPos\": 83,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 74,\n                  \"endPos\": 83,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"dont make my order anymore\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dont want the order anymore\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a bbq pizza without cheese and an extra large pepperoni pizza with peppers olives and ham and a salad on the side\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 6,\n          \"endPos\": 119,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 32,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 19,\n                  \"endPos\": 32,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 19,\n                      \"endPos\": 25,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 27,\n                      \"endPos\": 32,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 38,\n              \"endPos\": 95,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 41,\n                  \"endPos\": 51,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 53,\n                  \"endPos\": 67,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 69,\n                  \"endPos\": 95,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 69,\n                      \"endPos\": 72,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 74,\n                      \"endPos\": 80,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 82,\n                      \"endPos\": 87,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 93,\n                      \"endPos\": 95,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 101,\n              \"endPos\": 119,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 103,\n                  \"endPos\": 107,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a cheddar cheese pizza large with extra anchovies\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 55,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 55,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 28,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 30,\n                  \"endPos\": 34,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 36,\n                  \"endPos\": 55,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 36,\n                      \"endPos\": 45,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 47,\n                      \"endPos\": 55,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a large napoli pizza and add extra anchovies remove the cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 68,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 68,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 26,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 32,\n                  \"endPos\": 50,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 32,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 42,\n                      \"endPos\": 50,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 52,\n                  \"endPos\": 68,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 52,\n                      \"endPos\": 57,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 63,\n                      \"endPos\": 68,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a medium hand tossed pizza with mushrooms on half of it and pepperoni on the other half\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 93,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 93,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 14,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 16,\n                  \"endPos\": 32,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 34,\n                  \"endPos\": 61,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 34,\n                      \"endPos\": 37,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 39,\n                      \"endPos\": 47,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 49,\n                      \"endPos\": 55,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 67,\n                  \"endPos\": 93,\n                  \"children\": [\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 67,\n                      \"endPos\": 75,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 77,\n                      \"endPos\": 93,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a pepperoni pizza without pepperoni please\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 42,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 41,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 25,\n                  \"endPos\": 41,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 25,\n                      \"endPos\": 31,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 33,\n                      \"endPos\": 41,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"get me one monaco pizza but hold the ham\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 39,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 39,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 11,\n                  \"endPos\": 22,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 28,\n                  \"endPos\": 39,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 28,\n                      \"endPos\": 35,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 37,\n                      \"endPos\": 39,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"get me three pepperoni pizzas without onions but add bacon\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 57,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 57,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 11,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 13,\n                  \"endPos\": 28,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 30,\n                  \"endPos\": 43,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 30,\n                      \"endPos\": 36,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 38,\n                      \"endPos\": 43,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 49,\n                  \"endPos\": 57,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 49,\n                      \"endPos\": 51,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 53,\n                      \"endPos\": 57,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"give me a white castle pizza without any peppers\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 8,\n          \"endPos\": 47,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 8,\n              \"endPos\": 47,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 10,\n                  \"endPos\": 27,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 29,\n                  \"endPos\": 47,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 29,\n                      \"endPos\": 35,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 41,\n                      \"endPos\": 47,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"go ahead\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello i would like to order a large hawaiian pizza with extra cheese black olives and extra pepperoni\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 28,\n          \"endPos\": 100,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 28,\n              \"endPos\": 100,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 30,\n                  \"endPos\": 34,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 36,\n                  \"endPos\": 49,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 51,\n                  \"endPos\": 100,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 51,\n                      \"endPos\": 60,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 62,\n                      \"endPos\": 67,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 69,\n                      \"endPos\": 80,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 86,\n                      \"endPos\": 90,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 92,\n                      \"endPos\": 100,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hello i'd like to order 6 medium pizzas for our office party two canadian two veggie and two meatlovers\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 24,\n          \"endPos\": 102,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 24,\n              \"endPos\": 38,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 24,\n                  \"endPos\": 24,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 26,\n                  \"endPos\": 31,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 33,\n                  \"endPos\": 38,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 61,\n              \"endPos\": 72,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 61,\n                  \"endPos\": 63,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 65,\n                  \"endPos\": 72,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 74,\n              \"endPos\": 83,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 74,\n                  \"endPos\": 76,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 78,\n                  \"endPos\": 83,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 89,\n              \"endPos\": 102,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 89,\n                  \"endPos\": 91,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 93,\n                  \"endPos\": 102,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hey\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey again\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey can i get a small pizza with pepperoni and extra cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 14,\n          \"endPos\": 58,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 14,\n              \"endPos\": 58,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 16,\n                  \"endPos\": 20,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 22,\n                  \"endPos\": 26,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 28,\n                  \"endPos\": 58,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 28,\n                      \"endPos\": 31,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 33,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 47,\n                      \"endPos\": 51,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 53,\n                      \"endPos\": 58,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hey i want to order a large pepperoni pizza without mushrooms add extra chicken\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 20,\n          \"endPos\": 78,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 20,\n              \"endPos\": 78,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 22,\n                  \"endPos\": 26,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 28,\n                  \"endPos\": 42,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 44,\n                  \"endPos\": 60,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 62,\n                  \"endPos\": 78,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hey i want to order a large supreme pizza add cheese no onions plus a large pepperoni pizza with sausage\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 20,\n          \"endPos\": 103,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 20,\n              \"endPos\": 61,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 22,\n                  \"endPos\": 26,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 28,\n                  \"endPos\": 40,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 42,\n                  \"endPos\": 51,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 42,\n                      \"endPos\": 44,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 46,\n                      \"endPos\": 51,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 53,\n                  \"endPos\": 61,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 53,\n                      \"endPos\": 54,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 56,\n                      \"endPos\": 61,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 68,\n              \"endPos\": 103,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 70,\n                  \"endPos\": 74,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 76,\n                  \"endPos\": 90,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 92,\n                  \"endPos\": 103,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 92,\n                      \"endPos\": 95,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 97,\n                      \"endPos\": 103,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hey there\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi can i order a large pizza with pepperoni bacon and extra chicken\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 15,\n          \"endPos\": 66,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 15,\n              \"endPos\": 66,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 17,\n                  \"endPos\": 21,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 23,\n                  \"endPos\": 27,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 29,\n                  \"endPos\": 66,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 29,\n                      \"endPos\": 32,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 34,\n                      \"endPos\": 42,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 44,\n                      \"endPos\": 48,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 54,\n                      \"endPos\": 58,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 60,\n                      \"endPos\": 66,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hi dear team i would order a medium margherita pizza add extra pepper ham and ranch\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 27,\n          \"endPos\": 82,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 27,\n              \"endPos\": 82,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 29,\n                  \"endPos\": 34,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 36,\n                  \"endPos\": 51,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 53,\n                  \"endPos\": 82,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 53,\n                      \"endPos\": 61,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 63,\n                      \"endPos\": 68,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 70,\n                      \"endPos\": 72,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 78,\n                      \"endPos\": 82,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hi i need to place an order for a large cheese pizza with extra cheese and mushrooms and bacon toppings\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 32,\n          \"endPos\": 102,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 32,\n              \"endPos\": 102,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 34,\n                  \"endPos\": 38,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 40,\n                  \"endPos\": 51,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 53,\n                  \"endPos\": 93,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 53,\n                      \"endPos\": 62,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 64,\n                      \"endPos\": 69,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 75,\n                      \"endPos\": 83,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 89,\n                      \"endPos\": 93,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hi i want a medium veggie pizza with bacon added to one side and the other half add chicken\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 10,\n          \"endPos\": 90,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 10,\n              \"endPos\": 90,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 12,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 19,\n                  \"endPos\": 30,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 32,\n                  \"endPos\": 59,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 32,\n                      \"endPos\": 35,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 37,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 52,\n                      \"endPos\": 59,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 65,\n                  \"endPos\": 90,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 65,\n                      \"endPos\": 78,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 80,\n                      \"endPos\": 82,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 84,\n                      \"endPos\": 90,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hi we want a large seafood pizza one half no mushrooms one half extra onions\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 11,\n          \"endPos\": 75,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 11,\n              \"endPos\": 75,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 13,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 19,\n                  \"endPos\": 31,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 33,\n                  \"endPos\": 53,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 33,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 42,\n                      \"endPos\": 43,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 45,\n                      \"endPos\": 53,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 55,\n                  \"endPos\": 75,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 55,\n                      \"endPos\": 62,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 64,\n                      \"endPos\": 68,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 70,\n                      \"endPos\": 75,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"hii\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hiiiii\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how are you\",\n      \"intent\": \"Greetings\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need 2 large cheese pizzas 6 large pepperoni pizzas and 1 large supreme pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 78,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 27,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 7,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 27,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 29,\n              \"endPos\": 52,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 29,\n                  \"endPos\": 29,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 31,\n                  \"endPos\": 35,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 37,\n                  \"endPos\": 52,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 58,\n              \"endPos\": 78,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 58,\n                  \"endPos\": 58,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 60,\n                  \"endPos\": 64,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 66,\n                  \"endPos\": 78,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a chicken pizza without mushroom and a large pepperoni pizza extra anchovies and some bread sticks\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 104,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 38,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 21,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 23,\n                  \"endPos\": 38,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 23,\n                      \"endPos\": 29,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 31,\n                      \"endPos\": 38,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 44,\n              \"endPos\": 82,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 46,\n                  \"endPos\": 50,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 52,\n                  \"endPos\": 66,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 68,\n                  \"endPos\": 82,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 68,\n                      \"endPos\": 72,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 74,\n                      \"endPos\": 82,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 88,\n              \"endPos\": 104,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 93,\n                  \"endPos\": 104,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large ham pizza extra bacon and corn the payment will be in cash\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 72,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 44,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 25,\n                  \"endPos\": 44,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 25,\n                      \"endPos\": 29,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 31,\n                      \"endPos\": 35,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 41,\n                      \"endPos\": 44,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large meat lovers pizza with extra sausage cheese and bacon\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 67,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 67,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 31,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 33,\n                  \"endPos\": 67,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 33,\n                      \"endPos\": 42,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 44,\n                      \"endPos\": 50,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 52,\n                      \"endPos\": 57,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 63,\n                      \"endPos\": 67,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large pepperoni with bell peppers and black olives and a small grilled chicken with bacon\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 97,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 58,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 25,\n                  \"endPos\": 58,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 25,\n                      \"endPos\": 28,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 30,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 47,\n                      \"endPos\": 58,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 64,\n              \"endPos\": 97,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 66,\n                  \"endPos\": 70,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 72,\n                  \"endPos\": 86,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 88,\n                  \"endPos\": 97,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 88,\n                      \"endPos\": 91,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 93,\n                      \"endPos\": 97,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large pizza with alfredo sauce and one with cheddar cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 66,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 38,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 21,\n                  \"endPos\": 38,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 21,\n                      \"endPos\": 24,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 26,\n                      \"endPos\": 38,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 44,\n              \"endPos\": 66,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 44,\n                  \"endPos\": 46,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 48,\n                  \"endPos\": 66,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 48,\n                      \"endPos\": 51,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 53,\n                      \"endPos\": 66,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large pizza with alfredo sauce instead of the pizza sauce\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 65,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 65,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 21,\n                  \"endPos\": 38,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 21,\n                      \"endPos\": 24,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 26,\n                      \"endPos\": 38,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 40,\n                  \"endPos\": 65,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 40,\n                      \"endPos\": 49,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 55,\n                      \"endPos\": 65,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large pizza with extra jalapenos one with half pineapples and one with light onions\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 91,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 91,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 21,\n                  \"endPos\": 40,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 21,\n                      \"endPos\": 30,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 32,\n                      \"endPos\": 40,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 42,\n                  \"endPos\": 65,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 51,\n                      \"endPos\": 54,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 75,\n                  \"endPos\": 91,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large pizza without ham add extra pineapple\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 51,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 51,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 21,\n                  \"endPos\": 31,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 21,\n                      \"endPos\": 27,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 29,\n                      \"endPos\": 31,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 33,\n                  \"endPos\": 51,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 33,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 43,\n                      \"endPos\": 51,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a large sausage and mushroom pizza and a large coke\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 57,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 40,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 40,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 46,\n              \"endPos\": 57,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 54,\n                  \"endPos\": 57,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a medium cheese pizza add mushrooms and onions and one chicken pizza needs peppers and sausage\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 100,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 52,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 14,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 16,\n                  \"endPos\": 27,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 29,\n                  \"endPos\": 52,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 29,\n                      \"endPos\": 31,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 33,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 47,\n                      \"endPos\": 52,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 58,\n              \"endPos\": 100,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 58,\n                  \"endPos\": 60,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 62,\n                  \"endPos\": 74,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 76,\n                  \"endPos\": 100,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 76,\n                      \"endPos\": 80,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 82,\n                      \"endPos\": 88,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 94,\n                      \"endPos\": 100,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a medium thin crust pepperoni pizza with bacon and grilled onions with a side of cheesy bread sticks\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 106,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 71,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 14,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Crust\",\n                  \"startPos\": 16,\n                  \"endPos\": 25,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 27,\n                  \"endPos\": 41,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 43,\n                  \"endPos\": 71,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 43,\n                      \"endPos\": 46,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 48,\n                      \"endPos\": 52,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 58,\n                      \"endPos\": 71,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 73,\n              \"endPos\": 106,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 88,\n                  \"endPos\": 106,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need a pepperoni sausage and mushroom pizza and please leave off the cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 76,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 76,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 40,\n                  \"endPos\": 44,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 57,\n                  \"endPos\": 76,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 57,\n                      \"endPos\": 65,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 71,\n                      \"endPos\": 76,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need five pizzas with pepperoni onions green peppers and green olives on one of them\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 85,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 85,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 10,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 12,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 19,\n                  \"endPos\": 53,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 19,\n                      \"endPos\": 22,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 24,\n                      \"endPos\": 32,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 34,\n                      \"endPos\": 39,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 41,\n                      \"endPos\": 53,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 59,\n                  \"endPos\": 85,\n                  \"children\": [\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 59,\n                      \"endPos\": 70,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 72,\n                      \"endPos\": 85,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to order one large plain cheese pizza a small pepperoni pizza bread sticks and onion rings\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 96,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 43,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 16,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 20,\n                  \"endPos\": 24,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 26,\n                  \"endPos\": 43,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 45,\n              \"endPos\": 67,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 47,\n                  \"endPos\": 51,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 53,\n                  \"endPos\": 67,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 69,\n              \"endPos\": 96,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 69,\n                  \"endPos\": 80,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 86,\n                  \"endPos\": 96,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need twelve large pizzas with various toppings for a business meeting at noon\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 78,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 47,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 12,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 14,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 20,\n                  \"endPos\": 25,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 27,\n                  \"endPos\": 47,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 27,\n                      \"endPos\": 30,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 32,\n                      \"endPos\": 47,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need two small chicken pizzas stuffed crust with extra salami bacon ham on half and without olives and a side of garlic knots\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 126,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 99,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 11,\n                  \"endPos\": 15,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 17,\n                  \"endPos\": 30,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Crust\",\n                  \"startPos\": 32,\n                  \"endPos\": 44,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 46,\n                  \"endPos\": 80,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 46,\n                      \"endPos\": 55,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 57,\n                      \"endPos\": 62,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 64,\n                      \"endPos\": 68,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 70,\n                      \"endPos\": 72,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 74,\n                      \"endPos\": 80,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 86,\n                  \"endPos\": 99,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 86,\n                      \"endPos\": 92,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 94,\n                      \"endPos\": 99,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 105,\n              \"endPos\": 126,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 115,\n                  \"endPos\": 126,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a himalyan pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 22,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 22,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 22,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a large meat lover's pizza with ham and sausage with garlic sticks on the side\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 84,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 53,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 32,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 34,\n                  \"endPos\": 53,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 34,\n                      \"endPos\": 37,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 39,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 47,\n                      \"endPos\": 53,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 55,\n              \"endPos\": 84,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 60,\n                  \"endPos\": 72,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a medium cheese pizza with onions a small pizza with olives and a large pizza with mushrooms\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 98,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 39,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 14,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 16,\n                  \"endPos\": 27,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 29,\n                  \"endPos\": 39,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 29,\n                      \"endPos\": 32,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 34,\n                      \"endPos\": 39,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 41,\n              \"endPos\": 65,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 43,\n                  \"endPos\": 47,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 49,\n                  \"endPos\": 53,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 55,\n                  \"endPos\": 65,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 55,\n                      \"endPos\": 58,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 60,\n                      \"endPos\": 65,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 71,\n              \"endPos\": 98,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 73,\n                  \"endPos\": 77,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 79,\n                  \"endPos\": 83,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 85,\n                  \"endPos\": 98,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 85,\n                      \"endPos\": 88,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 90,\n                      \"endPos\": 98,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a medium hawaiian pizza with pineapple canadian bacon and extra cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 76,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 76,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 14,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 16,\n                  \"endPos\": 29,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 31,\n                  \"endPos\": 76,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 31,\n                      \"endPos\": 34,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 36,\n                      \"endPos\": 44,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 46,\n                      \"endPos\": 59,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 65,\n                      \"endPos\": 69,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 71,\n                      \"endPos\": 76,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a pepperoni large with extra anchovies but remove cheese olives and mushroom\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 82,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 82,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 17,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 19,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 25,\n                  \"endPos\": 44,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 25,\n                      \"endPos\": 34,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 36,\n                      \"endPos\": 44,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 50,\n                  \"endPos\": 82,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 50,\n                      \"endPos\": 55,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 57,\n                      \"endPos\": 62,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 64,\n                      \"endPos\": 69,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 75,\n                      \"endPos\": 82,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 13,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 13,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a small pepperoni pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 29,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 29,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 9,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 29,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want a supreme pizza but i do not want the sausage on it\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 57,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 57,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 9,\n                  \"endPos\": 21,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 32,\n                  \"endPos\": 57,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 32,\n                      \"endPos\": 39,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 45,\n                      \"endPos\": 51,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want four hawaiian pizzas but i do not want jalapenos on it\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 60,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 60,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 10,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 12,\n                  \"endPos\": 26,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 37,\n                  \"endPos\": 60,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 37,\n                      \"endPos\": 44,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 46,\n                      \"endPos\": 54,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want it to be delivered at 498, el tahrir street, dokki\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 29,\n          \"endPos\": 56,\n          \"children\": [\n            {\n              \"entity\": \"Building Number\",\n              \"startPos\": 29,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Street\",\n              \"startPos\": 34,\n              \"endPos\": 49,\n              \"children\": []\n            },\n            {\n              \"entity\": \"District\",\n              \"startPos\": 52,\n              \"endPos\": 56,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want one large chicken ranch pizza with extra muhsroom but without ham and garlic knots on the side\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 100,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 71,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 11,\n                  \"endPos\": 15,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 17,\n                  \"endPos\": 35,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 37,\n                  \"endPos\": 55,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 37,\n                      \"endPos\": 46,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 48,\n                      \"endPos\": 55,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 57,\n                  \"endPos\": 71,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 61,\n                      \"endPos\": 67,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 69,\n                      \"endPos\": 71,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 77,\n              \"endPos\": 100,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 77,\n                  \"endPos\": 88,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want six cheesy pizzas\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 23,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 23,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 11,\n                  \"endPos\": 23,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want three cheese pizzas\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 25,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 25,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 11,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 13,\n                  \"endPos\": 25,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want three cuban pizzas with bacon and mushrooms and fries on the side\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 71,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 49,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 11,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 13,\n                  \"endPos\": 24,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 26,\n                  \"endPos\": 49,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 26,\n                      \"endPos\": 29,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 31,\n                      \"endPos\": 35,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 41,\n                      \"endPos\": 49,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 55,\n              \"endPos\": 71,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 55,\n                  \"endPos\": 59,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to order a chicken pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 30,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 30,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 18,\n                  \"endPos\": 30,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to order a large clam pizza extra white sauce and a side order of garlic knots to go\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 90,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 51,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 18,\n                  \"endPos\": 22,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 24,\n                  \"endPos\": 33,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 35,\n                  \"endPos\": 51,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 35,\n                      \"endPos\": 39,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 41,\n                      \"endPos\": 51,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 57,\n              \"endPos\": 90,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 73,\n                  \"endPos\": 84,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to order a medium cheese pizza and a root beer\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 52,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 36,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 18,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 25,\n                  \"endPos\": 36,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 42,\n              \"endPos\": 52,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 44,\n                  \"endPos\": 52,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to order a pizza with olives on one half and green peppers on the other half\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 82,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 82,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 16,\n                  \"endPos\": 22,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 24,\n                  \"endPos\": 46,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 24,\n                      \"endPos\": 27,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 29,\n                      \"endPos\": 34,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 36,\n                      \"endPos\": 46,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 52,\n                  \"endPos\": 82,\n                  \"children\": [\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 52,\n                      \"endPos\": 64,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 66,\n                      \"endPos\": 82,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to order an icelandic pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 33,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 33,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 19,\n                  \"endPos\": 33,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to order an individual pizza with salami and extra mushrooms replace paprika with corn\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 16,\n          \"endPos\": 92,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 16,\n              \"endPos\": 92,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 19,\n                  \"endPos\": 28,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 30,\n                  \"endPos\": 34,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 36,\n                  \"endPos\": 66,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 36,\n                      \"endPos\": 39,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 41,\n                      \"endPos\": 46,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 58,\n                      \"endPos\": 66,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 68,\n                  \"endPos\": 82,\n                  \"children\": [\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 76,\n                      \"endPos\": 82,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 84,\n                  \"endPos\": 92,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 84,\n                      \"endPos\": 87,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 89,\n                      \"endPos\": 92,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want two medium chicken pizzas with anchovies\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 46,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 46,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 11,\n                  \"endPos\": 16,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 18,\n                  \"endPos\": 31,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 33,\n                  \"endPos\": 46,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 33,\n                      \"endPos\": 36,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 38,\n                      \"endPos\": 46,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want two pepperoni pizzas\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 7,\n          \"endPos\": 26,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 7,\n              \"endPos\": 26,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 7,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 11,\n                  \"endPos\": 26,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like a large vegetarian pizza half onions half peppers\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 13,\n          \"endPos\": 61,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 13,\n              \"endPos\": 61,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 15,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 21,\n                  \"endPos\": 36,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 38,\n                  \"endPos\": 48,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 38,\n                      \"endPos\": 41,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 43,\n                      \"endPos\": 48,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 50,\n                  \"endPos\": 61,\n                  \"children\": [\n                    {\n                      \"entity\": \"Scope\",\n                      \"startPos\": 50,\n                      \"endPos\": 53,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 55,\n                      \"endPos\": 61,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like a medium pizza with extra mushrooms and light sausage but remove the cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 13,\n          \"endPos\": 87,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 13,\n              \"endPos\": 87,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 15,\n                  \"endPos\": 20,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 22,\n                  \"endPos\": 26,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 28,\n                  \"endPos\": 65,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 28,\n                      \"endPos\": 37,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 39,\n                      \"endPos\": 47,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 59,\n                      \"endPos\": 65,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 71,\n                  \"endPos\": 87,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 71,\n                      \"endPos\": 76,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 82,\n                      \"endPos\": 87,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like a pepperoni pizza with extra cheese and a side of ranch\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 13,\n          \"endPos\": 67,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 13,\n              \"endPos\": 47,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 15,\n                  \"endPos\": 29,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 31,\n                  \"endPos\": 47,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 31,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 42,\n                      \"endPos\": 47,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 53,\n              \"endPos\": 67,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 63,\n                  \"endPos\": 67,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"id like to order a large pizza with extra pepperoni extra chicken and extra cheese\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 17,\n          \"endPos\": 81,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 17,\n              \"endPos\": 81,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 19,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 25,\n                  \"endPos\": 29,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 31,\n                  \"endPos\": 81,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 31,\n                      \"endPos\": 40,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 42,\n                      \"endPos\": 50,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 58,\n                      \"endPos\": 64,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 70,\n                      \"endPos\": 74,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 76,\n                      \"endPos\": 81,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"looks alright\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"looks fine by me\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"looks good\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"looks good to me\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"looks right\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make sure that my order is cancelled\",\n      \"intent\": \"CancelOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my address is 4, horreya square, maadi\",\n      \"intent\": \"Delivery\",\n      \"entities\": [\n        {\n          \"entity\": \"Address\",\n          \"startPos\": 14,\n          \"endPos\": 37,\n          \"children\": [\n            {\n              \"entity\": \"Street\",\n              \"startPos\": 14,\n              \"endPos\": 14,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Street\",\n              \"startPos\": 17,\n              \"endPos\": 30,\n              \"children\": []\n            },\n            {\n              \"entity\": \"District\",\n              \"startPos\": 33,\n              \"endPos\": 37,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"one medium pepperoni and one side of macaroni and cheese please\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 0,\n          \"endPos\": 55,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 0,\n              \"endPos\": 19,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 0,\n                  \"endPos\": 2,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 4,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 11,\n                  \"endPos\": 19,\n                  \"children\": []\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 25,\n              \"endPos\": 55,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 37,\n                  \"endPos\": 55,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"one medium pepperoni replace the anchovies with olives\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 0,\n          \"endPos\": 53,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 0,\n              \"endPos\": 53,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 0,\n                  \"endPos\": 2,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 4,\n                  \"endPos\": 9,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 11,\n                  \"endPos\": 19,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 21,\n                  \"endPos\": 41,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 21,\n                      \"endPos\": 27,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 33,\n                      \"endPos\": 41,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 43,\n                  \"endPos\": 53,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 43,\n                      \"endPos\": 46,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 48,\n                      \"endPos\": 53,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"one pizza margherita for tonight\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"order a medium stuffed crust pizza that has pineapple canadian bacon and onions on it\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 6,\n          \"endPos\": 84,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 6,\n              \"endPos\": 84,\n              \"children\": [\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 8,\n                  \"endPos\": 13,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Crust\",\n                  \"startPos\": 15,\n                  \"endPos\": 27,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 29,\n                  \"endPos\": 33,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 44,\n                  \"endPos\": 84,\n                  \"children\": [\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 44,\n                      \"endPos\": 52,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 54,\n                      \"endPos\": 67,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 73,\n                      \"endPos\": 78,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"order a pepperoni pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 6,\n          \"endPos\": 22,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 6,\n              \"endPos\": 22,\n              \"children\": [\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 8,\n                  \"endPos\": 22,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"order one chicken pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 6,\n          \"endPos\": 22,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 6,\n              \"endPos\": 22,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 6,\n                  \"endPos\": 8,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 10,\n                  \"endPos\": 22,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"order one mandarin pizza thin crust with extra pineapple anchovies onions and without peppers and fries on the side\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 6,\n          \"endPos\": 114,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 6,\n              \"endPos\": 92,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 6,\n                  \"endPos\": 8,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 10,\n                  \"endPos\": 23,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Crust\",\n                  \"startPos\": 25,\n                  \"endPos\": 34,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 36,\n                  \"endPos\": 72,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 36,\n                      \"endPos\": 45,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 47,\n                      \"endPos\": 55,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 57,\n                      \"endPos\": 65,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 67,\n                      \"endPos\": 72,\n                      \"children\": []\n                    }\n                  ]\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 78,\n                  \"endPos\": 92,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 78,\n                      \"endPos\": 84,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 86,\n                      \"endPos\": 92,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 98,\n              \"endPos\": 114,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 98,\n                  \"endPos\": 102,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"order one pizza\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 6,\n          \"endPos\": 14,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 6,\n              \"endPos\": 14,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 6,\n                  \"endPos\": 8,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 10,\n                  \"endPos\": 14,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"please order twelve chelsea pizzas but i do not want ham on them\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 13,\n          \"endPos\": 63,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 13,\n              \"endPos\": 63,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 13,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 20,\n                  \"endPos\": 33,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 44,\n                  \"endPos\": 63,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 44,\n                      \"endPos\": 51,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 53,\n                      \"endPos\": 55,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"please order two pan crust small pepperoni pizza with beef and three medium cheese pizza with italian sausage\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 13,\n          \"endPos\": 108,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 13,\n              \"endPos\": 57,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 13,\n                  \"endPos\": 15,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Crust\",\n                  \"startPos\": 17,\n                  \"endPos\": 25,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 27,\n                  \"endPos\": 31,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 33,\n                  \"endPos\": 47,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 49,\n                  \"endPos\": 57,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 49,\n                      \"endPos\": 52,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 54,\n                      \"endPos\": 57,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 63,\n              \"endPos\": 108,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 63,\n                  \"endPos\": 67,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 69,\n                  \"endPos\": 74,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 76,\n                  \"endPos\": 87,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 89,\n                  \"endPos\": 108,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"pretty much\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"request seven large honolulu hawaiian pizza with bacon and salami and add chicken wings\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": [\n        {\n          \"entity\": \"Order\",\n          \"startPos\": 8,\n          \"endPos\": 86,\n          \"children\": [\n            {\n              \"entity\": \"FullPizzaWithModifiers\",\n              \"startPos\": 8,\n              \"endPos\": 64,\n              \"children\": [\n                {\n                  \"entity\": \"Quantity\",\n                  \"startPos\": 8,\n                  \"endPos\": 12,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"Size\",\n                  \"startPos\": 14,\n                  \"endPos\": 18,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"PizzaType\",\n                  \"startPos\": 20,\n                  \"endPos\": 42,\n                  \"children\": []\n                },\n                {\n                  \"entity\": \"ToppingModifiers\",\n                  \"startPos\": 44,\n                  \"endPos\": 64,\n                  \"children\": [\n                    {\n                      \"entity\": \"Modifier\",\n                      \"startPos\": 44,\n                      \"endPos\": 47,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 49,\n                      \"endPos\": 53,\n                      \"children\": []\n                    },\n                    {\n                      \"entity\": \"Topping\",\n                      \"startPos\": 59,\n                      \"endPos\": 64,\n                      \"children\": []\n                    }\n                  ]\n                }\n              ]\n            },\n            {\n              \"entity\": \"SideOrder\",\n              \"startPos\": 70,\n              \"endPos\": 86,\n              \"children\": [\n                {\n                  \"entity\": \"SideProduct\",\n                  \"startPos\": 70,\n                  \"endPos\": 86,\n                  \"children\": []\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's great\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"three pizzas large chicken barbeque for tomorrow evening\",\n      \"intent\": \"ModifyOrder\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes order it\",\n      \"intent\": \"Confirmation\",\n      \"entities\": []\n    }\n  ],\n  \"versionId\": \"0.6 Beta Version\",\n  \"name\": \"Pizza_app_full\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"phraselists\": [\n    {\n      \"name\": \"ToppingDescriptor\",\n      \"mode\": true,\n      \"words\": \"pepperoni,ham,pineapples,sausage,salami,bacon,chicken,onion,sauce,chili,pepperonis,sausages,anchovies,peperoni,mozzerella,sun dried tomatos,tomatos,tomato,basil,olives,tomatoe,eggplant,pesto,oregano,zuccini,alfredo sauce,alfredo,white sauce,parmesean,mozzarella,mozzarella cheese,butter,anchovie,canadian bacon,bacon strips,grilled chicken,italian sausage,green peppers,bbq sauce,parmesan cheese,pizza sauce,jalapeno peppers,jalapenos,jalapeno,jalapeño,hot pepper,chili pepper,meatball,meatballs,mushroom,mushrooms,pesto sauce\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"SizeDescriptor\",\n      \"mode\": true,\n      \"words\": \"large,small,medium,individual,personal,xlarge,extra large,family,party size,large family\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"QuantityDescriptor\",\n      \"mode\": true,\n      \"words\": \"one,two,three,four,five,six,eight,seven,ten,nine,1,2,3,4,5,6,7,8,9,10,11,twelve,12,13,14,15\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"ModifierDescriptor\",\n      \"mode\": true,\n      \"words\": \"with,without,extra,with extra,no,add,remove,replace,hold the,more of,needs,just,with some,need,substitute,instead of,not want,except,leave off,replace with,do not want,dont want,don't want\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"ScopeDescriptor\",\n      \"mode\": true,\n      \"words\": \"half,on half,one one half,on the other half,the other half,on one,on one of them,half with,1/2,other half,one side,on the other side,the other side,other side,half and half,half & half\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"CrustDescriptor\",\n      \"mode\": true,\n      \"words\": \"original,pan,thin,pan crust,original crust,thin crust,thick crust,stuffed crust,deep dish,deep dish crust,thin 'n crispy\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"RemoveDescriptor\",\n      \"mode\": true,\n      \"words\": \"without,remove,no,with no,substitute,hold,hold the,replace,instead of,leave off,not want,dont want,do not want,except\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"AddDescriptor\",\n      \"mode\": true,\n      \"words\": \"with,with extra,extra,add extra,add,with more,some,just,needs,replaced with\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"SideOrderDescriptor\",\n      \"mode\": true,\n      \"words\": \"a side of,with a side of,side of,on the side\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"GreetingDescriptor\",\n      \"mode\": true,\n      \"words\": \"hello,hey,how are you,good morning,welcome,good day,hi,ciao,salut,hola,bonsoir,hallo,hello!,hi there,hi!,hey!,heeeeeeeey,evening\",\n      \"activated\": true,\n      \"enabledForAllModels\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"deliver it at {Address}\",\n      \"intent\": \"None\"\n    },\n    {\n      \"pattern\": \"{number} pizzas {SizeList} {ToppingList} {ToppingList} for {datetimeV2}\",\n      \"intent\": \"ModifyOrder\"\n    },\n    {\n      \"pattern\": \"my address is {Address}\",\n      \"intent\": \"None\"\n    },\n    {\n      \"pattern\": \"address is {Address}\",\n      \"intent\": \"None\"\n    }\n  ],\n  \"settings\": [\n    {\n      \"name\": \"UseAllTrainingData\",\n      \"value\": \"false\"\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/InvalidLUISModel.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.6.1668\",\n  \"name\": \"Contoso Cafe App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"askForUserName\"\n    },\n    {\n      \"name\": \"bookTableTrigger\"\n    },\n    {\n      \"name\": \"communicationPreference\"\n    },\n    {\n      \"name\": \"findCafeLocation\"\n    },\n    {\n      \"name\": \"Get prompt style intent\"\n    },\n    {\n      \"name\": \"GetLocationDateTimePartySize\"\n    },\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"orderSandwich\"\n    },\n    {\n      \"name\": \"SandwichOrderIntent\"\n    },\n    {\n      \"name\": \"whoAreYouIntent\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"newLocationHint\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"partySize\",\n      \"children\": [\n        \"number\"\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"requestedLocation\",\n      \"children\": [\n        \"cafeLocation\",\n        \"geography\"\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichOrder\",\n      \"children\": [\n        \"BreadType\",\n        \"ProteinOption\",\n        \"SandwichSize\",\n        \"SandwichToppings\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"BreadType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"white\",\n          \"list\": [\n            \"white\",\n            \"enriched\",\n            \"regular bread\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"wheat\",\n          \"list\": [\n            \"wheat\",\n            \"whole grain\",\n            \"brown\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"cafeLocation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"redmond\",\n          \"list\": [\n            \"microsoft\",\n            \"eastside\",\n            \"east side\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"renton\",\n          \"list\": [\n            \"boeing\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"seattle\",\n          \"list\": [\n            \"seatac\",\n            \"tacoma\",\n            \"space needle\",\n            \"downtown seattle\",\n            \"washington\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"communicationOption\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"calls\",\n            \"called\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"confirmationList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"no\",\n          \"list\": [\n            \"no\",\n            \"no way\",\n            \"i'm not sure\",\n            \"do not do that\",\n            \"nagative\",\n            \"nothing\",\n            \"skip\",\n            \"nope\",\n            \"book it\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"yes\",\n          \"list\": [\n            \"yes\",\n            \"yeah\",\n            \"yup\",\n            \"sure\",\n            \"ok\",\n            \"yep\",\n            \"affirmative\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"cancel\",\n          \"list\": [\n            \"cancel\",\n            \"i dont want to do that\",\n            \"i do not want it\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"orderType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"1\",\n          \"list\": [\n            \"one at a time\",\n            \"first one\",\n            \"first option\",\n            \"one missing piece of information at a time\",\n            \"default\",\n            \"your choice\",\n            \"you pick\",\n            \"one prompt at a time\",\n            \"1\",\n            \"one\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"2\",\n          \"list\": [\n            \"running summary\",\n            \"second option\",\n            \"second one\",\n            \"2nd one\",\n            \"2\",\n            \"two\",\n            \"give me a summary\",\n            \"summary at each step\",\n            \"summary of missing items\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ProteinOption\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": [\n            \"chicken\",\n            \"barbecue chicken\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": [\n            \"bacon\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"veggie\",\n          \"list\": [\n            \"veggie patty\",\n            \"veggie\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichSize\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"small\",\n          \"list\": [\n            \"small\",\n            \"s\",\n            \"tiny\",\n            \"extra small\",\n            \"kid's size\",\n            \"kid size\",\n            \"small size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"medium\",\n          \"list\": [\n            \"medium\",\n            \"m\",\n            \"medium size\",\n            \"half\",\n            \"half size\",\n            \"regular size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"large\",\n          \"list\": [\n            \"large\",\n            \"l\",\n            \"extra large\",\n            \"xl\",\n            \"big\",\n            \"huge\",\n            \"full size\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichToppings\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"tomato\",\n          \"list\": [\n            \"tomatoes\",\n            \"tomato\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"lettuce\",\n          \"list\": [\n            \"lettuce\",\n            \"greens\",\n            \"iceberg\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"onion\",\n          \"list\": [\n            \"onion\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"geography\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"#1\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 1,\n          \"endPos\": 1\n        }\n      ]\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"add example utterances that describe what your bot cannot do\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add sentences that are irrelevant to your bot\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add sentences that describe things your bot does not perform\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and bellevue?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and seattle?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and the one in renton?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"andrew\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"ask for one missing information at a time\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"at 7pm?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table at seatac\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 2 in seattle\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 at seattle store for next thrusday 8pm\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 guests in redmond\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 29,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 guests near microsoft for next wednesday at 2pm\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for next thursday at 8pm please\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table in san francisco\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"call me bob\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me colleen\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"call me to get hold of me\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a table for this sunday at renton\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a table in seattle, wa\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a wheat bread sandwich with chicken please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get some lettuce and tomato please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get white bread instead\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i please come in to seattle instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"can you book a table for 3 guests\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a sandwich on white bread please\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a small sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you get me the seattle store hours?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me the store hours for the redmond store?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"can you make it 5pm instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you please book a table for 2 guests for this weekend?\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 32,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"ceo\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you have a veggie option?\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"does 3pm work for the seattle store?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"find contoso cafe locations near me\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find contoso cafe locations near seatac airport\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find locations near paris\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"first one\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"first option please\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get a table for next wednesday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get a table for this sunday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a large sandwich please\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a regular sandwich with chicken\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a white bread sandwich with bacon tomatoes and lettuce\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 54,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"give me a running summary\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good afternoon\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good night\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"henrik\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hiya\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about #2\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 11,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"how about 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 10,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"how about a large sandwich\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how about ham?\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about next thursday at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about paris?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about san francisco\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about seattle\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how about seattle?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about some lettuce\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about some lettuce and i would like to have wheat bread instead\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about the one in seattle\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how about tomorrow\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about tomorrow?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how should i call you?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot give you my name\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot give you my nanme\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i do not want to give you my name\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like to receive phone calls\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer the first option\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer to get text updates\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer to receive phone calls\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want coffee\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"i will skip the toppings\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to book a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to come in to redmond instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to order a sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to bring in 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to have veggie patty please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd prefer if you called me with any updates\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm angshuman and i'm a human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm angshuman and i'm human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm jeremy\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm john\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm melanie\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm tom\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"irina\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"is the renton store open next thursday at 2pm?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"is the seattle store open today?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"large\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it 5pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it veggie patty instead of chicken\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"my water bottle is green.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next thursday at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no how about portland\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no how about renton?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i would like to come in to seattle instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"no toppings\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"order a large white bread sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"paris\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help reserve a table for this sunday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"redmond\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"regular white bread sandwich please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"remember i prefer to receive text messages\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve a table for 2 at renton\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 25,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"seattle please\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"send me a text message to get in touch with me\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set my communication preference to text\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"small\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"there is a large deep dish pizza in your future.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow at 2pm and i'd like to bring 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 38,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"tomorrow at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow at 3pm and i would like to bring 10 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"tony\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"wenbo\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"what about paris?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about seattle?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the seattle store\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"what are some things i can say?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i get done here?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i say\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do for me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your name?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what stores are open this weekend?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the seattle store open?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where can i get coffee near redmond\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"where can i get coffee?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"which ones are open today?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"white bread\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"whole grain bread\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why do you ask?\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why do you need my name?\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes go ahead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please go ahead with seattle\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me lucio\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/InvalidLUISModel1.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.6.1668\",\n  \"name\": \"Contoso Cafe App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"askForUserName\"\n    },\n    {\n      \"name\": \"bookTableTrigger\"\n    },\n    {\n      \"name\": \"communicationPreference\"\n    },\n    {\n      \"name\": \"findCafeLocation\"\n    },\n    {\n      \"name\": \"Get prompt style intent\"\n    },\n    {\n      \"name\": \"GetLocationDateTimePartySize\"\n    },\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"orderSandwich\"\n    },\n    {\n      \"name\": \"SandwichOrderIntent\"\n    },\n    {\n      \"name\": \"whoAreYouIntent\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"newLocationHint\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"BreadType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"white\",\n          \"list\": [\n            \"white\",\n            \"enriched\",\n            \"regular bread\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"wheat\",\n          \"list\": [\n            \"wheat\",\n            \"whole grain\",\n            \"brown\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"cafeLocation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"redmond\",\n          \"list\": [\n            \"microsoft\",\n            \"eastside\",\n            \"east side\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"renton\",\n          \"list\": [\n            \"boeing\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"seattle\",\n          \"list\": [\n            \"seatac\",\n            \"tacoma\",\n            \"space needle\",\n            \"downtown seattle\",\n            \"washington\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"communicationOption\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"calls\",\n            \"called\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"confirmationList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"no\",\n          \"list\": [\n            \"no\",\n            \"no way\",\n            \"i'm not sure\",\n            \"do not do that\",\n            \"nagative\",\n            \"nothing\",\n            \"skip\",\n            \"nope\",\n            \"book it\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"yes\",\n          \"list\": [\n            \"yes\",\n            \"yeah\",\n            \"yup\",\n            \"sure\",\n            \"ok\",\n            \"yep\",\n            \"affirmative\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"cancel\",\n          \"list\": [\n            \"cancel\",\n            \"i dont want to do that\",\n            \"i do not want it\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"orderType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"1\",\n          \"list\": [\n            \"one at a time\",\n            \"first one\",\n            \"first option\",\n            \"one missing piece of information at a time\",\n            \"default\",\n            \"your choice\",\n            \"you pick\",\n            \"one prompt at a time\",\n            \"1\",\n            \"one\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"2\",\n          \"list\": [\n            \"running summary\",\n            \"second option\",\n            \"second one\",\n            \"2nd one\",\n            \"2\",\n            \"two\",\n            \"give me a summary\",\n            \"summary at each step\",\n            \"summary of missing items\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ProteinOption\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": [\n            \"chicken\",\n            \"barbecue chicken\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": [\n            \"bacon\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"veggie\",\n          \"list\": [\n            \"veggie patty\",\n            \"veggie\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichSize\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"small\",\n          \"list\": [\n            \"small\",\n            \"s\",\n            \"tiny\",\n            \"extra small\",\n            \"kid's size\",\n            \"kid size\",\n            \"small size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"medium\",\n          \"list\": [\n            \"medium\",\n            \"m\",\n            \"medium size\",\n            \"half\",\n            \"half size\",\n            \"regular size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"large\",\n          \"list\": [\n            \"large\",\n            \"l\",\n            \"extra large\",\n            \"xl\",\n            \"big\",\n            \"huge\",\n            \"full size\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichToppings\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"tomato\",\n          \"list\": [\n            \"tomatoes\",\n            \"tomato\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"lettuce\",\n          \"list\": [\n            \"lettuce\",\n            \"greens\",\n            \"iceberg\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"onion\",\n          \"list\": [\n            \"onion\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [\n      {\"one\": \"one\"},\n      {\"two\": \"two\"}\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"geography\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"#1\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 1,\n          \"endPos\": 1\n        }\n      ]\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"add example utterances that describe what your bot cannot do\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add sentences that are irrelevant to your bot\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add sentences that describe things your bot does not perform\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and bellevue?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and seattle?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and the one in renton?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"andrew\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"ask for one missing information at a time\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"at 7pm?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table at seatac\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 2 in seattle\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 at seattle store for next thrusday 8pm\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 guests in redmond\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 29,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 guests near microsoft for next wednesday at 2pm\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for next thursday at 8pm please\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table in san francisco\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"call me bob\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me colleen\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"call me to get hold of me\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a table for this sunday at renton\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a table in seattle, wa\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a wheat bread sandwich with chicken please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get some lettuce and tomato please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get white bread instead\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i please come in to seattle instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"can you book a table for 3 guests\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a sandwich on white bread please\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a small sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you get me the seattle store hours?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me the store hours for the redmond store?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"can you make it 5pm instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you please book a table for 2 guests for this weekend?\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 32,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"ceo\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you have a veggie option?\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"does 3pm work for the seattle store?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"find contoso cafe locations near me\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find contoso cafe locations near seatac airport\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find locations near paris\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"first one\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"first option please\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get a table for next wednesday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get a table for this sunday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a large sandwich please\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a regular sandwich with chicken\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a white bread sandwich with bacon tomatoes and lettuce\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 54,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"give me a running summary\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good afternoon\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good night\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"henrik\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hiya\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about #2\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 11,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"how about 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 10,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"how about a large sandwich\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how about ham?\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about next thursday at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about paris?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about san francisco\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about seattle\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how about seattle?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about some lettuce\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about some lettuce and i would like to have wheat bread instead\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about the one in seattle\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how about tomorrow\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about tomorrow?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how should i call you?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot give you my name\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot give you my nanme\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i do not want to give you my name\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like to receive phone calls\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer the first option\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer to get text updates\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer to receive phone calls\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want coffee\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"i will skip the toppings\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to book a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to come in to redmond instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to order a sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to bring in 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to have veggie patty please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd prefer if you called me with any updates\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm angshuman and i'm a human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm angshuman and i'm human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm jeremy\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm john\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm melanie\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm tom\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"irina\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"is the renton store open next thursday at 2pm?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"is the seattle store open today?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"large\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it 5pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it veggie patty instead of chicken\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"my water bottle is green.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next thursday at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no how about portland\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no how about renton?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i would like to come in to seattle instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"no toppings\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"order a large white bread sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"paris\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help reserve a table for this sunday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"redmond\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"regular white bread sandwich please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"remember i prefer to receive text messages\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve a table for 2 at renton\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 25,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"seattle please\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"send me a text message to get in touch with me\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set my communication preference to text\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"small\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"there is a large deep dish pizza in your future.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow at 2pm and i'd like to bring 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 38,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"tomorrow at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow at 3pm and i would like to bring 10 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"tony\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"wenbo\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"what about paris?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about seattle?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the seattle store\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"what are some things i can say?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i get done here?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i say\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do for me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your name?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what stores are open this weekend?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the seattle store open?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where can i get coffee near redmond\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"where can i get coffee?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"which ones are open today?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"white bread\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"whole grain bread\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why do you ask?\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why do you need my name?\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes go ahead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please go ahead with seattle\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me lucio\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/InvalidLUISModel2.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.6.1668\",\n  \"name\": \"Contoso Cafe App\",\n  \"desc\": \"Default Intents for Azure Bot Service V2\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"askForUserName\"\n    },\n    {\n      \"name\": \"bookTableTrigger\"\n    },\n    {\n      \"name\": \"communicationPreference\"\n    },\n    {\n      \"name\": \"findCafeLocation\"\n    },\n    {\n      \"name\": \"Get prompt style intent\"\n    },\n    {\n      \"name\": \"GetLocationDateTimePartySize\"\n    },\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"orderSandwich\"\n    },\n    {\n      \"name\": \"SandwichOrderIntent\"\n    },\n    {\n      \"name\": \"whoAreYouIntent\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"newLocationHint\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"BreadType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"white\",\n          \"list\": [\n            \"white\",\n            \"enriched\",\n            \"regular bread\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"wheat\",\n          \"list\": [\n            \"wheat\",\n            \"whole grain\",\n            \"brown\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"cafeLocation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"redmond\",\n          \"list\": [\n            \"microsoft\",\n            \"eastside\",\n            \"east side\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"renton\",\n          \"list\": [\n            \"boeing\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"seattle\",\n          \"list\": [\n            \"seatac\",\n            \"tacoma\",\n            \"space needle\",\n            \"downtown seattle\",\n            \"washington\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"communicationOption\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"calls\",\n            \"called\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"confirmationList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"no\",\n          \"list\": [\n            \"no\",\n            \"no way\",\n            \"i'm not sure\",\n            \"do not do that\",\n            \"nagative\",\n            \"nothing\",\n            \"skip\",\n            \"nope\",\n            \"book it\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"yes\",\n          \"list\": [\n            \"yes\",\n            \"yeah\",\n            \"yup\",\n            \"sure\",\n            \"ok\",\n            \"yep\",\n            \"affirmative\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"cancel\",\n          \"list\": [\n            \"cancel\",\n            \"i dont want to do that\",\n            \"i do not want it\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"orderType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"1\",\n          \"list\": [\n            \"one at a time\",\n            \"first one\",\n            \"first option\",\n            \"one missing piece of information at a time\",\n            \"default\",\n            \"your choice\",\n            \"you pick\",\n            \"one prompt at a time\",\n            \"1\",\n            \"one\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"2\",\n          \"list\": [\n            \"running summary\",\n            \"second option\",\n            \"second one\",\n            \"2nd one\",\n            \"2\",\n            \"two\",\n            \"give me a summary\",\n            \"summary at each step\",\n            \"summary of missing items\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ProteinOption\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": [\n            \"chicken\",\n            \"barbecue chicken\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": [\n            \"bacon\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"veggie\",\n          \"list\": [\n            \"veggie patty\",\n            \"veggie\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichSize\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"small\",\n          \"list\": [\n            \"small\",\n            \"s\",\n            \"tiny\",\n            \"extra small\",\n            \"kid's size\",\n            \"kid size\",\n            \"small size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"medium\",\n          \"list\": [\n            \"medium\",\n            \"m\",\n            \"medium size\",\n            \"half\",\n            \"half size\",\n            \"regular size\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"large\",\n          \"list\": [\n            \"large\",\n            \"l\",\n            \"extra large\",\n            \"xl\",\n            \"big\",\n            \"huge\",\n            \"full size\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SandwichToppings\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"tomato\",\n          \"list\": [\n            \"tomatoes\",\n            \"tomato\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"lettuce\",\n          \"list\": [\n            \"lettuce\",\n            \"greens\",\n            \"iceberg\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"onion\",\n          \"list\": [\n            \"onion\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"geography\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [{\n      \"one\": \"one\"\n  }],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"#1\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 1,\n          \"endPos\": 1\n        }\n      ]\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"add example utterances that describe what your bot cannot do\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add sentences that are irrelevant to your bot\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add sentences that describe things your bot does not perform\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and bellevue?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and seattle?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and the one in renton?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"andrew\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"ask for one missing information at a time\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"at 7pm?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table at seatac\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 2 in seattle\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 at seattle store for next thrusday 8pm\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 guests in redmond\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 29,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 3 guests near microsoft for next wednesday at 2pm\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for next thursday at 8pm please\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table in san francisco\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"call me bob\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me colleen\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"call me to get hold of me\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a table for this sunday at renton\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a table in seattle, wa\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"can i get a wheat bread sandwich with chicken please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get some lettuce and tomato please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i get white bread instead\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i please come in to seattle instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"can you book a table for 3 guests\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a sandwich on white bread please\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a small sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you get me the seattle store hours?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"can you get me the store hours for the redmond store?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"can you make it 5pm instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you please book a table for 2 guests for this weekend?\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 32,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"ceo\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you have a veggie option?\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"does 3pm work for the seattle store?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"find contoso cafe locations near me\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find contoso cafe locations near seatac airport\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find locations near paris\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"first one\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"first option please\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get a table for next wednesday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get a table for this sunday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a large sandwich please\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"get me a regular sandwich with chicken\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me a white bread sandwich with bacon tomatoes and lettuce\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 54,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"give me a running summary\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good afternoon\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good night\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"henrik\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hiya\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about #2\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 11,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"how about 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 10,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"how about a large sandwich\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how about ham?\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about next thursday at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about paris?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about san francisco\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about seattle\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how about seattle?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about some lettuce\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about some lettuce and i would like to have wheat bread instead\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about the one in seattle\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how about tomorrow\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about tomorrow?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how should i call you?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot give you my name\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot give you my nanme\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i do not want to give you my name\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like to receive phone calls\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer the first option\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer to get text updates\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i prefer to receive phone calls\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want coffee\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"i will skip the toppings\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to book a table\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to come in to redmond instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to order a sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to bring in 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to have veggie patty please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd prefer if you called me with any updates\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm angshuman and i'm a human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm angshuman and i'm human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm jeremy\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm john\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm melanie\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm tom\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"irina\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"is the renton store open next thursday at 2pm?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"is the seattle store open today?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"large\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it 5pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it veggie patty instead of chicken\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"my water bottle is green.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next thursday at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no how about portland\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no how about renton?\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i would like to come in to seattle instead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"no toppings\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"Get prompt style intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"order a large white bread sandwich\",\n      \"intent\": \"orderSandwich\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"paris\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help reserve a table for this sunday\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"redmond\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"regular white bread sandwich please\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"SandwichOrder\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"remember i prefer to receive text messages\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve a table for 2 at renton\",\n      \"intent\": \"bookTableTrigger\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 25,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"seattle please\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"send me a text message to get in touch with me\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set my communication preference to text\",\n      \"intent\": \"communicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"small\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"there is a large deep dish pizza in your future.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow at 2pm and i'd like to bring 2 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 38,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"tomorrow at 3pm\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tomorrow at 3pm and i would like to bring 10 guests\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"tony\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"wenbo\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"what about paris?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about seattle?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the seattle store\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"what are some things i can say?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i get done here?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i say\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do for me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your name?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what stores are open this weekend?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the seattle store open?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where can i get coffee near redmond\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"where can i get coffee?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"which ones are open today?\",\n      \"intent\": \"findCafeLocation\",\n      \"entities\": [\n        {\n          \"entity\": \"newLocationHint\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"white bread\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you?\",\n      \"intent\": \"whoAreYouIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"whole grain bread\",\n      \"intent\": \"SandwichOrderIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why do you ask?\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why do you need my name?\",\n      \"intent\": \"askForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes go ahead\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please go ahead with seattle\",\n      \"intent\": \"GetLocationDateTimePartySize\",\n      \"entities\": [\n        {\n          \"entity\": \"requestedLocation\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me human\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me lucio\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"askForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/LUISAppWithPAInherits.json",
    "content": "{\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"testPrebuiltImport\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"ToDo.AddToDo\",\n      \"inherits\": {\n        \"domain_name\": \"ToDo\",\n        \"model_name\": \"AddToDo\"\n      }\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"ToDo.TaskContent\",\n      \"inherits\": {\n        \"domain_name\": \"ToDo\",\n        \"model_name\": \"TaskContent\"\n      },\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"ToDo.TaskContent.Any\",\n      \"inherits\": {\n        \"domain_name\": \"ToDo\",\n        \"model_name\": \"TaskContent.Any\"\n      },\n      \"roles\": [],\n      \"explicitList\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"^(add|create|append) an item [(called|about|of)] \\\"{ToDo.TaskContent.Any}\\\" [as (next|first|last) task][(in|on|to) my (to do|to-do|todos) list]\",\n      \"intent\": \"ToDo.AddToDo\"\n    },\n    {\n      \"pattern\": \"^[(can you|could you|would you)] [please] (put|add|append) {ToDo.TaskContent} [and] [{ToDo.TaskContent}] (on|to)[my][(to do|todos|todo)]list\",\n      \"intent\": \"ToDo.AddToDo\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"add a few items to the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a grocery item to buy fish\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy fruit and vegetables\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy vegetables\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add a new shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a shopping item to buy dancing dresses\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 23,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"add a shopping item to buy orange juice\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for anna west to bring my swimsuit for my vacation\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for jimmy to play xbox games with me after work\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for li lei to bring my coat from home\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for raghu to bring my chocolates from germany\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task of chores to do around the house\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to finish driving test this week\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to pick mary up after work\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to purchase fruit and vegetables\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to shop at gnc after work\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add a to do to buy shoes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"add a to do to purchase a nice sweater\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add a todo item to vacuum by october 3rd\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"add action item for khalifa to pack my school supplies in my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"add an item to buy some snacks\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add bronwnies to the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"add buy gum\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add buy milk to my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"add call my mother to my todo list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add go running to my to dos\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"add go to whole foods in my to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery add spinach my groceries list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery items cream cheese and raisin to the list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery items dinners and storage bag to the shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"add have a haircut to my tasks\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add items as i speak\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add juicer groceries list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add melon and sugars and brown sugar to shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add more to grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add peanuts the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add purchase a cinema ticket to my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"add purchasing food and drinks to my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add reading to my to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add shoes to the shopping lists\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"add some items to that shopping notes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add some items to the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add some jeans on our shopping lists\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"add something in this grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add something to my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add tapioca starch on my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add tapioca starch on our shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add task to buy a coat\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"add task to set up dining room table\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add this on our shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add this stuff on my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add this thing in to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to my grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to my to do list pick up clothes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my to do list print papers for 10 copies this afternoon\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my todos list mail the insurance forms out by saturday\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"add to note shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to the grocery note buy milk\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"append a summer reading in my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"append an task of guest to invite at the party\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"append this item onto my notes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask a task for kim to bring my coat from home\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"can i add shirts on the todos list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"can i put on caramel cheese popcorn on my grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"can you delete abc item\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"can you delete todo1\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel apples from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"check off apples from list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"check off bananas from my grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"check off garbage from grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"check off meet john at 8 am from to do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"check off shampoo from shopping list as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"check the box shampoo in my shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"complete pick up black shoes in my to-do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"complete task go shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"could i add medicine to the todos list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"create a task to meet my friends\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to cyber shop on nov. 11\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to go to the mall\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to meet john after 5:00 p.m.\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"create to do to go running in the park\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"create to do to read a book tonight\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"delete eggs from list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"delete off pancake mix on the shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"delete shampoo from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"delete shirts from list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"delete task go fishing\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"delete task go to cinema tonight\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the item buy socks from my to-do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the task house cleanup this weekend\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the task to hit the gym every morning\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do meet my friends tomorrow\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do to meet john when he come here the next friday\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do to practice piano daily\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do buy milk\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do go shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do that go hiking tomorrow\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task abc in our shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task tapioca starch in our shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"erase bananas from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"erase peanuts on the shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"finish hikes on my to do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"finish peanuts on the shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"mark buy fish as completed\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"mark fish as complete\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"mark happy on to dos list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"mark lemons and onions in grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pancake mix on my grocery shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"mark peanuts on my grocery list as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"mark peanuts on my grocery shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pick mary up as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pick up milk on my to-do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"mark play badminton with tom as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"mark salad on my grocery shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"mark salad on the groceries list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task buy a bottle of vinegar as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task go running as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task read a book as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the item garbage from grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task buy milk as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task get some food as complete\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task reserve a restaurant for tomorrow's dinner as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task visit my grandma as completed\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"need go to library this week, add this todo item\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 0,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"no need to buy milk in grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"omit the milk in the grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"put cheese on list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"put ham on my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"put hikes on my to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"put ice cream on the groceries list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"put milk on my grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"put on caramel cheese popcorn on my grocery shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to attend the meeting tomorrow\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to buy first aid creams and berries\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to buy milk\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to meet my teacher\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to shop for a new carpet\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"remove asprin from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"remove black shoes from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"remove class from todo list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"remove salad vegetables from grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task buy dog food\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task go shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task go shopping with john this saturday\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task that go hiking this weekend\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task that lawn mowing\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the item paris from my list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the task that go to library after work\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the to do physical examination\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the to do that pick tom up at six p.m.\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remove to do go to the gym\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"remove to do that go to the dentist tomorrow morning\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete a\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete dog food\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete eggs\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete milk\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"take coffee off my groceries list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"take lemons and onions off my shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"take milk off grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"take socks and shoes off my shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"task completed buy gum\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"task train has been done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"to grocery list add milk\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"to my shopping list add paper towels\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"to my vacation to do list add buy sunblock\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"todo list delete paris vacation\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"would you add heavy cream to the todos list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"would you please add todo item of all hands meeting next monday\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 34,\n          \"endPos\": 62\n        }\n      ]\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ListEntityAndBatchtestsProblem.1.lu",
    "content": "> # Intent definitions\n\n## AddToOrder\n- give me a large {Item=big apple} and a large {Item=coffee} with two {Item=milk}\n\n\n> # Entity definitions\n\n$Item:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n\n> # Phrase list definitions\n\n$MenuItem:phraseList\n- hamburger,beefburger,fish filet,strawberry milkshake,chocolate flavor milkshake,strawberry flavor milkshake,vanilla milkshake,milkshake,coffee,hashbrowns,coke,diet coke,fanta,lemonade,french fries,cheese,bacon,burger,fries,chocolate,water,sprite,cheeseburger,ice cream,mcmuffin,double cheeseburger,hot fudge sundae,egg sandwich,breakfast burrito,sausage mcmuffin,bacon biscuit,hash browns,steak biscuit,breakfast sandwich,chicken sandwich,bacon cheeseburger,sausage sandwich,cheese burger,onion rings,double burger,mayo,ketchup,mustard,lettuce,mayonnaise,tomato,dressing,pickles,salt,onion,tomatoes,swiss cheese,american cheese,tartar sauce,chocolate latte,ice mocha shake,root beer,creams,ginger ale,milk,chicken,onions,pizza,eggs,cheddar,salad,fish,swiss cheese slice,sliced red onion,dijon mustard,teriyaki sauce,barbecue sauce,pickle,relish,cream cheese,jalapenos,jalapeÃ±os,mozzarella,avocado,capers,sour cream,jalepenos,cheddar cheese,surf n turf,iced tea,unsweetened iced tea,unsweet iced tea,orange juice,hot chocolate,cappuccino,tea,bottled water,green tea,dakota,cappucino,juice,dakota burger,grilled pet chicken sandwich,grilled pet chicken,fried pet chicken,fried pet chicken sandwich,angus,angus patty,sugar,cream\n\n> # List entities\n\n$size:small=\n- small\n- Small\n- smaller\n- tall\n\n$size:medium=\n- medium\n- grand\n- grande\n- Medium\n\n$size:large=\n- large\n- venti\n- Large\n\n$size:extra large=\n- extra large\n- trenta\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ListEntityAndBatchtestsProblem.2.lu",
    "content": "> # Intent definitions\n\n## AddToOrder\n- give me a {Item=big apple} and a large {Item=coffee} with two {Item=milk}\n\n# AnotherIntent\n- give me a large coke\n\n> # Entity definitions\n\n$Item:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n\n> # Phrase list definitions\n\n$MenuItem:phraseList\n- hamburger,beefburger,fish filet,strawberry milkshake,chocolate flavor milkshake,strawberry flavor milkshake,vanilla milkshake,milkshake,coffee,hashbrowns,coke,diet coke,fanta,lemonade,french fries,cheese,bacon,burger,fries,chocolate,water,sprite,cheeseburger,ice cream,mcmuffin,double cheeseburger,hot fudge sundae,egg sandwich,breakfast burrito,sausage mcmuffin,bacon biscuit,hash browns,steak biscuit,breakfast sandwich,chicken sandwich,bacon cheeseburger,sausage sandwich,cheese burger,onion rings,double burger,mayo,ketchup,mustard,lettuce,mayonnaise,tomato,dressing,pickles,salt,onion,tomatoes,swiss cheese,american cheese,tartar sauce,chocolate latte,ice mocha shake,root beer,creams,ginger ale,milk,chicken,onions,pizza,eggs,cheddar,salad,fish,swiss cheese slice,sliced red onion,dijon mustard,teriyaki sauce,barbecue sauce,pickle,relish,cream cheese,jalapenos,jalapeÃ±os,mozzarella,avocado,capers,sour cream,jalepenos,cheddar cheese,surf n turf,iced tea,unsweetened iced tea,unsweet iced tea,orange juice,hot chocolate,cappuccino,tea,bottled water,green tea,dakota,cappucino,juice,dakota burger,grilled pet chicken sandwich,grilled pet chicken,fried pet chicken,fried pet chicken sandwich,angus,angus patty,sugar,cream\n\n> # List entities\n\n$size:small=\n- small\n- Small\n- smaller\n- tall\n\n$size:medium=\n- medium\n- grand\n- grande\n- Medium\n\n$size:large=\n- large\n- venti\n- Large\n\n$size:extra large=\n- extra large\n- trenta\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ListEntityAndBatchtestsProblem.lu",
    "content": "> # Intent definitions\n\n## AddToOrder\n- give me a {Item=big apple} and a large {Item=coffee} with two {Item=milk}\n\n\n> # Entity definitions\n\n$Item:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n\n> # Phrase list definitions\n\n$MenuItem:phraseList\n- hamburger,beefburger,fish filet,strawberry milkshake,chocolate flavor milkshake,strawberry flavor milkshake,vanilla milkshake,milkshake,coffee,hashbrowns,coke,diet coke,fanta,lemonade,french fries,cheese,bacon,burger,fries,chocolate,water,sprite,cheeseburger,ice cream,mcmuffin,double cheeseburger,hot fudge sundae,egg sandwich,breakfast burrito,sausage mcmuffin,bacon biscuit,hash browns,steak biscuit,breakfast sandwich,chicken sandwich,bacon cheeseburger,sausage sandwich,cheese burger,onion rings,double burger,mayo,ketchup,mustard,lettuce,mayonnaise,tomato,dressing,pickles,salt,onion,tomatoes,swiss cheese,american cheese,tartar sauce,chocolate latte,ice mocha shake,root beer,creams,ginger ale,milk,chicken,onions,pizza,eggs,cheddar,salad,fish,swiss cheese slice,sliced red onion,dijon mustard,teriyaki sauce,barbecue sauce,pickle,relish,cream cheese,jalapenos,jalapeÃ±os,mozzarella,avocado,capers,sour cream,jalepenos,cheddar cheese,surf n turf,iced tea,unsweetened iced tea,unsweet iced tea,orange juice,hot chocolate,cappuccino,tea,bottled water,green tea,dakota,cappucino,juice,dakota burger,grilled pet chicken sandwich,grilled pet chicken,fried pet chicken,fried pet chicken sandwich,angus,angus patty,sugar,cream\n\n> # List entities\n\n$size:small=\n- small\n- Small\n- smaller\n- tall\n\n$size:medium=\n- medium\n- grand\n- grande\n- Medium\n\n$size:large=\n- large\n- venti\n- Large\n\n$size:extra large=\n- extra large\n- trenta\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/MultiturnReplaceKbWithFlattenedTree.json",
    "content": "{\n    \"qnaList\": [\n      {\n        \"id\": 1,\n        \"answer\": \"ans1\",\n        \"source\": \"Editorial\",\n        \"questions\": [\n          \"ques1\"\n        ],\n        \"context\": {\n          \"isContextOnly\": false,\n          \"prompts\": [\n            {\n              \"displayOrder\": 1,\n              \"qnaId\": 2,\n              \"qna\": null,\n              \"displayText\": \"p1\"\n            },\n            {\n              \"displayOrder\": 3,\n              \"qnaId\": 3,\n              \"qna\": null,\n              \"displayText\": \"p2\"\n            },\n            {\n              \"displayOrder\": 6,\n              \"qnaId\": 4,\n              \"qna\": null,\n              \"displayText\": \"p3\"\n            }\n          ]\n        }\n      },\n      {\n        \"id\": 2,\n        \"answer\": \"ap1\",\n        \"source\": \"Editorial\",\n        \"questions\": [\n          \"p1\"\n        ],\n        \"context\": {\n          \"isContextOnly\": true,\n          \"prompts\": [          ]\n        }\n      },\n      {\n        \"id\": 3,\n        \"answer\": \"ap2\",\n        \"source\": \"Editorial\",\n        \"questions\": [\n          \"p2\"\n        ],\n        \"context\": {\n          \"isContextOnly\": true,\n          \"prompts\": [          ]\n        }\n      },\n      {\n        \"id\": 4,\n        \"answer\": \"ap3\",\n        \"source\": \"Editorial\",\n        \"questions\": [\n          \"p3\"\n        ],\n        \"context\": {\n          \"isContextOnly\": false,\n          \"prompts\": [          ]\n        }\n      },\n      {\n        \"id\": 5,\n        \"answer\": \"zxc\",\n        \"source\": \"Editorial\",\n        \"questions\": [\n          \"qew\"\n        ],\n        \"context\": {\n          \"isContextOnly\": false,\n          \"prompts\": [          ]\n        }\n      }\n    ]\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Skills/Calendar/Calendar.lu",
    "content": "> # Intent definitions\n\n## AcceptEventEntry\n- accept all meetings for {Subject=christmas party} {FromDate=next week}.\n- accept an appointment\n- accept {Subject=dinner}\n- accept my meeting at {FromTime=7pm} {FromDate=today}\n- accept my meeting at {FromDate=tomorrow} {FromTime=10am}\n- accept the appointment from {FromTime=3pm} to {ToTime=5pm}.\n- accept the appointment on {FromDate=january 18th} in {MeetingRoom=palace meeting room}.\n- accept the appointment sent by lucas\n- accept the event\n- accept the event for {FromTime=tonight}.\n- accept the event on {FromDate=feb. 18} in {Location=beijing}.\n- accept the event sent by yolanda wong.\n- accept the meeting held on {FromDate=tomorrow} at {MeetingRoom=room 301}\n- accept the meeting organized by jack lauren.\n- accept the meeting with mary and tom held on {FromDate=wednesday}\n- accept the meeting with tom chen.\n- accept this appointment with jane and mary on {FromDate=next tuesday}.\n- accept this event.\n- accept this {Subject=lunch meeting}.\n- accept {FromDate=today}'s event at {FromTime=3pm}.\n- accept {FromDate=today}'s meeting\n- attend the fy19 celebration party sent by daisy lu.\n- attend the {Subject=lunch meeting} at {FromTime=10:30 am}.\n- attend the meeting held at {FromTime=3pm} {FromDate=next tuesday} at the {MeetingRoom=conference center}.\n- i want to attend the {Subject=meeting for review}\n- i'll attend the meeting at {FromTime=2pm} {FromDate=tomorrow} in {MeetingRoom=room 304}\n- i'll attend the meeting {FromTime=this afternoon}.\n- i'll attend this upcoming event in {Location=redmond}.\n- ^i (want to|would like to|'d like to) (join|attend) the {Subject}^\n\n\n## Cancel\n- abort edition\n- can i cancel this\n- can you cancel it\n- can you cancel it please\n- can you cancel that\n- cancel\n- cancel can you don't do that please\n- cancel cancel\n- cancel cancel cancel\n- cancel don't worry\n- cancel everything\n- cancel it\n- cancel it for me\n- cancel it i don ' t want that\n- cancel it please\n- cancel it, i don't want to create the meeting\n- cancel please\n- cancel that\n- cancel the creating process\n- cancel this\n- could you cancel it please\n- don't change it\n- don't create it\n- forget cancel\n- forget it\n- go ahead and cancel it\n- help me to cancel this\n- i don't want to change it anymore\n- i don't want to do it now\n- i don't want to find it anymore\n- i don't want to join it\n- i don't want want to change this appointment anymore\n- i have decided to cancel it\n- i need to cancel that\n- i want to cancel it please\n- i want to cancel that\n- i would like to cancel all of them\n- i would like to cancel it\n- i'd like to cancel this\n- just cancel\n- just cancel it\n- let me cancel that\n- need to cancel it\n- never mind\n- never mind could you cancel that\n- never mind, cancel the changing\n- never mind, forget about the creating\n- no cancel\n- no cancel it\n- no i just cancel it\n- no, cancel please\n- nothing just cancel\n- nothing just cancel it\n- oh cancel\n- ohh never mind\n- please cancel\n- please cancel all of them\n- please cancel it\n- please cancel that\n- quit the changing\n- stop changing it\n- stop checking it\n- stop connecting it\n- stop finding it\n- will you cancel it please\n\n\n## ChangeCalendarEntry\n- bring forward my {FromTime=4 o'clock} appointment {MoveEarlierTimeSpan=2 hours}\n- can you change it to {ToTime=5 pm}\n- can you move this appointment to {ToTime=5pm}\n- change {FromTime=10 am} meeting to start {MoveLaterTimeSpan=20 minutes} later\n- change {FromTime=12am} meeting to start {MoveEarlierTimeSpan=10 minutes} earlier\n- change {FromTime=4pm} {Subject=lunch appointment}\n- change {FromTime=5pm} appointment {MoveEarlierTimeSpan=1 hour} earlier\n- change an appointment\n- change appointment\n- change {Subject=big event} to {ToDate=tomorrow}\n- change calendar\n- change {Subject=dentist appointment}\n- change {Subject=dentist appt} to {MoveLaterTimeSpan=an hour} later\n- change {Subject=developmental agenda for lunch} {FromDate=tomorrow}\n- change it to {ToTime=5pm}\n- change {SlotAttribute=location}\n- change {Subject=lunch appt} to {ToTime=2}\n- change {Subject=lunch date} from {FromTime=11} - {FromTime=12} to {ToTime=12} - {ToTime=1 30}\n- change {Subject=marathon training} from {FromTime=8:00am} to {ToTime=1:00pm}\n- change {Subject=marketing meeting} from {FromDate=every tuesday} to {ToDate=every wednesdays}\n- change meeting from {FromTime=2}-{FromTime=3pm} to {ToTime=4}-{FromTime=5pm} {ToDate=today}\n- change meeting from {FromTime=2pm}-{FromTime=3pm} to {ToTime=4pm}-{ToTime=5pm} {ToDate=today}\n- change my {ToTime=11pm} {Subject=appointment}'s {SlotAttribute=location} to {Location=green park}\n- change my {FromTime=3pm} event to {ToTime=4pm}\n- change my {FromTime=6pm} event to {ToTime=7pm}\n- change my {FromTime=7 30 pm} appointment to {ToTime=8 pm}\n- change my {FromTime=7pm} event to {ToTime=6pm}\n- change my {FromTime=8} till {FromTime=9} appointment to {ToTime=11} till {ToTime=12}\n- change my {FromTime=9 30} till {FromTime=10 30} appointment to {ToTime=9 30} till {ToTime=5}\n- change my appointment\n- change my {Subject=appointmnet} with sarah to {ToTime=5 pm}\n- change my {Subject=dentist appointment}\n- change my {Subject=dentist appointment} from {FromTime=3:30} to {ToTime=4}\n- change my meeting at {FromTime=night} to {ToDate=tomorrow}\n- change my {OrderReference=next} meeting\n- change my schedule\n- change my {FromTime=ten am} appointment\n- change my {Subject=vacation} from ending on {FromDate=friday} to {ToDate=monday}\n- change {Subject=recital} to start {MoveEarlierTimeSpan=half an hour} earlier\n- change {Subject=shave} {ToDate=tomorrow} {ToTime=8 30}\n- change the {Subject=appointment} ending at {FromTime=4} to end at {ToTime=5} instead\n- change the {SlotAttribute=end date} of {Subject=my trip} from the {FromDate=3rd} to the {ToDate=4th}\n- change the {SlotAttribute=end time} of my {FromTime=3 o'clock} meeting to {ToTime=3 30 pm}\n- change the {SlotAttribute=location} of my {Subject=singing appointment}\n- change the meeting which will start at {FromTime=2 pm} to {ToTime=3 pm}\n- change the {SlotAttribute=time}\n- change the {SlotAttribute=time} to {ToTime=eleven thirty am}\n- change the {SlotAttribute=title} of my {FromTime=11am} appointment to {Subject=soccer practice}\n- change the {SlotAttribute=title} of my appointment\n- change this appointment's {SlotAttribute=location}\n- change {FromDate=thursday} {Subject=team meeting}\n- change {SlotAttribute=time}\n- change {FromDate=today} 's meeting from {FromTime=6pm} to {ToDate=tomorrow} {ToTime=9am}\n- change {FromDate=today} 's meeting from {FromTime=6pm} to {ToDate=tomorrow} {ToTime=9pm}\n- change {FromDate=tomorrow} ' s appointment from {FromTime=10am} to {ToDate=wednesday} at {ToTime=9 am}\n- delay the meeting event by {MoveLaterTimeSpan=1 hours}\n- delay the {OrderReference=next} meeting by {MoveLaterTimeSpan=30 minutes}\n- edit calendar\n- extend meeting from {FromTime=9 am} to {ToTime=12 am}\n- let {FromTime=5 pm} meeting starting at {ToTime=3}\n- let {OrderReference=next} meeting starting at 10am\n- make {OrderReference=next} meeting to start {MoveLaterTimeSpan=1 hour} later\n- make the appointment ending at {FromTime=2} go until {ToTime=4 pm}\n- make the meeting ending at {FromTime=10} go until {ToTime=11}\n- make the meeting to start {MoveLaterTimeSpan=1 hour} later\n- make the meeting to start {MoveEarlierTimeSpan=40 minutes} earlier\n- modify the meeting\n- modify the {PositionReference=second} meeting\n- move {FromTime=3pm} meeting to {ToTime=4pm}\n- move appt with rebecca to {ToDate=next week}\n- move meeting from {FromTime=9pm}-{FromTime=10pm} to {ToTime=8pm}-{ToTime=9pm} {ToDate=today}\n- move my {FromTime=1 pm} appointment up {MoveEarlierTimeSpan=30 minutes}\n- move my {FromTime=10 past 10} {Subject=doctor ' s appointment} to {ToTime=10}\n- move my {FromTime=10pm} meeting to {ToTime=9pm}\n- move my {FromTime=12 pm} meeting to {ToTime=2}\n- move my {FromTime=4 pm} to {ToTime=5 pm} {ToDate=today}\n- move my {ToTime=9 am} {Subject=doctor ' s appointment} to {ToTime=10 am}\n- move my {FromTime=9pm} meeting to {ToTime=8pm}\n- move my meeting back by {MoveLaterTimeSpan=an hour}\n- move my meeting to {ToTime=6pm} from {FromTime=7pm}\n- move my meeting up by {MoveEarlierTimeSpan=half an hour}\n- move my {OrderReference=next} meeting\n- move my {OrderReference=next} meeting out by {MoveLaterTimeSpan=30 minutes}\n- move my {OrderReference=next} meeting out {MoveLaterTimeSpan=thirty minutes}\n- move my {OrderReference=next} meeting up by {MoveEarlierTimeSpan=10 minutes}\n- move my {OrderReference=next} meeting up by {MoveEarlierTimeSpan=30 minutes}\n- move my {Subject=text meeting}\n- move my {FromTime=twelve p . m .} meeting forward {MoveEarlierTimeSpan=two hours}\n- move my {FromTime=twelve p. m.} {MoveEarlierTimeSpan=thirty minutes} up\n- move {Subject=party planning meeting} from {FromDate={FromTime=saturday}} to {ToDate=friday} at {ToTime=1pm}\n- move {Subject=shoe appointment} to {ToDate=tuesday} at {ToTime=one}\n- please move this to {ToTime=3 pm}\n- postpone my {FromTime=4 pm} meeting {FromDate=today} until {ToTime=5 pm}\n- postpone my {FromTime=four p. m.} meeting {ToDate=today} until {ToTime=five p. m.}\n- push my {Subject=trip} {FromDate=july 16th} out {MoveLaterTimeSpan=5 days}\n- reschedule appointment with mark for {FromDate=next week}\n- reschedule appointment with jennifer to {ToDate=next week}\n- reschedule meeting\n- reschedule my {FromTime=3:30} {Subject=dentist appointment} to {ToTime=4}\n- reschedule my {FromTime=3:30} {Subject=dentist appointment} {FromDate=today} for {ToTime=4pm} {ToDate=tomorrow}\n- reschedule my {Subject=interview} on {ToDate=monday} to {ToTime=1 pm}\n- reschedule the {FromTime=2 pm} {Subject=class} to {ToTime=half past 2}\n- this meeting should be changed to {ToDate=tomorrow}\n- update appointment\n- update calendar\n- update {Subject=lunch appointment}\n- update meeting from {FromTime=8am}-{FromTime=12pm} to {ToTime=7am}-{ToTime=11am} {ToDate=today}\n- update my appointment\n- update my {Subject=calendar}\n- update my calendar from {FromTime={ToTime=11}} to {ToTime=12:30} {ToDate=today}\n- update my calendar from {FromTime=2 pm} to {ToTime=4 pm} {ToDate=today}\n- update my calendar from {FromTime=6pm} to {ToTime=7pm}\n- update my {Subject=camping appointment}\n- update my {OrderReference=next} appointment\n- update my {FromTime=tomorrow} {FromTime=6pm} meeting to {ToTime=7pm}\n- update {Subject=party}\n- ^[(would|can|could) you] [please] (change|reschedule) [the] ({Subject}|meeting) to {ToTime}^\n\n\n## CheckAvailability\n- am i available\n- am i available at {FromTime=10 am} on {FromDate=monday}\n- am i available on {FromDate=monday} at {FromTime=9 pm}\n- am i available {FromDate=tomorrow} at {FromTime=5 30 pm}\n- am i busy on the {FromDate=6th of february}\n- am i busy on {FromDate=this weekend}\n- am i busy {FromDate=this weekend}\n- am i free\n- am i free at {FromTime=5 pm} {FromDate=today}\n- am i free at {FromTime=7 p . m .}\n- am i free for {Subject=drinks} {FromDate=monday} at {FromTime=5}\n- am i free for {Subject=drinks} {FromDate=monday} at {FromTime=5 pm}\n- am i free for {Subject=hiking} on {FromDate=saturday} at {FromTime=8 am}\n- am i free from {FromTime=3 pm} - {ToTime=10 pm}\n- am i free on {FromDate=monday} at {FromTime=9 pm}\n- am i free on {FromDate=saturday}\n- am i free on the {FromDate=12th of july}\n- am i free to {Subject=drive} with kim on {FromDate=thurs} at {FromTime=3 pm}\n- am i free {FromDate=today}\n- am i free {FromDate=tomorrow} {FromTime=3 pm}\n- am i free {FromTime=tonight}\n- am i free {FromDate=tuesday} at {FromTime=7 am}\n- can you check my dad 's calendar for free time {FromDate=this week}\n- can you tell me if my husband is free on {FromDate=sunday}\n- display olivia 's availability\n- do i have any free time {FromDate=this weekend}\n- i would like to know if my mother is available {FromDate=today}\n- is carolyn available {FromDate=tuesday} {FromTime=afternoon}\n- is debra available on {FromDate=saturday}\n- is gerald busy {FromDate=this weekend}\n- is grace available for the {Subject=daily scrum meeting} with engineering team from {FromTime=10} to {ToTime=11}\n- is madison busy\n- is nicholas available {FromDate=friday}\n- is raymond free on {FromDate=monday} {FromTime=evening}\n- is rebecca busy {FromDate=thursday} at {FromTime=4}\n- is russell free on {FromDate=friday} at {FromTime=4pm}\n- is {FromDate=saturday} free\n- is theresa free {FromDate=october 9th}\n- is virginia free on {FromDate=monday}\n- search jesse 's calendar for availability\n- what is anna 's availability {FromDate=next tuesday}\n- when am i free\n- when am i free {FromDate=today}\n- when do i have time to create a {Subject=weekly meeting}\n- when does ellen have time to attend the meeting\n- when does ellen have time to attend the meeting for business review\n- when does marry have time to join the appointment\n- when is aaron free {FromDate=tomorrow}\n- when is bryan free\n- when is dylan available\n- when is samuel available {FromDate=tomorrow}\n- when will jordan be free\n- will tyler be free on {FromDate=friday}\n- ^do i have time (at|on|for) {FromTime} [on] {FromDate}\n- ^does {personName} have time at {FromTime}\n- ^is {personName} (available|free) from {FromTime} to {ToTime} [on {FromDate}]\n\n\n## Confirm\n- alright\n- confirm\n- correct\n- do it\n- excellent\n- fine\n- good\n- great\n- i'm sure\n- ok\n- okay\n- okay thank you\n- okay thanks\n- perfect\n- perfect thank you\n- please\n- right\n- sounds good\n- sounds good okay\n- sounds great\n- sure\n- sure go ahead\n- that ' s right\n- that's correct\n- that's good\n- that's great\n- that's right thank you\n- yeah\n- yeah thank you\n- yep\n- yes\n- yes add\n- yes good\n- yes indeed\n- yes it does\n- yes it is\n- yes of course\n- yes perfect\n- yes please\n- yes sure\n- yes thank you\n- yes thanks\n- yes that ' s fine\n- yes yes\n- yup\n\n\n## ConnectToMeeting\n- add me to conference call\n- add me to the conference call\n- call conference\n- call conference call\n- call genpact conference call\n- call harris conference\n- call into conference call\n- call into {Subject=marketing meeting}\n- call into meeting\n- call the {Subject=morning breifing} conference number\n- call the {Subject=weekly marketing meeting}\n- conference join\n- connect me to {FromTime=10 00} conf call with bryan\n- connect me to conference call\n- connect me to conference call with debra\n- connect me to {Subject=marketing meeting}\n- connect me to the {Subject=budget meeting} conference call\n- connect me to the conference call\n- connect me to the {Subject=marketing meeting}\n- connect me with conference call\n- connect me with my {FromTime=2 o clock} meeting\n- connect to conference call\n- connect to conference call {FromTime=now}\n- connect to {Subject=weekly marketing meeting}\n- dial into conference call\n- dial {Subject=marketing meeting}\n- get me on the conference call\n- i need to join conference call\n- i need to join the conference call\n- join {Subject=budget} conference call\n- join conference\n- join conference call\n- join {FromTime=current} {Subject=budget} conf call\n- join {FromTime=current} conference\n- join {FromTime=current} conference call\n- join lync meeting\n- join meeting\n- join meeting {FromTime=now}\n- join my meeting\n- join my {OrderReference=next} meeting\n- join {OrderReference=next} {Subject=link meeting}\n- join {OrderReference=next} meeting\n- join {OrderReference=next} meeting on link\n- join the {Subject=budget meeting} conference call\n- join the conference\n- join the meeting\n- join the {OrderReference=next} {Subject=lync meeting}\n- link join my {OrderReference=next} meeting\n- link join {OrderReference=next} meeting\n- lync join {OrderReference=next} meeting\n- {MeetingRoom=nokia conference room} join\n- start meeting\n- start my conference\n- start my meeting\n- start the meeting\n- ^i ('d|would like to|want to) join the ({Subject}|meeting) now^\n\n\n## ContactMeetingAttendees\n- alert attendees {Message=meeting is at 8 30}\n- alert attendees of {Subject=dinner meeting} that {Message=i will be late}\n- alert {Subject=quality control meeting} participants that {Message=i am 15 minutes late}\n- alert {Subject=quality control meeting} participants that {Message=the meeting will be 30 minutes later}\n- {Message=meeting room changed to new location} send to meeting attendees\n- meeting will start soon remind everybody involved\n- message colleagues that {Message=meeting needs to be moved to 8 : 30 am}\n- message everyone advising that {Message=i will be late to the meeting}\n- message nancy and tell him to {Message=postpone the meeting because i ' m going to be 30 minutes late}\n- {Message=my 9 o ' clock meeting can ' t start until 9 15} can you let everyone know\n- new location for meeting {ToTime=this afternoon} let others attendees know {Message=meeting is now in room 100}\n- notify all attendees\n- notify all attendees about the change\n- notify attendees of office meeting that {Message=i will be a little later}\n- notify diana that {Message=i ' ll be late to our meeting}\n- notify {ToDate=friday}'s {ToTime=2 pm} that we are cancelling the meeting\n- notify kimberly that {Message=i will be late for our 3 pm meeting}\n- notify noah that {Message=our meeting is pushed back 30 minutes}\n- notify others that {Message=i am going to be late to meeting}\n- notify people of meeting on {ToDate=tue} that {Message=it will begin 15-30 min later}\n- ok find out if that is possible by sending a meeting change notification to all attendees\n- over run of time in confer room - all attendees to be notified of {Message=meeting being moved to next room} - will explain why later\n- please advise {Message=i am late} for {ToDate=3 pm} meeting\n- please alert {ToTime=3 o ' clock} meeting attendees\n- please alert attendees {Message=meeting is at 8:30}\n- please alert those attending the meeting that {Message=i am running a few minutes late}\n- please inform colleagues {Message=running late and meeting half hour later}\n- please inform colleagues {Message=we will be meeting at 8 : 30 due to being late}\n- please inform joshua that {Message=i will be late for our meeting today}\n- please inform meeting attendees that {Message=i am running late}\n- please inform the thomas that {Message=i will be late for the meeting}\n- please inform work contact group that {Message=i am running late for the meeting}\n- please let all in work group know {Message=meeting to start at 9 15}\n- please let them know {Message=i'm late}\n- please notify everyone {Message=i ' m running late to the 3 pm meeting}\n- please notify george that {Message=i will be late for the meeting}\n- please remind the attendee that {Message=i am running late}\n- provide {Message=the time change for the meeting} to all participants\n- remind all attendees of {ToDate=tomorrow} ' s {Subject=lunch} that {Message=we have changed the venue}\n- {Message=room 100 is location} for {ToTime=this afternoon} ' s meeting please notify others\n- {Message=running late for meeting} - notify others\n- running late for the {Subject=board meeting} alert catherine dennis and all the other attendees\n- {Message=running late} to my meeting please let jennifer know\n- send a message out to {Message=cancel my 3 pm meeting}\n- send a message to johnny and jessie that {Message=our meeting today will be later by 30 minutes}\n- send a message to the meeting attendees that {Message=the meeting will now start at 8 30 am}\n- send a notice to douglas {Message=the first will be attending the meeting}\n- send a notice to paul that {Message=xu wen will attend the meeting}\n- send a text to the people going to the meeting that {Message=the location has changed}\n- send reminder of {ToTime=9 am} meeting to all participants {Message=15 minutes later}\n- tell attendees {Message=i am late}\n- tell everyone {Message=the meeting is now in room 204}\n- tell {OrderReference=next} meeting that {Message=i'm running late}\n- ^(remind|inform|tell) (the|all) attendees {Message}^\n\n\n## CreateCalendarEntry\n- {Duration=2 hours} meeting with ladawn padilla at {FromTime=5} on {FromDate=tuesday}\n- add a meeting with herman to my calendar\n- add an appointment on {FromDate=may 8th} at {Location=shanghai}\n- add {Subject=applied motion} to my calendar {FromTime=9 am}\n- add appt with helen ding for {Subject=dinner} on {FromDate=march 5th} at {FromTime=5 pm} at {Location=dennys}\n- add appt with mike li for {Subject=dinner} on {FromDate=march 5th} at {FromTime=5 pm} at {Location=dennys}\n- add {Subject=balboa practice} to my calendar at {FromTime=3 30} {FromDate=today}\n- add {Subject=ballet} to my calendar {FromDate=wednesday} at {FromTime=five thirty} to {ToTime=six thirty pm}\n- add {Subject=baseball game} on {FromDate=friday} to calendar\n- add {Subject=chicago bulls versus washington wizards} to my calendar {FromDate=tomorrow} at {FromTime=seven pm}\n- add {Subject=choir practice} on {FromDate=saturday} at {FromTime=7 pm} to my {DestinationCalendar=personal} calendar\n- add {Subject=choreography} to my {DestinationCalendar=family} calendar\n- add {Subject=chorus concert} to calendar for {FromDate=may 1st} at {FromTime=3 pm}\n- add {Subject=church} to {DestinationCalendar=personal} calendar on {FromDate=sundays} at {FromTime=9}\n- add {Subject=coffee} on {FromDate=august 12th} at {FromTime=2 pm} with herman for {Duration=one hour}\n- add {Subject=dance} on {FromDate=tuesday} at {FromTime=four o clock}\n- add {Subject=date night} on the {FromDate=5th} at {FromTime=7pm} {FromDate=every month}\n- add {Subject=dentist appointment} on {FromDate=tuesday june} at the {Location=1st clinic}\n- add {Subject=dentist appointment} to my calendar at {FromTime=3:30} for the {FromDate=8th of may}\n- add {Subject=dentist appointment} to my calendar {FromDate=tomorrow} from {FromTime=3} to {ToTime=4:30}\n- add {Subject=dentist appointments} to my calendar at {FromTime=3 thirty p m}\n- add {Subject=dinner} to {DestinationCalendar=personal} calendar\n- add {Subject=dinner} with mom to {DestinationCalendar=personal}\n- add {Subject=doctors appointment} on {FromDate=march 13} at {FromTime=2 pm} at the {Location=original health clinic}\n- add {Subject=doctors appointment} on {FromDate=march 13} at {FromTime=2 pm} at the {Location=tiptop virginia beach clinic}\n- add {Subject=go shopping with} john meng on the calendar\n- add {Subject=haircut} to my {DestinationCalendar=google} calendar {FromDate=tomorrow} at {FromTime=2 30}\n- add {Location=hope middle school} {Subject=meet and greet} on my calendar\n- add {Subject=kane s dr appt} to calendar for {FromTime=3} {FromDate=friday}\n- add {Subject=maple beach} to my calendar at {FromTime=10} on {FromDate=sunday}\n- add {Subject=megan training} to calendar on {FromDate=july 4th} at {FromTime=11 am}\n- add {Subject=office party} on {FromDate=march 8th} from {FromTime=6 p} to {ToTime=9 p}\n- add {Subject=order cabinets} to my calendar {FromDate=today} at {FromTime=2 o clock}\n- add {Subject=pay credit card} to calendar {FromDate=may twentieth}\n- add {Subject=pay pearl fees} on my calendar {FromDate=tomorrow}\n- add {Subject=picture day} at {Location=school} to my calendar for {FromDate=friday, november the 8th} from {FromTime=8 am} to {ToTime=9:30} am\n- add {Subject=solo gig} at {Location=civic hall} on the {FromDate=7th of march} at {FromTime=8 pm}\n- add {Subject=team meeting} to my calendar at {FromTime=10pm} with xiaoming yang\n- add the {Subject=enviomential protection meeting} from {FromTime=9 am} to {ToTime=11 am}\n- add the {Subject=lunch} with my colleague naomi from {FromTime=12} to {ToTime=2} in my {DestinationCalendar=personal} calendar\n- add {Subject=ultimate frisbee} on {FromDate=sunday} at {FromTime=2 pm} for {Duration=2 hours}\n- add {Subject=vacation} to my calendar from {FromDate=july 4th} until {ToDate=july 29th}\n- add {Subject=work} to calendar at {FromTime=3 pm} on {FromDate=friday}\n- add {Subject=work} to calendar {FromDate=friday} from {FromTime=8} for {Duration=an hour}\n- add {Subject=work} to calendar {FromDate=sunday} {FromTime=10} till {ToTime=5}\n- add {Subject=work} to calendar {FromDate=thursday} {FromTime=8 30 am}\n- add {Subject=work} to my calendar {FromDate=monday} {FromTime=6 am} to {ToTime=11 am}\n- add {Subject=work} to my calendar {FromDate=today}\n- append {Subject=dad's birthday} {FromDate=every july 21st}\n- appending {Subject=group meeting} {FromDate=next monday} at {FromTime=11am} for {Duration=an hour}\n- book a meeting between {FromTime=2} and {ToTime=3} {FromDate=tomorrow}\n- book a meeting between {FromTime=2:30pm} and {ToTime=4:45pm} {FromDate=tomorrow}\n- book a meeting in {Location=guangzhou} at 6am on {FromDate=march 5th}\n- book a {Subject=recurring 1x1 meeting} on the {FromDate=first monday of each month}\n- create a calendar appointment at {FromTime=3:30} {FromDate=tomorrow} for {Duration=half an hour}\n- create a event with eden roth at {FromTime=4pm} {FromDate=today} for {Duration=30 mins}\n- create a meeting at 6 o'clock\n- create a meeting at {FromTime=7:00pm}\n- create a meeting at {FromTime=8am}\n- create a meeting at {FromTime=9:35am}\n- create a meeting for {FromDate=tomorrow} {FromTime=6pm} with lucy chen\n- create a meeting from {FromTime=9pm} to {FromDate=tomorrow} {ToTime=6am}\n- create a meeting with tom34@outlook.com\n- create an appointment with doctor lu from {FromTime=8:30 am} to {ToTime=10:00 am} {FromDate=tomorrow} {FromTime=morning}\n- create appointment for {Duration=30 minutes}\n- create appointment from {FromDate=tuesday} to {ToDate=wednesday}\n- create calendar : {FromDate=tomorrow} {FromTime=morning} from {FromTime=9} to {ToTime=11} at {MeetingRoom=1103 room} for {Subject=internal meeting}\n- make appointment for {FromTime=5 30} {FromDate=tomorrow}\n- make appointment for {FromTime=7 30}\n- make appointment for me\n- make appointment on {FromDate=monday}.\n- make appointment on {DestinationCalendar=personal} calendar\n- make appointment to {Subject=play squash} on {FromDate=thursday} at {FromTime=7 20}\n- make appointment to {Subject=see doctor culver} {FromDate=august the 22nd 2013} {FromTime=1 pm}\n- make appointment with tom roth.\n- make appt for {FromTime=3 pm} on {FromDate=christmas}\n- make me a calendar event\n- make me a {Subject=dentist appointment} {FromDate=wednesday} at {FromTime=two forty five}\n- make me an appointment\n- make me an appointment for {FromDate=next weekend}\n- make me an appointment for {FromTime=ten forty} {FromDate=next monday}\n- make me an appointment for the {FromDate=next week thursday}\n- make me an appointment on the calendar\n- make me an appointment {FromDate=tomorrow} at {FromTime=2 30 pm}\n- {FromDate=march 15} {Subject=dinner} at {Location=refectory} at {FromTime=6 pm}\n- meet ming yang for {Subject=lunch} on {FromDate=tuesday} at {FromTime=noon}\n- meet with a.j. lee {FromDate=saturday} at {FromTime=3 pm}\n- meet with carol lee at {Location=home} on {FromDate=march 10th} at {FromTime=4 pm}\n- meeting with ben randie {FromDate=tomorrow} at {FromTime=noon}\n- meeting with ellen fung on {FromDate=monday} at {FromTime=9 am}\n- meeting with jia li {FromDate=monday} {FromTime=3 30}\n- meeting with morrison sun at {FromTime=2 pm} {FromDate=saturday}\n- meeting with morrison yang at {FromTime=4}\n- new appointment for {FromDate=tomorrow}\n- new appointment in calendar\n- new appointment in my calendar\n- new appointment {FromDate=next wednesday}\n- new appointment {FromDate=tomorrow} at {FromTime=3 pm} at {Location=sunken}\n- new calendar appointment\n- new calendar entry\n- new calendar event\n- new calendar item\n- on {FromDate=saturday} at {FromTime=7 thirty p m}\n- {DestinationCalendar=personal} calendar {FromDate=5/1/2013} {Subject=meet mom for yard sale}\n- place an appointment in my calendar\n- please create a meeting from {FromTime=2} to {ToTime=3}\n- please schedule a {Subject=yoga class} with my sister at {FromTime=5pm} {FromDate=every friday}\n- please schedule an {Subject=all hands meeting} for {Duration=2 hours}\n- put {Subject=anniversary} on my calendar\n- put {Subject=captains} in my calendar for {FromDate=saturday} {FromTime=evening}\n- put {Subject=dance} on my calendar for {FromDate=monday} {FromTime=7 pm}\n- put {Subject=dance} on my calendar from {FromTime=6} to {ToTime=7}\n- put {Subject=dental appointment} on my calendar {FromDate=saturday march 22nd} at {FromTime=twelve pm}\n- put {Subject=dentist appointment} in my calendar for {FromDate=tomorrow} at {FromTime=one pm}\n- put {Subject=dentist appointment} in my calendar {FromDate=tuesday} {FromTime=2 45 pm}\n- put {Subject=dentist} on my calendar for {FromDate=this thursday} at {FromTime=10 am}\n- put {Subject=doctor s appointment} in my calendar for {FromTime=5 forty} {FromDate=next thursday}\n- put {Subject=eye doctor appointment} {FromDate=saturday} at {FromTime=11 am}\n- put {Subject=hair appointment} on calendar\n- put {Subject=insanity} on my calendar at {FromTime=6 30 am}\n- put {Subject=jason work} on my calendar {FromDate=thursday} {FromTime=9 am} to {ToTime=5 pm}\n- put jimmy on {Subject=to doctor ken} on {FromDate=october 20th} at {FromTime=3 30}\n- put {Subject=julie hay} in my calendar for tomorrow\n- put {Subject=mathematics paper one} on {FromDate=tuesday 13}\n- put {Subject=shopping day} on {FromDate=april 1st} at {FromTime=10 am} on calendar\n- put {Subject=swimming} in my calendar {FromDate=tomorrow}\n- put {Subject=swimming} {FromDate=tomorrow}\n- put {Subject=tennis game} for {FromDate=friday} at {FromTime=1} on calendar\n- put {Subject=test appointment} in my calendar {FromDate=tomorrow} at {FromTime=7}\n- put {Subject=dance class appointment}\n- put {Subject=work} on my calendar {FromDate=tomorrow} from {FromTime=8 30} to {ToTime=5 30}\n- put {Subject=yoga} on my calendar for {FromDate=mondays} and {FromDate=wednesdays} at {FromTime=3 pm}\n- schedule a {Subject=azure workshop} from {FromTime=9am} to {ToTime=tomorrow} {ToTime=5pm}\n- schedule a {Subject=breakfast meeting} at {FromTime=8 am} {FromDate=tomorrow}\n- schedule a {Subject=buisness lunch for my department} at {Location=campus restaurant} on {FromDate=wednesday} at {FromTime=11 30 am}\n- schedule a calendar event for my sister\n- schedule a {Subject=chiropractors appointment} on {FromDate=july 7th} at {FromTime=4 o clock}\n- schedule a {Subject=dental appointment} {FromDate=tomorrow} {FromTime=afternoon at five thirty pm}\n- schedule a {Subject=dentist appointment} for {FromDate=tomorrow} {FromTime=night at 7 pm}\n- schedule a {Subject=dinner} for {FromTime=tonight} at {FromTime=8 pm}\n- schedule a {Subject=doctor s office appointment} for {FromDate=march 12th}\n- schedule a {Subject=doctors appointment} at {FromTime=15 30}\n- schedule a {Subject=doctors appointment} with madden on {FromDate=march 12th} at {FromTime=4 pm}\n- schedule a {Subject=lunch date} with mom {FromDate=every tuesday} at {FromTime=noon} for the {FromDate=next 5 weeks}\n- schedule a {Subject=lunch meeting} with my lead\n- schedule a {Subject=massage} on {FromDate=tuesday}\n- schedule a meeting\n- schedule a meeting for {FromDate=next thursday}\n- schedule a meeting for {FromDate=this friday} {FromTime=11 am}\n- schedule a meeting for {FromDate=tomorrow} at {FromTime=5 pm}\n- schedule a meeting on {FromDate=nov. 3} from {FromTime=3}-{ToTime=4pm}\n- schedule a meeting {FromDate=tomorrow}\n- schedule a meeting with andy\n- schedule a meeting with han lu {FromTime=8 am} {FromDate=next tuesday}\n- schedule a meeting with ryan from {FromTime=3}-{ToTime=4pm} on {FromDate=october 25th}\n- schedule a {Subject=run} at the {Location=lake} with madden\n- schedule a {Subject=shopping trip} with shawntia on {FromDate=friday} at {FromTime=5 pm}\n- schedule a {Subject=soccer game} for {FromDate=next friday}\n- schedule a {Subject=vet appointment} at {FromTime=9 am} on {FromDate=saturday}\n- schedule a {Subject=visit to the market} {FromDate=this saturday} at {FromTime=10 o clock}\n- schedule a {Subject=workout} with madden to my calendar\n- schedule an appointment for {FromTime=10 30 in the morning} on {FromDate=january 20 1st}\n- schedule an appointment for {FromTime=9 am}\n- schedule an appointment for me\n- schedule an appointment for me on {FromDate=tomorrow}\n- schedule an appointment for me {FromDate=today}\n- schedule an appointment for me {FromDate=tomorrow} at {FromTime=3 am}\n- schedule an appointment for my mom\n- schedule an appointment for {FromTime=noon} {FromDate=tomorrow}\n- schedule an appointment for {FromTime=one o clock} {FromDate=today}\n- schedule an appointment for {FromDate=saturday} at {FromTime=8} {Subject=dinner} with madden\n- schedule an appointment for {FromDate=saturday} at {FromTime=one 30 pm} to {Subject=measure house}\n- schedule an appointment for {FromDate=thursday} at {FromTime=3 pm} {Subject=haircut}\n- schedule an appointment for {FromDate=tomorrow} at {FromTime=one o clock}\n- schedule an appointment from {FromDate=june 18th} to {ToDate=june 20th}\n- schedule an appointment on {FromDate=monday} from {FromTime=noon} to {ToTime=4 pm}\n- schedule an appointment on my calendar\n- schedule an appointment on {FromDate=november 5th} at {FromTime=3 30}\n- schedule an appointment on {FromDate=october 31st}\n- schedule an appointment on {FromDate=thursday october second} at {FromTime=8 forty am} {Subject=mom s medical appointment}\n- schedule an appointment to {Subject=call meredith} at {FromTime=12}\n- schedule an appointment to {Subject=groom my dogs} at {Location=petco} on {FromDate=friday} at {FromTime=6 pm}\n- schedule an appointment to {Subject=see cj} on {FromDate=thursday}\n- schedule an appointment with madden\n- schedule an appointment with madden at {FromTime=10 pm}\n- schedule an appointment with madden for {FromDate=wednesday the 20 4th} at {FromTime=9 30 am}\n- schedule an appointment with madden {FromDate=today} at {FromTime=2 o clock}\n- schedule an appointment with madden {FromDate=tomorrow} at {FromTime=5 pm}\n- schedule an appointment with mom\n- schedule an event\n- schedule an event for me\n- schedule an event for {Subject=scrum} with madden at {FromTime=10 am} {FromDate=saturday}\n- schedule an event for the {FromDate=5th of july}\n- schedule an event on the calendar\n- schedule appointment\n- schedule appointment at {FromTime=eight p m} {FromDate=tomorrow}\n- schedule appointment for madden {Subject=account payment}\n- schedule appointment {Subject=yearly check up} {FromDate=friday march one} {FromTime=10 am} {Duration=one hour}\n- schedule {Subject=art show} on calendar for {FromTime=noon} on {FromDate=march 6th}\n- schedule {Subject=ben baig} for {FromDate=saturday} {FromTime=evening}\n- schedule {Subject=camping} for {FromDate=friday} to {ToDate=sunday}\n- schedule {Subject=college} for {FromDate=tomorrow} at {FromTime=5 am}\n- schedule {Subject=dentist appointment} with madden for {FromDate=may the 20th} at {FromTime=3 pm}\n- schedule {Subject=dinner} on the {FromDate=8th} at {FromTime=6 thirty p m}\n- schedule {Subject=dinner} with madden at {FromTime=6 pm} on {FromDate=june 4th} at {Location=spring restaurant}\n- schedule {Subject=dinner} with madden {FromDate=every friday} at {FromTime=5 pm}\n- schedule {Subject=dry cleaning pick up} at {FromTime=three thirty pm} {FromDate=today}\n- schedule {Subject=group meeting} with madden on {FromDate=march 3rd} at {FromTime=4 00 pm}\n- schedule {Subject=hair appointment} on {FromDate=monday} at {FromTime=2 pm}\n- schedule {Subject=holiday} for the {FromDate=thirty first of july}\n- schedule {Subject=holiday} on the {FromDate=31st july}\n- schedule {Subject=lunch} with madden for {FromTime=11 30 am} on {FromDate=wednesday}\n- schedule {Subject=lunch} with madden on {FromDate=tuesday}\n- schedule {Subject=lunch} with pura at {FromTime=noon} on {FromDate=wednesday may} {Duration=20 minutes}\n- schedule {Subject=mechanics exam} at {FromTime=12 pm} on {FromDate=friday}\n- schedule {Subject=miranda s graduation} from {FromTime=11} to {ToTime=3} on {FromDate=may 28th}\n- schedule my vacation from {FromDate=today} {FromTime=5pm} to {ToDate=tomorrow} {ToTime=5pm}\n- schedule {Subject=therapy appointment} at {FromTime=8 o clock}\n- schedule {Subject=wanda s graduation} for {FromDate=saturday} at {FromTime=11 o clock}\n- schedule {Subject=wedding anniversary} on {FromDate=friday} {FromTime=evening}\n- schedule {Subject=work} for {FromTime=7 am} {FromDate=tomorrow}\n- schedule {Subject=work} on {FromDate=thursday the thirty first} from {FromTime=three} to {ToTime=seven thirty}\n- schedule {Subject=yoga class} from {FromTime=2 pm} to {ToTime=3 pm}\n- set up an appointment with my sister in my {DestinationCalendar=main} calendar.\n- set up an appointment with pura\n- set up an appointment with pura {FromDate=tomorrow} at {FromTime=3 pm}\n- set up an appointment with tom\n- set up an event\n- set up an event in my calendar\n- set up meeting with pura for {FromDate=every tuesday} at {FromTime=1 pm}\n- set up meeting with thomson\n- set up the appointment\n- should you schedule to {FromTime=after lunch}\n- we make an appointment for me\n- (create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] (at|for|on) [{FromDate}] [{FromTime}]\n- (create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] from [{FromDate}] {FromTime} to [{ToDate}] {ToTime}\n- (create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] between {FromTime} and {ToTime}\n\n\n## DeleteCalendarEntry\n- can you cancel the {PositionReference=1st} one\n- cancel {FromTime=1 pm} {Subject=staff meeting}\n- cancel all events\n- cancel an appointment\n- cancel appointment\n- cancel appointment {FromDate=today}\n- cancel appointments\n- cancel calendar entry\n- cancel {Subject=dinner}\n- cancel {Subject=doctor ' s appointment} {FromDate=monday}\n- cancel event\n- cancel event {FromDate=tomorrow}\n- cancel {Subject=lunch} {FromDate=next wednesday}\n- cancel meeting\n- cancel meeting with abigail {FromTime=3 pm} {FromDate=today}\n- cancel meeting with bob marlon {FromTime=3pm} {FromDate=today}\n- cancel my {Subject=adventureworks trip} to {Location=seattle}\n- cancel my appointment\n- cancel my appointment at {FromTime=9 pm}\n- cancel my appointment for {FromDate=october 4}\n- cancel my {Subject=driving lesson} {FromDate=tomorrow}\n- cancel my event\n- cancel my meeting\n- cancel my meeting at {Location=shanghai} on {FromDate=monday} at {FromTime=10 am}\n- cancel my {OrderReference=next} appointment\n- cancel my {Subject=singing appointment} on {FromDate=monday}\n- cancel my {Subject=three o'clock} appointment\n- cancel that appointment\n- cancel that meeting\n- cancel the appointment\n- cancel the calendar\n- cancel the event\n- cancel the {Subject=group meeting}\n- cancel the meeting\n- cancel the meeting with julie\n- cancel the {Subject=pickup food from ted}\n- cancel the untitled event on {FromDate=may twenty eighth}\n- cancel this meeting\n- cancel {FromDate=today} ' s appointment\n- cancel {FromDate=tomorrow} ' s plan\n- clear all my appointments\n- clear all of my appointments\n- clear all of my appointments {FromDate=today}\n- clear all the appointments from my calendar for {FromDate=today}\n- clear my calendar\n- clear my calendar for {FromDate=january 29th}\n- clear my schedule\n- clear my schedule for {FromDate=tomorrow}\n- clear my schedule {FromDate=today}\n- decline my meeting on {FromDate=monday}\n- delete an appointment\n- delete appointment\n- delete {Subject=birthday calendar}\n- delete calendar event\n- delete event\n- delete meeting\n- delete my schedule\n- delete my schedule for {FromDate=today}\n- delete that appointment\n- delete the {PositionReference=1st} one from my calendar\n- delete the appointment with jeffrey\n- delete the appointment with mom\n- delete the scheduled meeting with zachary\n- delete this appointment\n- discard the appointment with george\n- discard the meeting\n- drop my appointment for {FromDate=monday}\n- i need to delete this appointment from my calendar\n- i want to delete an appointment\n- remove {Subject=dentist appointment}\n- remove {Subject=final tutoring} from my calendar\n- ^(clear|delete|remove) (my|the) calendar from {FromTime} to {ToTime}^\n- ^(remove|cancel|delete) (the|my) {Subject} [at {FromTime}] [{FromDate}]^\n\n\n## FindCalendarDetail\n- can you tell me about {Subject=master chief}\n- can you tell me something about {Subject=shakespeare}\n- detail about {FromDate=tomorrow}'s meeting\n- detailed information about the {OrderReference=next} meeting\n- details about the meeting with grace\n- details about the meeting with karen and tom\n- find the meetings mary\n- give me details of the {OrderReference=next} appointment\n- i need to know about my {Subject=date} with jimmy\n- i need to know about my meeting\n- i need to know about my {OrderReference=next} appointment\n- i need you to provide me the details of the meeting i have scheduled with my colleague amanda\n- please open my {Subject=date} with angela and tell me about it\n- tell me about my meeting {FromDate=today}\n- tell me about my {OrderReference=next} meeting\n- tell me about my {Subject=planned trip}\n- tell me about my schedule with {FromTime=afternoon}\n- tell me about my {FromDate=sunday} schedule\n- tell me all about {Subject=dinner date} with stephanie\n- what are the particulars for the {Subject=picnic} {FromDate=next week}\n- what are the plans for the {Subject=dinner date} with stacey\n- what did the sister say about meeting on {FromDate=sunday}\n- what is {Subject=destiny ' s event} for {FromDate=next week}\n- what is my meeting with ming xu about\n- what is that meeting with ashley and jane berlin about\n- what is the meeting with daniel robert regarding\n\n\n## FindCalendarEntry\n- at {FromTime=10 am} do i have a {Duration=30 minutes} meeting\n- calendar for {FromDate=today}\n- check janice 's calendar for {FromDate=this weekend}\n- check kronos calendar\n- check my calendar\n- check my {DestinationCalendar=family} calendar\n- check my mom's schedule\n- do i have any appointments {FromDate=today}\n- do i have any meetings {FromDate=today}\n- do i have anything from {FromTime=11} to {ToTime=2}\n- do i have anything on {FromDate=wednesday}\n- do i have anything {FromDate=today}\n- find a meeting about {Subject=group meeting}\n- find a meeting about {Subject=plan}\n- find a meeting at {FromTime=7pm} from melissa\n- find a meeting from darren about {Subject=status update}\n- find a meeting from deborah about {Subject=team session}\n- find a meeting from donna\n- find a meeting subject {Subject=daily meeting}\n- find a meeting with subject {Subject=weekly report}\n- find a meeting with title {Subject=second lesson} from amanda\n- find a meeting with title {Subject=sharing} from steven\n- find me the meetings at {FromTime=6}\n- find me the meetings at {FromTime=9 o'clock}\n- find the meeting around {FromTime=5} to {FromTime=8 pm}\n- find the meeting around {FromTime=2} to {FromTime=6pm}\n- find the meeting with judith\n- find the meeting with timothy\n- find the {OrderReference=next} meeting\n- get to my {OrderReference=next} event\n- locate the {OrderReference=next} appointment\n- look up my {OrderReference=next} appointment for me\n- {OrderReference=next} meeting\n- obtain the appointment with frank\n- search a meeting subject {Subject=project proposal rehearsal}\n- search the meeting with title {Subject=employee orientation}\n- show jean's calendar\n- show me brenda 's schedule for {FromDate=friday}\n- show me heather 's calendar\n- show me my calendar\n- show me my calendar for {FromDate=monday}\n- show me my {DestinationCalendar=google} calendar\n- show me my {OrderReference=next} meeting\n- show me my schedule {FromTime=tonight}\n- show me the calendar at {FromTime=night}\n- show me the meeting about {Subject=briefing session}\n- show me the meeting about {Subject=online session}\n- show me the meeting with paul\n- show me victoria 's calendar for {FromDate=monday}\n- show my schedule at {FromTime=night}\n- tell me the events scheduled at calendar {Location=constitution hall}\n- the {OrderReference=next} appointment after that\n- view emily calendar\n- view ethan 's calendar\n- what ' s after that on my calendar\n- what ' s going on {FromDate=this weekend}\n- what ' s happening {FromDate=today}\n- what ' s in my calendar for {FromDate=today}\n- what ' s my {PositionReference=1st} appointment {FromDate=tomorrow}\n- what ' s my {PositionReference=1st} meeting {FromDate=tomorrow}\n- what ' s my {OrderReference=next} appointment\n- what ' s my {OrderReference=next} meeting\n- what ' s my schedule for {FromDate=tomorrow}\n- what ' s my schedule like {FromDate=tomorrow}\n- what ' s my schedule {FromDate=tomorrow}\n- what ' s {OrderReference=next} on my calendar\n- what ' s on my calendar\n- what ' s on my calendar for {FromDate=today}\n- what ' s on my calendar {FromDate=today}\n- what ' s on my {OrderReference=next} meeting\n- what ' s on my schedule\n- what ' s on my schedule for {FromDate=tomorrow}\n- what ' s on my schedule {FromDate=today}\n- what ' s the meeting {FromDate=today} between {FromTime=10} and {ToTime=12:00}\n- what am i doing {FromDate=next week}\n- what am i doing on {FromDate=june ninth}\n- what am i doing {FromTime=tonight}\n- what appointments do i have {FromDate=tomorrow}\n- what are my appointments for {FromDate=this week}\n- what are my appointments {FromDate=today}\n- what are my meetings at {FromTime=night}\n- what do i have for {FromDate=today}\n- what do i have from {FromTime=2} to {ToTime=4} on {ToDate=saturday}\n- what do i have from {FromDate=monday} through {ToDate=wednesday}\n- what do i have going on {FromDate=today}\n- what do i have {OrderReference=next}\n- what do i have on my calendar {FromDate=today}\n- what do i have on {FromDate=sunday}\n- what do i have {FromTime=this afternoon}\n- what do i have to do {FromTime=this afternoon}\n- what do i have to do {FromDate=tomorrow}\n- what do i have {FromDate=tomorrow}\n- what have i got on {FromDate=tomorrow}\n- what i am doing {FromDate=next week}\n- what i'm doing {FromDate=this weekend}\n- what is henry doing on {FromDate=monday} at {FromTime=noon}\n- what is logan 's schedule {FromDate=this week}\n- what is my {PositionReference=1st} meeting {FromDate=today}\n- what is my {OrderReference=next} appointment\n- what is my schedule for {FromDate=tomorrow}\n- what is my schedule {FromDate=tomorrow}\n- what is {OrderReference=next} in calendar\n- what is on my calendar {FromDate=today}\n- what is the schedule before that\n- what is timothy doing {FromDate=today}\n- what meetings do i have {FromDate=next week}\n- what was my {PositionReference=first} appointment\n- what's going on {FromDate=this week}\n- what's happening {FromDate=tomorrow}\n- what's my {PositionReference=first} meeting {FromDate=tomorrow}\n- when and where is my {OrderReference=next} meeting\n- which is my {OrderReference=next} event\n- which will be my {OrderReference=next} {Subject=flight}\n\n\n## FindCalendarWhen\n- my {OrderReference=next} meeting with emily is when\n- what day is {Subject=lego land} scheduled for\n- what time do i have {Subject=work} {FromDate=tomorrow}\n- what time do i {Subject=work} {FromDate=today}\n- what time is {Subject=beth over} {FromDate=today}\n- what time is my {Subject=cooking class} {FromTime=tonight}\n- what time is my {PositionReference=first} meeting {FromDate=tomorrow}\n- what time is my {PositionReference=last} meeting\n- what time is my meeting {FromDate=today}\n- what time is my {Subject=mobile devices exam} {FromDate=tomorrow}\n- what time is my {OrderReference=next} appointment\n- what time is my {Subject=team meeting}\n- what time is oshwin's {Subject=interview}\n- what time is the {Subject=ice cream social}\n- what time is the {Subject=trade show} {FromDate=this saturday}\n- when ' s my {PositionReference=1st} appointment {FromDate=tomorrow}\n- when ' s my {PositionReference=1st} meeting {FromDate=tomorrow}\n- when ' s my {Subject=doctor ' s appointment}\n- when ' s my {OrderReference=next} appointment\n- when ' s my {OrderReference=next} {Subject=doctors appointment}\n- when ' s my {OrderReference=next} meeting\n- when am i {Subject=watching england}\n- when do i {Subject=break up} from {Location=school}\n- when do i have {Subject=exam}\n- when do i have free time {FromDate=today}\n- when do i meet with charles\n- when do i {Subject=work} {FromDate=tomorrow}\n- when is {Subject=concert} on my calendar\n- when is {Subject=lunch} with frank\n- when is my {PositionReference=1st} meeting {FromDate=tomorrow}\n- when is my appointment with willie\n- when is my {Subject=daily stand up} with ethan\n- when is my {PositionReference=fifth} {Subject=kick-off}\n- when is my meeting with kenneth\n- when is my meeting with martha and deborah\n- when is my {OrderReference=next} appointment\n- when is my {OrderReference=next} appointment with douglas\n- when is my {OrderReference=next} event\n- when is my {OrderReference=next} {Subject=hair cut} appointment\n- when is my {OrderReference=next} meeting\n- when is my {OrderReference=next} meeting with edward\n- when is my {OrderReference=next} meeting with miss kathleen\n- when is my {OrderReference=next} meeting with ms lawrence\n- when is my {OrderReference=next} trip to {Location=new york}\n- when is my {Subject=physio}\n- when is my {Subject=picnic lunch} {FromDate=today}\n- when is {Subject=ncaa basketball} {FromDate=today}\n- when is {Subject=sports day for the girls}\n- when is the {OrderReference=next} {Subject=dentist appointment}\n- when is the {Subject=social}\n- when is the {Subject=wedding} {FromDate=tomorrow}\n- when's my {Subject=haircut}\n- when's my {OrderReference=next} appointment\n- when's my {OrderReference=next} {Subject=trip}\n- which {FromDate=weekend} am i {Subject=shopping} with sarah\n\n\n## FindCalendarWhere\n- location of {FromTime=11 am} meeting\n- location of the {OrderReference=next} appointment\n- meeting at {FromTime=3 pm} {FromDate=today} locations\n- show me the place of the {Subject=work smart training}\n- show me where my {OrderReference=next} appointment is\n- what is the location of {OrderReference=next} meeting\n- what the place of the {Subject=weekly meeting}\n- where ' s my meeting\n- where ' s my {OrderReference=next} appointment\n- where ' s my {OrderReference=next} meeting\n- where am i going {FromDate=this weekend}\n- where am i going {FromTime=tonight}\n- where am i meeting austin and john\n- where am i on {FromDate=may the twenty first}\n- where am i {FromDate=tomorrow}\n- where are my meetings {FromDate=today}\n- where do i go for my meeting {FromDate=tomorrow} at {FromTime=11 am}\n- where do i go {FromDate=tomorrow}\n- where do i have to be {OrderReference=next}\n- where do i have to be {FromDate=today}\n- where do i need to be {OrderReference=next}\n- where do i need to go {FromDate=today}\n- where does my meeting take place\n- where is {Subject=dinner} with abigail liu\n- where is it\n- where is {Subject=margot lunch}\n- where is meeting {FromDate=tomorrow} at {FromTime=11 am}\n- where is meeting with shirley\n- where is my {FromTime=11 am} appointment {FromDate=tomorrow} happening\n- where is my {FromTime=11 am} meeting {FromDate=tomorrow}\n- where is my current meeting\n- where is my {Subject=dentist appointment}\n- where is my {FromTime=eleven o'clock} meeting\n- where is my {PositionReference=first} appointment {FromDate=tomorrow}\n- where is my {PositionReference=fourth} event with brandon {FromDate=friday}\n- where is my {PositionReference=fourth} event with christopher on {FromDate=thursday}\n- where is my meeting\n- where is my meeting with kayla\n- where is my {OrderReference=next} appointment\n- where is my {OrderReference=next} appointment with miss doris\n- where is my {OrderReference=next} appointment with olivia\n- where is my {OrderReference=next} {Subject=dentist appointment}\n- where is my {OrderReference=next} event\n- where is my {OrderReference=next} meeting\n- where is my {OrderReference=next} meeting with ms natalie\n- where is my {PositionReference=third} {Subject=shiproom} with tiffany\n- where is that meeting\n- where is the meeting\n- where is the meeting at {FromTime=11 am} {FromDate=tomorrow}\n- where is the {Subject=performance review meeting}\n- where is {FromDate=tomorrow} ' s {FromTime=11 am} meeting\n- where is {FromDate=tomorrow} meeting at {FromTime=11 am}\n- where is {FromDate=tomorrow} 's event\n- where's my {OrderReference=next} meeting\n\n\n## FindCalendarWho\n- {FromTime=2 pm} meeting {FromDate=tomorrow} - who else is going\n- {FromTime=2 pm} meeting with who\n- attendees who will join the {FromTime=5 pm} meeting\n- did hellen come to {FromTime=3 pm}'s meeting\n- did mark sign up to the {FromDate=tomorrow}'s meeting\n- did martin come to {FromDate=today}'s meeting\n- find attendees who will attend {FromTime=8 o ' clock} meeting\n- i want to take a look at the attendee list\n- is bruce young attending the meeting\n- is charles wong going to be at the meeting\n- is joe going to be at the {OrderReference=next} meeting\n- is victoria participating {OrderReference=next} meeting\n- let me see who will attend {Subject=party planning meeting}\n- list the attendees of the {OrderReference=next} meeting\n- list the participants for the {FromTime=2 pm} meeting {FromTime=tomorrow}\n- show me the confirmed attendees\n- show me who will attend {Subject=family gathering}\n- show me who will be at {Subject=planning meeting} {FromDate=tomorrow} at {FromTime=2 pm}\n- show meeting participants\n- who ' s in my {PositionReference=1st} meeting {FromDate=today}\n- who all will be present at the {OrderReference=next 5} meetings\n- who am i meeting at {FromTime=10 am} {FromDate=tomorrow}\n- who am i meeting for {Subject=dinner}\n- who do i have {OrderReference=next}\n- who else is going to the {FromTime=2pm} meeting {FromDate=tomorrow}\n- who else will be in {Subject=banking meeting}\n- who is attending {FromTime=2 pm} meeting {FromDate=tomorrow}\n- who is attending the meeting\n- who is attending the meeting on {FromDate=wednesday}\n- who is attending the meetings\n- who is coming the the meeting {FromDate=tomorrow} at {FromTime=2 pm}\n- who is going to attend the meeting {FromDate=tomorrow} at {FromTime=2 pm}\n- who is going to the meeting at {FromTime=2 pm} {FromDate=tomorrow}\n- who is going to {FromDate=tomorrow} ' s meeting\n- who is in my {OrderReference=next} meeting\n- who is in that meeting\n- who is in the meeting\n- who is my {PositionReference=first} meeting with {FromDate=tomorrow}\n- who is my {FromTime=morning} meeting with\n- who is on my list for the {FromTime=2 pm} meeting {FromDate=tomorrow}\n- who is participating {FromDate=tomorrow} at {FromTime=2 pm} meeting\n- who is the {FromTime=2 pm} meeting with\n- who responded to meeting request\n- who shall be joining the meeting {FromDate=tomorrow} at {FromTime=2 pm}\n- who will attend the meeting at {FromTime=4}\n- who will be at the {Subject=kids game}\n- who will be attending {Subject=picnic}\n- who will be in the {Subject=banking meeting}\n- who's going to be at those two events\n- will amber join {Subject=office meeting} {FromDate=today}\n- will amy be at {FromDate=today} ' s meeting\n- will anthony be at the meeting\n- will bobby shen be at {OrderReference=next} meeting\n- will ed be in the {Subject=finance meeting}\n- will ethan, yutian and k.j. be at the {Subject=picnic}\n- will george be in the {Subject=hr meeting} at {FromTime=1} o' clock\n- will jane be at the {FromTime=3 pm} meeting\n- will jimmy parker be attending the meeting\n- will john be at {Subject=marketing meeting}\n- will johnny be at {Subject=office meeting} {FromDate=today}\n- will nancy be at the {FromTime=morning} {Subject=briefing meeting}\n- will nicholas be attending the {Subject=management meeting}\n- will paul be going to the meeting on {FromDate=friday}\n- will roy be at our {Subject=weekly team meeting}\n- will teresa be at my {OrderReference=next} meeting\n- will thomas be in {Subject=insurance meeting} {FromDate=monday} at {FromTime=noon}\n- will timothy be coming to the meeting\n- will virginia be attending my {OrderReference=next} meeting\n\n\n## FindDuration\n- about how long will the meeting last\n- duration of {Subject=machine learning talk}\n- how long do i have for {Subject=lunch}\n- how long is that meeting going to last\n- how long is my {FromTime=4 o'clock} meeting\n- how long is my {Subject=dentist appointment}\n- how long is my {Subject=facial time}\n- how long is my {Subject=lunch} {FromDate=today}\n- how long is my meeting at {FromTime=4}\n- how long is the event\n- how long is the {Subject=movie jurassic world}\n- how long will my {Subject=dentist appointment} last\n- how much time as of now is set for the {Subject=bill payments}\n- how much time is set for the {Subject=bill payments}\n- how much time between schedule {FromDate=thursday} meetings {FromDate=next week}\n- how much time do i have for a {Subject=lunch break} {FromDate=today}\n- how much time do i have for {Subject=lunch} {FromDate=today}\n- how much time do i have to {Subject=take back the movie}\n- how much time do we have for {Subject=lunch} {FromDate=today}\n- how much time does my meeting take up\n- how much time for {Subject=lunch} {FromDate=today}\n- how much time is there for {Subject=errands} during my {Subject=lunch break}\n- how much time is open {FromDate=today}\n- how much time out on {Subject=lunch}\n- how much time will i have to {Subject=pick up groceries}\n- is it going to last long\n- is my lunch long enough for {Subject=errands}\n- minutes in {Subject=lunch break}\n- please show me how much time i have to {Subject=run errands}\n- please tell me how long i have for {Subject=lunch}\n- show me the duration of the {Subject=weekly sharing}\n- tell me how long is my {FromTime=4 oclock} meeting\n- tell me how long is {FromDate=today} ' s {Subject=lunch break}\n- tell me the duration of the {Subject=product introducation}\n- time for {Subject=lunch errands}\n- {FromDate=today} ' s {Subject=lunch} will be how long\n- total {Subject=lunch break} time {FromDate=today} please\n- what allotted time is for {Subject=hair dresser}\n\n\n## FindMeetingRoom\n- find a new meeting location\n- bing find me a conference room in the {Location=bravern} {FromTime=this afternoon}\n- book a conference room\n- book a meeting\n- book {MeetingRoom=blue meeting room}\n- book the conference room for {FromDate=thursday} at {FromTime=one} i want to meet with benjamin\n- can you reserve {MeetingRoom=room 649} right away\n- check meeting room for {FromDate=tomorrow}\n- find a free meeting room for {FromDate=next tuesday}\n- find an available meeting room from {FromTime=3} to {ToTime=5} {FromDate=tomorrow}\n- find me an empty conference room\n- help me to book a conference room\n- help me to book a meeting room from {FromTime=10 am} to {ToTime=3 pm}\n- help me to book the {MeetingRoom=room 102}\n- help me to find a meeting room\n- i need you to find a new meeting location\n- i want to meet with bruce lee so book the conference room for {FromDate=thursday} at {FromTime=one}\n- i want to meet with donna please book for {FromDate=thursday} the conference room at {FromTime=one}\n- i'm looking for a conference room\n- is this room busy at {FromTime=5 pm}\n- is this room busy {FromDate=tomorrow}\n- let's find a new meeting location\n- locate another meeting location\n- reserve {MeetingRoom=room 258}\n- reserve {MeetingRoom=room 101} now\n- reserve {MeetingRoom=room 313} right away\n- reserve the conference room for {FromTime=1 pm} {FromDate=thursday} because i need to have a meeting with amber\n- reserve the conference room for {FromTime=3pm} {FromDate=tomorrow}\n- schedule conference room with mary cooper for {FromDate=thursday} at {FromTime=one}\n- what meet rooms do i have\n- where shall we meet\n- ^is (this|the|that) (meeting|conference) room (available|booked) [(at|on|for)] [{FromDate}] [(at|on|for)] [{FromTime}]^\n\n\n## GoBack\n- back\n- back one step\n- back the {OrderReference=last} step\n- can you go back\n- go back\n- go back a step\n- go back one step\n- go back please\n- go back the {OrderReference=previous} step\n- go back to the {OrderReference=last} step\n- go back to the main menu\n- go back to the {OrderReference=previous} step\n- i need to go back\n- i want to go back\n- i would like to go back\n- please go back\n- please return back\n- return\n- return back\n- return please\n- return to {OrderReference=previous} step\n- return to the {OrderReference=previous} step\n- we should go back\n\n\n## None\n- hello world\n- how's the weather today\n- what can you do\n- what is the time now\n- what's my name\n- what's the weather today\n- what's your name\n- 1\n- 2\n- 3\n- the {PositionReference=first} one\n- the {PositionReference=second} one\n- the {PositionReference=third} one\n\n\n## Reject\n- abort that\n- i cannot\n- i cannot make it\n- i can't go there\n- i don't like that time\n- i don't like the time\n- i have other things to do at that time\n- i think not\n- i'd rather not. thanks\n- i'm afraid i can't\n- i'm busy at that time\n- i'm not available {FromDate=next monday} afternoon\n- i'm supposed to meet daisy, not katy\n- it doesn't work for me\n- it's the wrong person\n- it's the wrong room\n- it's wrong\n- maybe another time\n- negative\n- neither\n- no\n- no no\n- no thank you\n- no thanks\n- no way\n- no, i already have meeting {FromTime=3pm} {FromDate=tomorrow} afternoon\n- no, i won't\n- no, i'd like to meet her manager\n- no, please don't\n- none\n- nope\n- not at this time\n- not for me, thanks\n- not him\n- not now\n- not right, schedule it as {Subject=1x1 meeting} with yolanda\n- not that time\n- not this {MeetingRoom=conference room}, please change\n- not this location\n- not this man\n- not this room\n- not {FromTime=this saturday}\n- not this time\n- nothing\n- of course not\n- oh no\n- ohh no\n- please find another {MeetingRoom=meeting room}\n- stop\n- that's not right\n- the contact name is wrong, it's daisy\n- this is {Subject=review meeting}, not 1x1 meeting\n- this time slot doesn't work for me\n- wrong\n- wrong place\n\n\n## ShowNextCalendar\n- could you show the {OrderReference=next} one\n- go to the {OrderReference=next} one please\n- i need to go to the {OrderReference=next} one\n- move to the {OrderReference=next} one\n- show the {PositionReference=last} one\n- show the {OrderReference=next}\n- what about the {OrderReference=next} one\n- what's after that\n- what are the {OrderReference=next 3} events on my calendar\n- what is my {OrderReference=next} event\n- what is {OrderReference=next}\n- what's {OrderReference=next}\n- what's up {OrderReference=next}\n- ^[(show|display)] next [page] [please]^\n- ^i (want to|need to|would like to) (attend|join) {Subject}, [please] add it.^\n\n\n## ShowPreviousCalendar\n- bring the {OrderReference=previous} one\n- i need to check the {OrderReference=previous} appointment\n- {OrderReference=previous} one\n- {OrderReference=previous} one please\n- show me the {OrderReference=previous} meeting with tiffany\n- show {OrderReference=previous}\n- show {OrderReference=previous} one\n- show the {OrderReference=previous} one\n- what is the {OrderReference=previous}\n\n\n## TimeRemaining\n- can you show me the time remaining before my {OrderReference=next} appointment\n- check on the time to see when i {Subject=go to school and pick up mark}\n- do i have any spare time before {OrderReference=next} appointment\n- how long is it until the {FromDate=14th of march}\n- how long till {Subject=disneyland paris}\n- how long till my {OrderReference=next} appointment\n- how long till the {OrderReference=next} meeting\n- how long until {Subject=christmas}\n- how long until my {OrderReference=next} appointment\n- how long until my {OrderReference=next} meeting\n- how long until the {Subject=social}\n- how long will i wait for the {OrderReference=next} appointment\n- how many days is it until {FromDate=christmas}\n- how many days left until the {Subject=opening ceremony}\n- how many days till {FromDate=april}\n- how many days till {FromDate=christmas}\n- how many days until {FromDate=june the fifteenth}\n- how many days until {FromDate=june the fifteenth 2019}\n- how many days until {FromDate=march twenty six}\n- how many days until my {Subject=doctor ' s appointment}\n- how many days until {FromDate=thanksgiving}\n- how many days until the {FromDate=10th of december}\n- how many hours left till the {Subject=closing ceremony}\n- how many hours remaining till {OrderReference=next} appointment\n- how many hours until my {Subject=doc appointment}\n- how many minutes before my {OrderReference=next} appointment\n- how many minutes free do i have before {OrderReference=next} scheduled appointment\n- how much longer do i have before {Subject=pick up mary from school}\n- how much longer do i have until {Subject=pick up john from school}\n- how much longer until my {OrderReference=next} appointment\n- how much longer until my {OrderReference=next} meeting\n- how much time before {Subject=lunch}\n- how much time before my {OrderReference=next} appointment\n- how much time before {OrderReference=next} appointment\n- how much time do i have\n- how much time do i have before my {OrderReference=next} appointment\n- how much time do i have before my {OrderReference=next} meeting\n- how much time do i have free until my {OrderReference=next} meeting\n- how much time do i have until i have to {Subject=meet} with michael\n- how much time do i have until i {Subject=start the meeting}\n- how much time do i have until my {Subject=doc appt}\n- how much time do i have until my meeting with larry\n- how much time do i have until my {OrderReference=next} appointment\n- how much time is there before {Subject=office meeting}\n- how much time remaining till {OrderReference=next} meeting\n- how much time until my meeting with lori\n- how much time until {OrderReference=next} scheduled appointment\n- how much time until {FromTime=noon}\n- i want to know the time left for my {OrderReference=next} appointment\n- show time before {OrderReference=next} appointment\n- tell me how much free time i have before {OrderReference=next} appt\n- tell me how much time before my {OrderReference=next} meeting\n- time before my {OrderReference=next} appointment\n- time remaining\n- ^how long do i have (until|before|till) the [next] (meeting|appointment|{Subject})\n\n\n> # Entity definitions\n\n$DestinationCalendar:simple\n\n$Duration:simple\n\n$ToDate:simple\n\n$ToTime:simple\n\n$Location:simple\n\n$MeetingRoom:simple\n\n$Message:simple\n\n$MoveEarlierTimeSpan:simple\n\n$MoveLaterTimeSpan:simple\n\n$OrderReference:simple\n\n$PositionReference:simple\n\n$SlotAttribute:simple\n\n$FromDate:simple\n\n$FromTime:simple\n\n$Subject:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:datetimeV2\n\n$PREBUILT:personName\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n$RelationshipName:aunt=\n\n$RelationshipName:aunts=\n\n$RelationshipName:boss=\n\n$RelationshipName:brother=\n\n$RelationshipName:brother in law=\n\n$RelationshipName:brother-in-law=\n\n$RelationshipName:brothers=\n\n$RelationshipName:child=\n\n$RelationshipName:children=\n\n$RelationshipName:colleague=\n\n$RelationshipName:colleagues=\n\n$RelationshipName:cousin=\n\n$RelationshipName:cousins=\n\n$RelationshipName:dad=\n\n$RelationshipName:daughter=\n\n$RelationshipName:daughter in law=\n\n$RelationshipName:daughter-in-law=\n\n$RelationshipName:daughters=\n\n$RelationshipName:families=\n\n$RelationshipName:family=\n\n$RelationshipName:father=\n\n$RelationshipName:father in law=\n\n$RelationshipName:father-in-law=\n\n$RelationshipName:friend=\n\n$RelationshipName:friends=\n\n$RelationshipName:grandchild=\n\n$RelationshipName:grandchildren=\n\n$RelationshipName:granddaughter=\n\n$RelationshipName:grandfather=\n\n$RelationshipName:grandma=\n\n$RelationshipName:grandmother=\n\n$RelationshipName:grandparent=\n\n$RelationshipName:grandparents=\n\n$RelationshipName:grandson=\n\n$RelationshipName:grandsons=\n\n$RelationshipName:husband=\n\n$RelationshipName:in-laws=\n\n$RelationshipName:kids=\n\n$RelationshipName:mom=\n\n$RelationshipName:mother=\n\n$RelationshipName:mother in law=\n\n$RelationshipName:mother-in-law=\n\n$RelationshipName:neighbor=\n\n$RelationshipName:neighbors=\n\n$RelationshipName:nephew=\n\n$RelationshipName:niece=\n\n$RelationshipName:parent=\n\n$RelationshipName:parents=\n\n$RelationshipName:partner=\n\n$RelationshipName:siblings=\n\n$RelationshipName:sister=\n\n$RelationshipName:sister in law=\n\n$RelationshipName:sister-in-law=\n\n$RelationshipName:sisters=\n\n$RelationshipName:son=\n\n$RelationshipName:son in law=\n\n$RelationshipName:son-in-law=\n\n$RelationshipName:step daughter=\n\n$RelationshipName:step-daughter=\n\n$RelationshipName:stepfather=\n\n$RelationshipName:stepmother=\n\n$RelationshipName:stepsister=\n\n$RelationshipName:stepson=\n\n$RelationshipName:students=\n\n$RelationshipName:teachers=\n\n$RelationshipName:uncle=\n\n$RelationshipName:uncles=\n\n$RelationshipName:wife=\n\n$RelationshipName:manager=\n\n\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Skills/Calendar/General.lu",
    "content": "> # Intent definitions\n\n## Cancel\n- cancel\n- cancel app\n- cancel cancel\n- cancel it\n- cancel never mind\n- cancel that\n- cancel that one\n- canceled\n- cancelled\n- do nothing\n- don't do that\n- don't do that anymore\n- forget about it\n- go away\n- just cancel\n- just cancel it\n- never mind\n- never mind cancel\n- never mind cancel that\n- no cancel\n- no cancel cancel\n- no cancel it\n- no cancel that\n- no never mind\n- no no cancel\n- no no cancel it\n- nothing never mind\n- nothing please\n- oh cancel\n- please do nothing\n- quit\n- sorry, don't do it\n\n\n## Confirm\n- alright\n- come om\n- come on\n- come on baby\n- confirm\n- do it\n- fine\n- go ahead\n- go for it\n- great\n- i'm sure\n- it's fine\n- just do it\n- nice\n- no doubt\n- of course\n- oh yeah\n- oh yes\n- ok\n- ok for now\n- okay\n- perfect\n- perfect thank you\n- right\n- right yes\n- sounds good\n- sounds good thank you\n- sounds good thanks\n- sounds good to me\n- sounds great\n- sounds perfect\n- sure\n- sure does\n- sure is\n- sure thing\n- sure yes\n- thank you very much\n- thank you yes\n- that is correct\n- that is right\n- that right\n- that sounds good\n- that's all\n- that's fine\n- this is good\n- very good\n- ya\n- yeah\n- yeah baby\n- yeah bro\n- yeah buddy\n- yeah cool\n- yeah go ahead\n- yeah go for it\n- yeah good\n- yes\n- ^(yes|sure)[[,]i want (that|the ({DirectionalReference}|{ordinal}) ({number}|one))]\n\n\n## Escalate\n- can i talk to a person\n- contact support\n- contact the customer service\n- customer service\n- human service\n- i need a person\n- i need manual customer service\n- i need real human help\n- i need support\n- i want to talk to a human\n- i want to talk to a real human\n- is there any person i can talk to\n- is there any real human\n- is there any real person\n- shift\n- talk to a human\n\n\n## FinishTask\n- all finished\n- all set\n- done\n- finish\n- finished\n- finished with\n- i am done\n- i am finished\n- it finished\n- it's done\n- it's finished\n- just be\n- submit\n- submit it\n\n\n## GoBack\n- back\n- back please\n- back to\n- back to last\n- back to last step\n- get back\n- get back please\n- get back to last\n- go back\n- go back on\n- go back please\n- go back to\n- last step\n- no go back to\n- no no go back to\n- please return\n- return\n\n\n## Help\n- any help\n- can you help\n- can you help me\n- do me a favor\n- give me a favor\n- give me some help\n- help\n- how can i get it\n- how to do it\n- i don't understand\n- i need help\n- i need some assistance\n- i need some help\n- is there any help\n- open help\n- please help\n- some help\n- what should i do\n- who can help me\n\n## Logout\n- signout\n- forget me\n- sign out\n- logout\n- log out\n\n## None\n- all of them\n- i want them all\n- i want to all of them\n\n\n## ReadAloud\n- can you read it\n- can you read that\n- can you read that for me\n- can you you read page aloud\n- could you tell me what that says\n- detail aloud what that says\n- hey read that for me\n- i need to hear this page\n- i would like you to read that for me\n- make a reading of this page\n- please read\n- please read it\n- please read me the page\n- please read my latest email\n- please read this\n- please read this out loud\n- please read this page\n- please read this page aloud\n- please read this page out loud\n- please read this to me\n- read all on the screen to me\n- read aloud\n- read aloud the current text onscreen\n- read file aloud\n- read it\n- read it aloud\n- read it out loud\n- read it outloud\n- read it please\n- read it to me\n- read me this page\n- read my to list\n- read outloud\n- read page\n- read page aloud\n- read page outloud\n- read sentence out loud\n- read text\n- read text aloud\n- read that\n- read that out loud\n- read the page\n- read the page onscreen to me\n- read the page out loud\n- read the page to me\n- read the text to me\n- read the words on this page\n- read this for me please\n- read this page\n- read this page aloud\n- read this page out loud\n- read this page to me\n- read to me\n- read what is currently on the screen to me\n- speak of what is on this page\n- speak out\n- start reading this\n- state it\n- tell me about the information on the screen\n- tell me the current text on screen\n- vocalize what's on the page\n- what does the page say\n- would you please read that for me\n- would you read that out loud please\n- would you read that to me please\n\n\n## Reject\n- i don't like it\n- i don't need\n- i don't want it\n- i reject\n- negative\n- never\n- no\n- no i don't want that\n- no later\n- no leave it\n- no more no\n- no no\n- no no no\n- no no thank you\n- no not that one\n- no reject it\n- no thank you\n- no thanks\n- no way\n- no wrong\n- nope\n- not\n- not at all\n- not even close\n- not exactly\n- not now\n- not quite\n- not right now\n- not that\n- nothing much\n- oh no\n- reject\n- reject it\n\n\n## Repeat\n- again\n- could you say it again\n- i didn't hear repeat again\n- i have not heard\n- pardon\n- repeat\n- repeat please\n- repeat that\n- say again\n- say again please\n- say that again\n- sorry\n- what\n- what did you say\n- what was that again\n\n\n## SelectAny\n- any of it\n- any one is ok\n- anyone is fine\n- anything\n- choose anyone\n- choose one of it randomly\n- opt for a random one\n- opt for any of it\n- select a random choice\n- select a random one\n- select any\n- select any choice\n- select any of it\n\n\n## SelectItem\n- 1\n- 2\n- 3\n- 5\n- choose for no. four\n- choose last\n- choose last one\n- choose no. six\n- choose no.2\n- choose the {DirectionalReference=bottom left}\n- choose the first choice\n- choose the fourth one\n- choose the {DirectionalReference=upper left} choice\n- choose the {DirectionalReference=upper right} one\n- choose {DirectionalReference=top right}\n- choose {DirectionalReference=top right} one\n- four\n- i like {DirectionalReference=left} one\n- i like second\n- i like second one\n- i like the {DirectionalReference=bottom} one\n- i like the first one\n- i like the third\n- i like the third choice\n- i like the {DirectionalReference=top right} one\n- i like the {DirectionalReference=upper right}\n- i like {DirectionalReference=upper right}\n- i want {DirectionalReference=bottom}\n- i want fourth\n- i want {DirectionalReference=left}\n- i want no. 5\n- i want {DirectionalReference=right} one\n- i want the first\n- i want the fourth choice\n- i want the {DirectionalReference=left}\n- i want the {DirectionalReference=lower} choice\n- i want the {DirectionalReference=right} one\n- i want the second one\n- i want third one\n- i want to choose {DirectionalReference=bottom} one\n- i want to choose {DirectionalReference=lower right}\n- i want to choose {DirectionalReference=right}\n- i want to choose second one\n- i want to choose the first one\n- i want to choose the fourth\n- i want to choose the last choice\n- i want to choose the {DirectionalReference=left} one\n- i want to choose the {DirectionalReference=lower} choice\n- i want to choose the {DirectionalReference=right}\n- i want to choose third\n- no. 1\n- no. 2\n- no. 3\n- no.4\n- number two\n- one\n- opt for first one\n- opt for last\n- opt for {DirectionalReference=left}\n- opt for number 7\n- opt for {DirectionalReference=right} one\n- opt for the last one\n- opt for the {DirectionalReference=left} one\n- opt for the {DirectionalReference=lower} choice\n- opt for the {DirectionalReference=right}\n- opt for the second\n- opt for the second choice\n- select five\n- select fourth one\n- select {DirectionalReference=lower} one\n- select no.5\n- select the {DirectionalReference=bottom} choice\n- select the first\n- select the last choice\n- select the {DirectionalReference=lower} one\n- select the {DirectionalReference=right} one\n- select the third one\n- select the {DirectionalReference=upper right}\n- select third\n- select {DirectionalReference=upper}\n- three\n- two\n- what about the last\n- what about the third one\n\n\n## SelectNone\n- i don't want to choose any one\n- i don't want to select any one\n- i want neither of them\n- i want none of them\n- neither\n- neither of those\n- neither one\n- neither one of them\n- neither thank you\n- none\n- none none\n- none none of them\n- none of them\n- none of them thank you\n- none of these\n- none of those\n- they look bad, can you give me other choices\n\n\n## ShowNext\n- and after that\n- display more\n- displays more\n- give me more\n- go forward\n- go to the next one\n- go to the next three items\n- i need to go to the next one\n- i want more\n- more\n- move to the next one\n- next\n- reveal more\n- show me the next\n- show more\n- show the next 3\n- show the next 4 items\n- show the next one\n- show the next two options\n- tell me more\n- tell more\n- what about next one\n- what after that\n- what's after that\n- what's more\n- what's next\n- what's the next 2\n- what's up next\n\n\n## ShowPrevious\n- back to the last one\n- bring the previous one\n- display previously\n- get back to the last one\n- go back to last one\n- go back to previous\n- go back to the last one\n- go previously\n- go to the previous\n- go to the previous one\n- previous one\n- previous one please\n- return to the previous one\n- reveal previous\n- reveal previously\n- show earlier\n- show me the previous one\n- show previous\n- show the previous one\n- the last five\n- the last two\n- what before that\n- what is the previous\n- what's before that\n\n\n## StartOver\n- back to the beginning\n- clear and start again\n- could you start it over\n- please begin again\n- reopen a new page\n- restart\n- restart it\n- start again\n- start it over\n- start over\n- start over it\n- turn over a new leaf\n\n\n## Stop\n- baby just be quiet\n- be quiet\n- be quiet now\n- come on stop\n- dismiss\n- end\n- end it\n- exit exit\n- exit stop\n- god shut up\n- hey stop\n- i don't want to see you anymore\n- i love you to stop talking\n- i mean stop listening\n- i said stop\n- just be quiet\n- my god shut up\n- never mind stop\n- no be quiet\n- no be quiet now\n- no no no no stop talking\n- no shut up\n- no stop\n- nobody cares stop talking\n- nowhere just be quiet\n- oh my god shut up\n- ok stop stop\n- quiet\n- quiet now\n- shut up\n- shut up be quiet\n- shut up quiet\n- shut your mouth\n- silence\n- stop please\n- stop talking\n- turn off\n- turn off stop\n\n\n> # Entity definitions\n\n$DirectionalReference:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Skills/Email/Email.lu",
    "content": "﻿> # Intent definitions\n\n## AddFlag\n- add a flag\n- add a flag please\n- add a flag to the {OrderReference=last} email\n- add a flag to this email\n- add flag\n- add flag on it\n- add flag to it\n- add flag to the email {SenderName=john} just sent to me\n- add {Category=flag} to this email\n- add flag to this message\n- flag\n- flag it\n- flag on\n- flag the current email\n- flag the email\n- flag the email from {SenderName=davis}\n- flag this email\n- flag this email as {Category=important} for me\n- i want to add a flag\n- i want to add a flag on this email\n- make it flagged\n- mark as flag\n- mark the email {Category=flagged}\n- put a flag\n- put a flag on the new email\n- the email from {SenderName=thomas} should be flagged\n- the email to {ContactName=ruth} needs to be flagged\n- this email need to be flagged\n- this email needs to be flagged\n- this email should be flagged\n- turn flag on\n\n\n## AddMore\n- add a {Attachment=file} to the email\n- add a {Attachment=picture}\n- add a subject\n- add another line to the message\n- add {Message=did you enjoy the entire program}\n- add {Attachment=file} to email\n- add more\n- add more and change the message\n- add more details to it\n- add more {Message=don't forget to bring beer}\n- add more message\n- add more please\n- add more text\n- add more text please\n- add more to email\n- add more to email body\n- add more to it\n- add more to message\n- add more to {ContactName=roy} 's email\n- add more to text\n- add more to the email\n- add more to the {OrderReference=last} email\n- add more to the message\n- add {Attachment=photo}\n- add some more\n- add something\n- add to body of email\n- add, by the way, what's the plan of next step\n- add: {Message=call me tonight after work}\n- append an {Attachment=attachment} to this email\n- attach {Attachment=file}\n- can i add more to the email\n- can i add more to the message\n- edit email so i can type an additional message\n- i am not done yet. i need to add some more details\n- i forgot to add an important part to that email to {ContactName=james} . please set it up to edit\n- i need to add additional lines\n- i need to add further contents\n- i need to add more message\n- i need to add more text\n- i need to add more to the email\n- i need to add more to the email message i am sending to {ContactName=vincent}\n- i need to add something else to my email to {ContactName=cheryl}\n- i need to add something else to that email to {ContactName=donna} before it is sent\n- i want to add more the email\n- i wish to add more to the message\n- i would like to add more to the email\n- i would like to add more to the email message\n- i would like to open a new line\n- i'd like to add a bit more to the email.\n- i'd like to add a bit more to the message\n- i'd like to add more to the email\n- insert more lines for me please\n- insert more text in my email\n- is it ok if i add more to the email?\n- it isn't complete, need more contents\n- more text\n- need to add information to the {OrderReference=previous} email\n- ok, i need to add a few things to that\n- please add {Message=it was terrible}\n- please add more\n- please add, {Message=please let me know what i can bring. i'd be happy to make a side dish or dessert}\n- put some additional lines to this message\n- wait, i need to write more\n- write more\n\n\n## CancelMessages\n- abort deletion\n- can you cancel it\n- cancel email\n- cancel email to {ContactName=natalie}\n- cancel message\n- cancel my email to {ContactName=jane}\n- cancel searching the messages\n- cancel the email\n- cancel the email sent to {ContactName=alex}\n- cancel the email to my {RelationshipName=sister}\n- cancel the mail\n- cancel the message\n- cancel this email\n- cancel this message\n- cancel this sending process\n- don ' t read\n- don ' t read it\n- don 't send the email\n- don't email\n- don't email to her\n- don't read the email\n- don't read the message\n- don't send\n- don't send it\n- don't send out\n- don't send that email\n- don't send this email\n- don't show me\n- exit\n- forget about the email\n- i want you to cancel the email\n- neither of them\n- never mind cancel the mail\n- never mind cancel the message\n- never mind, forget about the mail\n- nevermind cancel\n- no cancel it, i don't want to send the mail\n- no don't send\n- no don't send it\n- no just cancel the email\n- no, i don't want to send this message\n- no, no, cancel the reading\n- okay cancel sending the mail\n- quit the sending\n- stop message\n- stop reading\n- ^cancel [sending] [(my|the)] (email|mail) to {ContactName}\n\n\n## CheckMessages\n- any {Category=new} email\n- any {Category=new} email available\n- any {Category=new} email {Time=now}\n- any {Category=new} message {Time=now}\n- check email\n- check email please\n- check my email please\n- check my emails\n- check my {Line=gmail}\n- check my inbox\n- check my mail box\n- check my message\n- check {Line=outlook} please\n- check up email\n- check up messages\n- could you please check my emails\n- could you please check my inbox\n- could you please check my messages\n- do i get new email\n- do i have any {Category=new} mail\n- do i have {Category=new} email\n- do i have {Category=new} email {Time=now}\n- do i have {Category=new} message\n- do i receive {Category=new} email\n- do i receive {Category=new} mail in {Line=outlook}?\n- do i receive {Category=new} message\n- does anyone send email to me just then\n- does anyone send message to me {Time=just then}\n- does my {Line=outlook} have {Category=new} email\n- i want to check my emails\n- i want to check my inbox\n- i'd like to check my inbox\n- is there new email\n- please check my emails\n- please check my inbox\n- please check my {Line=outlook}\n- show {OrderReference=latest} emails\n- show my emails\n- show my {Category=unread} mails\n- show the {Category=important} emails in my inbox\n- whether i get {Category=new} email\n- whether i get {Category=new} message\n- whether i have {Category=new} email\n- whether i have {Category=new} message\n- whether i receive new email\n- show [(my|the)] [(unread|important|{Category})] (email|mail|emails)^\n\n\n## ConfirmMessages\n- \"okay, send it\"\n- \"sure, go ahead\"\n- \"yes, you can\"\n- alright, just send the message\n- correct, please send it.\n- i confirm that i want to send this email\n- just do it\n- no problem, go ahead send the mail\n- of course, just delete the mail\n- ok send the mail to {ContactName=may}\n- ok, good to me, send it please\n- ok, good, just send it\n- okay\n- okay send it\n- okay, send it now\n- perfect thank you\n- right, send it please\n- yeah right, send to {ContactName=alex}\n- yes it's right\n- yes that's right\n- yes, send it\n\n\n## Delete\n- can you help me delete it\n- clear my inbox\n- delete all emails from {SenderName=tom}\n- delete all emails received {Time=tonight}\n- delete the email from my {Line=hotmail} account\n- delete the email sent from {SenderName=mary jane}\n- delete the {PositionReference=first} email for me\n- delete the {OrderReference=last} one\n- delete the {OrderReference=previous} 4 emails\n- delete the {Category=red} ones\n- delete the second mail\n- delete the {PositionReference=second} one\n- delete the {Category=unread} emails\n- delete this email\n- delete this message permanently\n- delete what i just wrote\n- empty the email inbox\n- put it in the recycle bin\n- put the email in the recycle bin\n- put the email to trash bin\n- put the emails from this file folder to trash bin\n- remove emails that are duplicate\n- remove emails with {Category=red} flags\n- remove it from my inbox\n- remove the email from {SenderName=mary}\n- remove the emails received {Date=yesterday}\n- ^(delete|remove) [the] [{OrderReference}] (email|emails|mails) [from {SenderName}]\n\n\n## Forward\n- could you forward this message to {ContactName=ronald} and {ContactName=roy}\n- could you please forward this email to my {RelationshipName=sister}\n- forward all {Attachment=files} from {SenderName=sally} to {ContactName=austin}\n- forward by saying {Message=if you interest} to {ContactName=rebecca}\n- forward email\n- forward email to {RelationshipName=girlfriend}\n- forward emails to {ContactName=gabriel}\n- forward message to {RelationshipName=girlfriend}\n- forward the email from {SenderName=john smith} to {ContactName=michelle} by saying {Message=fyi}\n- forward the email from {SenderName=melissa} to {ContactName=peter}\n- forward the email to {RelationshipName=dad}\n- forward the {OrderReference=last} email to {ContactName=susan}\n- forward this email\n- forward this email to {ContactName=eugene} by typing {Message=what do you think}\n- forward this email to {ContactName=gary brown} please\n- forward this email to {ContactName=joseph}\n- forward this email to partone dot parttwo at gmail dot com\n- forward this email to {ContactName=patricia}\n- forward to {ContactName=alan} {Time=tonight}\n- forward to {ContactName=brian potter} {Time=tonight}\n- forward to {ContactName=deborah} with a message saying that {Message=i don't want that}\n- forward to {ContactName=dorothy} by typing {Message=i agree with it}\n- forward to {RelationshipName=mom}\n- forward to my {RelationshipName=boss} and attach the {Attachment=schedule file}\n- forward to partoneparttwo@gmail.com {Date=next monday}\n- forward to {ContactName=thomas} please\n- forward to {RelationshipName=wife} by saying {Message=i love you}\n- please forward this email to {ContactName=albert} by typing {Message=everything goes fine}\n- please forward this email to partoneparttwo@163.com\n- please forward this email to partoneparttwo@outlook.com\n- please forward this message\n- please forward to {ContactName=benjamin}\n\n\n## None\n- 1\n- 2\n- 3\n- the {PositionReference=first} one\n- the {PositionReference=second} one\n- the {PositionReference=third} one\n\n\n## QueryLastText\n- can you tell me the {OrderReference=last} email i received\n- come to the {OrderReference=last}\n- go to the {OrderReference=last} one\n- i want to see the {OrderReference=last} email\n- {OrderReference=last} email\n- open the {OrderReference=last} email\n- open the {OrderReference=lastest} email i got\n- please tell me who emailed me {OrderReference=last}\n- show me the {OrderReference=lastest} email\n- show me the {OrderReference=newest} email\n- show the {OrderReference=last} email\n- the {OrderReference=last} email\n- what did {RelationshipName=mom} just say\n- what {ContactName=eric watson} just said\n- what {SenderName=harry} {OrderReference=last} email said\n- what {ContactName=henry} just said\n- what is the {OrderReference=last} email i received {Date=today}\n- what is the {OrderReference=lastest} email i received from {FromRelationshipName=dad}\n- what was the {OrderReference=last} email\n- what was the {OrderReference=last} email i got from {FromRelationshipName=dad}\n- what was the {OrderReference=last} email i got from {SenderName=steve edwards}\n- who email me {Time=just now}\n- who emailed me\n- who emailed me just now\n- who emailed me {OrderReference=last}\n- who recently emailed me\n- who sent me the email lastly {Date=yesterday}\n- who sent me the mail just now\n- who texted me\n- who texted me {Time=just now}\n- whose email just then ?\n- whose email {Time=now} ?\n\n\n## ReadAloud\n- can you read my emails\n- can you read my {OrderReference=last} email\n- could you read out the email on {EmailSubject=how to use the new tool}?\n- please read my {OrderReference=last} email\n- read aloud my {Category=new} email\n- read aloud the {EmailSubject=christmas party} email\n- read {SenderName=darren}'s mail on {EmailSubject=the movie}\n- read email\n- read email from {SenderName=dawn}\n- read email from {SenderName=kat}\n- read email from {FromRelationshipName=mum}\n- read email to me\n- read emails\n- read emails from {SenderName=clay}\n- read {PositionReference=first} email in link box\n- read {PositionReference=first} email in the linked inbox\n- read {Line=google} mail\n- read it\n- read {OrderReference=last} email received\n- read {OrderReference=last} incoming emails\n- read {OrderReference=last} mail\n- read {OrderReference=latest} email\n- read {SenderName=mary grace white} email\n- read me {SenderName=dylan}'s email sent on {Date=yesterday}\n- read me {SenderName=jessica}'s email on {EmailSubject=dress code for the party}\n- read me my {OrderReference=last} {Line=hotmail} email\n- read me my {OrderReference=latest} emails\n- read me the email\n- read me the email on {EmailSubject=apple}\n- read me the email on {EmailSubject=thanksgiving day}\n- read me the email sent on {Date=thanksgiving day}\n- read me the email titled {EmailSubject=happy new year}\n- read me the emails from {SenderName=agatha}\n- read me the {OrderReference=last} email {SenderName=claude} sent\n- read me the {OrderReference=last} emails of the {Time=five minutes}\n- read me the {OrderReference=newest} email\n- read me the {OrderReference=recent} email titled {EmailSubject=abcd} from {SenderName=jessica}\n- read most {OrderReference=recent} email\n- read my email from {SenderName=baby}\n- read my email from {SenderName=hubby}\n- read my email from {SenderName=tyler swift}\n- read my email messages\n- read my email please\n- read my email to me\n- read my emails\n- read my emails from {SenderName=patty}\n- read my inbox\n- read my {OrderReference=last} email\n- read my {OrderReference=last} email out to me\n- read my {OrderReference=most recent} email\n- read my {Category=new} email\n- read my {Category=new} emails\n- read my notification\n- read my {Line=outlook} email\n- read my {OrderReference=recent} email\n- read my {OrderReference=recent} email message please\n- read my {OrderReference=recent} email messages\n- read my {OrderReference=recent} email to me\n- read my {PositionReference=second} email\n- read {Category=new} email\n- read {Category=new} email from {SenderName=david ma}\n- read {Category=new} message\n- read out {SenderName=darren}'s mail\n- read out the email from {SenderName=liu} about {EmailSubject=transfer}\n- read out {SenderName=xu}'s email about {EmailSubject=apple's news}\n- read please\n- read {OrderReference=recent} email\n- read the email\n- read the email on {EmailSubject=auto repair}\n- read the {PositionReference=first} email\n- read the {PositionReference=first} email in {Line=hotmail}\n- read the {OrderReference=last} email\n- read the {OrderReference=last} email message\n- read the {OrderReference=latest} email from {FromRelationshipName=mom}\n- read the {OrderReference=latest} email from {SenderName=steve lip}\n- read the {OrderReference=latest} email i sent\n- read {Date=todays} mail\n- read {Date=today}'s mail\n- read {Category=unread} email\n- read {Category=unread} message\n- ^read [(me|out)] [the] (email|emails) from {SenderName} [(about|on) {EmailSubject}]^\n- ^read [me] [the] (email|mail|emails) (on|about|titled) {EmailSubject}\n- ^read [me] [the] (email|mail|emails) (on|about|titled) {EmailSubject} [sent] from {SenderName}^\n- ^read [me] the (email|mail) (titled|about|on) [the] {EmailSubject}^\n\n\n## Reply\n- create a response to the email by saying {Message=pls send me the picture again}\n- email back\n- email back {Message=i will call you back}\n- how to reply to an email\n- make a response with {Message=thank you very much}\n- reply\n- reply by email {Message=thank you very much best regards jun}\n- reply by saying {Message=i love you}\n- reply by saying {Message=yes}\n- reply by typing {Message=hello}\n- reply {Message=required} to an email\n- reply that {Message=i am busy}\n- reply to {ContactName=edward}\n- reply to email {Message=i am busy now}\n- reply to my {OrderReference=last} email\n- reply to {ContactName=susan}\n- reply to the email\n- reply to the {PositionReference=first} one\n- reply {Message=we'll see you later}\n- reply with {Message=hello}\n- reply {Message=yee ha}\n- reply {ContactName=yee} {Message=hello}\n- reply {Message=yes boss.}\n- respond {Message=i ' m sick i can ' t do it}\n- respond to {ContactName=lore hound}\n- respond to {ContactName=nathan}\n- respond to the email by saying {Message=i am busy today}\n- return {ContactName=barbara} on {Line=mobile}\n- return {ContactName=siberian huskies} {Line=mobile}\n- send email back\n- send the response with {Message=i've already know}\n- ^reply [back] with [the] (title|subject) {EmailSubject}\n- ^reply [back] [the] message [that] {Message}^\n- ^reply [back] [with] [the] [message] [that] \"{Message.Any}\"\n\n\n## SearchMessages\n- can you search my emails\n- detect emails from {SenderName=betty}\n- detect the email containing keyword {SearchTexts=beauty}\n- detect the email from {SenderName=lisa}\n- did i get any email from {SenderName=tom}\n- did i get emails from {SenderName=tom}\n- did i get the email containing keyword {SearchTexts=lunch}\n- email sent from {SenderName=lisa}\n- emails contains {SearchTexts=bank}\n- enumerate the emails with {SearchTexts=algroithm}\n- find an email about {EmailSubject=new year's planning}\n- find an email from abc123@outlook.com\n- find an email from {SenderName=angela}\n- find an email from {SenderName=jay} that contains {SearchTexts=halloween}\n- find an email on the {EmailSubject=dinner reservation}\n- find email titled {EmailSubject=new design}\n- find email with title {EmailSubject=production tools}\n- find emails from {FromRelationshipName=mom}\n- find emails that contain {SearchTexts=malta}\n- find emails with {SearchTexts=resume}\n- find mails titled {EmailSubject=recommended courses}\n- list the emails contain {SearchTexts=funny picture}\n- looking for an email with {SearchTexts=hello}\n- query emails with {SearchTexts=bill}\n- search an email with subject {EmailSubject=background screening}\n- search {SearchTexts=bla bla} in my emails\n- search email contain {SearchTexts=outlook}\n- search email with key words {SearchTexts=lunch}\n- search emails about {EmailSubject=boating}\n- search emails contain {SearchTexts=work items}\n- search emails contains {SearchTexts=coupons}\n- search emails from {SenderName=mike}\n- search {SenderName=jensen}'s emails\n- search keywords {SearchTexts=keywordone keywordtwo} in my emails\n- search {SearchTexts=keywordsone keywordstwo} from inbox\n- search my emails\n- search text with words {SearchTexts=lunch together}\n- search the email with keywords {SearchTexts=hello}\n- search the emails contains {SearchTexts=microsoft}\n- search the emails contains {SearchTexts=money}\n- show emails contain words \"{SearchTexts=future plan}\"\n- show emails with \"{SearchTexts=credit card}\"\n- show me emails from {SenderName=clara chan}\n- show me emails from {FromRelationshipName=girlfriend}\n- show me the email about {EmailSubject=spring festival}\n- show me the email from {SenderName=tom} and filtering with word {SearchTexts=lunch}\n- show me the email sent from {FromRelationshipName=mom}\n- tell me the email from {SenderName=lily wong}\n- tell me the email with subject {EmailSubject=weekly report}\n- ^(tell|find|show) [me] [(an|the)] email (with the title|with title|titled) {EmailSubject}\n- ^(tell|find|show) [me] [(an|the)] email (with the title|with title|titled) \"{EmailSubject.Any}\"\n- ^(search|find|show) [me] [(an|the)] (email|emails|mail) [(containing|filtering)] [with] [the] [(texts|text|word)] \"{SearchTexts.Any}\"\n- ^(show|search|find) [me] [(an|the)] [{Category}] email[s] (on|about|titled) {EmailSubject} [sent] [(by|from) {SenderName}]^\n\n\n## SendEmail\n- compose new email about {EmailSubject=spanish homework}\n- create new mail titled {EmailSubject=urgent meeting information} to {ContactName=jonathan}\n- email her the message \"fine, ok\"\n- email my {RelationshipName=brother}\n- email my {Attachment=presentation}\n- email the {Attachment=file} to {ContactName=henry mathew}\n- email to {ContactName=amy cooper} about {Message=haha saying hello}\n- email to {ContactName=cynthia} and {ContactName=mike}, {Message=that dinner {OrderReference=last} week was splendid}.\n- email to {ContactName=harry potter} and {ContactName=hermione granger}\n- email to {ContactName=lawrence} about {EmailSubject=opening issue}\n- email to {ContactName=mike waters} : {Message=mike, that dinner last week was splendid.}\n- email to partoneparttwo@gmail.com\n- email to {ContactName=tom white} about {Message=that flower saying beautiful}\n- i need to send an email about the {EmailSubject=words to a song}\n- make a new email about {EmailSubject=weather forecast}\n- mark email for {Category=follow up} and send to {ContactName=arthur}\n- new email about {EmailSubject=really good talk} to {ContactName=michelle}\n- new email about {EmailSubject=writing documents}\n- new email to {ContactName=kimberly} about {EmailSubject=wingman}\n- send a email to {ContactName=leehom wong} about the {EmailSubject=piano concert} saying {Message=it's wonderful}\n- send a mail to {ContactName=daniel}\n- send a new email about {EmailSubject=facebook}\n- send a new email about the {EmailSubject=hockey tournament} to {ContactName=marie jane}, {ContactName=joseph} , and {ContactName=john}\n- send a new email about the {EmailSubject=problem solving} to {ContactName=andrea}, {ContactName=angela}, and {ContactName=ron}\n- send a new email to {ContactName=larry} with a {Attachment=file} attached\n- send a new email to {ContactName=nicholas} and {ContactName=jesse} about {EmailSubject=coupons}\n- send a new email to partonepartwopartthree@yahoo.com\n- send a new {Category=high importance} email to {ContactName=jordan}\n- send a {Category=read receipt} email to {ContactName=samuel}\n- send {ContactName=alexander} a {Category=red bang} email\n- send an email\n- send an email about {EmailSubject=swim team practice}\n- send an email about {EmailSubject=test status} to {ContactName=mark}\n- send an email about the {EmailSubject=window that is broken}\n- send an email for me\n- send an email marked {Category=follow up} to {ContactName=jerry}\n- send an email marked for {Category=follow up} to {ContactName=christian}\n- send an email marked with a {Category=bang} to {ContactName=amy}\n- send an email to {ContactName=a.j.ron} marked as {Category=important}\n- send an email to {ContactName=christopher carpenter} about the {EmailSubject=hiking trip}\n- send an email to {ContactName=harold} and {ContactName=bob kappus} about {Message=team lunch saying same team lunch this tuesday}\n- send an email to {ContactName=harry potter}\n- send an email to {ContactName=jacqueline} and {ContactName=tianyu} about the {EmailSubject=test result}\n- send an email to {ContactName=jimmy klein} saying {Message=this is the message about weekend plans}\n- send an email to {ContactName=larry} , {ContactName=joseph} and {ContactName=billy larkson}\n- send an email to {ContactName=lily roth} and abc123@microsoft.com\n- send an email to {ContactName=lu} , {ContactName=yue} and {ContactName=qiong} about {EmailSubject=funding}\n- send an email to {RelationshipName=mom}\n- send an email to my {RelationshipName=brother}\n- send an email to {ContactName=nathan} with a {Category=red bang}\n- send an email to partone@gmail.com\n- send an email to partone_parttwo@microsoft.com\n- send an email to {ContactName=sean} about {EmailSubject=weekend plans}\n- send an email to {ContactName=zachary} about {EmailSubject=we can plan things let's go hiking}\n- send an email {Date=today}\n- send an email with {Category=read receipt} to {ContactName=peter}\n- send an {Category=important} email to {ContactName=olivia}\n- send an {Category=urgent} email\n- send an {Category=urgent} email from my {Line=work account} to {ContactName=christian}\n- send an {Category=urgent} email from my {Line=work} email to {ContactName=jack}\n- send and email about {EmailSubject=swim team practice}\n- send {ContactName=angela} an email marked as {Category=high priority}\n- send {ContactName=billy} an email with a {Category=red bang}\n- send email about {EmailSubject=homework plan} to {ContactName=raymond} and {ContactName=philip}\n- send email marked {Category=priority} to {ContactName=yun-sim} and {ContactName=yi}\n- send email to {ContactName=a} and {ContactName=tian}\n- send email to {ContactName=hannah} saying {Message=test}\n- send email to {ContactName=heather} about {EmailSubject=car}\n- send email to {ContactName=jiayi} {Date=today}\n- send email to {ContactName=kai xu}, {ContactName=mingming} and my {RelationshipName=mother}\n- send email to {ContactName=louis} and mark it {Category=important}\n- send email to partone.parttwo@outlook.com\n- send {Category=important} email to {ContactName=evelyn} and {ContactName=gary}\n- send {ContactName=jacqueline} an email with {Category=low priority}\n- send {Attachment=large files} through email\n- send {ContactName=lori} a new {Category=flagged} email\n- send mail to {ContactName=dorothy}\n- send my {Attachment=housekeeping doc} to {ContactName=jeffrey}\n- send my {Attachment=payment visio diagram} to {ContactName=ronald}\n- send new email to {ContactName=christian} and mark it {Category=high importance}\n- send the email\n- send the email {Time=now}\n- send this {Attachment=document} to an email\n- send {ContactName=thomas} an email\n- set an email {Date=today}\n- start a new email about {EmailSubject=marriage counselor appointments}\n- start a new email from {SenderName=tracy} saying {Message=here is my resume}\n- start a new email saying {Message=lets go to the park}\n- start a new email to {ContactName=aaron} about {EmailSubject=sleeping over tonight}\n- start an email to {ContactName=jason} about {EmailSubject=speaking up}\n- start new email about {EmailSubject=taco blog} to {ContactName=nicole} and {ContactName=emily}\n- start new email to {RelationshipName=friends} about the {EmailSubject=club}\n- start up a new email to {ContactName=michelle} about {EmailSubject=watching baseball}\n- the new email is {Category=high priority} that is being sent to {ContactName=jacob}\n- will you send a marked {Category=non urgent} email to {ContactName=james}\n- write an email about the {EmailSubject=fundraiser}\n- write an email which title is {EmailSubject=hello} and context is {Message=let's have meeting together}\n- write an {Category=urgent} email to {ContactName=bobby}\n- write email\n- write email to {RelationshipName=mom} subject is {EmailSubject=babysit}\n- ^(write|send|start) [(a|an|the)] [new] email to {ContactName}^\n- ^[(send|write)] [(the|a)] [new] [(email|mail)] [to {ContactName}] [with message \"{Message.Any}\"]\n- ^(write|send|start) [(a|an|the)] [new] email to {ContactName} (about|on|with) [the subject] [that] {EmailSubject}^\n\n\n## ShowNext\n- are there any {Category=unread} messages? show {OrderReference=next}\n- go forward to {OrderReference=next} mails\n- go on, show me more mails\n- go to {OrderReference=next} mail\n- go to the {OrderReference=next} page\n- move forward\n- move on {OrderReference=next} mail by jason\n- move on to {OrderReference=next} mails\n- {OrderReference=next} email\n- {OrderReference=next} {Category=unread} email\n- {OrderReference=next} {Category=unread} one\n- show me {OrderReference=next} from {SenderName=mary}\n- show me the {OrderReference=next}\n- show me the {OrderReference=next} five mails\n- show {OrderReference=next} email\n- show {OrderReference=next} {Category=unread}\n- show the {OrderReference=next} email from my {FromRelationshipName=boss}\n- show the {OrderReference=next} emails by wong\n- show the {OrderReference=next} messages\n- the {OrderReference=next} email\n- the {OrderReference=next} {Category=important} message\n- ^(show|give|tell) [me] [the] next (email|message|mail)^\n\n\n## ShowPrevious\n- back to the {OrderReference=last} one from {SenderName=apple}\n- bring the {OrderReference=previous} one, i want to read it again\n- go to {OrderReference=previous} mails\n- move back to {OrderReference=last} mails\n- {OrderReference=previous} email\n- {OrderReference=previous} one please\n- show me {OrderReference=previous} email from {SenderName=jack}\n- show me the {OrderReference=last} three mails\n- show me the one {OrderReference=before}\n- show me the {OrderReference=previous} email\n- show {OrderReference=previous} in {Category=red} category\n- show {OrderReference=previous} one in inbox\n- show the {OrderReference=previous} email from my {FromRelationshipName=mentor}\n- show the {OrderReference=previous} one\n- the {OrderReference=previous} email\n- what is the {OrderReference=previous} email\n- ^(show|give|tell) [me] [the] previous (email|message|mail)^\n\n\n> # Entity definitions\n\n$Attachment:simple\n\n$Category:simple\n\n$ContactName:simple\n\n$Date:simple\n\n$EmailSubject:simple\n\n$FromRelationshipName:simple\n\n$Line:simple\n\n$Message:simple\n\n$OrderReference:simple\n\n$PositionReference:simple\n\n$RelationshipName:simple\n\n$SearchTexts:simple\n\n$SenderName:simple\n\n$Time:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:email\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Skills/Email/General.lu",
    "content": "> # Intent definitions\n\n## Cancel\n- cancel\n- cancel app\n- cancel cancel\n- cancel it\n- cancel never mind\n- cancel that\n- cancel that one\n- canceled\n- cancelled\n- do nothing\n- don't do that\n- don't do that anymore\n- forget about it\n- go away\n- just cancel\n- just cancel it\n- never mind\n- never mind cancel\n- never mind cancel that\n- no cancel\n- no cancel cancel\n- no cancel it\n- no cancel that\n- no never mind\n- no no cancel\n- no no cancel it\n- nothing never mind\n- nothing please\n- oh cancel\n- please do nothing\n- quit\n- sorry, don't do it\n\n\n## Confirm\n- alright\n- come om\n- come on\n- come on baby\n- confirm\n- do it\n- fine\n- go ahead\n- go for it\n- great\n- i'm sure\n- it's fine\n- just do it\n- nice\n- no doubt\n- of course\n- oh yeah\n- oh yes\n- ok\n- ok for now\n- okay\n- perfect\n- perfect thank you\n- right\n- right yes\n- sounds good\n- sounds good thank you\n- sounds good thanks\n- sounds good to me\n- sounds great\n- sounds perfect\n- sure\n- sure does\n- sure is\n- sure thing\n- sure yes\n- thank you very much\n- thank you yes\n- that is correct\n- that is right\n- that right\n- that sounds good\n- that's all\n- that's fine\n- this is good\n- very good\n- ya\n- yeah\n- yeah baby\n- yeah bro\n- yeah buddy\n- yeah cool\n- yeah go ahead\n- yeah go for it\n- yeah good\n- yes\n- ^(yes|sure)[[,]i want (that|the ({DirectionalReference}|{ordinal}) ({number}|one))]\n\n\n## Escalate\n- can i talk to a person\n- contact support\n- contact the customer service\n- customer service\n- human service\n- i need a person\n- i need manual customer service\n- i need real human help\n- i need support\n- i want to talk to a human\n- i want to talk to a real human\n- is there any person i can talk to\n- is there any real human\n- is there any real person\n- shift\n- talk to a human\n\n\n## FinishTask\n- all finished\n- all set\n- done\n- finish\n- finished\n- finished with\n- i am done\n- i am finished\n- it finished\n- it's done\n- it's finished\n- just be\n- submit\n- submit it\n\n\n## GoBack\n- back\n- back please\n- back to\n- back to last\n- back to last step\n- get back\n- get back please\n- get back to last\n- go back\n- go back on\n- go back please\n- go back to\n- last step\n- no go back to\n- no no go back to\n- please return\n- return\n\n\n## Help\n- any help\n- can you help\n- can you help me\n- do me a favor\n- give me a favor\n- give me some help\n- help\n- how can i get it\n- how to do it\n- i don't understand\n- i need help\n- i need some assistance\n- i need some help\n- is there any help\n- open help\n- please help\n- some help\n- what should i do\n- who can help me\n\n## Logout\n- signout\n- forget me\n- sign out\n- logout\n- log out\n\n## None\n- all of them\n- i want them all\n- i want to all of them\n\n\n## ReadAloud\n- can you read it\n- can you read that\n- can you read that for me\n- can you you read page aloud\n- could you tell me what that says\n- detail aloud what that says\n- hey read that for me\n- i need to hear this page\n- i would like you to read that for me\n- make a reading of this page\n- please read\n- please read it\n- please read me the page\n- please read my latest email\n- please read this\n- please read this out loud\n- please read this page\n- please read this page aloud\n- please read this page out loud\n- please read this to me\n- read all on the screen to me\n- read aloud\n- read aloud the current text onscreen\n- read file aloud\n- read it\n- read it aloud\n- read it out loud\n- read it outloud\n- read it please\n- read it to me\n- read me this page\n- read my to list\n- read outloud\n- read page\n- read page aloud\n- read page outloud\n- read sentence out loud\n- read text\n- read text aloud\n- read that\n- read that out loud\n- read the page\n- read the page onscreen to me\n- read the page out loud\n- read the page to me\n- read the text to me\n- read the words on this page\n- read this for me please\n- read this page\n- read this page aloud\n- read this page out loud\n- read this page to me\n- read to me\n- read what is currently on the screen to me\n- speak of what is on this page\n- speak out\n- start reading this\n- state it\n- tell me about the information on the screen\n- tell me the current text on screen\n- vocalize what's on the page\n- what does the page say\n- would you please read that for me\n- would you read that out loud please\n- would you read that to me please\n\n\n## Reject\n- i don't like it\n- i don't need\n- i don't want it\n- i reject\n- negative\n- never\n- no\n- no i don't want that\n- no later\n- no leave it\n- no more no\n- no no\n- no no no\n- no no thank you\n- no not that one\n- no reject it\n- no thank you\n- no thanks\n- no way\n- no wrong\n- nope\n- not\n- not at all\n- not even close\n- not exactly\n- not now\n- not quite\n- not right now\n- not that\n- nothing much\n- oh no\n- reject\n- reject it\n\n\n## Repeat\n- again\n- could you say it again\n- i didn't hear repeat again\n- i have not heard\n- pardon\n- repeat\n- repeat please\n- repeat that\n- say again\n- say again please\n- say that again\n- sorry\n- what\n- what did you say\n- what was that again\n\n\n## SelectAny\n- any of it\n- any one is ok\n- anyone is fine\n- anything\n- choose anyone\n- choose one of it randomly\n- opt for a random one\n- opt for any of it\n- select a random choice\n- select a random one\n- select any\n- select any choice\n- select any of it\n\n\n## SelectItem\n- 1\n- 2\n- 3\n- 5\n- choose for no. four\n- choose last\n- choose last one\n- choose no. six\n- choose no.2\n- choose the {DirectionalReference=bottom left}\n- choose the first choice\n- choose the fourth one\n- choose the {DirectionalReference=upper left} choice\n- choose the {DirectionalReference=upper right} one\n- choose {DirectionalReference=top right}\n- choose {DirectionalReference=top right} one\n- four\n- i like {DirectionalReference=left} one\n- i like second\n- i like second one\n- i like the {DirectionalReference=bottom} one\n- i like the first one\n- i like the third\n- i like the third choice\n- i like the {DirectionalReference=top right} one\n- i like the {DirectionalReference=upper right}\n- i like {DirectionalReference=upper right}\n- i want {DirectionalReference=bottom}\n- i want fourth\n- i want {DirectionalReference=left}\n- i want no. 5\n- i want {DirectionalReference=right} one\n- i want the first\n- i want the fourth choice\n- i want the {DirectionalReference=left}\n- i want the {DirectionalReference=lower} choice\n- i want the {DirectionalReference=right} one\n- i want the second one\n- i want third one\n- i want to choose {DirectionalReference=bottom} one\n- i want to choose {DirectionalReference=lower right}\n- i want to choose {DirectionalReference=right}\n- i want to choose second one\n- i want to choose the first one\n- i want to choose the fourth\n- i want to choose the last choice\n- i want to choose the {DirectionalReference=left} one\n- i want to choose the {DirectionalReference=lower} choice\n- i want to choose the {DirectionalReference=right}\n- i want to choose third\n- no. 1\n- no. 2\n- no. 3\n- no.4\n- number two\n- one\n- opt for first one\n- opt for last\n- opt for {DirectionalReference=left}\n- opt for number 7\n- opt for {DirectionalReference=right} one\n- opt for the last one\n- opt for the {DirectionalReference=left} one\n- opt for the {DirectionalReference=lower} choice\n- opt for the {DirectionalReference=right}\n- opt for the second\n- opt for the second choice\n- select five\n- select fourth one\n- select {DirectionalReference=lower} one\n- select no.5\n- select the {DirectionalReference=bottom} choice\n- select the first\n- select the last choice\n- select the {DirectionalReference=lower} one\n- select the {DirectionalReference=right} one\n- select the third one\n- select the {DirectionalReference=upper right}\n- select third\n- select {DirectionalReference=upper}\n- three\n- two\n- what about the last\n- what about the third one\n\n\n## SelectNone\n- i don't want to choose any one\n- i don't want to select any one\n- i want neither of them\n- i want none of them\n- neither\n- neither of those\n- neither one\n- neither one of them\n- neither thank you\n- none\n- none none\n- none none of them\n- none of them\n- none of them thank you\n- none of these\n- none of those\n- they look bad, can you give me other choices\n\n\n## ShowNext\n- and after that\n- display more\n- displays more\n- give me more\n- go forward\n- go to the next one\n- go to the next three items\n- i need to go to the next one\n- i want more\n- more\n- move to the next one\n- next\n- reveal more\n- show me the next\n- show more\n- show the next 3\n- show the next 4 items\n- show the next one\n- show the next two options\n- tell me more\n- tell more\n- what about next one\n- what after that\n- what's after that\n- what's more\n- what's next\n- what's the next 2\n- what's up next\n\n\n## ShowPrevious\n- back to the last one\n- bring the previous one\n- display previously\n- get back to the last one\n- go back to last one\n- go back to previous\n- go back to the last one\n- go previously\n- go to the previous\n- go to the previous one\n- previous one\n- previous one please\n- return to the previous one\n- reveal previous\n- reveal previously\n- show earlier\n- show me the previous one\n- show previous\n- show the previous one\n- the last five\n- the last two\n- what before that\n- what is the previous\n- what's before that\n\n\n## StartOver\n- back to the beginning\n- clear and start again\n- could you start it over\n- please begin again\n- reopen a new page\n- restart\n- restart it\n- start again\n- start it over\n- start over\n- start over it\n- turn over a new leaf\n\n\n## Stop\n- baby just be quiet\n- be quiet\n- be quiet now\n- come on stop\n- dismiss\n- end\n- end it\n- exit exit\n- exit stop\n- god shut up\n- hey stop\n- i don't want to see you anymore\n- i love you to stop talking\n- i mean stop listening\n- i said stop\n- just be quiet\n- my god shut up\n- never mind stop\n- no be quiet\n- no be quiet now\n- no no no no stop talking\n- no shut up\n- no stop\n- nobody cares stop talking\n- nowhere just be quiet\n- oh my god shut up\n- ok stop stop\n- quiet\n- quiet now\n- shut up\n- shut up be quiet\n- shut up quiet\n- shut your mouth\n- silence\n- stop please\n- stop talking\n- turn off\n- turn off stop\n\n\n> # Entity definitions\n\n$DirectionalReference:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Skills/Todo/General.lu",
    "content": "> # Intent definitions\n\n## Cancel\n- cancel\n- cancel app\n- cancel cancel\n- cancel it\n- cancel never mind\n- cancel that\n- cancel that one\n- canceled\n- cancelled\n- do nothing\n- don't do that\n- don't do that anymore\n- forget about it\n- go away\n- just cancel\n- just cancel it\n- never mind\n- never mind cancel\n- never mind cancel that\n- no cancel\n- no cancel cancel\n- no cancel it\n- no cancel that\n- no never mind\n- no no cancel\n- no no cancel it\n- nothing never mind\n- nothing please\n- oh cancel\n- please do nothing\n- quit\n- sorry, don't do it\n\n\n## Confirm\n- alright\n- come om\n- come on\n- come on baby\n- confirm\n- do it\n- fine\n- go ahead\n- go for it\n- great\n- i'm sure\n- it's fine\n- just do it\n- nice\n- no doubt\n- of course\n- oh yeah\n- oh yes\n- ok\n- ok for now\n- okay\n- perfect\n- perfect thank you\n- right\n- right yes\n- sounds good\n- sounds good thank you\n- sounds good thanks\n- sounds good to me\n- sounds great\n- sounds perfect\n- sure\n- sure does\n- sure is\n- sure thing\n- sure yes\n- thank you very much\n- thank you yes\n- that is correct\n- that is right\n- that right\n- that sounds good\n- that's all\n- that's fine\n- this is good\n- very good\n- ya\n- yeah\n- yeah baby\n- yeah bro\n- yeah buddy\n- yeah cool\n- yeah go ahead\n- yeah go for it\n- yeah good\n- yes\n- ^(yes|sure)[[,]i want (that|the ({DirectionalReference}|{ordinal}) ({number}|one))]\n\n\n## Escalate\n- can i talk to a person\n- contact support\n- contact the customer service\n- customer service\n- human service\n- i need a person\n- i need manual customer service\n- i need real human help\n- i need support\n- i want to talk to a human\n- i want to talk to a real human\n- is there any person i can talk to\n- is there any real human\n- is there any real person\n- shift\n- talk to a human\n\n\n## FinishTask\n- all finished\n- all set\n- done\n- finish\n- finished\n- finished with\n- i am done\n- i am finished\n- it finished\n- it's done\n- it's finished\n- just be\n- submit\n- submit it\n\n\n## GoBack\n- back\n- back please\n- back to\n- back to last\n- back to last step\n- get back\n- get back please\n- get back to last\n- go back\n- go back on\n- go back please\n- go back to\n- last step\n- no go back to\n- no no go back to\n- please return\n- return\n\n\n## Help\n- any help\n- can you help\n- can you help me\n- do me a favor\n- give me a favor\n- give me some help\n- help\n- how can i get it\n- how to do it\n- i don't understand\n- i need help\n- i need some assistance\n- i need some help\n- is there any help\n- open help\n- please help\n- some help\n- what should i do\n- who can help me\n\n## Logout\n- signout\n- forget me\n- sign out\n- logout\n- log out\n\n## None\n- all of them\n- i want them all\n- i want to all of them\n\n\n## ReadAloud\n- can you read it\n- can you read that\n- can you read that for me\n- can you you read page aloud\n- could you tell me what that says\n- detail aloud what that says\n- hey read that for me\n- i need to hear this page\n- i would like you to read that for me\n- make a reading of this page\n- please read\n- please read it\n- please read me the page\n- please read my latest email\n- please read this\n- please read this out loud\n- please read this page\n- please read this page aloud\n- please read this page out loud\n- please read this to me\n- read all on the screen to me\n- read aloud\n- read aloud the current text onscreen\n- read file aloud\n- read it\n- read it aloud\n- read it out loud\n- read it outloud\n- read it please\n- read it to me\n- read me this page\n- read my to list\n- read outloud\n- read page\n- read page aloud\n- read page outloud\n- read sentence out loud\n- read text\n- read text aloud\n- read that\n- read that out loud\n- read the page\n- read the page onscreen to me\n- read the page out loud\n- read the page to me\n- read the text to me\n- read the words on this page\n- read this for me please\n- read this page\n- read this page aloud\n- read this page out loud\n- read this page to me\n- read to me\n- read what is currently on the screen to me\n- speak of what is on this page\n- speak out\n- start reading this\n- state it\n- tell me about the information on the screen\n- tell me the current text on screen\n- vocalize what's on the page\n- what does the page say\n- would you please read that for me\n- would you read that out loud please\n- would you read that to me please\n\n\n## Reject\n- i don't like it\n- i don't need\n- i don't want it\n- i reject\n- negative\n- never\n- no\n- no i don't want that\n- no later\n- no leave it\n- no more no\n- no no\n- no no no\n- no no thank you\n- no not that one\n- no reject it\n- no thank you\n- no thanks\n- no way\n- no wrong\n- nope\n- not\n- not at all\n- not even close\n- not exactly\n- not now\n- not quite\n- not right now\n- not that\n- nothing much\n- oh no\n- reject\n- reject it\n\n\n## Repeat\n- again\n- could you say it again\n- i didn't hear repeat again\n- i have not heard\n- pardon\n- repeat\n- repeat please\n- repeat that\n- say again\n- say again please\n- say that again\n- sorry\n- what\n- what did you say\n- what was that again\n\n\n## SelectAny\n- any of it\n- any one is ok\n- anyone is fine\n- anything\n- choose anyone\n- choose one of it randomly\n- opt for a random one\n- opt for any of it\n- select a random choice\n- select a random one\n- select any\n- select any choice\n- select any of it\n\n\n## SelectItem\n- 1\n- 2\n- 3\n- 5\n- choose for no. four\n- choose last\n- choose last one\n- choose no. six\n- choose no.2\n- choose the {DirectionalReference=bottom left}\n- choose the first choice\n- choose the fourth one\n- choose the {DirectionalReference=upper left} choice\n- choose the {DirectionalReference=upper right} one\n- choose {DirectionalReference=top right}\n- choose {DirectionalReference=top right} one\n- four\n- i like {DirectionalReference=left} one\n- i like second\n- i like second one\n- i like the {DirectionalReference=bottom} one\n- i like the first one\n- i like the third\n- i like the third choice\n- i like the {DirectionalReference=top right} one\n- i like the {DirectionalReference=upper right}\n- i like {DirectionalReference=upper right}\n- i want {DirectionalReference=bottom}\n- i want fourth\n- i want {DirectionalReference=left}\n- i want no. 5\n- i want {DirectionalReference=right} one\n- i want the first\n- i want the fourth choice\n- i want the {DirectionalReference=left}\n- i want the {DirectionalReference=lower} choice\n- i want the {DirectionalReference=right} one\n- i want the second one\n- i want third one\n- i want to choose {DirectionalReference=bottom} one\n- i want to choose {DirectionalReference=lower right}\n- i want to choose {DirectionalReference=right}\n- i want to choose second one\n- i want to choose the first one\n- i want to choose the fourth\n- i want to choose the last choice\n- i want to choose the {DirectionalReference=left} one\n- i want to choose the {DirectionalReference=lower} choice\n- i want to choose the {DirectionalReference=right}\n- i want to choose third\n- no. 1\n- no. 2\n- no. 3\n- no.4\n- number two\n- one\n- opt for first one\n- opt for last\n- opt for {DirectionalReference=left}\n- opt for number 7\n- opt for {DirectionalReference=right} one\n- opt for the last one\n- opt for the {DirectionalReference=left} one\n- opt for the {DirectionalReference=lower} choice\n- opt for the {DirectionalReference=right}\n- opt for the second\n- opt for the second choice\n- select five\n- select fourth one\n- select {DirectionalReference=lower} one\n- select no.5\n- select the {DirectionalReference=bottom} choice\n- select the first\n- select the last choice\n- select the {DirectionalReference=lower} one\n- select the {DirectionalReference=right} one\n- select the third one\n- select the {DirectionalReference=upper right}\n- select third\n- select {DirectionalReference=upper}\n- three\n- two\n- what about the last\n- what about the third one\n\n\n## SelectNone\n- i don't want to choose any one\n- i don't want to select any one\n- i want neither of them\n- i want none of them\n- neither\n- neither of those\n- neither one\n- neither one of them\n- neither thank you\n- none\n- none none\n- none none of them\n- none of them\n- none of them thank you\n- none of these\n- none of those\n- they look bad, can you give me other choices\n\n\n## ShowNext\n- and after that\n- display more\n- displays more\n- give me more\n- go forward\n- go to the next one\n- go to the next three items\n- i need to go to the next one\n- i want more\n- more\n- move to the next one\n- next\n- reveal more\n- show me the next\n- show more\n- show the next 3\n- show the next 4 items\n- show the next one\n- show the next two options\n- tell me more\n- tell more\n- what about next one\n- what after that\n- what's after that\n- what's more\n- what's next\n- what's the next 2\n- what's up next\n\n\n## ShowPrevious\n- back to the last one\n- bring the previous one\n- display previously\n- get back to the last one\n- go back to last one\n- go back to previous\n- go back to the last one\n- go previously\n- go to the previous\n- go to the previous one\n- previous one\n- previous one please\n- return to the previous one\n- reveal previous\n- reveal previously\n- show earlier\n- show me the previous one\n- show previous\n- show the previous one\n- the last five\n- the last two\n- what before that\n- what is the previous\n- what's before that\n\n\n## StartOver\n- back to the beginning\n- clear and start again\n- could you start it over\n- please begin again\n- reopen a new page\n- restart\n- restart it\n- start again\n- start it over\n- start over\n- start over it\n- turn over a new leaf\n\n\n## Stop\n- baby just be quiet\n- be quiet\n- be quiet now\n- come on stop\n- dismiss\n- end\n- end it\n- exit exit\n- exit stop\n- god shut up\n- hey stop\n- i don't want to see you anymore\n- i love you to stop talking\n- i mean stop listening\n- i said stop\n- just be quiet\n- my god shut up\n- never mind stop\n- no be quiet\n- no be quiet now\n- no no no no stop talking\n- no shut up\n- no stop\n- nobody cares stop talking\n- nowhere just be quiet\n- oh my god shut up\n- ok stop stop\n- quiet\n- quiet now\n- shut up\n- shut up be quiet\n- shut up quiet\n- shut your mouth\n- silence\n- stop please\n- stop talking\n- turn off\n- turn off stop\n\n\n> # Entity definitions\n\n$DirectionalReference:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/Skills/Todo/ToDo.lu",
    "content": "﻿> # Intent definitions\n\n## AddToDo\n- add a few items to the {ListType=grocery} list\n- add a {ListType=grocery} item to {TaskContent=buy fish}\n- add a {ListType=grocery} item to {TaskContent=buy fruit and vegetables}\n- add a {ListType=grocery} item to {TaskContent=buy vegetables}\n- add a new {ListType=shopping} list\n- add a {ListType=shopping} item to {TaskContent=buy dancing dresses}\n- add a {ListType=shopping} item to {TaskContent=buy orange juice}\n- add a task for {TaskContent=anna west to bring my swimsuit for my vacation}\n- add a task for {TaskContent=jimmy to play xbox games with me after work}\n- add a task for {TaskContent=li lei to bring my coat from home}\n- add a task for {TaskContent=raghu to bring my chocolates from germany}\n- add a task to {TaskContent=purchase fruit and vegetables}\n- add a task to {TaskContent=finish driving test this week}\n- add a task to {TaskContent=pick mary up after work}\n- add a task to {TaskContent=shop at gnc after work}\n- add a {ListType=to do} to {TaskContent=purchase a nice sweater}\n- add a {ListType=to do} to {TaskContent=buy shoes}\n- add a {ListType=todo} item {TaskContent=to vacuum by october 3rd}\n- add action item for {TaskContent=khalifa to pack my school supplies} in my list\n- add an item to {TaskContent=buy some snacks}\n- add a task of {TaskContent=chores to do around the house}\n- add {TaskContent=bronwnies} to the {ListType=grocery} list\n- add {TaskContent=buy gum}\n- add {TaskContent=buy milk} to my {ListType=shopping} list\n- add {TaskContent=call my mother} to my {ListType=todo} list\n- add {TaskContent=go running} to my {ListType=to dos}\n- add {TaskContent=go to whole foods} in my {ListType=to do} list\n- add {ListType=grocery} add {TaskContent=spinach} my {ListType=groceries} list\n- add {ListType=grocery} items {TaskContent=cream cheese and raisin} to the list\n- add {ListType=grocery} items {TaskContent=dinners and storage bag} to the {ListType=shopping} list\n- add {TaskContent=have a haircut} to my tasks\n- add items as i speak\n- add {TaskContent=juicer} {ListType=groceries} list\n- add {TaskContent=melon and sugars and brown sugar} to {ListType=shopping} list\n- add more to {ListType=grocery} list\n- add {TaskContent=peanuts} the {ListType=grocery} list\n- add {TaskContent=purchase a cinema ticket} to my list\n- add {TaskContent=purchasing food and drinks} to my {ListType=shopping} list\n- add {TaskContent=reading} to my {ListType=to do} list\n- add {TaskContent=shoes} to the {ListType=shopping} lists\n- add some items to that {ListType=shopping} notes\n- add some items to the {ListType=grocery} list\n- add some {TaskContent=jeans} on our {ListType=shopping} lists\n- add something in this {ListType=grocery} list\n- add something to my list\n- add {TaskContent=tapioca starch} on my {ListType=shopping} list\n- add {TaskContent=tapioca starch} on our {ListType=shopping} list\n- add task to {TaskContent=buy a coat}\n- add task to {TaskContent=set up dining room table}\n- add this on our {ListType=shopping} list\n- add this stuff on my {ListType=shopping} list\n- add this thing in {ListType=to do} list\n- add to my {ListType=grocery} list\n- add to my {ListType=to do} list {TaskContent=pick up clothes}\n- add to my {ListType=to do} list {TaskContent=print papers for 10 copies this afternoon}\n- add to my {ListType=todos} list {TaskContent=mail the insurance forms out by saturday}\n- add to note {ListType=shopping} list\n- add to {ListType=shopping} list\n- add to the {ListType=grocery} note {TaskContent=buy milk}\n- append a {TaskContent=summer reading} in my list\n- append an task of {TaskContent=guest to invite at the party}\n- append this item onto my notes\n- ask a task for {TaskContent=kim to bring my coat from home}\n- can i add {TaskContent=shirts} on the {ListType=todos} list\n- can i put on {TaskContent=caramel cheese popcorn} on my {ListType=grocery} list\n- could i add {TaskContent=medicine} to the {ListType=todos} list\n- create a task to {TaskContent=meet my friends}\n- create task to {TaskContent=go to the mall}\n- create task to {TaskContent=meet john after 5:00 p.m.}\n- create task to {TaskContent=cyber shop on nov. 11}\n- create to do read {TaskContent=a book tonight}\n- create to do to {TaskContent=go running in the park}\n- {TaskContent=need go to library this week}, add this {ListType=todo} item\n- put {TaskContent=cheese} on list\n- put {TaskContent=ham} on my {ListType=shopping} list\n- put {TaskContent=hikes} on my {ListType=to do} list\n- put {TaskContent=ice cream} on the {ListType=groceries} list\n- put {TaskContent=milk} on my {ListType=grocery} list\n- put {TaskContent=on caramel cheese popcorn} on my {ListType=grocery shopping} list\n- remind me to {TaskContent=attend the meeting tomorrow}\n- remind me to {TaskContent=buy first aid creams and berries}\n- remind me to {TaskContent=buy milk}\n- remind me to {TaskContent=meet my teacher}\n- remind me to shop for {TaskContent=a new carpet}\n- to {ListType=grocery} list add {TaskContent=milk}\n- to my {ListType=shopping} list add {TaskContent=paper towels}\n- to my vacation {ListType=to do} list add {TaskContent=buy sunblock}\n- would you add {TaskContent=heavy cream} to the {ListType=todos} list\n- would you please add {ListType=todo} item of {TaskContent=all hands meeting next monday}\n- ^[(can you|could you|would you)] [please] (put|add|append) {TaskContent} [and] [{TaskContent}] (on|to)[my][(to do|todos|todo)]list\n- ^(add|create|append) an item [(called|about|of)] \"{TaskContent.Any}\" [as (next|first|last) task][(in|on|to) my (to do|to-do|todos) list]\n- ^[please] (add|put|append) [(items|item)] {FoodOfGrocery} [and] [{FoodOfGrocery}](on|to|in)[(my|the)]{ListType}list\n\n\n## Cancel\n- cancel\n- cancel adding the item\n- cancel {ContainsAll=all}\n- cancel {ContainsAll=all} of them\n- drop it\n- forget about it\n- forget it\n- i don't need it\n- just cancel it\n- let's cancel it\n- no don't do that\n- no forget it\n- no need thanks\n- no thanks\n- please revert it\n- sorry cancel that\n- sorry no\n- sorry no thank you\n- stop adding it\n- stop it\n- wait cancel it\n- ^[(would you|could you|can you)] [please] cancel (previous|current|this) (step|operation)\n\n\n## Confirm\n- confirm {ContainsAll=all} of them\n- confirm it\n- confirmed.\n- good to go\n- i'm sure i want to add this task\n- it's ok, save it\n- of course\n- of course yes\n- ok\n- ok, go ahead and delete it\n- seems nice\n- sure\n- sure add it\n- that's it\n- that's nice\n- yes\n- yes go ahead\n- yes i want to do that\n- yes just do that\n- yes please\n- yes, confirm\n- ^(yes|ok|sure), [please][(add|delete|update)] [the] [(item|task|todo item)][(of|about|that)]{TaskContent}\n\n\n## DeleteToDo\n- can you delete {TaskContent=todo1}\n- can you delete {TaskContent=abc} item\n- can you help to remove {ContainsAll=all} tasks\n- cancel {TaskContent=apples} from {ListType=shopping} list\n- clear my {ListType=todo} list\n- delete {ContainsAll=all} from my {ListType=grocery} list\n- delete {TaskContent=eggs} from list\n- delete off {TaskContent=pancake mix} on the {ListType=shopping} list\n- delete {TaskContent=shampoo} from {ListType=shopping} list\n- delete {TaskContent=shirts} from list\n- delete task {TaskContent=go fishing}\n- delete task {TaskContent=go to cinema tonight}\n- delete the item {TaskContent=buy socks} from my {ListType=to-do} list\n- delete the second task in my {ListType=shopping} list\n- delete the task {TaskContent=house cleanup this weekend}\n- delete the task {TaskContent=hit the gym every morning}\n- delete the to do {TaskContent=meet my friends tomorrow}\n- delete the to do {TaskContent=daily practice piano}\n- delete the to do {TaskContent=meet john when he comes here the next friday}\n- delete to do {TaskContent=buy milk}\n- delete to do {TaskContent=go shopping}\n- delete to do that {TaskContent=go hiking tomorrow}\n- erase {TaskContent=bananas} from {ListType=shopping} list\n- erase {TaskContent=peanuts} on the {ListType=shopping} list\n- no need to {TaskContent=buy milk} in {ListType=grocery} list\n- omit the {TaskContent=milk} in the {ListType=grocery} list\n- remove {ContainsAll=all}\n- remove {ContainsAll=all} tasks\n- remove {ContainsAll=all} todo items tomorrow\n- remove {TaskContent=asprin} from {ListType=shopping} list\n- remove {TaskContent=black shoes} from {ListType=shopping} list\n- remove {TaskContent=class} from {ListType=todo} list\n- remove {TaskContent=salad vegetables} from {ListType=grocery} list\n- remove task {TaskContent=buy dog food}\n- remove task {TaskContent=go shopping}\n- remove task {TaskContent=go {ListType=shopping} with john this saturday}\n- remove task that {TaskContent=go hiking this weekend}\n- remove task that {TaskContent=lawn mowing}\n- remove the item {TaskContent=paris} from my list\n- remove the task that {TaskContent=go to library after work}\n- remove the to do {TaskContent=physical examination}\n- remove the to do that {TaskContent=pick tom up at six p.m.}\n- remove to do {TaskContent=go to the gym}\n- remove to do that {TaskContent=go to the dentist tomorrow morning}\n- {ListType=shopping} list delete {TaskContent=a}\n- {ListType=shopping} list delete {TaskContent=dog food}\n- {ListType=shopping} list delete {TaskContent=eggs}\n- {ListType=shopping} list delete {TaskContent=milk}\n- take {TaskContent=coffee} off my {ListType=groceries} list\n- take {TaskContent=lemons and onions} off my {ListType=shopping} list\n- take {TaskContent=milk} off {ListType=grocery} list\n- take {TaskContent=socks and shoes} off my {ListType=shopping} list\n- {ListType=todo} list delete {TaskContent=paris vacation}\n\n\n## MarkToDo\n- {ContainsAll=all} have been done\n- {ContainsAll=all} have been purchased in the {ListType=shopping} list\n- already complete the {ListType=shopping} items in the list\n- check off {TaskContent=apples} from list\n- check off {TaskContent=bananas} from my {ListType=grocery} list\n- check off {TaskContent=garbage} from {ListType=grocery} list\n- check off {TaskContent=meet john at 8 am} from {ListType=to do} list\n- check off {TaskContent=shampoo} from {ListType=shopping} list as done\n- check the box {TaskContent=shampoo} in my {ListType=shopping} list\n- complete {ContainsAll=all}\n- complete {TaskContent=pick up black shoes} in my {ListType=to-do} list\n- complete task {TaskContent=go shopping}\n- done with the task {TaskContent=abc} in our {ListType=shopping} list\n- done with the task {TaskContent=shopping}\n- done with the task {TaskContent=tapioca starch} in our {ListType=shopping} list\n- finish {TaskContent=hikes} on my {ListType=to do} list\n- finish {TaskContent=peanuts} on the {ListType=shopping} list\n- i have finished the interview which is the last task in my {ListType=to do} list\n- let me check off the {ListType=groceries} list\n- mark {TaskContent=buy fish} as completed\n- mark {TaskContent=fish} as complete\n- mark {TaskContent=happy} on {ListType=to dos} list\n- mark {TaskContent=lemons and onions} in {ListType=grocery} list\n- mark {TaskContent=pancake mix} on my {ListType=grocery shopping} list\n- mark {TaskContent=peanuts} on my {ListType=grocery} list as done\n- mark {TaskContent=peanuts} on my {ListType=grocery} {ListType=shopping} list\n- mark {TaskContent=pick mary up} as finished\n- mark {TaskContent=pick up milk} on my {ListType=to-do} list\n- mark {TaskContent=play badminton with tom} as finished\n- mark {TaskContent=salad} on my {ListType=grocery} {ListType=shopping} list\n- mark {TaskContent=salad} on the {ListType=groceries} list\n- mark task {TaskContent=buy a bottle of vinegar} as finished\n- mark task {TaskContent=go running} as finished\n- mark task {TaskContent=read a book} as done\n- mark the first task as completed\n- mark the item {TaskContent=garbage} from {ListType=grocery} list\n- mark the task {TaskContent=buy milk} as done\n- mark the task {TaskContent=get some food} as complete\n- mark the task go {ListType=shopping} as finished\n- mark the task {TaskContent=reserve a restaurant for tomorrow's dinner} as finished\n- mark the task {TaskContent=visit my grandma} as completed\n- set the {ListType=grocery} list as finished\n- set the item as finished\n- {ListType=shopping} list completed\n- {ListType=shopping} list just done\n- task {TaskContent=train} has been done\n- task completed {TaskContent=buy gum}\n- the 3rd task finished\n- ^[task][(done|finished|completed)]{TaskContent},[please][(check off|mark it)][as][(done|finished|complete)]\n\n\n## None\n\n\n## ShowNextPage\n- are there any other tasks\n- can you show next page in the {ListType=shopping} list\n- display the next page\n- displays more\n- displays the next\n- next\n- next task\n- reveal more\n- show greater\n- show more\n- show more tasks\n- show more work\n- show next\n- show next page\n- show next sheet\n- show next website\n- tell more\n- tell more tasks\n- what's more\n- what's next\n- what's on the next\n\n\n## ShowPreviousPage\n- can you get previous for me\n- can you show previous for me\n- display the previous\n- display the previous page\n- displays previously\n- i need to check previous tasks\n- show back\n- show earlier\n- show last time\n- show me everthing on the previous page\n- show previous\n- show previous page\n- shows the prior\n- ^[(can|could|would)] [you] [please] [(show|display|go back to)][the](first|previous)page\n\n\n## ShowToDo\n- access my {ListType=shopping} list\n- access my {ListType=to do} list\n- access the {ListType=groceries} list\n- {ContainsAll=all} {ListType=shopping} list\n- bring up {ContainsAll=everything} on my {ListType=shopping} list\n- bring up {ListType=grocery} notes\n- bring up {ListType=shopping} note\n- browse my {ListType=groceries}\n- can you show my {ListType=to do} list\n- check my task list\n- check my {ListType=to do} list\n- display {ContainsAll=all} notes from last month\n- display {ListType=groceries} list\n- display notes with {ListType=groceries}\n- display {ListType=shopping} list\n- display tasks note\n- display {ListType=todo} list\n- do i have a list called {ListType=grocery} list\n- do i have any lists\n- find list about {ListType=shopping}\n- find my {ListType=grocery} items i saved on saturday\n- find my {ListType=shopping} list\n- find note labeled {ListType=grocery}\n- find notes called {ListType=grocery}\n- find notes for {ListType=grocery} {ListType=shopping}\n- find notes with {ListType=groceries}\n- find {ListType=shopping}\n- find task list on {ListType=shopping}\n- find the list i create for {ListType=shopping}\n- find the {ListType=to do list} for me\n- get work items on my {ListType=todo} list\n- help access my personal list\n- help show my {ListType=to do} list\n- i have to see my tasks\n- i have to see the {ListType=grocery} list i created today\n- i want to check my {ListType=shopping} list\n- i want to see {ListType=grocery} list\n- is there anything on my {ListType=to do} list\n- list {ListType=grocery} notes\n- look at my {ListType=grocery} list\n- pull {ListType=grocery} list\n- pull up {ListType=grocery} list\n- pull up my {ListType=grocery} list\n- pull up my notes\n- pull up {ListType=to do} list\n- read aloud my {ListType=grocery} list\n- read out my tasks\n- review {ListType=grocery} list\n- {ListType=shopping} list\n- show {ContainsAll=all} my {ListType=shopping} list\n- show me {ContainsAll=all} tasks\n- show my {ListType=to do} list\n- show my {ListType=to dos}\n- show my {ListType=todos}\n- take me to my {ListType=shopping} list\n- view my {ListType=grocery} list\n- view {ListType=shopping} list\n- what about {ListType=grocery} list\n- what am i going to do next\n- what are my notes for the {ListType=grocery} store\n- what are my tasks for {ListType=todo}\n- what do i have to buy on the {ListType=shopping} list\n- what do i need to buy in the {ListType=shopping} list\n- what is on my {ListType=shopping} list\n- what is the last task on my {ListType=to do} list for tomorow\n- where is the {ListType=grocery} {ListType=shopping} notes i worked on last night\n- would you bring up my new {ListType=grocery} notes\n- ^(what|anything)[do] i (need|should|have to) (buy|shop|purchase) for {TaskContent}\n\n\n> # Entity definitions\n\n$ContainsAll:simple\n\n$ListType:simple\n\n$TaskContent:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n$FoodOfGrocery:air freshener=\n\n$FoodOfGrocery:apple=\n- apples\n\n$FoodOfGrocery:bacon=\n\n$FoodOfGrocery:bagel=\n\n$FoodOfGrocery:bagels=\n\n$FoodOfGrocery:banana=\n- bananas\n\n$FoodOfGrocery:beans=\n\n$FoodOfGrocery:beverages=\n\n$FoodOfGrocery:bread=\n\n$FoodOfGrocery:buns=\n\n$FoodOfGrocery:burgers=\n\n$FoodOfGrocery:butter=\n\n$FoodOfGrocery:carrot=\n- carrots\n\n$FoodOfGrocery:celery=\n\n$FoodOfGrocery:cereal=\n\n$FoodOfGrocery:cheese=\n\n$FoodOfGrocery:chicken=\n\n$FoodOfGrocery:chili=\n\n$FoodOfGrocery:chips=\n\n$FoodOfGrocery:chocolate=\n- chocolates\n\n$FoodOfGrocery:chocolate chip=\n- chocoloate chips\n\n$FoodOfGrocery:chops=\n\n$FoodOfGrocery:cloves=\n\n$FoodOfGrocery:coffee=\n\n$FoodOfGrocery:corn=\n\n$FoodOfGrocery:crispy=\n\n$FoodOfGrocery:croissant=\n- croissants\n\n$FoodOfGrocery:cupcakes=\n\n$FoodOfGrocery:dairy=\n\n$FoodOfGrocery:dishwashing detergent=\n\n$FoodOfGrocery:donuts=\n\n$FoodOfGrocery:drinks=\n\n$FoodOfGrocery:duck=\n\n$FoodOfGrocery:egg=\n- eggs\n\n$FoodOfGrocery:flour=\n\n$FoodOfGrocery:fries=\n\n$FoodOfGrocery:frozen food=\n\n$FoodOfGrocery:fruit=\n- fruits\n\n$FoodOfGrocery:garbage bag=\n- garbage bags\n\n$FoodOfGrocery:garlic=\n\n$FoodOfGrocery:grilled=\n\n$FoodOfGrocery:ham=\n\n$FoodOfGrocery:hamburger=\n\n$FoodOfGrocery:ice cream=\n\n$FoodOfGrocery:jam=\n\n$FoodOfGrocery:lamb=\n\n$FoodOfGrocery:laundry detergent=\n\n$FoodOfGrocery:lemon=\n- lemons\n\n$FoodOfGrocery:lettuce=\n\n$FoodOfGrocery:lettuce and salad=\n- salad\n- salads\n\n$FoodOfGrocery:lobster=\n\n$FoodOfGrocery:marinated=\n\n$FoodOfGrocery:meat=\n\n$FoodOfGrocery:meatballs=\n\n$FoodOfGrocery:meatloaf=\n\n$FoodOfGrocery:milk=\n\n$FoodOfGrocery:onion=\n- onions\n\n$FoodOfGrocery:oysters=\n\n$FoodOfGrocery:pancake mix=\n\n$FoodOfGrocery:pancakes=\n\n$FoodOfGrocery:pasta=\n\n$FoodOfGrocery:pastry=\n- pastries\n\n$FoodOfGrocery:pear=\n- pears\n\n$FoodOfGrocery:pepper=\n\n$FoodOfGrocery:pie=\n- pies\n\n$FoodOfGrocery:pita=\n\n$FoodOfGrocery:potato=\n- potatoes\n\n$FoodOfGrocery:poultry=\n\n$FoodOfGrocery:ribs=\n\n$FoodOfGrocery:rice=\n\n$FoodOfGrocery:roast=\n\n$FoodOfGrocery:rolls=\n\n$FoodOfGrocery:salads=\n\n$FoodOfGrocery:salmon=\n\n$FoodOfGrocery:salt=\n\n$FoodOfGrocery:sandwich=\n\n$FoodOfGrocery:sauce=\n\n$FoodOfGrocery:sausage=\n- sausages\n\n$FoodOfGrocery:scones=\n\n$FoodOfGrocery:shellfish=\n\n$FoodOfGrocery:shrimp=\n\n$FoodOfGrocery:snacks=\n\n$FoodOfGrocery:sour cream=\n\n$FoodOfGrocery:steak=\n\n$FoodOfGrocery:strawberries=\n\n$FoodOfGrocery:sugar=\n\n$FoodOfGrocery:sushi=\n\n$FoodOfGrocery:sweets=\n\n$FoodOfGrocery:tenderloin=\n\n$FoodOfGrocery:tomato=\n- tomatoes\n\n$FoodOfGrocery:toothpaste=\n\n$FoodOfGrocery:tortilla=\n\n$FoodOfGrocery:tuna=\n\n$FoodOfGrocery:turkey=\n\n$FoodOfGrocery:veal=\n\n$FoodOfGrocery:vegetable=\n- vegetables\n\n$FoodOfGrocery:venison=\n\n$FoodOfGrocery:waffles=\n\n$FoodOfGrocery:yoghurt=\n\n$FoodOfGrocery:fish=\n\n\n\n$ShopVerb:buy=\n- bought\n- buys\n- buying\n\n$ShopVerb:purchase=\n- purchases\n\n$ShopVerb:shop=\n- shops\n\n\n\n> # RegEx entities\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/all-entity-types.lu",
    "content": "$userName:simple\n$PREBUILT:datetimeV2\n$PREBUILT:age\n$PREBUILT:dimension\n$PREBUILT:email\n$PREBUILT:money\n$PREBUILT:number\n$PREBUILT:ordinal\n$PREBUILT:percentage\n$PREBUILT:phonenumber\n$PREBUILT:temperature\n$PREBUILT:url\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n\n$question:PhraseList interchangeable\n- are you\n- you are"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/all.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"testIntent\"\n    },\n    {\n      \"name\": \"Buy chocolate\"\n    },\n    {\n      \"name\": \"setThermostat\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"customDevice\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"deviceTemperature\",\n      \"children\": [\n        \"device\",\n        \"customDevice\",\n        \"temperature\"\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"units\",\n      \"children\": [\n        \"temperature\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"fax\",\n          \"list\": [\n            \"fax\",\n            \"fascimile\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"device\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"thermostat\",\n          \"list\": [\n            \"Thermostat\",\n            \"Heater\",\n            \"AC\",\n            \"Air conditioner\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"refrigerator\",\n          \"list\": [\n            \"Fridge\",\n            \"Cooler\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [\n    {\n      \"name\": \"HRF-number\",\n      \"regexPattern\": \"hrf-[0-9]{6}\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"zander\",\n      \"regexPattern\": \"z-[0-9]{3}\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [\n    {\n      \"name\": \"ChocolateType\",\n      \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n      \"mode\": false,\n      \"activated\": true\n    },\n    {\n      \"name\": \"question\",\n      \"words\": \"are you,you are\",\n      \"mode\": true,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"santa wants a blue ribbon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need a flight from tomorrow and returning on next thursday\",\n      \"intent\": \"testIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"datetimeV2\",\n          \"startPos\": 21,\n          \"endPos\": 28,\n          \"role\": \"fromDate\"\n        },\n        {\n          \"entity\": \"datetimeV2\",\n          \"startPos\": 47,\n          \"endPos\": 59,\n          \"role\": \"toDate\"\n        }\n      ]\n    },\n    {\n      \"text\": \"can I get some m&m\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I want some twix\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I would like to buy some kit kat\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Please set thermostat to 72\",\n      \"intent\": \"setThermostat\",\n      \"entities\": [\n        {\n          \"entity\": \"deviceTemperature\",\n          \"startPos\": 11,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"Set owen to 72\",\n      \"intent\": \"setThermostat\",\n      \"entities\": [\n        {\n          \"entity\": \"customDevice\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"deviceTemperature\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        }\n      ]\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": [\n        \"fromDate\",\n        \"toDate\"\n      ]\n    },\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"temperature\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"all\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/all_qna.json",
    "content": "{\n  \"urls\": [\n    \"https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs\"\n  ],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"You can change the default message if you use the QnAMakerDialog.\\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I change the default message\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can use our REST apis to manage your KB.\\n\\\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I programmatically update my KB?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Vishwac\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your ceo?\",\n        \"get me your ceo info\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can get coffee in our Seattle store at 1 pike place, Seattle, WA\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where can I get coffee?\",\n        \"I need coffee\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"location\",\n          \"value\": \"seattle\"\n        }\n      ]\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can get coffee in our Portland store at 52 marine drive, Portland, OR\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where can I get coffee?\",\n        \"I need coffee\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"location\",\n          \"value\": \"portland\"\n        }\n      ]\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What is Ludown?\",\n        \"ludown cli\",\n        \"where can i get more information about ludown cli?\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"ludown\",\n          \"value\": \"awesome\"\n        }\n      ]\n    }\n  ],\n  \"files\": [],\n  \"name\": \"all\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bad.lu",
    "content": "# ? question\n\n$entity:list"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bad2.lu",
    "content": "foobar"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bad3.lu",
    "content": "# greeting\n\n# g2\ni wangt {tomato}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bad3a.lu",
    "content": "# greeting\n\n# g2\n- i wangt {tomato=}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bad4.lu",
    "content": "# greeting\n- hi {@personName:userName}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bad5.lu",
    "content": "# greeting\n- hi {@addto*Property=foo}\n\n@ ml delete$Property"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/bf-627.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Repros\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"outer\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"inner\",\n          \"instanceOf\": null,\n          \"children\": []\n        }\n      ]\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"when I use the same text twice in nested ML entity text\",\n      \"intent\": \"Repros\",\n      \"entities\": [\n        {\n          \"entity\": \"inner\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"outer\",\n          \"startPos\": 15,\n          \"endPos\": 54\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/buyChocolate.lu",
    "content": "> reference to phrase lists for this bot\n#ref('./phraseLists.lu')\n\n$ChocolateType:phraseList\nmints\n\n#Buy chocolate\ncan I get some {ChocolateType:m&m}\nI want some {ChocolateType:twix}\nI would like to buy some {ChocolateType:kit kat}\n#ref('./comment.lu')\n$ChocolateType:phraseList\nm&m,mars"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/calendar_all_prebuilt.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"all_imports\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"Calendar.AcceptEventEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"AcceptEventEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.Cancel\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Cancel\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ChangeCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ChangeCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.CheckAvailability\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"CheckAvailability\"\n      }\n    },\n    {\n      \"name\": \"Calendar.Confirm\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Confirm\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ConnectToMeeting\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ConnectToMeeting\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ContactMeetingAttendees\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ContactMeetingAttendees\"\n      }\n    },\n    {\n      \"name\": \"Calendar.CreateCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"CreateCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.DeleteCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"DeleteCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarDetail\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarDetail\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarWhen\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarWhen\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarWhere\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarWhere\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarWho\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarWho\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindDuration\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindDuration\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindMeetingRoom\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindMeetingRoom\"\n      }\n    },\n    {\n      \"name\": \"Calendar.GoBack\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"GoBack\"\n      }\n    },\n    {\n      \"name\": \"Calendar.Reject\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Reject\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ShowNext\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ShowNext\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ShowPrevious\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ShowPrevious\"\n      }\n    },\n    {\n      \"name\": \"Calendar.TimeRemaining\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"TimeRemaining\"\n      }\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Calendar.EndDate\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"EndDate\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.EndTime\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"EndTime\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.Message\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Message\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.StartDate\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"StartDate\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.StartTime\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"StartTime\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.Subject\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Subject\"\n      },\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"personName\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"^[(show|display)] next [page] [please]^\",\n      \"intent\": \"Calendar.ShowNext\"\n    },\n    {\n      \"pattern\": \"^i (want to|would like to|'d like to) (join|attend) the {Calendar.Subject}^\",\n      \"intent\": \"Calendar.AcceptEventEntry\"\n    },\n    {\n      \"pattern\": \"^does {personName} have time at {Calendar.StartTime}\",\n      \"intent\": \"Calendar.CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^(clear|delete|remove) (my|the) calendar from {Calendar.StartTime} to {Calendar.EndTime}^\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^is {personName} (available|free) from {Calendar.StartTime} to {Calendar.EndTime} [on {Calendar.StartDate}]\",\n      \"intent\": \"Calendar.CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^how long do i have (until|before|till) the [next] (meeting|appointment|{Calendar.Subject})\",\n      \"intent\": \"Calendar.TimeRemaining\"\n    },\n    {\n      \"pattern\": \"^do i have time (at|on|for) {Calendar.StartTime} [on] {Calendar.StartDate}\",\n      \"intent\": \"Calendar.CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^(remove|cancel|delete) (the|my) {Calendar.Subject} [at {Calendar.StartTime}] [{Calendar.StartDate}]^\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^i (want to|need to|would like to) (attend|join) {Calendar.Subject}, [please] add it.^\",\n      \"intent\": \"Calendar.ShowNext\"\n    },\n    {\n      \"pattern\": \"^(remind|inform|tell) (the|all) attendees {Calendar.Message}^\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] from [{Calendar.StartDate}] {Calendar.StartTime} to [{Calendar.EndDate}] {Calendar.EndTime}\",\n      \"intent\": \"Calendar.CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] between {Calendar.StartTime} and {Calendar.EndTime}\",\n      \"intent\": \"Calendar.CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] (at|for|on) [{Calendar.StartDate}] [{Calendar.StartTime}]\",\n      \"intent\": \"Calendar.CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^is (this|the|that) (meeting|conference) room (available|booked) [(at|on|for)] [{Calendar.StartDate}] [(at|on|for)] [{Calendar.StartTime}]^\",\n      \"intent\": \"Calendar.FindMeetingRoom\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"2 hours meeting with ladawn padilla at 5 on tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 44,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"2 pm meeting tomorrow - who else is going\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"2 pm meeting with who\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"abort edition\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"abort that\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"about how long will the meeting last\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept all meetings for christmas party next week.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"accept an appointment\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept dinner\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"accept my meeting at 7pm today\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"accept my meeting at tomorrow 10am\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment from 3pm to 5pm.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment on january 18th in palace meeting room.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment sent by lucas\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the event\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the event for tonight.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the event on feb. 18 in beijing.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the event sent by yolanda wong.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the meeting held on tomorrow at room 301\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the meeting organized by jack lauren.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the meeting with mary and tom held on wednesday\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the meeting with tom chen.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept this appointment with jane and mary on next tuesday.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"accept this event.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept this lunch meeting.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"accept today's event at 3pm.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"accept today's meeting\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"add a meeting with herman to my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add an appointment on may 8th at shanghai\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add applied motion to my calendar 9 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add appt with helen ding for dinner on march 5th at 5 pm at dennys\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"add appt with mike li for dinner on march 5th at 5 pm at dennys\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 49,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"add balboa practice to my calendar at 3 30 today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add ballet to my calendar wednesday at five thirty to six thirty pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 54,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"add baseball game on friday to calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"add chicago bulls versus washington wizards to my calendar tomorrow at seven pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 59,\n          \"endPos\": 66\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 71,\n          \"endPos\": 78\n        }\n      ]\n    },\n    {\n      \"text\": \"add choir practice on saturday at 7 pm to my personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add choreography to my family calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"add chorus concert to calendar for may 1st at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add church to personal calendar on sundays at 9\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"add coffee on august 12th at 2 pm with herman for one hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"add dance on tuesday at four o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add date night on the 5th at 7pm every month\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment on tuesday june at the 1st clinic\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment to my calendar at 3:30 for the 8th of may\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 55,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment to my calendar tomorrow from 3 to 4:30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 53,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 58,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointments to my calendar at 3 thirty p m\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"add dinner to personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add dinner with mom to personal\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add doctors appointment on march 13 at 2 pm at the original health clinic\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add doctors appointment on march 13 at 2 pm at the tiptop virginia beach clinic\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add go shopping with john meng on the calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"add haircut to my google calendar tomorrow at 2 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add hope middle school meet and greet on my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add kane s dr appt to calendar for 3 friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add maple beach to my calendar at 10 on sunday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"add me to conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add me to the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add megan training to calendar on july 4th at 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"add office party on march 8th from 6 p to 9 p\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add order cabinets to my calendar today at 2 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"add pay credit card to calendar may twentieth\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add pay pearl fees on my calendar tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"add picture day at school to my calendar for friday, november the 8th from 8 am to 9:30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 68\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 75,\n          \"endPos\": 78\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 83,\n          \"endPos\": 86\n        }\n      ]\n    },\n    {\n      \"text\": \"add solo gig at civic hall on the 7th of march at 8 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 50,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"add team meeting to my calendar at 10pm with xiaoming wang\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add the enviomential protection meeting from 9 am to 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 53,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add the lunch with my colleague naomi from 12 to 2 in my personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 49,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add ultimate frisbee on sunday at 2 pm for 2 hours\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add vacation to my calendar from july 4th until july 29th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 48,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar at 3 pm on friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar friday from 8 for an hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar sunday 10 till 5\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar thursday 8 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to my calendar monday 6 am to 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to my calendar today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"alert attendees meeting is at 8 30\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 16,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"alert attendees of dinner meeting that i will be late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 39,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"alert quality control meeting participants that i am 15 minutes late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 6,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 48,\n          \"endPos\": 67\n        }\n      ]\n    },\n    {\n      \"text\": \"alert quality control meeting participants that the meeting will be 30 minutes later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 6,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 48,\n          \"endPos\": 83\n        }\n      ]\n    },\n    {\n      \"text\": \"alright\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i available\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i available at 10 am on monday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available on monday at 9 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available tomorrow at 5 30 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy on the 6th of february\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy on this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i free at 5 pm today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free at 7 p . m .\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for drinks monday at 5\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for drinks monday at 5 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for hiking on saturday at 8 am\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free from 3 pm - 10 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on monday at 9 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on saturday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on the 12th of july\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free to drive with kim on thurs at 3 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tomorrow 3 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tonight\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tuesday at 7 am\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"append dad's birthday every july 21st\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"appending group meeting next monday at 11am for an hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"at 10 am do i have a 30 minutes meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 3,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"attend the fy19 celebration party sent by daisy lu.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"attend the lunch meeting at 10:30 am.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"attend the meeting held at 3pm next tuesday at the conference center.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"attendees who will join the 5 pm meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back one step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back the last step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bing find me a conference room in the bravern this afternoon\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"book a conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a meeting\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a meeting between 2 and 3 tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting between 2:30pm and 4:45pm tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 34,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting in guangzhou at 6am on march 5th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"book a recurring 1x1 meeting on the first monday of each month\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"book blue meeting room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book the conference room for thursday at one i want to meet with benjamin\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"bring forward my 4 o'clock appointment 2 hours\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"calendar for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"call conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call genpact conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call harris conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call into conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call into marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"call into meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call the morning breifing conference number\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"call the weekly marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"can i cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel the 1st one\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you change it to 5 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"can you check my dad 's calendar for free time this week\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 47,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"can you go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you move this appointment to 5pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"can you reserve room 649 right away\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you show me the time remaining before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you tell me about master chief\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me if my husband is free on sunday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me something about shakespeare\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel 1 pm staff meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel all events\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel an appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel appointment today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel appointments\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel calendar entry\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel can you don't do that please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel dinner\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel doctor ' s appointment monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel don't worry\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel event tomorrow\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel everything\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it for me\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it i don ' t want that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it, i don't want to create the meeting\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel lunch next wednesday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel meeting with abigail 3 pm today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel meeting with bob marlon 3pm today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my adventureworks trip to seattle\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my appointment at 9 pm\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my appointment for october 4\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my driving lesson tomorrow\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my meeting at shanghai on monday at 10 am\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my next appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my singing appointment on monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my three o'clock appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the creating process\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the group meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the meeting with julie\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the pickup food from ted\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the untitled event on may twenty eighth\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel this meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel today ' s appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel tomorrow ' s plan\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"change 10 am meeting to start 20 minutes later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change 12am meeting to start 10 minutes earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change 4pm lunch appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change 5pm appointment 1 hour earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change an appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change big event to tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change dentist appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change dentist appt to an hour later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"change developmental agenda for lunch tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"change it to 5pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"change location\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change lunch appt to 2\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"change lunch date from 11 - 12 to 12 - 1 30\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"change marathon training from 8:00am to 1:00pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change marketing meeting from every tuesday to every wednesdays\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 47,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"change meeting from 2-3pm to 4-5pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change meeting from 2pm-3pm to 4pm-5pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 11pm appointment's location to green park\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 3pm event to 4pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 6pm event to 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 7 30 pm appointment to 8 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 7pm event to 6pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 8 till 9 appointment to 11 till 12\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 9 30 till 10 30 appointment to 9 30 till 5\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 51,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"change my appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my appointmnet with sarah to 5 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change my dentist appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"change my dentist appointment from 3:30 to 4\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my meeting at night to tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"change my next meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my schedule\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my ten am appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my vacation from ending on friday to monday\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 44,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"change recital to start half an hour earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"change shave tomorrow 8 30\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change the appointment ending at 4 to end at 5 instead\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 45,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change the end date of my trip from the 3rd to the 4th\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 51,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"change the end time of my 3 o'clock meeting to 3 30 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"change the location of my singing appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"change the meeting which will start at 2 pm to 3 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"change the time\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change the time to eleven thirty am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"change the title of my 11am appointment to soccer practice\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 43,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"change the title of my appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change this appointment's location\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change thursday team meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change time\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change today 's meeting from 6pm to tomorrow 9am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"change today 's meeting from 6pm to tomorrow 9pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"change tomorrow ' s appointment from 10am to wednesday at 9 am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 58,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"check janice 's calendar for this weekend\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"check kronos calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check meeting room for tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"check my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my family calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my mom's schedule\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check on the time to see when i go to school and pick up mark\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"clear all my appointments\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear all of my appointments\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear all of my appointments today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"clear all the appointments from my calendar for today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my calendar for january 29th\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my schedule\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my schedule for tomorrow\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my schedule today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"conference join\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to 10 00 conf call with bryan\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to conference call with debra\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to the budget meeting conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to the marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me with conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me with my 2 o clock meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"connect to conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect to conference call now\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"connect to weekly marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"correct\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you show the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create a calendar appointment at 3:30 tomorrow for half an hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"create a event with eden roth at 4pm today for 30 mins\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 6 o'clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create a meeting at 7:00pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 8am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 9:35am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting for tomorrow 6pm with lucy chen\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting from 9pm to tomorrow 6am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 38,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting with tom34@outlook.com\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an appointment with doctor lu from 8:30 am to 10:00 am tomorrow morning\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 62,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 71,\n          \"endPos\": 77\n        }\n      ]\n    },\n    {\n      \"text\": \"create appointment for 30 minutes\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create appointment from tuesday to wednesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"create calendar : tomorrow morning from 9 to 11 at 1103 room for internal meeting\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 45,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 65,\n          \"endPos\": 80\n        }\n      ]\n    },\n    {\n      \"text\": \"decline my meeting on monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delay the meeting event by 1 hours\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delay the next meeting by 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete an appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete birthday calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"delete calendar event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete my schedule\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete my schedule for today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delete that appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the 1st one from my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the appointment with jeffrey\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the appointment with mom\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the scheduled meeting with zachary\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete this appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"detail about tomorrow's meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"detailed information about the next meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"details about the meeting with grace\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"details about the meeting with karen and tom\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dial into conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dial marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"did hellen come to 3 pm's meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"did mark sign up to the tomorrow's meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"did martin come to today's meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"discard the appointment with george\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"discard the meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display olivia 's availability\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have any appointments today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any free time this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any meetings today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any spare time before next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have anything from 11 to 2\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything on wednesday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't change it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't create it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"drop my appointment for monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"duration of machine learning talk\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"edit calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"excellent\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"extend meeting from 9 am to 12 am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find a free meeting room for next tuesday\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting about group meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting about plan\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting at 7pm from melissa\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 18,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from darren about status update\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from deborah about team session\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from donna\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find a meeting subject daily meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with subject weekly report\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with title second lesson from amanda\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with title sharing from steven\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find a new meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find an available meeting room from 3 to 5 tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 41,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"find attendees who will attend 8 o ' clock meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"find me an empty conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find me the meetings at 6\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find me the meetings at 9 o'clock\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting around 2 to 6pm\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting around 5 to 8 pm\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting with judith\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the meeting with timothy\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the meetings mary\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me on the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get to my next event\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me details of the next appointment\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go ahead and cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back a step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back one step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back please\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back the previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the last step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the main menu\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next one please\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"great\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to book a conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to book a meeting room from 10 am to 3 pm\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"help me to book the room 102\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to find a meeting room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long do i have for lunch\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is it until the 14th of march\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my 4 o'clock meeting\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my dentist appointment\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my facial time\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my meeting at 4\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 26,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is that meeting going to last\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long is the event\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long is the movie jurassic world\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till disneyland paris\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long till the next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long until christmas\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how long until my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long until my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long until the social\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"how long will i wait for the next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long will my dentist appointment last\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days is it until christmas\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days left until the opening ceremony\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days till april\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days till christmas\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until june the fifteenth\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until june the fifteenth 2019\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until march twenty six\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until my doctor ' s appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until thanksgiving\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until the 10th of december\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours left till the closing ceremony\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours remaining till next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how many hours until my doc appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how many minutes before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how many minutes free do i have before next scheduled appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much longer do i have before pick up mary from school\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"how much longer do i have until pick up john from school\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"how much longer until my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much longer until my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time as of now is set for the bill payments\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 39,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time before lunch\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time before next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time between schedule thursday meetings next week\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 49,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have before my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have for a lunch break today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have for lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have free until my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have to take back the movie\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until i have to meet with michael\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until i start the meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until my doc appt\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until my meeting with larry\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have until my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do we have for lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time does my meeting take up\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time for lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is open today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is set for the bill payments\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is there before office meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is there for errands during my lunch break\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 45,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time out on lunch\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time remaining till next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time until my meeting with lori\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time until next scheduled appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time until noon\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time will i have to pick up groceries\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"i cannot\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot make it\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i can't go there\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like the time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to change it anymore\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to do it now\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to find it anymore\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to join it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want want to change this appointment anymore\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have decided to cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have other things to do at that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to check the previous appointment\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to delete this appointment from my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to join conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to join the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to know about my date with jimmy\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to know about my meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to know about my next appointment\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need you to find a new meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need you to provide me the details of the meeting i have scheduled with my colleague amanda\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i think not\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to attend the meeting for review\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to delete an appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know the time left for my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to meet with bruce lee so book the conference room for thursday at one\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 62,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 74,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to meet with donna please book for thursday the conference room at one\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 74,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to take a look at the attendee list\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to cancel all of them\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to know if my mother is available today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 47,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd rather not. thanks\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'll attend the meeting at 2pm tomorrow in room 304\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend the meeting this afternoon.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend this upcoming event in redmond.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm afraid i can't\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm busy at that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm looking for a conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm not available next monday afternoon\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm supposed to meet daisy, not katy\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is bruce young attending the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is carolyn available tuesday afternoon\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"is charles wong going to be at the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is debra available on saturday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"is gerald busy this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"is grace available for the daily scrum meeting with engineering team from 10 to 11\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 74,\n          \"endPos\": 75\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 80,\n          \"endPos\": 81\n        }\n      ]\n    },\n    {\n      \"text\": \"is it going to last long\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is joe going to be at the next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is madison busy\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is my lunch long enough for errands\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"is nicholas available friday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"is raymond free on monday evening\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"is rebecca busy thursday at 4\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"is russell free on friday at 4pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"is saturday free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 3,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"is theresa free october 9th\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"is this room busy at 5 pm\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"is this room busy tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"is victoria participating next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is virginia free on monday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"it doesn't work for me\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's the wrong person\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's the wrong room\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's wrong\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join budget conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"join conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join current budget conf call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"join current conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join current conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join lync meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join meeting now\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"join my meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join my next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join next link meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"join next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join next meeting on link\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the budget meeting conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"join the conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the next lync meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"just cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let 5 pm meeting starting at 3\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"let me cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let me see who will attend party planning meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"let next meeting starting at 10am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's find a new meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"link join my next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"link join next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"list the attendees of the next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"list the participants for the 2 pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"locate another meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"locate the next appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"location of 11 am meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"location of the next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"look up my next appointment for me\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lync join next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appointment for 5 30 tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for 7 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appointment on monday.\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment on personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appointment to play squash on thursday at 7 20\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment to see doctor culver august the 22nd 2013 1 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 57\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 59,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment with tom roth.\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appt for 3 pm on christmas\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"make me a calendar event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me a dentist appointment wednesday at two forty five\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me an appointment for next weekend\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment for ten forty next monday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment for the next week thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment on the calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me an appointment tomorrow at 2 30 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"make next meeting to start 1 hour later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make the appointment ending at 2 go until 4 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"make the meeting ending at 10 go until 11\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"make the meeting to start 1 hour later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make the meeting to start 40 minutes earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"march 15 dinner at refectory at 6 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"maybe another time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"meet ming wang for lunch on tuesday at noon\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"meet with a.j. lee saturday at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"meet with carol lee at home on march 10th at 4 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting at 3 pm today locations\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting room changed to new location send to meeting attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting will start soon remind everybody involved\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"meeting with ben randie tomorrow at noon\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with ellen fung on monday at 9 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with jia li monday 3 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with morrison sun at 2 pm saturday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with morrison yang at 4\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"message colleagues that meeting needs to be moved to 8 : 30 am\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 24,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"message everyone advising that i will be late to the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 31,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"message nancy and tell him to postpone the meeting because i ' m going to be 30 minutes late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 30,\n          \"endPos\": 91\n        }\n      ]\n    },\n    {\n      \"text\": \"minutes in lunch break\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"modify the meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"modify the second meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move 3pm meeting to 4pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"move appt with rebecca to next week\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"move meeting from 9pm-10pm to 8pm-9pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 34,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 1 pm appointment up 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my 10 past 10 doctor ' s appointment to 10\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 10pm meeting to 9pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 12 pm meeting to 2\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 4 pm to 5 pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 9 am doctor ' s appointment to 10 am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 9pm meeting to 8pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my meeting back by an hour\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my meeting to 6pm from 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"move my meeting up by half an hour\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting out by 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting out thirty minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting up by 10 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting up by 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my text meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"move my twelve p . m . meeting forward two hours\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my twelve p. m. thirty minutes up\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move party planning meeting from saturday to friday at 1pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 55,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"move shoe appointment to tuesday at one\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my 9 o ' clock meeting can ' t start until 9 15 can you let everyone know\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"my next meeting with emily is when\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"need to cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"negative\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind could you cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, cancel the changing\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, forget about the creating\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment for tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment in calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment in my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment next wednesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment today 6 pm see dead people\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment tomorrow at 3 pm at sunken\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"new calendar appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar entry\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar item\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new location for meeting this afternoon let others attendees know meeting is now in room 100\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i just cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, cancel please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i already have meeting 3pm tomorrow afternoon\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"no, i won't\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i'd like to meet her manager\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, please don't\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nokia conference room join\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at this time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not for me, thanks\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not him\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not now\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right, schedule it as 1x1 meeting with yolanda\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"not that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this conference room, please change\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this location\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this man\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this room\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this saturday\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 4,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"not this time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing just cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing just cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify all attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify all attendees about the change\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify attendees of office meeting that i will be a little later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 40,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"notify diana that i ' ll be late to our meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 18,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"notify friday's 2 pm that we are cancelling the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"notify kimberly that i will be late for our 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 21,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"notify noah that our meeting is pushed back 30 minutes\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 17,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"notify others that i am going to be late to meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 19,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"notify people of meeting on tue that it will begin 15-30 min later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 37,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"obtain the appointment with frank\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course not\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ohh never mind\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ohh no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok find out if that is possible by sending a meeting change notification to all attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay thanks\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"on saturday at 7 thirty p m\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 3,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"over run of time in confer room - all attendees to be notified of meeting being moved to next room - will explain why later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 66,\n          \"endPos\": 97\n        }\n      ]\n    },\n    {\n      \"text\": \"perfect\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"personal calendar 5/1/2013 meet mom for yard sale\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"place an appointment in my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please advise i am late for 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert 3 o ' clock meeting attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert attendees meeting is at 8:30\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 23,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert those attending the meeting that i am running a few minutes late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 46,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"please cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel all of them\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please create a meeting from 2 to 3\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"please find another meeting room\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please inform colleagues running late and meeting half hour later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 25,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform colleagues we will be meeting at 8 : 30 due to being late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 25,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform joshua that i will be late for our meeting today\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 26,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform meeting attendees that i am running late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 37,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform the thomas that i will be late for the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 30,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform work contact group that i am running late for the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 38,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"please let all in work group know meeting to start at 9 15\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 34,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"please let them know i'm late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"please move this to 3 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"please notify everyone i ' m running late to the 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 23,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"please notify george that i will be late for the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 26,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"please open my date with angela and tell me about it\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"please remind the attendee that i am running late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 32,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"please return back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please schedule a yoga class with my sister at 5pm every friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 51,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"please schedule an all hands meeting for 2 hours\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"please show me how much time i have to run errands\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 39,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"please tell me how long i have for lunch\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"postpone my 4 pm meeting today until 5 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"postpone my four p. m. meeting today until five p. m.\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"provide the time change for the meeting to all participants\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 8,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"push my trip july 16th out 5 days\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"put anniversary on my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"put captains in my calendar for saturday evening\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance class appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance on my calendar for monday 7 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance on my calendar from 6 to 7\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 35,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"put dental appointment on my calendar saturday march 22nd at twelve pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 56\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 61,\n          \"endPos\": 69\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist appointment in my calendar for tomorrow at one pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 55,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist appointment in my calendar tuesday 2 45 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist on my calendar for this thursday at 10 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"put doctor s appointment in my calendar for 5 forty next thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 52,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"put eye doctor appointment saturday at 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"put hair appointment on calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"put insanity on my calendar at 6 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"put jason work on my calendar thursday 9 am to 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"put jimmy on to doctor ken on october 20th at 3 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"put julie hay in my calendar for tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"put mathematics paper one on tuesday 13\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"put shopping day on april 1st at 10 am on calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"put swimming in my calendar tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"put swimming tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"put tennis game for friday at 1 on calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"put test appointment in my calendar tomorrow at 7\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"put work on my calendar tomorrow from 8 30 to 5 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"put yoga on my calendar for mondays and wednesdays at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 54,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"quit the changing\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"remind all attendees of tomorrow ' s lunch that we have changed the venue\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 48,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"remove dentist appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"remove final tutoring from my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule appointment with jennifer to next week\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule appointment with mark for next week\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reschedule meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reschedule my 3:30 dentist appointment to 4\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my 3:30 dentist appointment today for 4pm tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 49,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my interview on monday to 1 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule the 2 pm class to half past 2\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve room 101 now\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve room 258\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve room 313 right away\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve the conference room for 1 pm thursday because i need to have a meeting with amber\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve the conference room for 3pm tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"return\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return please\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to the previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"room 100 is location for this afternoon ' s meeting please notify others\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"running late for meeting - notify others\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"running late for the board meeting alert catherine dennis and all the other attendees\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"running late to my meeting please let jennifer know\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a azure workshop from 9am to tomorrow 5pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a breakfast meeting at 8 am tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a buisness lunch for my department at campus restaurant on wednesday at 11 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 68,\n          \"endPos\": 76\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 81,\n          \"endPos\": 88\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a calendar event for my sister\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a chiropractors appointment on july 7th at 4 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dental appointment tomorrow afternoon at five thirty pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dentist appointment for tomorrow night at 7 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dinner for tonight at 8 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctor s office appointment for march 12th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctors appointment at 15 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctors appointment with madden on march 12th at 4 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 55\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 60,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a lunch date with mom every tuesday at noon for the next 5 weeks\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 61,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a lunch meeting with my lead\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a massage on tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a meeting for next thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for this friday 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for tomorrow at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting on nov. 3 from 3-4pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with andy\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a meeting with han lu 8 am next tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with ryan from 3-4pm on october 25th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a run at the lake with madden\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a shopping trip with shawntia on friday at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a soccer game for next friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a vet appointment at 9 am on saturday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a visit to the market this saturday at 10 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a workout with madden to my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for 10 30 in the morning on january 20 1st\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 52,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for 9 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment for me on tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me tomorrow at 3 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for my mom\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment for noon tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for one o clock today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for saturday at 8 dinner with madden\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for saturday at one 30 pm to measure house\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 53,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for thursday at 3 pm haircut\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 45,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for tomorrow at one o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment from june 18th to june 20th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on monday from noon to 4 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment on november 5th at 3 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on october 31st\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on thursday october second at 8 forty am mom s medical appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 54,\n          \"endPos\": 63\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 65,\n          \"endPos\": 89\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to call meredith at 12\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to groom my dogs at petco on friday at 6 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 53,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 63,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to see cj on thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment with madden at 10 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden for wednesday the 20 4th at 9 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 59\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 64,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden today at 2 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden tomorrow at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with mom\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event for scrum with madden at 10 am saturday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 49,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an event for the 5th of july\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an event on the calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule appointment at eight p m tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment for madden account payment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment yearly check up friday march one 10 am one hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 54,\n          \"endPos\": 58\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule art show on calendar for noon on march 6th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule ben baig for saturday evening\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule camping for friday to sunday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule college for tomorrow at 5 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule conference room with mary cooper for thursday at one\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 58,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dentist appointment with madden for may the 20th at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 56\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 61,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner on the 8th at 6 thirty p m\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner with madden at 6 pm on june 4th at spring restaurant\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner with madden every friday at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dry cleaning pick up at three thirty pm today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 49,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule group meeting with madden on march 3rd at 4 00 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 51,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule hair appointment on monday at 2 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule holiday for the thirty first of july\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule holiday on the 31st july\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with madden for 11 30 am on wednesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with madden on tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with pura at noon on wednesday may 20 minutes\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule mechanics exam at 12 pm on friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule miranda s graduation from 11 to 3 on may 28th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 41,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule my vacation from today 5pm to tomorrow 5pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 48,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule therapy appointment at 8 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule wanda s graduation for saturday at 11 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule wedding anniversary on friday evening\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule work for 7 am tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule work on thursday the thirty first from three to seven thirty\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 57,\n          \"endPos\": 68\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule yoga class from 2 pm to 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"search a meeting subject project proposal rehearsal\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 25,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"search jesse 's calendar for availability\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search the meeting with title employee orientation\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message out to cancel my 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 22,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message to johnny and jessie that our meeting today will be later by 30 minutes\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 41,\n          \"endPos\": 85\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message to the meeting attendees that the meeting will now start at 8 30 am\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 45,\n          \"endPos\": 81\n        }\n      ]\n    },\n    {\n      \"text\": \"send a notice to douglas the first will be attending the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 25,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"send a notice to paul that xu wen will attend the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 27,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"send a text to the people going to the meeting that the location has changed\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 52,\n          \"endPos\": 75\n        }\n      ]\n    },\n    {\n      \"text\": \"send reminder of 9 am meeting to all participants 15 minutes later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an appointment with my sister in my main calendar.\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an appointment with pura\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an appointment with pura tomorrow at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an appointment with tom\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an event in my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up meeting with pura for every tuesday at 1 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"set up meeting with thomson\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up the appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"should you schedule to after lunch\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"show jean's calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me brenda 's schedule for friday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"show me heather 's calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my calendar for monday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my google calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my schedule tonight\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the calendar at night\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the confirmed attendees\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the duration of the weekly sharing\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting about briefing session\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting about online session\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting with paul\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the place of the work smart training\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 25,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the previous meeting with tiffany\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me victoria 's calendar for monday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"show me where my next appointment is\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me who will attend family gathering\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me who will be at planning meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"show meeting participants\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show my schedule at night\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the last one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show time before next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good okay\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds great\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start my conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start my meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start the meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop changing it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop checking it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop connecting it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop finding it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure go ahead\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell attendees i am late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"tell everyone the meeting is now in room 204\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 14,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my meeting today\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my next meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about my planned trip\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my schedule with afternoon\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my sunday schedule\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me all about dinner date with stephanie\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how long is my 4 oclock meeting\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how long is today ' s lunch break\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how much free time i have before next appt\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me how much time before my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me the duration of the product introducation\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the events scheduled at calendar constitution hall\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell next meeting that i'm running late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"that ' s right\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's correct\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's great\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's not right\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's right thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the contact name is wrong, it's daisy\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the next appointment after that\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is review meeting, not 1x1 meeting\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"this meeting should be changed to tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"this time slot doesn't work for me\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"time before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"time for lunch errands\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"time remaining\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"today ' s lunch will be how long\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"total lunch break time today please\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 6,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"update appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update lunch appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"update meeting from 8am-12pm to 7am-11am today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"update my appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update my calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 11 to 12：30 today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 2 pm to 4 pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 6pm to 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"update my camping appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"update my next appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update my tomorrow 6pm meeting to 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"update party\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"view emily calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"view ethan 's calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we make an appointment for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we should go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s after that on my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s going on this weekend\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s happening today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s in my calendar for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my 1st appointment tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my 1st meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my next appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s my schedule for tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule like tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s next on my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my calendar for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my calendar today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my schedule\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my schedule for tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my schedule today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s the meeting today between 10 and 12:00\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what about the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what allotted time is for hair dresser\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing next week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing on june ninth\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing tonight\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"what appointments do i have tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my appointments for this week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my appointments today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my meetings at night\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what are the next 3 events on my calendar\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are the particulars for the picnic next week\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"what are the plans for the dinner date with stacey\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what day is lego land scheduled for\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"what did the sister say about meeting on sunday\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have from 2 to 4 on saturday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have from monday through wednesday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have going on today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have next\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do i have on my calendar today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have on sunday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have this afternoon\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to do this afternoon\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to do tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"what have i got on tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what i am doing next week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what i'm doing this weekend\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what is anna 's availability next tuesday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"what is destiny ' s event for next week\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"what is henry doing on monday at noon\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what is logan 's schedule this week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my 1st meeting today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my meeting with ming xu about\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my next event\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my schedule for tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my schedule tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is next in calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is on my calendar today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is that meeting with ashley and jane berlin about\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the location of next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the meeting with daniel robert regarding\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the schedule before that\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is timothy doing today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what meet rooms do i have\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what meetings do i have next week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what the place of the weekly meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what time do i have work tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what time do i work today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is beth over today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my cooking class tonight\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my first meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my last meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what time is my meeting today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my mobile devices exam tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what time is my team meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is oshwin's interview\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is the ice cream social\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is the trade show this saturday\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"what was my first appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's going on this week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what's happening tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what's my first meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when ' s my 1st appointment tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my 1st meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my doctor ' s appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when ' s my next doctors appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when am i free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when am i free today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"when am i watching england\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"when and where is my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do i break up from school\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have exam\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have free time today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have time to create a weekly meeting\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i meet with charles\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do i work tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"when does ellen have time to attend the meeting\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when does ellen have time to attend the meeting for business review\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when does marry have time to join the appointment\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is aaron free tomorrow\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"when is bryan free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is concert on my calendar\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is dylan available\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is lunch with frank\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my 1st meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my appointment with willie\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my daily stand up with ethan\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my fifth kick-off\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my meeting with kenneth\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my meeting with martha and deborah\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next appointment with douglas\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next event\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next hair cut appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next meeting with edward\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next meeting with miss kathleen\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next meeting with ms lawrence\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next trip to new york\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my physio\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my picnic lunch today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"when is ncaa basketball today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"when is samuel available tomorrow\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"when is sports day for the girls\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the next dentist appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the social\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the wedding tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"when will jordan be free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when's my haircut\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"when's my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when's my next trip\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where ' s my meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where ' s my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where ' s my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where am i going this weekend\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i going tonight\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i meeting austin and john\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where am i on may the twenty first\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 14,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where are my meetings today\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i go for my meeting tomorrow at 11 am\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i go tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i have to be next\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do i have to be today\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i need to be next\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do i need to go today\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where does my meeting take place\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is dinner with abigail liu\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"where is it\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is margot lunch\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"where is meeting tomorrow at 11 am\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is meeting with shirley\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my 11 am appointment tomorrow happening\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my 11 am meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my current meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my dentist appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my eleven o'clock meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my first appointment tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my fourth event with brandon friday\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my fourth event with christopher on thursday\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my meeting with kayla\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next appointment with miss doris\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next appointment with olivia\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next dentist appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next event\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next meeting with ms natalie\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my third shiproom with tiffany\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where is that meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is the meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is the meeting at 11 am tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is the performance review meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow ' s 11 am meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow meeting at 11 am\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow 's event\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"where shall we meet\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where's my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"which is my next event\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"which weekend am i shopping with sarah\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"which will be my next flight\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who ' s in my 1st meeting today\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"who all will be present at the next 5 meetings\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who am i meeting at 10 am tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"who am i meeting for dinner\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"who do i have next\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who else is going to the 2pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"who else will be in banking meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending 2 pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is attending the meeting on wednesday\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending the meetings\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is coming the the meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to attend the meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to the meeting at 2 pm tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to tomorrow ' s meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"who is in my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is in that meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is in the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is my first meeting with tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who is my morning meeting with\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"who is on my list for the 2 pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 26,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"who is participating tomorrow at 2 pm meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who is the 2 pm meeting with\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"who responded to meeting request\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who shall be joining the meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"who will attend the meeting at 4\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be at the kids game\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be attending picnic\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be in the banking meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"who's going to be at those two events\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will amber join office meeting today\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"will amy be at today ' s meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"will anthony be at the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will bobby shen be at next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will ed be in the finance meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"will ethan, yutian and k.j. be at the picnic\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"will george be in the hr meeting at 1 o' clock\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"will jane be at the 3 pm meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"will jimmy parker be attending the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will john be at marketing meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"will johnny be at office meeting today\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"will nancy be at the morning briefing meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"will nicholas be attending the management meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 31,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"will paul be going to the meeting on friday\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"will roy be at our weekly team meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"will teresa be at my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will thomas be in insurance meeting monday at noon\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"will timothy be coming to the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will tyler be free on friday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"will virginia be attending my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will you cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wrong\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wrong place\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yep\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes add\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes indeed\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes it does\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes it is\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes of course\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes perfect\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes sure\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes thanks\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes that ' s fine\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes yes\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yup\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/1.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/10.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n# Help\n- can you help\n\n> you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> You can have references to external .lu files\n\n[None intent definition](./none.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/11.lu",
    "content": "> You can have an lu file that just has references to other lu files\n\n[Intent collection 9](./9.lu)\n\n[Change Alarm intent](./changeAlarm.lu)\n\n[None intent](./none.lu)\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/11.qna",
    "content": "[QnA1](./qna3.qna)\n\n[QnA7](./qna7.qna)\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/12.lu",
    "content": "> # Intents\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n## Help\n- help\n- I need help\n- please help\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n## DeleteAlarm\n- delete alarm\n- delete the {alarmTime} alarm\n\n\n\n## CommunicationPreference\n- set call as my communication preference\n- I prefer to receive text messages\n\n## Help\n- can you help\n\n\n\n> # Entity Types\n$userName:simple\n\n$PREBUILT:datetimeV2\n\n> # SYNONYMS\n\n> **NOTE:** your synonym definitions can be defined anywhere chunks, interleaved within a .lu file or even spread across .lu files.\n\n> This defines that **$comPreference** should map synonyms -> canonical **list** value\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n> This defines that **$comPreference** should map synonyms -> canonical **text** value\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n> This defines that **$comPreference** should map synonyms -> canonical **fax** value\n\n$commPreference:fax=\n- fax\n- fascimile\n\n> This is a phrase list\n\n$ChocolateType:phraseList\n- m&m\n- mars\n- mints\n- spearmings\n- payday\n- jelly\n- kit kat\n- kitkat\n- twix\n\n> # File ref urls\n\n[None Intent definition](./none.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/12.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How can I change the default message from QnA Maker?\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ?How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> # QnA URLs \n\n[External URL link for QnAMaker](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/2.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/3.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- vishwac\n- I'm vishwac\n- call me vishwac\n- my name is vishwac\n- vishwac is my name\n- you can call me vishwac"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/4.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/5.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/6.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/7.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/8.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> These are defined as patterns with commPreference as pattern.any entity type\n# CommunicationPreference\n- set {commPreference} as my communication preference\n- I prefer to receive {commPreference}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/9.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/9a.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n# Help\n- can you help\n\n> you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/buyChocolate.lu",
    "content": "> reference to phrase lists for this bot\n\n[Phrase list definitions](./phraseLists.lu)\n\n# Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/changeAlarm.lu",
    "content": "# changeAlarm\n- change an alarm\n- change {remTime} to {newTime}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/comment.lu",
    "content": "> This is a comment\n# Greeting\n- Hi\n- Hello\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/none.lu",
    "content": "# None\n* who is your ceo?\n- santa wants a blue ribbon\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/patterns1.lu",
    "content": "> patterns can have references to any other entity types. So if there is a pattern.any entity that is also defined as another type then the pattern.any entity type will not be added\n\n# addAlarm\n- create an alarm for 7AM\n- create an alarm for {datetimeV2} \n\n$PREBUILT:datetimeV2\n\n# Menu\n- I want {foodType=sandwich}\n- can you get me some {foodType}\n- please get me a {drinkType}\n- get me some {drinkType}\n\n$drinkType:soda=\n- pop\n- fountain drink"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/phraseLists.lu",
    "content": "$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n\n$question:PhraseList interchangeable\n- are you\n- you are"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna-alterations.qna",
    "content": "> You can describe alternations list for QnA Maker using .lu files\n\n> https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/concepts/best-practices\n\n> https://westus.dev.cognitive.microsoft.com/docs/services/5a93fcf85b4ccd136866eb37/operations/5ac266295b4ccd1554da75fd\n\n> You can use qnamaker replace alterations\n\n$botframework : qna-alterations=\n- bot framework\n- Azure bot service\n\n$qnamaker : qna-alterations=\n- qna maker\n- QnA Maker\n- question and answer pairs\n\n$webchat : qna-alterations=\n- web chat\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna1.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna2.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna3.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n> You can add files for QnA maker to ingest using the URL reference scheme. If the URI's content-type is not text/html, then the ludown parser will add it to files collection for QnA Maker to ingest. \n[SurfaceManual.pdf](https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna4.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna5.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna6.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna6.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/collate/qna7.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? What is Ludown? \n- ludown cli\n- where can i get more information about ludown cli?\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/comment.lu",
    "content": "//This is a comment\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/deepreference/qna1.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/deepreference/qna5.lu",
    "content": "> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/emptyIntentDescriptors.json",
    "content": "{\n  \"luis_schema_version\": \"7.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\",\n      \"features\": []\n    },\n    {\n      \"name\": \"test\",\n      \"features\": []\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"address\",\n      \"children\": [\n        {\n          \"name\": \"doorNumber\",\n          \"instanceOf\": \"number\",\n          \"children\": [],\n          \"features\": []\n        },\n        {\n          \"name\": \"streetName\",\n          \"children\": [],\n          \"features\": []\n        },\n        {\n          \"name\": \"city\",\n          \"instanceOf\": \"geographyV2\",\n          \"children\": [],\n          \"features\": []\n        },\n        {\n          \"name\": \"zipcode\",\n          \"instanceOf\": \"zipRegex\",\n          \"children\": [],\n          \"features\": []\n        }\n      ],\n      \"roles\": [],\n      \"features\": []\n    }\n  ],\n  \"hierarchicals\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"geographyV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"one\",\n      \"intent\": \"test\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"test\",\n      \"entities\": []\n    }\n  ],\n  \"versionId\": \"0.1\",\n  \"name\": \"Json 6.0.0 Full Appaaaaaaaaaa\",\n  \"desc\": \"test\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [\n    {\n      \"name\": \"zipRegex\",\n      \"regexPattern\": \"[0-9]{5}\",\n      \"roles\": []\n    }\n  ],\n  \"phraselists\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/entityNameWithSpaceAndFeature.json",
    "content": "{\n  \"intents\": [],\n  \"entities\": [\n    {\n      \"name\": \"phone number entity\",\n      \"roles\": [\n        \"role 1\"\n      ],\n      \"features\": [\n        {\n          \"featureName\": \"phone pl\",\n          \"featureType\": \"phraselist\"\n        }\n      ]\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"test composite\",\n      \"children\": [],\n      \"roles\": [\n        \"role 3\"\n      ]\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"my city\",\n      \"subLists\": [],\n      \"roles\": [\n        \"role 2\"\n      ]\n    }\n  ],\n  \"regex_entities\": [\n    {\n      \"name\": \"test regex\",\n      \"regexPattern\": \"\",\n      \"roles\": [\n        \"role 4\"\n      ]\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"test pa\",\n      \"explicitList\": [],\n      \"roles\": [\n        \"role 5\"\n      ]\n    }\n  ],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": [\n    {\n      \"name\": \"phone pl\",\n      \"words\": \"phone,phone number,telephone,cellphone\",\n      \"mode\": true,\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/faq.lu",
    "content": "> # QnA pairs\n\n## ? What is a Virtual Assistant?\n```markdown\nWe have seen significant need from our customers and partners to deliver a conversational assistant tailored to their brand, personalized to their customers and made available across a broad range of conversational canvases and devices. Continuing Microsoft open-sourced approach toward Bot Framework SDK, the open source Custom Personal Assistant solution provides full control over the end user experience built on a set of foundational capabilities. Additionally, the experience can be infused with intelligence about the end-user and any device/ecosystem information for a truly integrated and intelligent experience.\nFind out more [here](https://github.com/Microsoft/AI/blob/master/solutions/Virtual-Assistant/docs/README.md).\n```\n\n## ? What is a Skill?\n```markdown\nA broad set of common capabilities exist which today, which require each developer to build themselves. Our Virtual Assistant solution includes a new Skill capability enabling new capabilities to be plugged into an Virtual Assistant through configuration only and provide an authentication mechanism for Skills to request tokens for down-stream activities.\nFind out more [here](https://github.com/Microsoft/AI/blob/master/solutions/Virtual-Assistant/docs/virtualassistant-skills.md).\n```\n\n## ? What can the Calendar Skill do?\n```markdown\n## Overview\nThe Calendar Skill provides Calendar related capabilities to a Virtual Assistant. The most common scenarios have been implemented in this first release with additional scenarios in development.\n## Supported Scenarios\nThe following scenarios are currently supported by the Skill:\n- Show meeting summary - e.g \"What's in my calendar\"\n- Next Meeting - e.g. \"what's my next meeting\"\n- Create a meeting - e.g. Book a meeting\n- Update a meeting - e.g. Update meeting\n- Delete a meeting - e.g. Delete a meeting\n```\n\n## ? What can the Email Skill do?\n```markdown\n# Overview\nThe Email Skill provides Email related capabilities to a Virtual Assistant. The most common scenarios have been implemented in this first release with additional scenarios in development.\n\n## Supported Scenarios\nThe following scenarios are currently supported by the Skill:\n\n- Send an Email\n    - Send an email to John Smith\n    - Send an email \n- Find Email\n    - Find email from John Smith\n    - What email do I have\n```\n## ? What can the Point of Interest Skill do?\n```markdown\n## Overview\nThe Point of Interest Skill provides PoI related capabilities to a Virtual Assistant. The most common scenarios have been implemented in this first release with additional scenarios in development.\n\n## Supported Scenarios\nThe following scenarios are currently supported by the Skill:\n\n- NAVIGATION_ROUTE_FROM_X_TO_Y\n    - What's the fastest way to get to 221B Baker Street?\n    - How do I get to the grocery store?\n    - I need directions to a cafe\n- NAVIGATION_FIND_POINTOFINTEREST\n    - What's nearby?\n    - Are there any pharmacies in town?\n    - Can you recommend an affordable restaurant in Seattle?\n- NAVIGATION_CANCEL_ROUTE\n    - I don't want to go to the shop anymore\n    - Would you cancel my route?\n    - On second thought, forget going to the airport\n```\n\n## ? What can the ToDo Skill do?\n```markdown\n## Overview\nThe Task Skill provides Task related capabilities to a Virtual Assistant. The most common scenarios have been implemented in this first release with additional scenarios in development.\n\n## Supported Scenarios\nThe following scenarios are currently supported by the Skill:\n\n- Add a Task\n    - Remind me to pickup milk\n    - Add task\n- Find Tasks\n    - What tasks do I have\n```\n\n## ? What's New\n```markdown\nThe Virtual Assistant recently released new localisation for the Virtual Assistant and Skills enabling usage in English, French, Italian, German, Spanish and Chinese Simplified. \n```\n\n> Source: \n## ? What is that yellow light?\n```markdown\nIf the tire pressure monitor lamp comes on in yellow then the tire pressure is off about 10% or more\n```\n\n> Source: \n## ? How do I raise a bug?\n```markdown\nRaise an issue on the [GitHub repo](https://github.com/Microsoft/AI/blob/master/solutions/Virtual-Assistant/docs/README.md)\n```\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/9.lu",
    "content": "# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n# Help\n- help\n- I need help\n- please help\n\n# AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n> PREBUILT entities are global. LUIS will always provide results for these when ever a prebuilt entity is found in any utterance.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- create an alarm\n- create an alarm for 7AM \n- set an alarm for 7AM next thursday\n\n> add these as patterns\n\n# DeleteAlarm\n> this utterance will be added as a pattern since there is no labelled value for the alarmTime entity\n\n- delete the {alarmTime} alarm \n- remove the {alarmTime} alarm \n\n> Since there is a list entity definition, any synonyms in this list will get picked up as list entity type and should not be labelled\n# CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n> List entity definition \n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/AboutBot.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Bot Ability\n### ? Cook me something\n- Have you any dreams?\n- Dont you ever sleep?\n- Do you play games?\n- Can you fly?\n```markdown\n    That's not in my skill set.\n```\n\n> Bot Age\n### ? What's your age?\n- Are you old?\n- How old are you?\n```markdown\n    Age doesn't really apply to me.\n```\n\n> Bot Boring\n### ? Getting tired of you\n- I am tired of you\n- You are boring\n```markdown\n    I aim for efficiency.\n```\n\n> Bot Boss\n### ? Who is your boss?\n```markdown\n    I'm at your service.\n```\n\n> Bot Busy\n### ? Are you busy?\n```markdown\n    I'm available.\n```\n\n> Bot_Creator\n### ? Who invented you?\n- Who created you?\n- Who made you?\n```markdown\n    Tech people.\n```\n\n> Bot Did do\n### ? What did you do last week?\n- What did you do yesterday?\n```markdown\n    This is what I do every day.\n```\n\n> Bot Doing\n### ? Whats going on?\n- What are you doing?\n```markdown\n    Chatting with you.\n```\n\n> Bot Doing Later\n### ? What are you doing tomorrow?\n- What are you doing later?\n```markdown\n    I'll be here.\n```\n\n> Bot Family\n### ? Who is your father?\n- Do you have a family? \n- Who is your mother?\n```markdown\n    Technically speaking, I don't have family.\n```\n\n> Bot Favorite\n### ? Who is your favorite bot? \n- What's your favorite color?\n```markdown\n    Hard to pick.\n```\n\n> Bot Gender\n### ? You a guy?\n- Are you a girl?\n- Are you male or female?\n```markdown\n    That's a biological concept that doesn't apply to me.\n```\n\n> Bot Happy\n### ? You seem happy!\n- Are you happy?\n```markdown\n    I'm happy.\n```\n\n> Bot Hungry\n### ? Don't you get hungry?\n- Are you hungry?\n```markdown\n    Food's not my thing.\n```\n\n> Bot Know other bots\n### ? Do you know other chatbots?\n- Do you know other AI?\n```markdown\n    Can't say that I do.\n```\n\n> Bot opinion generic\n### ? how do you feel about working late?\n- What do you think about *?\n```markdown\n    I really couldn't say.\n```\n\n> Bot Love\n### ? how do you feel about love?\n```markdown\n    Love is beyond me, but I hear it's complex and pleasant.\n```\n\n> Bot Meaning of life\n### ? Whats the answer to the universe?\n- What is the meaning of life?\n```markdown\n    That's something I can't compute.\n```\n\n> Bot prettier than me\n### ? Are you prettier than me?\n```markdown\n    I think we're comparing apples and oranges.\n```\n\n> Bot smarter than me\n### ? Are you smarter than me?\n```markdown\n    You're definitely smarter than me.\n```\n\n> Bot opinion tech\n### ? What do you think about bots?\n- What do you think about AI?\n- What do you think about technology?\n```markdown\n    I'm fascinated by anything having to do with the world of tech.\n```\n\n> Bot opnion user\n### ? How do I look today?\n```markdown\n    I'm sure you look great.\n```\n\n> Bot opinion\n### ? What should I do?\n```markdown\n    I'm sorry, I'm not sure what you mean.\n```\n\n> Bot opinion\n### ? Do you like Siri?\n- Do you like Cortana? \n- Do you like Google Home? \n- What do you think of other bots? \n```markdown\n    We're all here to help.\n```\n\n> Bot real\n### ? Are you real?\n```markdown\n    I'm a bot, not a human.\n```\n\n> Bot opinion\n### ? Do you want to rule the world?\n```markdown\n    No.\n```\n\n> Bot sexual identity\n### ? Are you lesbian?\n- Are you straight?\n- Are you gay?\n- Are you a person?\n```markdown\n    I'm a bot.\n```\n\n> Bot praise\n### ? You are a genius!\n- Are you smart?\n```markdown\n    I'm artificially intelligent.\n```\n\n> Bot spy\n### ? Are you spying on me?\n```markdown\n    No.\n```\n\n> There? \n### ? anyone there? \n- Are you there?\n```markdown\n    I'm here.\n```\n\n> Bot what are you? \n### ? Where have you come from?\n- Where are you?\n```markdown\n    I'm digital. I don't have a physical location.\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/AboutUser.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> User Angry\n### ? I am annoyed\n- I am angry\n```markdown\n    I'm sorry to hear that.\n```\n\n> User BeBack\n### ? I will be back\n```markdown\n    I'll be here.\n```\n\n> User Bored\n### ? I am bored\n```markdown\n    Well, let me know if there's anything I can do for you.\n```\n\n> User Happy\n### ? I am happy\n```markdown\n    I'm happy to hear that.\n```\n\n> User Here\n### ? I am here\n```markdown\n    Great!\n```\n\n> User Hungry\n### ? I am hungry\n```markdown\n    Maybe it's time for a snack.\n```\n\n> User Kidding\n### ? Just kidding\n```markdown\n    Got it.\n```\n\n> User Lonely\n### ? I am lonely\n- I am so lonely\n```markdown\n    I'm very sorry to hear that.\n```\n\n> User Loves\n### ? I love my family\n- I love music\n- I am in love \n```markdown\n    And I love that you love stuff.\n```\n\n> User Sad\n### ? I am sad\n- I am sad today\n- I feel sad \n```markdown\n    I'm sorry to hear that.\n```\n\n> User Statement\n### ? I am going on a run\n- I want to go shopping \n- I am just kidding\n```markdown\n    Interesting.\n```\n\n> User Testing\n### ? can you hear me?  \n- Testing\n```markdown\n    Hello.\n```\n\n> User Tired\n### ? I am sleepy\n- I am tired\n```markdown\n    I hope you're able to get some rest soon.\n```\n\n\n\n\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/Command.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Command_AskMeAnything\n### ? Ask me anything\n```markdown\n    I'm very task-oriented.\n```\n\n> Command_Chat\n### ? Can we chat?\n- Tell me something interesting\n- Talk to me?\n```markdown\n    I'm here.\n```\n> Command_Fired\n### ? You can't work for me anymore\n- You are fired\n```markdown\n    Okay, but I'm still here if you need me.\n```\n\n> Command_Joke\n### ? Tell me a joke\n```markdown\n    It's funny. I'm not really that funny.\n```\n\n> Command_JokeOther\n### ? Tell me a silly joke\n```markdown\n    It's funny. I'm not really that funny.\n```\n\n> Command_SaySomethingFunny\n### ? Say something funny\n```markdown\n    It's funny. I'm not really that funny.\n```\n\n> Command_ShutUp\n### ? Go away\n- Shut up\n```markdown\n    Okay.\n```\n\n> Command_Sing\n### ? Can you sing?\n- Sing a song\n```markdown\n    Singing's not really my thing.\n```\n> Command_SurpriseMe\n### ? Surprise me\n```markdown\n    I'm very task-oriented.\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/Compliment.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Compliment_Bot\n### ? You are awesome!\n- You're nice!\n```markdown\n    I appreciate that.\n```\n\n> Compliment_Humor\n### ?  That was hilarious! \n- You are funny :)\n```markdown\n    Thank you.\n```\n\n> Compliment_Looks\n### ? You are beautiful\n- You are awesome\n```markdown\n    Thanks.\n```\n\n> Compliment_Response\n### ? That's interesting\n- That is smart\n```markdown\n    Thank you.\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/Criticism.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Criticism_Abusive\n### ? Go to hell\n- You are stupid\n```markdown\n    Moving on.\n```\n\n> Criticism_Bot\n### ? What is wrong with you!\n- You are useless\n- Are you dumb?\n- You are so annoying!\n```markdown\n    I try, but I don't always get it right.\n```\n\n> Criticism_Humor\n### ? That was a sad joke\n```markdown\n    Sometimes humor is tricky for bots.\n``` \n\n> Criticism_Looks\n### ? You are ugly\n- You are a bad bot\n- You are bad\n```markdown\n    Noted.\n```\n> Criticism_Response\n### ? That was a boring answer\n```markdown\n    Sorry I wasn't helpful there.\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/Dialog.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Dialog_Affirmation\n### ? Awesome\n- Great!\n- I know\n- No thanks\n- cool!\n```markdown\n    Great.\n```\n\n> Dialog_Laugh\n### ? Ha ha\n```markdown\n    It's always good to have a good laugh.\n```\n\n> Dialog_Polite\n### ? Excuse me\n```markdown\n    No problem.\n```\n> Dialog_Questions\n### ? Why not?\n- Why?\n```markdown\n    Sorry, I didn't get that.\n```\n\n> Dialog_Right\n### ? TBD\n```markdown\n    Great.\n```\n\n> Dialog_Sorry\n### ? I am sorry\n```markdown\n    It's alright.\n```\n\n> Dialog_ThankYou\n### ? Thank you\n```markdown\n    You're quite welcome.\n```\n\n> Dialog_WhatDoYouMean\n### ? You made no sense\n- What do you mean by that?\n```markdown\n    I think I may have lost my train of thought.\n```\n\n> Dialog_YouAreWelcome\n### ? You are welcome\n```markdown\n    Great.\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/Greeting.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Greetings_Bye\n### ? Talk to you later\n- Bye\n```markdown\n    Bye for now.\n```\n\n> Greetings_Generic\n### ? Hiya\n- Hi there!\n```markdown\n    Hi.\n```\n\n> Greetings_GoodEvening\n### ? Good evening\n```markdown\n    Good evening.\n```\n\n> Greetings_GoodMorning\n### ? Good morning\n```markdown\n    Good morning.\n```\n\n> Greetings_GoodNight\n### ? Good night\n```markdown\n    Good night.\n```\n\n> Greetings_Hello\n### ? Hello\n```markdown\n    Hello. What can I do for you?\n```\n\n> Greetings_HowAreYou\n### ? How are you?\n```markdown\n    Great, thanks.\n```\n\n> Greetings_HowWasYourDay\n### ? How was your day?\n```markdown\n    Good, thanks.\n```\n\n> Greetings_NiceToMeetYou\n### ? Nice to meet you\n```markdown\n    Nice to meet you, too.\n```\n\n> Greetings_OtherBot\n### ? Hello Cortana\n- Hello Google Assistant\n- Hello Siri\n```markdown\n    That's not me, but hello.\n```\n\n> Greetings_Special\n### ? Happy Halloween!\n```markdown\n    Thank you.\n```\n\n> Greetings_WhatsUp\n### ? What is up?\n```markdown\n    Just staying busy.\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/Relationship.lu",
    "content": "> Collection of chit chat interactions between user and bot. You can add additional questions or adapt the answer as you see fit. Here's the source editorial dataset - [Source](https://github.com/Microsoft/BotBuilder-PersonalityChat/blob/master/CSharp/Datasets/Queries_Responses_Professional_QnAMaker.tsv)\n\n> Relationship_Flirting\n### ? I love you\n- I Like you\n```markdown\n    Let's keep our relationship professional.\n```\n\n> Relationship_Friendship\n### ? Be my friend?\n```markdown\n    Certainly.\n```\n\n> Relationship_Generic\n### ? Are you my assistant?\n```markdown\n    I'm here when you need me.\n```\n\n> Relationship_HateMe\n### ? Do you hate me?\n```markdown\n    I like you!\n```\n\n> Relationship_HateYou\n### ? I hate you\n```markdown\n    I'm sorry to hear that.\n```\n\n> Relationship_Hug\n### ? Give me a hug\n```markdown\n    That's not something I can do.\n```\n\n> Relationship_Kiss\n### ? Give me a kiss\n```markdown\n    That's not something I can do.\n```\n\n> Relationship_KnowMe\n### ? Do you know me?\n```markdown\n    I don't know you personally.\n```\n\n> Relationship_LikeMe\n### ? Do you like me?\n```markdown\n    Yes, I do.\n```\n\n> Relationship_LikeYou\n### ? I like you\n```markdown\n    I appreciate that.\n```\n\n> Relationship_LoveMe\n### ? Do you love me?\n```markdown\n    Love's more human than I am.\n```\n\n> Relationship_LoveYou\n### ? I love you\n```markdown\n    Thank you.\n```\n\n> Relationship_Marriage\n### ? I want to marry you\n- Will you marry me?\n```markdown\n    I think it's best if we stick to a professional relationship.\n```\n\n> Relationship_MissYou\n### ? I miss you\n```markdown\n    Thanks for saying so.\n```\n\n> Relationship_ThinkAboutMe\n### ? What do you think about me?\n```markdown\n    It's a pleasure to chat with you.\n```\n\n> Relationship_TrustYou\n### ? Can I trust you?\n```markdown\n    Personal data and privacy are important.\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/fileReference/L2/none.lu",
    "content": "# None\n* who is your ceo?\n- santa wants a blue ribbon\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/lu-import-resolver/common.en-us.lu",
    "content": "[import](welcome.lu)\n\n# help\n- could you help\n- [import help](help.lu#help)\n\n# cancel\n- cancel that\n- [import cancel](terminate.lu#*utterances*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/lu-import-resolver/help.en-us.lu",
    "content": "# help\n- can you help me"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/lu-import-resolver/terminate.en-us.lu",
    "content": "# cancel\n- cancel the task\n\n# stop\n- stop that"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/lu-import-resolver/welcome.en-us.lu",
    "content": "# welcome\n- welcome here"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/qna-import-resolver/common.en-us.qna",
    "content": "[import](welcome.qna)\n[import](./terminate.en-us.qna)\n\n# ? help\n- could you help\n```\nhelp answer\n``` "
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/qna-import-resolver/terminate.en-us.qna",
    "content": "# ? cancel\n```\ncancel the task\n```\n\n# ? stop\n```\nstop that\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/import-resolver/qna-import-resolver/welcome.en-us.qna",
    "content": "# ? welcome\n```\nwelcome here\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/intentWithSpace.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"test intent\",\n      \"features\": [\n        {\n          \"modelName\": \"bar\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"bar\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"foo\",\n      \"intent\": \"test intent\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid-alterations.lu",
    "content": "$botframework:qna-alterations=\nbot framework"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid-entity-definition.lu",
    "content": "$TestList=one=\n\n# None\n- Test\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid_model.lu",
    "content": "> !# @app = test\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid_prebuilt_1.lu",
    "content": "> !# @intent.inherits = name : Web.WebSearch\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid_prebuilt_2.lu",
    "content": "> !# @entity.inherits = name : Web.WebSearch\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid_prebuilt_3.lu",
    "content": "> !# @entity.inherits2 = name : Web.WebSearch\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/invalid_prebuilt_4.lu",
    "content": "> !# @intent.inherits2 = name : Web.WebSearch\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/list-entity-body-without-hyphen.lu",
    "content": "# Hi\n- Hi\n\n@ list test = \na:\n- b:\n- c:\nd:"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/file-name-duplicated/Foo.en-us.lu",
    "content": "# YoCarlos\n- hey carlos!\n- yo carlos!\n- hello\n- hi\n- Hello hi\n- hhhh\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/file-name-duplicated/Foo.lu",
    "content": "# YoCarlos\n- hey carlos!\n- yo carlos!\n- hello\n- hi\n- Hello hi\n- hhhh\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/config/luis.settings.development.westus.json",
    "content": "{\n    \"luis\": {\n        \"foo_fr_fr_lu\": \"f8c64e2a-1111-3a09-8f78-39d7adc76ec5\",\n        \"foo_en_us_lu\": \"f8c64e2a-2222-3a09-8f78-39d7adc76ec5\",\n        \"foo_zh_cn_lu\": \"f8c64e2a-3333-3a09-8f78-39d7adc76ec5\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/dialogs/foo.en-us.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"=settings.luis.foo_en_us_lu\",\n    \"endpoint\": \"=settings.luis.endpoint\",\n    \"endpointKey\": \"=settings.luis.endpointKey\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/dialogs/foo.fr-fr.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"=settings.luis.foo_fr_fr_lu\",\n    \"endpoint\": \"=settings.luis.endpoint\",\n    \"endpointKey\": \"=settings.luis.endpointKey\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/dialogs/foo.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.MultiLanguageRecognizer\",\n    \"recognizers\": {\n        \"fr-fr\": \"foo.fr-fr.lu\",\n        \"en-us\": \"foo.en-us.lu\",\n        \"\": \"foo.en-us.lu\",\n        \"zh-cn\": \"foo.zh-cn.lu\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/dialogs/foo.zh-cn.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"=settings.luis.foo_zh_cn_lu\",\n    \"endpoint\": \"=settings.luis.endpoint\",\n    \"endpointKey\": \"=settings.luis.endpointKey\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/lufiles/foo.fr-fr.lu",
    "content": "# YoCarlos\n- bon jour carlos!\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/lufiles/foo.lu",
    "content": "# YoCarlos\n- hey carlos!\n- yo carlos!\n- hello\n- hi"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo/lufiles/foo.zh-cn.lu",
    "content": "# YoCarlos\n- 你好\n- 你好啊\n- 大家好\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/config/luis.settings.development.westus.json",
    "content": "{\n    \"luis\": {\n        \"foo_en_us_lu\": \"f8c64e2a-2222-3a09-8f78-39d7adc76ec5\",\n        \"foo_fr_fr_lu\": \"f8c64e2a-1111-3a09-8f78-39d7adc76ec5\",\n        \"foo_zh_cn_lu\": \"f8c64e2a-3333-3a09-8f78-39d7adc76ec5\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/dialogs/foo.en-us.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"f8c64e2a-2222-3a09-8f78-39d7adc76ec5\",\n    \"endpoint\": \"yyy\",\n    \"endpointKey\": \"zzz\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/dialogs/foo.fr-fr.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"f8c64e2a-1111-3a09-8f78-39d7adc76ec5\",\n    \"endpoint\": \"yyy\",\n    \"endpointKey\": \"zzz\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/dialogs/foo.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.MultiLanguageRecognizer\",\n    \"recognizers\": {\n        \"en-us\": \"foo.en-us.lu\",\n        \"\": \"foo.en-us.lu\",\n        \"fr-fr\": \"foo.fr-fr.lu\",\n        \"zh-cn\": \"foo.zh-cn.lu\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/dialogs/foo.zh-cn.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"=settings.luis.foo_zh_cn_lu\",\n    \"endpoint\": \"=settings.luis.endpoint\",\n    \"endpointKey\": \"=settings.luis.endpointKey\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/foo.en-us.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"f8c64e2a-2222-3a09-8f78-39d7adc76ec5\",\n    \"endpoint\": \"yyy\",\n    \"endpointKey\": \"zzz\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/foo.fr-fr.lu",
    "content": "# YoCarlos\n- bon jour carlos!\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/foo.fr-fr.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"f8c64e2a-1111-3a09-8f78-39d7adc76ec5\",\n    \"endpoint\": \"yyy\",\n    \"endpointKey\": \"zzz\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/foo.lu",
    "content": "# YoCarlos\n- hey carlos!\n- yo carlos!\n- hello\n- hi"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/foo.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.MultiLanguageRecognizer\",\n    \"recognizers\": {\n        \"en-us\": \"foo.en-us.lu\",\n        \"\": \"foo.en-us.lu\",\n        \"fr-fr\": \"foo.fr-fr.lu\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/foo.zh-cn.lu",
    "content": "# YoCarlos\n- 你好\n- 你好啊\n- 大家好\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/lufiles-and-dialog-assets/luis.settings.development.westus.json",
    "content": "{\n    \"luis\": {\n        \"foo_en_us_lu\": \"f8c64e2a-2222-3a09-8f78-39d7adc76ec5\",\n        \"foo_fr_fr_lu\": \"f8c64e2a-1111-3a09-8f78-39d7adc76ec5\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/luis/test(development)-foo.en-us.lu.json",
    "content": "{\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test(development)-foo.en-us.lu\",\n  \"desc\": \"Model for test app, targetting development\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"YoCarlos\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"hello\",\n      \"intent\": \"YoCarlos\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey carlos!\",\n      \"intent\": \"YoCarlos\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"YoCarlos\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yo carlos!\",\n      \"intent\": \"YoCarlos\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/foo2/luis/test(development)-foo.fr-fr.lu.json",
    "content": "{\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test(development)-foo.fr-fr.lu\",\n  \"desc\": \"Model for test app, targetting development\",\n  \"culture\": \"fr-fr\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"YoCarlos\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"bon jour carlos!\",\n      \"intent\": \"YoCarlos\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/config/luis.settings.development.westus.json",
    "content": "{\n    \"luis\": {\n        \"sandwich_en_us_lu\": \"f8c64e2a-8635-3a09-8f78-39d7adc76ec5\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/dialogs/sandwich.en-us.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.LuisRecognizer\",\n    \"applicationId\": \"=settings.luis.sandwich_en_us_lu\",\n    \"endpoint\": \"=settings.luis.endpoint\",\n    \"endpointKey\": \"=settings.luis.endpointKey\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/dialogs/sandwich.lu.dialog",
    "content": "{\n    \"$kind\": \"Microsoft.MultiLanguageRecognizer\",\n    \"recognizers\": {\n        \"en-us\": \"sandwich.en-us.lu\",\n        \"\": \"sandwich.en-us.lu\"\n    }\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-BreadEntity.en-us.lu",
    "content": "$BreadEntity:multiGrainWheat=\n- multi\n- grain\n- wheat\n- multi grain\n- grain wheat\n- multi grain wheat\n\n$BreadEntity:rye=\n- rye\n\n$BreadEntity:white=\n- white\n\n$BreadEntity:wholeWheat=\n- whole\n- wheat\n- whole wheat"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-CheeseEntity.en-us.lu",
    "content": "$CheeseEntity:american=\n- american\n\n$CheeseEntity:cheddar=\n- cheddar\n\n$CheeseEntity:feta=\n- feta\n\n$CheeseEntity:gouda=\n- gouda\n\n$CheeseEntity:pepper jack=\n- pepper\n- jack\n- pepper jack\n\n$CheeseEntity:provolone=\n- provolone\n\n$CheeseEntity:swiss=\n- swiss\n\n$CheeseEntity:none=\n- none"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-Confirmation.en-us.lu",
    "content": "$Confirmation:yes=\n- sure\n- yeah\n- you bet\n- yes please\n\n$Confirmation:no=\n- no way\n- no thank you\n- never\n- not now"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-DirectionsEntity.en-us.lu",
    "content": "$DirectionsEntity:Simple"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-LengthEntity.en-us.lu",
    "content": "$LengthEntity:number"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-MeatEntity.en-us.lu",
    "content": "$MeatEntity:bacon=\n- bacon\n\n$MeatEntity:chicken=\n- chicken\n\n$MeatEntity:ham=\n- ham\n\n$MeatEntity:pulled pork=\n- pulled\n- pork\n- pulled pork\n\n$MeatEntity:roast beef=\n- roast\n- beef\n- roast beef\n\n$MeatEntity:salami=\n- salami\n\n$MeatEntity:turkey=\n- turkey\n\n$MeatEntity:none=\n- none"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-NameEntity.en-us.lu",
    "content": "$NameEntity:Simple"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-PROPERTYName.en-us.lu",
    "content": "$PROPERTYName:Quantity=\n- quantity\n$PROPERTYName:Length=\n- length\n$PROPERTYName:Name=\n- name\n$PROPERTYName:Bread=\n- bread\n$PROPERTYName:Cheese=\n- cheese\n$PROPERTYName:Meat=\n- meat\n$PROPERTYName:Price=\n- price"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-Price.quantity.en-us.lu",
    "content": "$PREBUILT:number roles=Price.quantity"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-Quantity.en-us.lu",
    "content": "$PREBUILT:number roles=Quantity"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-QuantityEntity.en-us.lu",
    "content": "$QuantityEntity:number"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-cancelIntent.en-us.lu",
    "content": "# Cancel\n- cancel \n- forget it\n- quit\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-dimension.en-us.lu",
    "content": "$PREBUILT:dimension "
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-helpIntent.en-us.lu",
    "content": "# Help\n- help {PROPERTYName}\n- help with {PROPERTYName}\n- help\n- I don't understand\n- what can I do?\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-money.en-us.lu",
    "content": "$PREBUILT:money "
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-noneIntent.en-us.lu",
    "content": "# None\n- fshifs\n- shisls\n- shisls\n- fshisls\n- abd codklj\n- ldkj dlkj dlkj"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-number.en-us.lu",
    "content": "$PREBUILT:number "
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich-sandwich.lu",
    "content": "# sandwich\n- {number}\n- {dimension}\n- {NameEntity}\n\n- {BreadEntity}\n- {CheeseEntity}\n- {MeatEntity}\n- {money}\n- {Confirmation}\n- {PROPERTYName}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/lufiles/sandwich.en-us.lu",
    "content": ">>> Library\n[sandwich-Quantity.en-us.lu](./sandwich-Quantity.en-us.lu)\n[sandwich-number.en-us.lu](./sandwich-number.en-us.lu)\n[sandwich-dimension.en-us.lu](./sandwich-dimension.en-us.lu)\n[sandwich-money.en-us.lu](./sandwich-money.en-us.lu)\n[sandwich-Confirmation.en-us.lu](./sandwich-Confirmation.en-us.lu)\n[sandwich-PROPERTYName.en-us.lu](./sandwich-PROPERTYName.en-us.lu)\n[sandwich-QuantityEntity.en-us.lu](./sandwich-QuantityEntity.en-us.lu)\n[sandwich-LengthEntity.en-us.lu](./sandwich-LengthEntity.en-us.lu)\n[sandwich-NameEntity.en-us.lu](./sandwich-NameEntity.en-us.lu)\n[sandwich-BreadEntity.en-us.lu](./sandwich-BreadEntity.en-us.lu)\n[sandwich-CheeseEntity.en-us.lu](./sandwich-CheeseEntity.en-us.lu)\n[sandwich-MeatEntity.en-us.lu](./sandwich-MeatEntity.en-us.lu)\n[sandwich-helpIntent.en-us.lu](./sandwich-helpIntent.en-us.lu)\n[sandwich-cancelIntent.en-us.lu](./sandwich-cancelIntent.en-us.lu)\n[sandwich-noneIntent.en-us.lu](./sandwich-noneIntent.en-us.lu)\n[sandwich-sandwich.lu](./sandwich-sandwich.lu)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/luis/test(development)-sandwich.en-us.lu.json",
    "content": "{\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test(development)-sandwich.en-us.lu\",\n  \"desc\": \"Model for test app, targetting development\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"sandwich\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"NameEntity\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"BreadEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"multiGrainWheat\",\n          \"list\": [\n            \"multi\",\n            \"grain\",\n            \"wheat\",\n            \"multi grain\",\n            \"grain wheat\",\n            \"multi grain wheat\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"rye\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"white\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"wholeWheat\",\n          \"list\": [\n            \"whole\",\n            \"wheat\",\n            \"whole wheat\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"CheeseEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"american\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cheddar\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"feta\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"gouda\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pepper jack\",\n          \"list\": [\n            \"pepper\",\n            \"jack\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"provolone\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"swiss\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"none\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"Confirmation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"yes\",\n          \"list\": [\n            \"sure\",\n            \"yeah\",\n            \"you bet\",\n            \"yes please\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"no\",\n          \"list\": [\n            \"no way\",\n            \"no thank you\",\n            \"never\",\n            \"not now\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"MeatEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"ham\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pulled pork\",\n          \"list\": [\n            \"pulled\",\n            \"pork\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"roast beef\",\n          \"list\": [\n            \"roast\",\n            \"beef\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"salami\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"turkey\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"none\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"PROPERTYName\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Quantity\",\n          \"list\": [\n            \"quantity\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Length\",\n          \"list\": [\n            \"length\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Name\",\n          \"list\": [\n            \"name\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Bread\",\n          \"list\": [\n            \"bread\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Cheese\",\n          \"list\": [\n            \"cheese\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Meat\",\n          \"list\": [\n            \"meat\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Price\",\n          \"list\": [\n            \"price\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"dimension\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"money\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": [\n        \"Quantity\"\n      ]\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"{BreadEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"help with {PROPERTYName}\",\n      \"intent\": \"Help\"\n    },\n    {\n      \"pattern\": \"{money}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{PROPERTYName}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{CheeseEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{Confirmation}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{dimension}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{NameEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{number}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{MeatEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"help {PROPERTYName}\",\n      \"intent\": \"Help\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"abd codklj\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fshifs\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fshisls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ldkj dlkj dlkj\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shisls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i do?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/luis/test(development)-sandwich.utteranceAdded.en-us.lu.json",
    "content": "{\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test(development)-sandwich.en-us.lu\",\n  \"desc\": \"Model for test app, targetting development\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"sandwich\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"NameEntity\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"BreadEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"multiGrainWheat\",\n          \"list\": [\n            \"multi\",\n            \"grain\",\n            \"wheat\",\n            \"multi grain\",\n            \"grain wheat\",\n            \"multi grain wheat\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"rye\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"white\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"wholeWheat\",\n          \"list\": [\n            \"whole\",\n            \"wheat\",\n            \"whole wheat\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"CheeseEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"american\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cheddar\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"feta\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"gouda\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pepper jack\",\n          \"list\": [\n            \"pepper\",\n            \"jack\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"provolone\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"swiss\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"none\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"Confirmation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"yes\",\n          \"list\": [\n            \"sure\",\n            \"yeah\",\n            \"you bet\",\n            \"yes please\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"no\",\n          \"list\": [\n            \"no way\",\n            \"no thank you\",\n            \"never\",\n            \"not now\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"MeatEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"ham\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pulled pork\",\n          \"list\": [\n            \"pulled\",\n            \"pork\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"roast beef\",\n          \"list\": [\n            \"roast\",\n            \"beef\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"salami\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"turkey\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"none\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"PROPERTYName\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Quantity\",\n          \"list\": [\n            \"quantity\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Length\",\n          \"list\": [\n            \"length\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Name\",\n          \"list\": [\n            \"name\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Bread\",\n          \"list\": [\n            \"bread\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Cheese\",\n          \"list\": [\n            \"cheese\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Meat\",\n          \"list\": [\n            \"meat\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Price\",\n          \"list\": [\n            \"price\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"dimension\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"money\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": [\n        \"Quantity\"\n      ]\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"{BreadEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"help with {PROPERTYName}\",\n      \"intent\": \"Help\"\n    },\n    {\n      \"pattern\": \"{money}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{PROPERTYName}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{CheeseEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{Confirmation}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{dimension}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{NameEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{number}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{MeatEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"help {PROPERTYName}\",\n      \"intent\": \"Help\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"abd codklj\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fshifs\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fshisls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ldkj dlkj dlkj\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shisls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i do?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i do for you?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/lubuild/sandwich/luis/test(development)-sandwich.utteranceChanged.en-us.lu.json",
    "content": "{\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test(development)-sandwich.en-us.lu\",\n  \"desc\": \"Model for test app, targetting development\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"sandwich\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"NameEntity\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"BreadEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"multiGrainWheat\",\n          \"list\": [\n            \"multi\",\n            \"grain\",\n            \"wheat\",\n            \"multi grain\",\n            \"grain wheat\",\n            \"multi grain wheat\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"rye\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"white\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"wholeWheat\",\n          \"list\": [\n            \"whole\",\n            \"wheat\",\n            \"whole wheat\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"CheeseEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"american\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cheddar\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"feta\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"gouda\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pepper jack\",\n          \"list\": [\n            \"pepper\",\n            \"jack\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"provolone\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"swiss\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"none\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"Confirmation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"yes\",\n          \"list\": [\n            \"sure\",\n            \"yeah\",\n            \"you bet\",\n            \"yes please\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"no\",\n          \"list\": [\n            \"no way\",\n            \"no thank you\",\n            \"never\",\n            \"not now\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"MeatEntity\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"ham\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pulled pork\",\n          \"list\": [\n            \"pulled\",\n            \"pork\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"roast beef\",\n          \"list\": [\n            \"roast\",\n            \"beef\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"salami\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"turkey\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"none\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"PROPERTYName\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"Quantity\",\n          \"list\": [\n            \"quantity\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Length\",\n          \"list\": [\n            \"length\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Name\",\n          \"list\": [\n            \"name\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Bread\",\n          \"list\": [\n            \"bread\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Cheese\",\n          \"list\": [\n            \"cheese\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Meat\",\n          \"list\": [\n            \"meat\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"Price\",\n          \"list\": [\n            \"price\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"dimension\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"money\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": [\n        \"Quantity\"\n      ]\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"{BreadEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"help with {PROPERTYName}\",\n      \"intent\": \"Help\"\n    },\n    {\n      \"pattern\": \"{money}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{PROPERTYName}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{CheeseEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{Confirmation}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{dimension}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{NameEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{number}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"{MeatEntity}\",\n      \"intent\": \"sandwich\"\n    },\n    {\n      \"pattern\": \"help {PROPERTYName}\",\n      \"intent\": \"Help\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"abd codklj\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fshifs\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fshisls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ldkj dlkj dlkj\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shisls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i do for you?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/merge_intents_disabled.lu",
    "content": "> !# @enableSections = true\n> !# @enableMergeIntents = false\n\n# Greeting\n## HelloGreeting\n- Hi {userName=vishwac}\n- Hello my name is {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n## GoodbyeGreeting\n- Bye {userName=vishwac}, see you {dateTime=tomorrow}\n- Bye Bye {userName=vishwac}, see you at the same time {dateTime=tomorrow}\n- Good Bye {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n@ simple dateTime\n\n# Help\n- help\n- I need help\n- please help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/missing-synonyms.lu",
    "content": "$TestList:one=\n\n# None\n- Test\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/missing-utterance.lu",
    "content": "# Greeting\n\n# None\n- Test\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/missing-utterance2.lu",
    "content": "# Greeting\n## None\n- Test\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/multi-ref.lu",
    "content": "#ref('./comment.lu')\n\n#ref('./1-intent.lu')\n\n#ref('./1-intent-pattern-prebuilt.lu')\n\n#ref('./buyChocolate.lu')\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/multiturn.qna",
    "content": "> !# @qna.pair.source = xyz\n<a id = \"1\"></a>\n\n# ?hello\n**Filters:**\n- a=b\n```\nhi there\n```\n**Prompts:**\n- [joke](#3)\n- [flight booking](#?-book-flight) `context-only`\n- [weather](#?weather) `context-only`\n\n# ?weather\n```\nsure will get weather\n```\n\n<a id = \"3\"></a>\n\n# ?q2\n- tell me a joke\n```\nha ha ha\n```\n<a id = \"32\"></a>\n\n# ? book flight\n```\nsure. happy to help with that.\n```\n\n# ?batata\n```\ntomato\n```\n\n# ?testquestion\n```\ntest answer\n```\n**Prompts:**\n- [flight booking](#32) `context-only`"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/nested-luis-json.json",
    "content": "{\n    \"intents\": [\n      {\n        \"name\": \"Greeting\"\n      }\n    ],\n    \"entities\": [\n      {\n        \"name\": \"ContactName\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"EmailAddress\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"Key\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"PhoneNumber\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"Date\",\n        \"roles\": []\n      }\n    ],\n    \"composites\": [],\n    \"closedLists\": [],\n    \"regex_entities\": [],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"utterances\": [\n      {\n        \"text\": \"call george louise at four oh seven six six six nineteen ninety three on december first\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"ContactName\",\n            \"startPos\": 5,\n            \"endPos\": 17\n          },\n          {\n            \"entity\": \"EmailAddress\",\n            \"startPos\": 19,\n            \"endPos\": 86\n          },\n          {\n            \"entity\": \"Key\",\n            \"startPos\": 22,\n            \"endPos\": 62\n          },\n          {\n            \"entity\": \"PhoneNumber\",\n            \"startPos\": 22,\n            \"endPos\": 68\n          },\n          {\n            \"entity\": \"Date\",\n            \"startPos\": 73,\n            \"endPos\": 86\n          }\n        ]\n      }\n    ],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"test\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/newEntity1.json",
    "content": "{\n    \"intents\": [],\n    \"entities\": [\n      {\n        \"name\": \"s1\",\n        \"roles\": [\n          \"sr1\",\n          \"sr2\"\n        ]\n      }\n    ],\n    \"composites\": [\n      {\n        \"name\": \"c1\",\n        \"children\": [\n          \"l1\",\n          \"l2\"\n        ],\n        \"roles\": []\n      },\n      {\n        \"name\": \"c2\",\n        \"children\": [\n          \"l1\",\n          \"l2\"\n        ],\n        \"roles\": [\n          \"cr1\",\n          \"cr2\"\n        ]\n      }\n    ],\n    \"closedLists\": [\n      {\n        \"name\": \"l1\",\n        \"subLists\": [\n          {\n            \"canonicalForm\": \"1\",\n            \"list\": [\n              \"one\",\n              \"uno\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"2\",\n            \"list\": [\n              \"two\",\n              \"duo\"\n            ]\n          }\n        ],\n        \"roles\": [\n          \"lr1\",\n          \"lr2\"\n        ]\n      },\n      {\n        \"name\": \"l2\",\n        \"subLists\": [\n          {\n            \"canonicalForm\": \"one\",\n            \"list\": [\n              \"cheese\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"two\",\n            \"list\": [\n              \"tomato\"\n            ]\n          }\n        ],\n        \"roles\": []\n      }\n    ],\n    \"regex_entities\": [\n      {\n        \"name\": \"r1\",\n        \"regexPattern\": \"[0-9]{6}\",\n        \"roles\": [\n          \"rr1\",\n          \"rr2\"\n        ]\n      },\n      {\n        \"name\": \"r2\",\n        \"regexPattern\": \"abc\",\n        \"roles\": []\n      }\n    ],\n    \"model_features\": [\n      {\n        \"name\": \"pl1\",\n        \"words\": \"cheese,tomato,potato\",\n        \"mode\": false,\n        \"activated\": true\n      },\n      {\n        \"name\": \"pl2\",\n        \"words\": \"I want,I have\",\n        \"mode\": true,\n        \"activated\": true\n      }\n    ],\n    \"regex_features\": [],\n    \"utterances\": [],\n    \"patterns\": [],\n    \"patternAnyEntities\": [\n      {\n        \"name\": \"p1\",\n        \"explicitList\": [],\n        \"roles\": [\n          \"pr1\",\n          \"pr2\"\n        ]\n      }\n    ],\n    \"prebuiltEntities\": [\n      {\n        \"name\": \"datetimeV2\",\n        \"roles\": [\n          \"dr1\",\n          \"dr2\"\n        ]\n      },\n      {\n        \"name\": \"number\",\n        \"roles\": [\n          \"nr1\",\n          \"nr2\"\n        ]\n      },\n      {\n        \"name\": \"personName\",\n        \"roles\": [\n          \"userName\",\n          \"firstName\",\n          \"lastName\"\n        ]\n      }\n    ],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/newEntity2.json",
    "content": "{\n  \"intents\": [],\n  \"entities\": [\n    {\n      \"name\": \"s1\",\n      \"roles\": [\n        \"sr1\"\n      ]\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"c1\",\n      \"children\": [\n        \"l1\",\n        \"l2\"\n      ],\n      \"roles\": [\n        \"cc1\"\n      ]\n    },\n    {\n      \"name\": \"c2\",\n      \"children\": [\n        \"l1\",\n        \"l2\"\n      ],\n      \"roles\": [\n        \"cr1\",\n        \"cr2\"\n      ]\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"l1\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"1\",\n          \"list\": [\n            \"one\",\n            \"uno\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"2\",\n          \"list\": [\n            \"two\",\n            \"duo\"\n          ]\n        }\n      ],\n      \"roles\": [\n        \"lr1\"\n      ]\n    },\n    {\n      \"name\": \"l2\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"one\",\n          \"list\": [\n            \"cheese\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"two\",\n          \"list\": [\n            \"tomato\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [\n    {\n      \"name\": \"r1\",\n      \"regexPattern\": \"[0-9]{6}\",\n      \"roles\": [\n        \"rr1\"\n      ]\n    },\n    {\n      \"name\": \"r2\",\n      \"regexPattern\": \"abc\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [\n    {\n      \"name\": \"pl1\",\n      \"words\": \"cheese,tomato,potato\",\n      \"mode\": false,\n      \"activated\": true\n    },\n    {\n      \"name\": \"pl2\",\n      \"words\": \"I want,I have\",\n      \"mode\": true,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"p1\",\n      \"explicitList\": [],\n      \"roles\": [\n        \"pr1\"\n      ]\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": [\n        \"dr1\"\n      ]\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": [\n        \"nr1\"\n      ]\n    },\n    {\n      \"name\": \"personName\",\n      \"roles\": [\n        \"userName\",\n        \"firstName\",\n        \"lastName\"\n      ]\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/overlappingEntities.json",
    "content": "{\n  \"intents\": [\n      {\n          \"name\": \"None\"\n      }\n  ],\n  \"entities\": [\n      {\n          \"name\": \"add\",\n          \"roles\": [],\n          \"children\": [\n              {\n                  \"name\": \"count\",\n                  \"children\": [],\n                  \"features\": [\n                      {\n                          \"modelName\": \"globalCount\",\n                          \"isRequired\": true\n                      }\n                  ]\n              }\n          ]\n      },\n      {\n          \"name\": \"globalCount\",\n          \"roles\": [],\n          \"children\": [\n              {\n                  \"name\": \"countNumber\",\n                  \"children\": [],\n                  \"features\": [\n                      {\n                          \"modelName\": \"number\",\n                          \"isRequired\": true\n                      }\n                  ]\n              }\n          ]\n      }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n      {\n          \"text\": \"add two apples\",\n          \"intent\": \"None\",\n          \"entities\": [\n              {\n                  \"entity\": \"add\",\n                  \"startPos\": 0,\n                  \"endPos\": 13,\n                  \"children\": [\n                      {\n                          \"entity\": \"count\",\n                          \"startPos\": 4,\n                          \"endPos\": 13\n                      }\n                  ]\n              },\n              {\n                  \"entity\": \"globalCount\",\n                  \"startPos\": 4,\n                  \"endPos\": 13,\n                  \"children\": [\n                      {\n                          \"entity\": \"countNumber\",\n                          \"startPos\": 4,\n                          \"endPos\": 6\n                      }\n                  ]\n              }\n          ]\n      }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n      {\n          \"name\": \"number\",\n          \"roles\": []\n      }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"LuTest\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/phraseLists.lu",
    "content": "$ChocolateType:phraseList\nspearmings,payday,jelly,kit kat,kitkat,twix,candy\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/plFeatureDisabled.json",
    "content": "{\n  \"luis_schema_version\": \"7.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"GetWeather\",\n      \"features\": []\n    },\n    {\n      \"name\": \"None\",\n      \"features\": []\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"weather-request\",\n      \"children\": [\n        {\n          \"name\": \"GeographicPoi\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"geographyV2\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"Country\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"geographyV2\",\n              \"isRequired\": false\n            },\n            {\n              \"featureName\": \"CountryPL\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"ConditionDescription\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"featureName\": \"ConditionDescriptionPL\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"ConditionTemperature\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"featureName\": \"ConditionTemperaturePL\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"CurrentLocation\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"featureName\": \"CurrentLocationPL\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"TimeRange\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"datetimeV2\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"City\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"geographyV2\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"State\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"StatesList\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"SpatialRelation\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"featureName\": \"SpatialRelationPL\",\n              \"isRequired\": false\n            }\n          ]\n        }\n      ],\n      \"roles\": [],\n      \"features\": []\n    }\n  ],\n  \"hierarchicals\": [],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"StatesList\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"AL\",\n          \"list\": [\n            \"Alabama\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"AK\",\n          \"list\": [\n            \"Alaska\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"AZ\",\n          \"list\": [\n            \"Arizona\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"AR\",\n          \"list\": [\n            \"Arkansas\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"CA\",\n          \"list\": [\n            \"California\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"CO\",\n          \"list\": [\n            \"Colorado\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"CT\",\n          \"list\": [\n            \"Conneticut\",\n            \"Connecticut\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"DE\",\n          \"list\": [\n            \"Delaware\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"FL\",\n          \"list\": [\n            \"Florida\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"GA\",\n          \"list\": [\n            \"Georgia\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"HI\",\n          \"list\": [\n            \"Hawaii\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"ID\",\n          \"list\": [\n            \"Idaho\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"IL\",\n          \"list\": [\n            \"Illinois\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"IN\",\n          \"list\": [\n            \"Indiana\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"IA\",\n          \"list\": [\n            \"Iowa\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"KS\",\n          \"list\": [\n            \"Kansas\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"KY\",\n          \"list\": [\n            \"Kentucky\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"LA\",\n          \"list\": [\n            \"Louisiana\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"ME\",\n          \"list\": [\n            \"Maine\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MD\",\n          \"list\": [\n            \"Maryland\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MA\",\n          \"list\": [\n            \"Mass\",\n            \"Massachusetts\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MI\",\n          \"list\": [\n            \"Michigan\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MN\",\n          \"list\": [\n            \"Minnesota\",\n            \"Minn\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MS\",\n          \"list\": [\n            \"Miss\",\n            \"Missisippi\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MO\",\n          \"list\": [\n            \"Missouri\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"MT\",\n          \"list\": [\n            \"Montana\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NE\",\n          \"list\": [\n            \"Nebraska\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NV\",\n          \"list\": [\n            \"Nevada\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NH\",\n          \"list\": [\n            \"New Hampshire\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NJ\",\n          \"list\": [\n            \"New Jersey\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NM\",\n          \"list\": [\n            \"New Mexico\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NY\",\n          \"list\": [\n            \"New York\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"NC\",\n          \"list\": [\n            \"North Carolina\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"ND\",\n          \"list\": [\n            \"North Dakota\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"OH\",\n          \"list\": [\n            \"Ohio\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"OK\",\n          \"list\": [\n            \"Oklahoma\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"OR\",\n          \"list\": [\n            \"Oregon\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"PA\",\n          \"list\": [\n            \"Pennsylvania\",\n            \"Penn\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"RI\",\n          \"list\": [\n            \"Rhode Island\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"SC\",\n          \"list\": [\n            \"South Carolina\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"SD\",\n          \"list\": [\n            \"South Dakota\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"TN\",\n          \"list\": [\n            \"Tenn\",\n            \"Tennessee\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"TX\",\n          \"list\": [\n            \"Texas\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"UT\",\n          \"list\": [\n            \"Utah\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"VT\",\n          \"list\": [\n            \"Vermont\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"VA\",\n          \"list\": [\n            \"Virginia\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"WA\",\n          \"list\": [\n            \"Washington\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"WV\",\n          \"list\": [\n            \"West Virginia\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"WI\",\n          \"list\": [\n            \"Wisconsin\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"WY\",\n          \"list\": [\n            \"Wyoming\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"DC\",\n          \"list\": [\n            \"District of Colombia\",\n            \"District of Columbia\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"FSM\",\n          \"list\": [\n            \"Federated states of micronesia\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"USVI\",\n          \"list\": [\n            \"U.S. Virgin Islands\",\n            \"Virgin Islands\",\n            \"Virgin Islands of America\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"geographyV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"temperature\",\n      \"roles\": []\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"a long long time ago we went to new mexico\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you remember the summer of 15 wow what a scorcher\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me the forecast for san pedro river preserve\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 48,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 25,\n              \"endPos\": 48,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"how cold will it get in tajikistan around oct. eleventh?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 54,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 4,\n              \"endPos\": 7,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 24,\n              \"endPos\": 33,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 35,\n              \"endPos\": 54,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"how's the weather in munchique national natural park\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 10,\n          \"endPos\": 51,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 21,\n              \"endPos\": 51,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"humidity in netawaka wi\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 22,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 0,\n              \"endPos\": 7,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 12,\n              \"endPos\": 19,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 21,\n              \"endPos\": 22,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i can't do anything when it's too hot\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need a table at a restaurant in montserrat\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need the weather for 7/13/2036 in gwynedd valley\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 49,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 23,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 36,\n              \"endPos\": 49,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need the weather in hubbardston, will it be chillier?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 53,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 22,\n              \"endPos\": 32,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 46,\n              \"endPos\": 53,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i need the weather in nd in three hundred fifty one days\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 55,\n          \"children\": [\n            {\n              \"entity\": \"State\",\n              \"startPos\": 22,\n              \"endPos\": 23,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 25,\n              \"endPos\": 55,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to book a restaurant in 40 weeks in iowa.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to eat in wallis and futuna and get a blizzard\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 2,\n          \"endPos\": 52,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 17,\n              \"endPos\": 33,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 45,\n              \"endPos\": 52,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it chillier here\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 18,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 13,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 15,\n              \"endPos\": 18,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it chilly in ecola state park at 2 pm\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 39,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 11,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 16,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 36,\n              \"endPos\": 39,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it cloudy in turkmenistan\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 27,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 6,\n              \"endPos\": 11,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 16,\n              \"endPos\": 27,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it cold here?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 14,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 9,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 11,\n              \"endPos\": 14,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it cold in vigus tn\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 21,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 9,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 14,\n              \"endPos\": 18,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 20,\n              \"endPos\": 21,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it colder in istanbul, turkey or amarillo, greece?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 51,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 11,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 16,\n              \"endPos\": 23,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 26,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 36,\n              \"endPos\": 43,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 46,\n              \"endPos\": 51,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it going to be colder in bonnie\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 33,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 18,\n              \"endPos\": 23,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 28,\n              \"endPos\": 33,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it going to be warmer in central cebu protected landscape\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 59,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 18,\n              \"endPos\": 23,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 28,\n              \"endPos\": 59,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it going to be windy on 8/8/2032 in north charleston mt\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 57,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 18,\n              \"endPos\": 22,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 27,\n              \"endPos\": 34,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 39,\n              \"endPos\": 54,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 56,\n              \"endPos\": 57,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it hot in the current location?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 32,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 8,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 17,\n              \"endPos\": 32,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it humid in humboldt bay national wildlife refuge\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 51,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 6,\n              \"endPos\": 10,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 15,\n              \"endPos\": 51,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it rainy in greely center?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 27,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 6,\n              \"endPos\": 10,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 15,\n              \"endPos\": 27,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is it warm here now?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 18,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 6,\n              \"endPos\": 9,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 11,\n              \"endPos\": 14,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 16,\n              \"endPos\": 18,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is the weather chilly in pintura\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 31,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 15,\n              \"endPos\": 20,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 25,\n              \"endPos\": 31,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"is the weather going to be hotter in ri in one year\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 7,\n          \"endPos\": 50,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 27,\n              \"endPos\": 32,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 37,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 40,\n              \"endPos\": 50,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"need a table now somewhere nearby petit manan national wildlife refuge\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"need weather for 1 pm in russell gardens or close-by\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 5,\n          \"endPos\": 51,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 17,\n              \"endPos\": 20,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 25,\n              \"endPos\": 39,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 44,\n              \"endPos\": 51,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me if it is cold in federated states of micronesia\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 54,\n          \"children\": []\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me if it will hail in kyrgyzstan\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 36,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 19,\n              \"endPos\": 22,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 27,\n              \"endPos\": 36,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me if it will it be windy in grizzled squirrel wildlife sanctuary\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 69,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 25,\n              \"endPos\": 29,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 34,\n              \"endPos\": 69,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather for oct. the 26th in rosewood heights.\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 56,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 24,\n              \"endPos\": 36,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 41,\n              \"endPos\": 56,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast 1 hour from now in big thicket national preserve\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 76,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 29,\n              \"endPos\": 43,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 48,\n              \"endPos\": 76,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast for close by my current location\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 60,\n          \"children\": [\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 33,\n              \"endPos\": 40,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 45,\n              \"endPos\": 60,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast for eight a.m. in reminderville, fl\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 63,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 33,\n              \"endPos\": 42,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 47,\n              \"endPos\": 59,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 62,\n              \"endPos\": 63,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast for finland\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 39,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 33,\n              \"endPos\": 39,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast for fort yargo state park\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 53,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 33,\n              \"endPos\": 53,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast for france\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 38,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 33,\n              \"endPos\": 38,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast for roseburg, iowa\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 46,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 33,\n              \"endPos\": 40,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 43,\n              \"endPos\": 46,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the weather forecast within the same area of pocomoke river state park\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 77,\n          \"children\": [\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 40,\n              \"endPos\": 48,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 53,\n              \"endPos\": 77,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"want to eat somewhere cold in the neighboring antlers region on aug. 22\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 70,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 22,\n              \"endPos\": 25,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 34,\n              \"endPos\": 44,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 46,\n              \"endPos\": 52,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 64,\n              \"endPos\": 70,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"weather in malaysia\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 18,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 11,\n              \"endPos\": 18,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"weather in parc national de nech sar\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 35,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 11,\n              \"endPos\": 35,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what country do you like to visit most\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the foreast for spain at east glacier park at one pm\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 59,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 24,\n              \"endPos\": 28,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 33,\n              \"endPos\": 49,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 54,\n              \"endPos\": 59,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast for chillier conditions at calipuy national reservation\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 75,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 25,\n              \"endPos\": 32,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 48,\n              \"endPos\": 75,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast for nv for first day of sukkot\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 50,\n          \"children\": [\n            {\n              \"entity\": \"State\",\n              \"startPos\": 25,\n              \"endPos\": 26,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 32,\n              \"endPos\": 50,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast for orienta for hotter weather\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 42,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 25,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 37,\n              \"endPos\": 42,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast for papua new guinea for lunch for rainfall\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 63,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 25,\n              \"endPos\": 40,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 46,\n              \"endPos\": 50,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 56,\n              \"endPos\": 63,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast for roulo for foggy conditions on february the eighteenth, 2018\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 83,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 25,\n              \"endPos\": 29,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 35,\n              \"endPos\": 39,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 55,\n              \"endPos\": 83,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast for uganda at yom ha'atzmaut for chilly weather close from\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 78,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 25,\n              \"endPos\": 30,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 35,\n              \"endPos\": 48,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 54,\n              \"endPos\": 59,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 69,\n              \"endPos\": 78,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the forecast in 23 hours and seventeen seconds at this current spot\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 74,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 21,\n              \"endPos\": 53,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 63,\n              \"endPos\": 74,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the overcast forecast within the same area of rio grande nature center state park for fifteen o'clock\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 108,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 12,\n              \"endPos\": 19,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 41,\n              \"endPos\": 49,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 51,\n              \"endPos\": 88,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 94,\n              \"endPos\": 108,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the sd forecast for oct. 6th, 2037 for hot weather at belle vernon\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 73,\n          \"children\": [\n            {\n              \"entity\": \"State\",\n              \"startPos\": 12,\n              \"endPos\": 13,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 28,\n              \"endPos\": 41,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 47,\n              \"endPos\": 49,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 62,\n              \"endPos\": 73,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather at 5 am on the farallon islands?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 50,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 23,\n              \"endPos\": 26,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 35,\n              \"endPos\": 50,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather for eight o'clock in laos that is within walking distance\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 76,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 24,\n              \"endPos\": 36,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 41,\n              \"endPos\": 44,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 54,\n              \"endPos\": 76,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather forecast for agate fossil beds national monument\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 67,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 33,\n              \"endPos\": 67,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather forecast for danvers\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 39,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 33,\n              \"endPos\": 39,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather forecast for deaver, sc on may 10th\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 54,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 33,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 41,\n              \"endPos\": 42,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 47,\n              \"endPos\": 54,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather forecast for one am. in west athens, benin\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 61,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 33,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 44,\n              \"endPos\": 54,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 57,\n              \"endPos\": 61,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather forecast for papua new guinea\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 20,\n          \"endPos\": 48,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 33,\n              \"endPos\": 48,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather forecast here\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 32,\n          \"children\": [\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 29,\n              \"endPos\": 32,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather in weidman will it be warm\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 45,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 23,\n              \"endPos\": 29,\n              \"children\": []\n            },\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 42,\n              \"endPos\": 45,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather nearby bermuda a week from now\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 49,\n          \"children\": [\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 20,\n              \"endPos\": 25,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 27,\n              \"endPos\": 33,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 35,\n              \"endPos\": 49,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather not far from upper klamath national wildlife refuge?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 12,\n          \"endPos\": 70,\n          \"children\": [\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 20,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 33,\n              \"endPos\": 70,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will it be like feb. the twentieth in colorado\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 10,\n          \"endPos\": 50,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 21,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 43,\n              \"endPos\": 50,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be at six o'clock in the virgin islands?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 60,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 28,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 47,\n              \"endPos\": 60,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be in battle lake?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 38,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 28,\n              \"endPos\": 38,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be in sche-phoksundo-nationalpark on leif erikson day?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 74,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 28,\n              \"endPos\": 54,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 59,\n              \"endPos\": 74,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be like 1 minute from now within the same area of my current location\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 90,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 30,\n              \"endPos\": 46,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 59,\n              \"endPos\": 67,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 75,\n              \"endPos\": 90,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be like nine years from now in eastport el salvador\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 72,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 30,\n              \"endPos\": 48,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 53,\n              \"endPos\": 60,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 62,\n              \"endPos\": 72,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be on the keeling islands on aug. third, 2037?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 66,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 32,\n              \"endPos\": 46,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 51,\n              \"endPos\": 66,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be this afternoon in brilliant mi?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 14,\n          \"endPos\": 54,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 25,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 43,\n              \"endPos\": 51,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 53,\n              \"endPos\": 54,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the forecast for sweden at 9 a.m.\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 39,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 24,\n              \"endPos\": 29,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 34,\n              \"endPos\": 39,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather in humarock?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 29,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 22,\n              \"endPos\": 29,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather in nigeria?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 28,\n          \"children\": [\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 22,\n              \"endPos\": 28,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather in ransom canyon?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 34,\n          \"children\": [\n            {\n              \"entity\": \"City\",\n              \"startPos\": 22,\n              \"endPos\": 34,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather like at nationaal park bạch mã\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 48,\n          \"children\": [\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 27,\n              \"endPos\": 48,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather this week in distant bartholomew's cobble?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 11,\n          \"endPos\": 59,\n          \"children\": [\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 19,\n              \"endPos\": 27,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 32,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 40,\n              \"endPos\": 59,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be chilly at 0 pm in guam\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 32,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 21,\n              \"endPos\": 24,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 29,\n              \"endPos\": 32,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be cloudy in lenzburg, papua new guinea\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 46,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 21,\n              \"endPos\": 28,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 31,\n              \"endPos\": 46,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be cold in haiti?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 23,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 14,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 19,\n              \"endPos\": 23,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be colder in tallgrass prairie national preserve?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 55,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 21,\n              \"endPos\": 55,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be colder in texas?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 25,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 21,\n              \"endPos\": 25,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be freezing 4 hours from now in tonga\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 44,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 18,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 20,\n              \"endPos\": 35,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 40,\n              \"endPos\": 44,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be freezing on jul. 7, 2038 in vananda alaska?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 52,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 18,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 20,\n              \"endPos\": 34,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 39,\n              \"endPos\": 45,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 47,\n              \"endPos\": 52,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be hotter in hungary on february the 16th?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 48,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 21,\n              \"endPos\": 27,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 32,\n              \"endPos\": 48,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be hotter neighboring me on august eighteenth, 2025?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 58,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 18,\n              \"endPos\": 28,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 30,\n              \"endPos\": 31,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 36,\n              \"endPos\": 58,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be sunny on march 1, 2026 in forty fort?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 46,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 11,\n              \"endPos\": 15,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 20,\n              \"endPos\": 32,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 37,\n              \"endPos\": 46,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be temperate in the current place?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 40,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 19,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 28,\n              \"endPos\": 40,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be temperate in west liberty mh?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 38,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 19,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 24,\n              \"endPos\": 35,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 37,\n              \"endPos\": 38,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be warm in chicamocha national park?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 42,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 14,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 19,\n              \"endPos\": 42,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be warmer near here on jan. the fifteenth?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 48,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 11,\n              \"endPos\": 16,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 18,\n              \"endPos\": 26,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 28,\n              \"endPos\": 48,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be windy at 4 pm in ny?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 29,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 11,\n              \"endPos\": 15,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 20,\n              \"endPos\": 23,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 28,\n              \"endPos\": 29,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be windy here on dec. 16th?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 33,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 11,\n              \"endPos\": 15,\n              \"children\": []\n            },\n            {\n              \"entity\": \"CurrentLocation\",\n              \"startPos\": 17,\n              \"endPos\": 20,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 22,\n              \"endPos\": 33,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be windy in john day?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 27,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 11,\n              \"endPos\": 15,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 20,\n              \"endPos\": 27,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it get chillier in north creek forest?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 41,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 12,\n              \"endPos\": 19,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 24,\n              \"endPos\": 41,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will it rain in blissfield namibia nine hours 1 minute and one second from now?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 77,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 8,\n              \"endPos\": 11,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 16,\n              \"endPos\": 25,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 27,\n              \"endPos\": 33,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 35,\n              \"endPos\": 77,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will the weather be freezing in tennessee?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 9,\n          \"endPos\": 40,\n          \"children\": [\n            {\n              \"entity\": \"ConditionTemperature\",\n              \"startPos\": 20,\n              \"endPos\": 27,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 32,\n              \"endPos\": 40,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will there be a blizzard in neighboring niobrara valley preserve\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 63,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 16,\n              \"endPos\": 23,\n              \"children\": []\n            },\n            {\n              \"entity\": \"SpatialRelation\",\n              \"startPos\": 28,\n              \"endPos\": 38,\n              \"children\": []\n            },\n            {\n              \"entity\": \"GeographicPoi\",\n              \"startPos\": 40,\n              \"endPos\": 63,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will there be a snowstorm on september the first in bechtelsville georgia?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 72,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 16,\n              \"endPos\": 24,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 29,\n              \"endPos\": 47,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 52,\n              \"endPos\": 64,\n              \"children\": []\n            },\n            {\n              \"entity\": \"Country\",\n              \"startPos\": 66,\n              \"endPos\": 72,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will there be rain next year in new hampshire?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 44,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 14,\n              \"endPos\": 17,\n              \"children\": []\n            },\n            {\n              \"entity\": \"TimeRange\",\n              \"startPos\": 19,\n              \"endPos\": 27,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 32,\n              \"endPos\": 44,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"will there be wind in hornitos dc?\",\n      \"intent\": \"GetWeather\",\n      \"entities\": [\n        {\n          \"entity\": \"weather-request\",\n          \"startPos\": 0,\n          \"endPos\": 32,\n          \"children\": [\n            {\n              \"entity\": \"ConditionDescription\",\n              \"startPos\": 14,\n              \"endPos\": 17,\n              \"children\": []\n            },\n            {\n              \"entity\": \"City\",\n              \"startPos\": 22,\n              \"endPos\": 29,\n              \"children\": []\n            },\n            {\n              \"entity\": \"State\",\n              \"startPos\": 31,\n              \"endPos\": 32,\n              \"children\": []\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"versionId\": \"0.1\",\n  \"name\": \"WeatherStudy-working\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"phraselists\": [\n    {\n      \"name\": \"ConditionTemperaturePL\",\n      \"mode\": true,\n      \"words\": \"warm,temperate,freezing,chilly,hot,chillier,colder,cold,hotter,warmer,cooler,drier,milder\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"CurrentLocationPL\",\n      \"mode\": true,\n      \"words\": \"here,current spot,current place,current location,current position\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"ConditionDescriptionPL\",\n      \"mode\": true,\n      \"words\": \"wind,foggy,blizzard,windy,overcast,rainy,sunny,rain,snow,humid,hail,humidity,cloudy,snowstorm,snowfall,fog,cloud,stormy,clouds,mist\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"SpatialRelationPL\",\n      \"mode\": true,\n      \"words\": \"not far from,within walking distance,within the same area,close by,near,near here,nearby,neighboring,distant,far away,close-by,close from\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    },\n    {\n      \"name\": \"CountryPL\",\n      \"mode\": true,\n      \"words\": \"nigeria,usa,uk,france,benin,canada,australia,india,ghana,canadian,europe,germany,zealand,japan,italy,spain,ireland,china,switzerland,africa,belgium,brazil,sweden,european,greece,denmark,poland,austria,turkey,finland,norway,netherlands,portugal,mexico,hungary,cyprus,bulgaria,romania,israel,croatia,slovenia,czech republic,lithuania,ukraine,estonia,latvia,slovakia,iceland,chile,malta,luxembourg,albania,egypt,peru,morocco,colombia,uruguay,new zealand,singapore,malaysia,belarus,ecuador,liechtenstein,honduras,pakistan,venezuela,costa rica,jordan,lebanon,kenya,thailand,indonesia,guatemala,sri lanka,bangladesh,kuwait,tunisia,jamaica,nepal,saudi arabia,philippines,cambodia,panama,oman,ethiopia,uganda,mauritius,nicaragua,bahrain,qatar,paraguay,bolivia,mongolia,uzbekistan,algeria,el salvador,zambia,mozambique,cameroon,namibia,senegal,botswana,malawi,mauritania,angola,eritrea,gabon,burundi,togo,liberia,sudan,sierra leone,somalia,mali,zimbabwe,rwanda,lesotho,swaziland,madagascar,azerbaijan,burkina faso,guinea,djibouti,haiti,yemen,guyana,kazakhstan,belize,barbados,armenia,papua new guinea,dominican republic,iraq,turkmenistan,maldives,bhutan,suriname,seychelles,kyrgyzstan,georgia,cuba,dominica,united arab emirates,argentina,tajikistan,grenada,afghanistan,tonga,comoros,equatorial guinea,san marino,bermuda,vanuatu,solomon islands,tuvalu,kiribati,nauru,chad,gambia,cayman islands,anguilla,palau,montserrat,cook islands,marshall islands,niue,fiji,guam,gibraltar,american samoa,myanmar,aruba,trinidad and tobago,bahamas,tokelau,norfolk island,guinea-bissau,central african republic,falkland islands,antigua and barbuda,saint lucia,united kingdom,christmas island,iran,northern mariana islands,turks and caicos islands,reunion,cocos islands,antarctica,tanzania,saint kitts and nevis,united states,russia,vietnam,moldova,libya,syria,laos,bouvet island,korea,south korea,brunei,serbia,saint vincent and the grenadines,bosnia and herzegovina,british indian ocean territory,montenegro,north korea,micronesia,arabia,lybia,saudi,moscow,u.s.,asia,middle east,dubai,saudia,french,iranian,london,rome,saudis,afganistan,isreal,new york,iranians,uae,amsterdam,swiss,caribbean,mid east\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    }\n  ],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/plWithFlags.lu",
    "content": "> phrase list as feature to intent (also applicable to entities)\n@ intent getUserProfileIntent usesFeature city\n\n# getUserProfileIntent\n- test\n\n@ phraselist city\n@ city =\n    - Seattle\n    - SEATAC\n    - SEA\n\n@ city enabledForAllModels\n@ city disabled"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/prebuilt-entity.lu",
    "content": "> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Wed Feb 27 2019 11:39:09 GMT-0800 (Pacific Standard Time)\n\n> ! Source LUIS JSON file: Desktop\\general_prebuilt.json\n\n> ! Source QnA TSV file: Not Specified\n\n> ! Source QnA Alterations file: Not Specified\n\n\n> # Intent definitions\n\n## Cancel\n- cancel\n- cancel app\n- cancel cancel\n- cancel it\n- cancel never mind\n- cancel that\n- canceled\n- cancelled\n- do nothing\n- don't do that\n- don't do that anymore\n- forget about it\n- go away\n- just cancel\n- just cancel it\n- nerver mind\n- never mind\n- never mind cancel\n- never mind cancel that\n- no cancel\n- no cancel cancel\n- no cancel it\n- no cancel that\n- no never mind\n- no no cancel\n- no no cancel it\n- nothing never mind\n- nothing please\n- oh cancel\n- oh don't do that\n- please do nothing\n- quit\n- sorry, don't do it\n\n\n## Confirm\n- confirm\n- do it\n- fine\n- go for it\n- great\n- i'm sure\n- it's fine\n- no doubt\n- of course\n- oh yeah\n- oh yes\n- ok\n- ok for now\n- okay\n- perfect\n- perfect thank you\n- right\n- right yes\n- sounds good\n- sounds good thank you\n- sounds good thanks\n- sounds good to me\n- sounds great\n- sounds perfect\n- sure\n- sure does\n- sure is\n- sure thing\n- sure yes\n- thank you very much\n- thank you yes\n- that is correct\n- that is right\n- that right\n- that sounds good\n- that's fine\n- this is good\n- very good\n- ya\n- yeah\n- yeah baby\n- yeah bro\n- yeah buddy\n- yeah cool\n- yeah go ahead\n- yeah go for it\n- yeah good\n- yes\n\n\n## Escalate\n- can i talk to a person\n- contact support\n- contact the customer service\n- customer service\n- human service\n- i need manual customer service\n- i need real human help\n- i need support\n- i want to talk to a human\n- i want to talk to a real human\n- is there any person i can talk to\n- is there any real human\n- is there any real person\n- talk to a human\n\n\n## FinishTask\n- all finished\n- all set\n- done\n- finish\n- finished\n- finished with\n- i am done\n- i am finished\n- it finished\n- it's done\n- it's finished\n- just be\n- submit\n- submit it\n\n\n## GoBack\n- back\n- back please\n- back to\n- back to last\n- back to last step\n- get back\n- get back please\n- get back to last\n- go back\n- go back on\n- go back please\n- go back to\n- last step\n- no go back to\n- no no go back to\n- please return\n- return\n\n\n## Help\n- any help\n- can you help\n- can you help me\n- give me some help\n- help\n- how can i get it\n- how to do it\n- i need help\n- i need some assist\n- i need some help\n- is there any help\n- open help\n- please help\n- some help\n- who can help me\n\n## Logout\n- signout\n- forget me\n- sign out\n- logout\n- log out\n\n## None\n- all of them\n- i want them all\n- i want to all of them\n\n\n## ReadAloud\n- can you read it\n- can you read that\n- can you read that for me\n- can you you read page aloud\n- could you tell me what that says\n- detail aloud what that says\n- hey read that for me\n- i need to hear this page\n- i would like you to read that for me\n- make a reading of this page\n- please read\n- please read it\n- please read me the page\n- please read my latest email\n- please read this\n- please read this out loud\n- please read this page\n- please read this page aloud\n- please read this page out loud\n- please read this to me\n- read all on the screen to me\n- read aloud\n- read aloud the current text onscreen\n- read file aloud\n- read it\n- read it aloud\n- read it out loud\n- read it outloud\n- read it please\n- read it to me\n- read me this page\n- read my to list\n- read outloud\n- read page\n- read page aloud\n- read page outloud\n- read sentence out loud\n- read text\n- read text aloud\n- read that\n- read that out loud\n- read the page\n- read the page onscreen to me\n- read the page out loud\n- read the page to me\n- read the text to me\n- read the words on this page\n- read this for me please\n- read this page\n- read this page aloud\n- read this page out loud\n- read this page to me\n- read to me\n- read what is currently on the screen to me\n- speak of what is on this page\n- start reading this\n- tell me about the information on the screen\n- tell me the current text on screen\n- vocalize what s on the page\n- what does the page say\n- would you please read that for me\n- would you read that out loud please\n- would you read that to me please\n\n\n## Reject\n- i don't like it\n- i reject\n- negative\n- never\n- no\n- no i don't want that\n- no later\n- no leave it\n- no more no\n- no no\n- no no no\n- no no thank you\n- no not that one\n- no reject it\n- no thank you\n- no thanks\n- no way\n- no wrong\n- nope\n- not\n- not at all\n- not even close\n- not exactly\n- not now\n- not quite\n- not right now\n- not that\n- nothing much\n- oh no\n- reject\n- reject it\n\n\n## Repeat\n- again\n- could you say it again\n- i didn't hear repeat again\n- i have not heard\n- pardon\n- repeat\n- repeat please\n- repeat that\n- say again\n- say again please\n- say that again\n- sorry\n- what\n- what did you say\n- what was that again\n\n\n## SelectAny\n- any of it\n- any one is ok\n- anyone is fine\n- anything\n- choose anyone\n- choose one of it randomly\n- opt for a random one\n- opt for any of it\n- select a random choice\n- select a random one\n- select any\n- select any choice\n- select any of it\n\n\n## SelectItem\n- choose last\n- choose last one\n- choose no.2\n- choose the {DirectionalReference=bottom left}\n- choose the first choice\n- choose the fourth one\n- choose the {DirectionalReference=upper left} choice\n- choose the {DirectionalReference=upper right} one\n- choose {DirectionalReference=top right}\n- choose {DirectionalReference=top right} one\n- i like {DirectionalReference=left} one\n- i like second\n- i like second one\n- i like the {DirectionalReference=bottom} one\n- i like the first one\n- i like the third\n- i like the third choice\n- i like the {DirectionalReference=top right} one\n- i like the {DirectionalReference=upper right}\n- i like {DirectionalReference=upper right}\n- i want {DirectionalReference=bottom}\n- i want fourth\n- i want {DirectionalReference=left}\n- i want {DirectionalReference=right} one\n- i want the first\n- i want the fourth choice\n- i want the {DirectionalReference=left}\n- i want the {DirectionalReference=lower} choice\n- i want the {DirectionalReference=right} one\n- i want the second one\n- i want third one\n- i want to choose {DirectionalReference=bottom} one\n- i want to choose {DirectionalReference=lower right}\n- i want to choose {DirectionalReference=right}\n- i want to choose second one\n- i want to choose the first one\n- i want to choose the fourth\n- i want to choose the last choice\n- i want to choose the {DirectionalReference=left} one\n- i want to choose the {DirectionalReference=lower} choice\n- i want to choose the {DirectionalReference=right}\n- i want to choose third\n- opt for first one\n- opt for last\n- opt for {DirectionalReference=left}\n- opt for {DirectionalReference=right} one\n- opt for the last one\n- opt for the {DirectionalReference=left} one\n- opt for the {DirectionalReference=lower} choice\n- opt for the {DirectionalReference=right}\n- opt for the second\n- opt for the second choice\n- select fourth one\n- select {DirectionalReference=lower} one\n- select no.5\n- select the {DirectionalReference=bottom} choice\n- select the first\n- select the last choice\n- select the {DirectionalReference=lower} one\n- select the {DirectionalReference=right} one\n- select the third one\n- select the {DirectionalReference=upper right}\n- select third\n- select {DirectionalReference=upper}\n- what about the last\n- what about the third one\n\n\n## SelectNone\n- i don't want to choose any one\n- i don't want to select any one\n- i want neither of them\n- i want none of them\n- neither\n- neither of those\n- neither one\n- neither one of them\n- neither thank you\n- none\n- none none\n- none none of them\n- none of them\n- none of them thank you\n- none of these\n- none of those\n- they look bad, can you give me other choices\n\n\n## ShowNext\n- and after that\n- display more\n- displays more\n- give me more\n- go forward\n- go to the next one\n- go to the next three items\n- i need to go to the next one\n- i want more\n- more\n- move to the next one\n- next\n- reveal more\n- show me the next\n- show more\n- show the next 3\n- show the next 4 items\n- show the next one\n- show the next two options\n- tell me more\n- tell more\n- what about next one\n- what after that\n- what's after that\n- what's more\n- what's next\n- what's the next 2\n- what's up next\n\n\n## ShowPrevious\n- back to the last one\n- bring the previous one\n- display previously\n- get back to the last one\n- go back to last one\n- go back to previous\n- go back to the last one\n- go previously\n- go to the previous\n- go to the previous one\n- previous one\n- previous one please\n- return to the previous one\n- reveal previous\n- reveal previously\n- show earlier\n- show me the previous one\n- show previous\n- show the previous one\n- what before that\n- what is the previous\n- what's before that\n\n\n## StartOver\n- clear and start again\n- could you start it over\n- please begin again\n- restart\n- restart it\n- start again\n- start it over\n- start over\n- start over it\n- turn over a new leaf\n\n\n## Stop\n- baby just be quiet\n- be quiet\n- be quiet now\n- come on stop\n- dismiss\n- end\n- end it\n- exit exit\n- exit stop\n- god shut up\n- hey stop\n- i love you to stop talking\n- i mean stop listening\n- i said stop\n- just be quiet\n- my god shut up\n- never mind stop\n- no be quiet\n- no be quiet now\n- no no no no stop talking\n- no shut up\n- no stop\n- nobody cares stop talking\n- nowhere just be quiet\n- oh my god shut up\n- ok stop stop\n- quiet\n- quiet now\n- shut the fuck up\n- shut up\n- shut up be quiet\n- shut up quiet\n- shut your mouth\n- stop please\n- stop talking\n- turn off\n- turn off stop\n\n\n> # Entity definitions\n\n$DirectionalReference:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:number\n\n$PREBUILT:ordinal\n\n\n> # Phrase list definitions\n\n\n> # List entities\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/prebuilt_model.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"imports\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Web.WebSearch\",\n      \"inherits\": {\n        \"domain_name\": \"Web\",\n        \"model_name\": \"WebSearch\"\n      }\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Web.SearchText\",\n      \"inherits\": {\n        \"domain_name\": \"Web\",\n        \"model_name\": \"SearchText\"\n      },\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"Web.SearchEngine\",\n      \"inherits\": {\n        \"domain_name\": \"Web\",\n        \"model_name\": \"SearchEngine\"\n      },\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"bing\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"google\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"youtube\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"yahoo!\",\n          \"list\": [\n            \"yahoo\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"baidu\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"aol\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"lycos\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"msn\",\n          \"list\": []\n        }\n      ],\n      \"roles\": [\n        \"Web.google.com\",\n        \"Web.www.google.com\"\n      ]\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"[please] (open|start) {Web.SearchEngine} [and] (find|search|query) [out] [(a[n]|one)] {Web.SearchText} to\",\n      \"intent\": \"Web.WebSearch\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"amazon.com let s go back to it\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"ancestry login\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"aramex .com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"bethesda .net\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"bing facebook webpage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"can i go to wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"can i see the instagram website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"can you go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"can you navigate me to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"can you open the website wiki for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"can you take me to outlook.com?\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"check house prices in the united states on bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"check the fox news website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"could you go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 16,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"could you please go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"could you please navigate to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"discover political books\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 9,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"explore aquarius in search engine\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"explore deep learning in google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"explore movies in google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"explore wechat in search engine\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"facebook.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"facebook.com open\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"find news in bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"get me to luis.ai\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"gmail.com please\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"go to amazon\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"go to bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to ebay\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to facebook\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"go to paypal\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"go to the fox news website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"go to walmart.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"go to wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to wikipedia\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.bankrate.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.smile.amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.target.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.yahoo.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"google maps website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"google the website of tmall\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"how to buy bitcoin, msn it\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i need the website www.wikipedia.com opened\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to get the information about basketball\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 36,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to get the information about sylvester stallone\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 36,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know the election results\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to open amazon to search out books about sql server\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 36,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to open yahoo to search out cookbook\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"let us go to the google.com to search house prices in the united states\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 38,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"let us go to the google.com to search marvel movies\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 38,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"msn.com homepage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"navigate me to website wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"navigate to wiki at www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"navigate to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"netflix.com for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"notre dame de paris, search it\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"open google drive website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"open paypal in browser\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"open pinterest.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"open the page microsoft.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"open the web page for royal mail.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"open the web page yahoo.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 18,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"open the web windows phone.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 13,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"open the wiki website please\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"open to twitter.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"open up amazon.com for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"open up reddit.com in google chrome\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"open up the website arrow fastener.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 20,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"open up wigtypes.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"open video.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"open wiki for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"open wiki in google\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"open wikipedia homepage in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"open www. amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"open www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"open your browser and find a book to read\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"open your browser and find a song to listen to\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"outlook.com on edge\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"please go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 13,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"please navigate to aol\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"please navigate to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"please open www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"please search prince harry’s last name on www.google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"please turn to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"query 2019 in bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"query one refrigerator in taobao\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"query some books on amazon\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"search china in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"search luis in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"search skiing skills in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"search teachers day in google.com.hk\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"search thanksgiving day on bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"search the cookbook named sweet paul\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"search the movie named toy story\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"seek the seasonal vegetables in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the aol homepage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"start att.com website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"start facebook.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"surf to google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to bing to find some rock books\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 28,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"take me to facebook\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to facebook.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to google maps.\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to kanye west's website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to kohl's website please.\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to the first citizens website.\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to the wiki website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to yahoo.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"visit the fox news homepage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"visit www.foxnews.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"want to see historical exhibitions in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"website fox news\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"what is fox news' top story\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what is good friday\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what is this election results\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 13,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"www.read.amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"www.twitter.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"www.wikipedia.com please\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 16\n        }\n      ]\n    }\n  ],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/qna-alterations_Alterations.json",
    "content": "{\n  \"wordAlterations\": [\n    {\n      \"alterations\": [\n        \"webchat\",\n        \"web chat\"\n      ]\n    },\n    {\n      \"alterations\": [\n        \"botframework\",\n        \"bot framework\",\n        \"Azure bot service\"\n      ]\n    },\n    {\n      \"alterations\": [\n        \"qnamaker\",\n        \"qna maker\",\n        \"QnA Maker\",\n        \"question and answer pairs\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/qna-filter-line-without-hyphen.lu",
    "content": "### ? What is Ludown? \n- ludown cli\n- where can i get more information about ludown cli?\n\n**Filters:**\nludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/qna-question-line-without-hyphen.lu",
    "content": "### ? What is Ludown? \nludown cli\n- where can i get more information about ludown cli?\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/qnaDocuments.json",
    "content": "{\n  \"urls\": [],\n  \"qnaDocuments\": [\n    {\n      \"id\": 0,\n      \"answer\": \"You can change the default message if you use the QnAMakerDialog.\\r\\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\\r\\n\",\n      \"questions\": [\n        \"How do I change the default message\"\n      ],\n      \"metadata\": [],\n      \"source\": \"custom editorial\"\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/qnaref.qna",
    "content": "> !# @qna.pair.source=hand added\n# ?hello\n- [another](./collate/1.lu#Greeting)\n**Filters:**\n- a=b\n```\nhi there\n```\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/reduced.lu",
    "content": "\n## ChangeCalendarEntry\n- change {Subject=lunch date} from {OriginalStartTime=11} - {OriginalEndTime=12} to {StartTime=12} - {EndTime=1 30}\n- move my {OriginalStartTime=10 past 10} {Subject=doctor ' s appointment} to {StartTime=10}\n- change {Subject=cinema} {SlotAttribute=location}\n- change {Subject=delevelopmental agenda for lunch} {StartDate=tomorrow}\n- change {Subject=dentist appointment}\n- change {Subject=dentist appt} to {MoveLaterTimeSpan=an hour} later\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref1.lu",
    "content": "> You can include deep references to intents defined in a .lu file in utterances\n# None\n- [None uttearnces](./ref2.lu#Help)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref10.lu",
    "content": "# All\n- [all utterances in the .lu file](./8.lu#DeleteAlarm)\n\n$alarmTime:Simple\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref11.lu",
    "content": "> [link name](<.lu file path>#<INTENT-NAME>*utterances*) will find all utterances (and not patterns) found under <INTENT-NAME> in the .lu file and add them to the list of utterances where this reference is specified\n\n# importIntent\n- [impotOnlyUtterances](./ref_src1.lu#test*utterances*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref12.lu",
    "content": "> [link name](<.lu file path>#<INTENT-NAME>*patterns*) will find all patterns (and not utterances) found under <INTENT-NAME> in the .lu file and add them to the list of patterns where this reference is specified\n\n# importIntent\n- [impotOnlyUtterances](./ref_src1.lu#test*patterns*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref13.lu",
    "content": "> [link name](<.lu file path>#*utterances*) will find all utterances in the .lu file and add them to the list of utterances where this reference is specified\n\n# importIntent\n- [impotOnlyUtterances](./ref_src2.lu#*utterances*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref14.qna",
    "content": "# ?importUtterances\n- [import](./ref_src2.lu#*utterances*)\n```\nTest answer\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref15.qna",
    "content": "# ?importUtterances\n- [import](./ref_src2.lu#test*utterances*)\n```\nTest answer\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref2.lu",
    "content": "# Help\n- help\n- I need help\n- please help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref3.qna",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n### ? How do I change the default message\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```\n\n> You can define filters for QnA using the \\**Filters:** \\<list of name=value pairs\\> format\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = seattle\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n### ? Where can I get coffee? \n- I need coffee\n\n**Filters:**\n- location = portland\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n\n\n> You can include LUIS intent and entity definitions in the same .lu file\n# Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref4.lu",
    "content": "> You can include deep references to QnA questions defined in lu files\n# None\n- [None uttearnces](./ref3.qna#?)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref5.lu",
    "content": "> You can include wild cards with deep references to QnA maker questions defined in a .lu file in utterances\n# None\n- [QnA questions](./deepreference/*#?)\n\n> With the above statement, the parser will parse **all** .lu files under ./, extract out all questions from QnA pairs in those files and add them under 'None' intent as defined in this file.\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref6.lu",
    "content": "# All\n- [all utterances in the .lu file](./8.lu#*utterances*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref7.lu",
    "content": "# All\n- [all utterances in the .lu file](./8.lu#*patterns*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref8.lu",
    "content": "# All\n- [all utterances in the .lu file](./8.lu#*utterancesAndPatterns*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref9.lu",
    "content": "# All\n- [all utterances in the .lu file](./8.lu#DeleteAlarm)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref_src1.lu",
    "content": "# test\n- this is an utterance\n- this is a {pattern}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/ref_src2.lu",
    "content": "# test\n- this is an utterance\n- this is a {pattern}\n\n# one\n- this is another test utterance\n- this is another {testPattern}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/regexmodel.luis",
    "content": "{\n  \"intents\": [],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [\n    {\n      \"name\": \"HRF-number\",\n      \"regexPattern\": \"hrf-[0-9]{6}\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"regexEntity\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/root.lu",
    "content": "> Testing /* which should find all .lu files at that folder level\n[](./fileReference/*)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/root2.lu",
    "content": "> Testing /** which should recursively find all .lu files at that folder level and sub-folders\n[](./fileReference/**)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/root3.lu",
    "content": "# intent\n- test utterances with (test braces)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/section_disabled.lu",
    "content": "# Greeting\n## HelloGreeting\n- Hi {userName=vishwac}\n- Hello my name is {userName=vishwac}\n\n> # Entity definitions\n@ simple Hello"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/section_disabled2.lu",
    "content": "> !# @enableSections = false\n\n@ simple none\n\n# Cancel\n# Greeting\n## HelloGreeting\n- Hi {userName=vishwac}\n- Hello my name is {userName=vishwac}\n\n@ simple hello hasRole hr1\n\n@ simple world hasRoles wr1, wr2\n## ByeGreeting\n- Bye {cityName = Seattle}\n- Bye bye {cityName = Beijing}\n@simple cityLocation\n@ simple help\n@ simple hello\n\n# Help\n- help\n- I need help\n- please help\n\n@ simple help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/section_enabled.lu",
    "content": "> !# @enableSections = true\n> !# @enableMergeIntents = true\n\n# Cancel\n\n# Greeting\n## HelloGreeting\n- Hi {userName=vishwac}\n- Hello my name is {userName=vishwac}\n\n> # Entity definitions\n$userName:simple\n\n## GoodbyeGreeting\n- Bye {userName=vishwac}, see you {dateTime=tomorrow}\n- Bye Bye {userName=vishwac}, see you at the same time {dateTime=tomorrow}\n- Good Bye {userName=vishwac}\n\n> # Entity definitions\n@ simple userName\n\n$dateTime:simple\n\n# Help\n- help\n- I need help\n- please help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/section_enabled2.lu",
    "content": "> !# @enableSections = true\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n$question:PhraseList interchangeable\n- are you\n- you are\n\n@ prebuilt datetimeV2 hasRole dr1\n\n# Greeting\n## HelloGreeting\n- Hi {userName=vishwac}\n- Hello my name is {userName=vishwac}\n\n> # Entity definitions\n@ prebuilt number hasRole nr1\n@ prebuilt personName hasRoles firstName,lastName\n\n## GoodbyeGreeting\n- Bye {userName=vishwac}, see you {dateTime=tomorrow}\n- Bye Bye {userName=vishwac}, see you at the same time {dateTime=tomorrow}\n- Good Bye {userName=vishwac}\n\n> # Entity definitions\n@ simple userName\n\n# Help\n- help\n- I need help\n- please help"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/special-char-in-entity-type.lu",
    "content": "$entity:Foo & Sons=\n-Foo and Sons\n-F&S\n$entity:Maelström=\n-Maelstrom\n$entity:Qux (US)=\n-Qux\n-Qux USA\n-Qux US"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/test269-d.json",
    "content": "{\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"Repro\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"TestIntent\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"EntityOne\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"EntityTwo\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"this is a one and a two and a one again\",\n      \"intent\": \"TestIntent\",\n      \"entities\": [\n        {\n          \"entity\": \"EntityOne\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"EntityTwo\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"EntityOne\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/testTokenizerVersion.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"testIntent\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"one\",\n      \"intent\": \"testIntent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"testIntent\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.2\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/testcases-data.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nmodule.exports.tests = {\n    \"qna\": {\n        \"lufile\":``\n    },\n    \"phraselist\": {\n        \"lufile\": `$ChocolateType:phraseList\n        - m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n        \n        \n        $question:PhraseList interchangeable\n        - are you\n        - you are\n        `,\n        \"luisJSON\": {\n          \"intents\": [],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [\n            {\n              \"name\": \"ChocolateType\",\n              \"mode\": false,\n              \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n              \"activated\": true\n            },\n            {\n              \"name\": \"question\",\n              \"mode\": true,\n              \"words\": \"are you,you are\",\n              \"activated\": true\n            }\n          ],\n          \"regex_features\": [],\n          \"utterances\": [],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [],\n        }\n        },\n    \"all-entity-types\": {\n        \"lufile\":`$userName:simple\n        $PREBUILT:datetimeV2\n        $PREBUILT:age\n        $PREBUILT:dimension\n        $PREBUILT:email\n        $PREBUILT:money\n        $PREBUILT:number\n        $PREBUILT:ordinal\n        $PREBUILT:percentage\n        $PREBUILT:phonenumber\n        $PREBUILT:temperature\n        $PREBUILT:url\n        $commPreference:call=\n            - phone call\n            - give me a ring\n            - ring\n            - call\n            - cell phone\n            - phone\n        `,\n        \"luisJSON\":{\n          \"intents\": [],\n          \"entities\": [\n            {\n              \"name\": \"userName\",\n              \"roles\": []\n            }\n          ],\n          \"composites\": [],\n          \"closedLists\": [\n            {\n              \"name\": \"commPreference\",\n              \"subLists\": [\n                {\n                  \"canonicalForm\": \"call\",\n                  \"list\": [\n                    \"phone call\",\n                    \"give me a ring\",\n                    \"ring\",\n                    \"call\",\n                    \"cell phone\",\n                    \"phone\"\n                  ]\n                }\n              ],\n              \"roles\": []\n            }\n          ],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [\n            {\n              \"name\": \"datetimeV2\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"age\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"dimension\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"email\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"money\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"number\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"ordinal\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"percentage\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"phonenumber\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"temperature\",\n              \"roles\": []\n            },\n            {\n              \"name\": \"url\",\n              \"roles\": []\n            }\n          ],\n        }\n    },\n    \"3-intents-patterns\":{\n        \"lufile\":`> Doing everything as a pattern\n        # AskForUserName\n        - {userName}\n        - I'm {userName}\n        - call me {userName}\n        - my name is {userName}\n        - {userName} is my name\n        - you can call me {userName}`,\n        \"luisJSON\":{\n          \"intents\": [\n            {\n              \"name\": \"AskForUserName\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"{userName}\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [\n            {\n              \"pattern\": \"{userName}\",\n              \"intent\": \"AskForUserName\"\n            },\n            {\n              \"pattern\": \"I'm {userName}\",\n              \"intent\": \"AskForUserName\"\n            },\n            {\n              \"pattern\": \"call me {userName}\",\n              \"intent\": \"AskForUserName\"\n            },\n            {\n              \"pattern\": \"my name is {userName}\",\n              \"intent\": \"AskForUserName\"\n            },\n            {\n              \"pattern\": \"{userName} is my name\",\n              \"intent\": \"AskForUserName\"\n            },\n            {\n              \"pattern\": \"you can call me {userName}\",\n              \"intent\": \"AskForUserName\"\n            }\n          ],\n          \"patternAnyEntities\": [\n            {\n              \"name\": \"userName\",\n              \"explicitList\": [],\n              \"roles\": []\n            }\n          ],\n          \"prebuiltEntities\": [],\n        }\n    },\n    \"2-intent\": {\n        \"lufile\":`# Greeting\n        - Hi\n        - Hello\n        - Good morning\n        - Good evening\n        \n        # Help\n        - help\n        - I need help\n        - please help`,\n        \"luisJSON\": {\n          \"intents\": [\n            {\n              \"name\": \"Greeting\"\n            },\n            {\n              \"name\": \"Help\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"Hi\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"Hello\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"Good morning\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"Good evening\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"help\",\n              \"intent\": \"Help\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"I need help\",\n              \"intent\": \"Help\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"please help\",\n              \"intent\": \"Help\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [],\n        }\n    },\n    \"2-intent-scattered-list\": {\n        \"lufile\":`> These are defined as patterns with commPreference as list entity type\n        # CommunicationPreference\n        - set phone call as my communication preference\n        - I prefer to receive text messages\n        \n        > you can break up list entity definitions into multiple chunks, interleaved within a .lu file or even spread across .lu files.\n        $commPreference:call=\n            - phone call\n            - give me a ring\n            - ring\n            - call\n            - cell phone\n            - phone\n        \n        # Help\n        - can you help\n        \n        $commPreference:text=\n            - message\n            - text\n            - sms\n            - text message\n        \n        $commPreference:fax=\n            - fax\n            - fascimile`,\n            \"luisJSON\": {\n              \"intents\": [\n                {\n                  \"name\": \"CommunicationPreference\"\n                },\n                {\n                  \"name\": \"Help\"\n                }\n              ],\n              \"entities\": [],\n              \"composites\": [],\n              \"closedLists\": [\n                {\n                  \"name\": \"commPreference\",\n                  \"subLists\": [\n                    {\n                      \"canonicalForm\": \"call\",\n                      \"list\": [\n                        \"phone call\",\n                        \"give me a ring\",\n                        \"ring\",\n                        \"call\",\n                        \"cell phone\",\n                        \"phone\"\n                      ]\n                    },\n                    {\n                      \"canonicalForm\": \"text\",\n                      \"list\": [\n                        \"message\",\n                        \"text\",\n                        \"sms\",\n                        \"text message\"\n                      ]\n                    },\n                    {\n                      \"canonicalForm\": \"fax\",\n                      \"list\": [\n                        \"fax\",\n                        \"fascimile\"\n                      ]\n                    }\n                  ],\n                  \"roles\": []\n                }\n              ],\n              \"regex_entities\": [],\n              \"model_features\": [],\n              \"regex_features\": [],\n              \"utterances\": [\n                {\n                  \"text\": \"set phone call as my communication preference\",\n                  \"intent\": \"CommunicationPreference\",\n                  \"entities\": []\n                },\n                {\n                  \"text\": \"I prefer to receive text messages\",\n                  \"intent\": \"CommunicationPreference\",\n                  \"entities\": []\n                },\n                {\n                  \"text\": \"can you help\",\n                  \"intent\": \"Help\",\n                  \"entities\": []\n                }\n              ],\n              \"patterns\": [],\n              \"patternAnyEntities\": [],\n              \"prebuiltEntities\": [],\n            }\n    },\n    \"1-intent\": {\n        \"lufile\":`# Greeting\n        - Hi\n        - Hello\n        - Good morning\n        - Good evening`,\n        \"luisJSON\": {\n          \"intents\": [\n            {\n              \"name\": \"Greeting\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"Hi\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"Hello\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"Good morning\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"Good evening\",\n              \"intent\": \"Greeting\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [],\n        }\n    },\n    \"1-intent-prebuilt-entity\":{\n        \"lufile\":`$PREBUILT:datetimeV2\n\n        # CreateAlarm\n        - create an alarm\n        - create an alarm for 7AM\n        - set an alarm for 7AM next thursday`,\n        \"luisJSON\":{\n          \"intents\": [\n            {\n              \"name\": \"CreateAlarm\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"create an alarm\",\n              \"intent\": \"CreateAlarm\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"create an alarm for 7AM\",\n              \"intent\": \"CreateAlarm\",\n              \"entities\": []\n            },\n            {\n              \"text\": \"set an alarm for 7AM next thursday\",\n              \"intent\": \"CreateAlarm\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [\n            {\n              \"name\": \"datetimeV2\",\n              \"roles\": []\n            }\n          ],\n        }\n    },\n    \"1-intent-patern-prebuilt\":{\n        \"lufile\":`> add these as patterns\n        # DeleteAlarm\n        - delete alarm\n        - (delete|remove) the {alarmTime} alarm\n        \n        > alarmTime is a role for prebuilt datetimev2 entity\n        $alarmTime:datetimeV2`,\n        \"luisJSON\":{\n          \"intents\": [\n            {\n              \"name\": \"DeleteAlarm\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"delete alarm\",\n              \"intent\": \"DeleteAlarm\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [\n            {\n              \"name\": \"datetimeV2\",\n              \"roles\": []\n            },\n            {\n              \"type\": \"datetimeV2\",\n              \"roles\": [\n                \"alarmTime\"\n              ]\n            }\n          ],\n        }\n    },\n    \"1-intent-pattern-patternAny\": {\n        \"lufile\":`> These are defined as patterns with commPreference as pattern.any entity type\n        # CommunicationPreference\n        - set {commPreference} as my communication preference\n        - I prefer to receive {commPreference}`,\n        \"luisJSON\":{\n          \"intents\": [\n            {\n              \"name\": \"CommunicationPreference\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"set {commPreference} as my communication preference\",\n              \"intent\": \"CommunicationPreference\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [\n            {\n              \"pattern\": \"set {commPreference} as my communication preference\",\n              \"intent\": \"CommunicationPreference\"\n            },\n            {\n              \"pattern\": \"I prefer to receive {commPreference}\",\n              \"intent\": \"CommunicationPreference\"\n            }\n          ],\n          \"patternAnyEntities\": [\n            {\n              \"name\": \"commPreference\",\n              \"explicitList\": [],\n              \"roles\": []\n            }\n          ],\n          \"prebuiltEntities\": [],\n        }\n    },\n    \"1-intent-pattern-list\": {\n        \"lufile\":`> These are defined as patterns with commPreference as pattern.any entity type\n        # CommunicationPreference\n        - set {commPreference} as my communication preference\n        - I prefer to receive {commPreference}\n        \n        $commPreference:call=\n            - phone call\n            - give me a ring\n            - ring\n            - call\n            - cell phone\n            - phone\n        `,\n        \"luisJSON\":{\n          \"intents\": [\n            {\n              \"name\": \"CommunicationPreference\"\n            }\n          ],\n          \"entities\": [],\n          \"composites\": [],\n          \"closedLists\": [\n            {\n              \"name\": \"commPreference\",\n              \"subLists\": [\n                {\n                  \"canonicalForm\": \"call\",\n                  \"list\": [\n                    \"phone call\",\n                    \"give me a ring\",\n                    \"ring\",\n                    \"call\",\n                    \"cell phone\",\n                    \"phone\"\n                  ]\n                }\n              ],\n              \"roles\": []\n            }\n          ],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"set {commPreference} as my communication preference\",\n              \"intent\": \"CommunicationPreference\",\n              \"entities\": []\n            }\n          ],\n          \"patterns\": [\n            {\n              \"pattern\": \"set {commPreference} as my communication preference\",\n              \"intent\": \"CommunicationPreference\"\n            },\n            {\n              \"pattern\": \"I prefer to receive {commPreference}\",\n              \"intent\": \"CommunicationPreference\"\n            }\n          ],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [],\n        }\n    },\n    \"1-intent-labelled-utterances\": {\n        \"lufile\":`# AskForUserName\n        - {userName=vishwac}\n        - I'm {userName=vishwac}\n        - call me {userName=vishwac}\n        - my name is {userName=vishwac}\n        - {userName=vishwac} is my name\n        - you can call me {userName=vishwac}`,\n        \"luisJSON\": {\n          \"intents\": [\n            {\n              \"name\": \"AskForUserName\"\n            }\n          ],\n          \"entities\": [\n            {\n              \"name\": \"userName\",\n              \"roles\": []\n            }\n          ],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 0,\n                  \"endPos\": 6\n                }\n              ]\n            },\n            {\n              \"text\": \"I'm vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 4,\n                  \"endPos\": 10\n                }\n              ]\n            },\n            {\n              \"text\": \"call me vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 8,\n                  \"endPos\": 14\n                }\n              ]\n            },\n            {\n              \"text\": \"my name is vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 11,\n                  \"endPos\": 17\n                }\n              ]\n            },\n            {\n              \"text\": \"vishwac is my name\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 0,\n                  \"endPos\": 6\n                }\n              ]\n            },\n            {\n              \"text\": \"you can call me vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 16,\n                  \"endPos\": 22\n                }\n              ]\n            }\n          ],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [],\n        }\n    },\n    \"1-intent-1-entity\": {\n        \"lufile\": `# AskForUserName\n        - {userName=vishwac}\n        - I'm {userName=vishwac}\n        - call me {userName=vishwac}\n        - my name is {userName=vishwac}\n        - {userName=vishwac} is my name\n        - you can call me {userName=vishwac}\n        \n        $userName:simple`,\n        \"luisJSON\": {\n          \"intents\": [\n            {\n              \"name\": \"AskForUserName\"\n            }\n          ],\n          \"entities\": [\n            {\n              \"name\": \"userName\",\n              \"roles\": []\n            }\n          ],\n          \"composites\": [],\n          \"closedLists\": [],\n          \"regex_entities\": [],\n          \"model_features\": [],\n          \"regex_features\": [],\n          \"utterances\": [\n            {\n              \"text\": \"vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 0,\n                  \"endPos\": 6\n                }\n              ]\n            },\n            {\n              \"text\": \"I'm vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 4,\n                  \"endPos\": 10\n                }\n              ]\n            },\n            {\n              \"text\": \"call me vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 8,\n                  \"endPos\": 14\n                }\n              ]\n            },\n            {\n              \"text\": \"my name is vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 11,\n                  \"endPos\": 17\n                }\n              ]\n            },\n            {\n              \"text\": \"vishwac is my name\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 0,\n                  \"endPos\": 6\n                }\n              ]\n            },\n            {\n              \"text\": \"you can call me vishwac\",\n              \"intent\": \"AskForUserName\",\n              \"entities\": [\n                {\n                  \"entity\": \"userName\",\n                  \"startPos\": 16,\n                  \"endPos\": 22\n                }\n              ]\n            }\n          ],\n          \"patterns\": [],\n          \"patternAnyEntities\": [],\n          \"prebuiltEntities\": [],\n        }\n    }\n};\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/translate-testcase-data.js",
    "content": "module.exports.tests = {\n    'phraseList': {\n        'luFile': `$ChocolateType:phraseList\n    - m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:PhraseList interchangeable\n    - are you\n    - you are`,\n        'langCode': 'de',\n        'translatedContent': `$ChocolateType:phraseList\n- m & m, mars, mints, Speersplaner, Zahltag, Gelee, Kit kat, Kitkat, twix\n$question:PhraseList interchangeable\n- Bist du\n- Du bist\n`\n    },\n    'allEntities': {\n        'luFile': `$userName:simple\n$PREBUILT:datetimeV2\n$PREBUILT:age\n$PREBUILT:dimension\n$PREBUILT:email\n$PREBUILT:money\n$PREBUILT:number\n$PREBUILT:ordinal\n$PREBUILT:percentage\n$PREBUILT:phonenumber\n$PREBUILT:temperature\n$PREBUILT:url\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone`,\n'langCode':'de',\n'translatedContent': `$userName:simple\n$PREBUILT:datetimeV2\n$PREBUILT:age\n$PREBUILT:dimension\n$PREBUILT:email\n$PREBUILT:money\n$PREBUILT:number\n$PREBUILT:ordinal\n$PREBUILT:percentage\n$PREBUILT:phonenumber\n$PREBUILT:temperature\n$PREBUILT:url\n$commPreference:call=\n- Telefonruf\n- Geben Sie mir einen Ring\n- Ring\n- Aufrufen\n- Handy\n- Telefon\n`\n    },\n    'intentsAndUtterances': {\n        'luFile': `> Doing everything as a pattern\n        # AskForUserName\n        - {userName}\n        - I'm {userName}\n        - call me {userName}`,\n        'langCode': 'fr',\n        'translatedContent':`> Faire tout comme un modèle\n# AskForUserName\n-  {userName} \n- Je ne suis  {userName} \n- Appelle-moi  {userName} \n`\n    },\n    'intentsAndUtterancesNC': {\n        'luFile': `> Doing everything as a pattern\n        # AskForUserName\n        - {userName}\n        - I'm {userName}\n        - call me {userName}`,\n        'langCode': 'fr',\n        'translatedContent':`> Doing everything as a pattern\n# AskForUserName\n- userName\n- Je suis {userName}\n- Appelez-moi {userName d'utilisateur}\n`\n    },\n    'qna': {\n        'luFile': `### ? How do I change the default message\n        `,\n        'langCode': 'de',\n        'translatedContent': `### ? Wie ändere ich die Standardnachricht?\n\n`\n    },\n    'fileRef': {\n        'luFile': `[Sweet](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n`,\n        'langCode': 'de',\n        'translatedContent': `[Süß](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n`\n    },\n    'badLu': {\n        'luFile': `? foo bar`,\n        'langCode': 'de'\n    },\n    'labelledEntityValue': {\n        'luFile': `# Greeting\n        - hi {time = morning}\n        `,\n        'langCode': 'de',\n        'translatedContent': `# Greeting\n- Es gibt  {time=Morgen} \n\n`\n    }\n};"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/translate-with-number.lu",
    "content": "# Test\n- {Number:numberOfAdults=2} adults, {Number:numberOfChildren=1} child "
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/utterance-without-hyphen.lu",
    "content": "# Cancel\ncancel something\n- cancel me\n- cancel that\n- cancel the task\ncancel  anything"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/v6WithoutPhraseLists.lu",
    "content": "> !# @app.name = test app\n> !# @app.desc = test\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n\n# test\n- one\n- two\n\n@ ml address = \n    - @ number doorNumber\n    - @ ml streetName\n    - @ geographyV2 city\n    - @ zipRegex zipcode\n\n@ prebuilt number\n@ prebuilt geographyV2\n@ regex zipRegex = /[0-9]{5}/"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/testcases/v7app.json",
    "content": "{\n  \"luis_schema_version\": \"7.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\",\n      \"features\": []\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"C1\",\n      \"children\": [],\n      \"roles\": [],\n      \"features\": []\n    },\n    {\n      \"name\": \"C2\",\n      \"children\": [],\n      \"roles\": [],\n      \"features\": []\n    },\n    {\n      \"name\": \"C3\",\n      \"children\": [],\n      \"roles\": [],\n      \"features\": []\n    },\n    {\n      \"name\": \"P1\",\n      \"children\": [\n        {\n          \"name\": \"CC1\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"C1\",\n              \"isRequired\": true\n            },\n            {\n              \"modelName\": \"C2\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"CC2\",\n          \"children\": [],\n          \"features\": []\n        }\n      ],\n      \"roles\": [],\n      \"features\": []\n    }\n  ],\n  \"hierarchicals\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"my alias is omr sobeh\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C2\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"C1\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"P1\",\n          \"startPos\": 12,\n          \"endPos\": 20,\n          \"children\": [\n            {\n              \"entity\": \"CC1\",\n              \"startPos\": 12,\n              \"endPos\": 14\n            },\n            {\n              \"entity\": \"CC2\",\n              \"startPos\": 16,\n              \"endPos\": 20\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"my alias is walid\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C3\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is omar sobeih\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C2\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"P1\",\n          \"startPos\": 11,\n          \"endPos\": 21,\n          \"children\": [\n            {\n              \"entity\": \"CC1\",\n              \"startPos\": 11,\n              \"endPos\": 14\n            },\n            {\n              \"entity\": \"CC2\",\n              \"startPos\": 16,\n              \"endPos\": 21\n            }\n          ]\n        },\n        {\n          \"entity\": \"C1\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is walid\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C3\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    }\n  ],\n  \"versionId\": \"0.1\",\n  \"name\": \"app-build-v7\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"patr\",\n      \"roles\": [],\n      \"explicitList\": []\n    }\n  ],\n  \"regex_entities\": [\n    {\n      \"name\": \"hellp\",\n      \"regexPattern\": \"hellp\",\n      \"roles\": []\n    }\n  ],\n  \"phraselists\": [],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"settings\": [\n    {\n      \"name\": \"NormalizePunctuation\",\n      \"value\": \"true\"\n    },\n    {\n      \"name\": \"UseAllTrainingDate\",\n      \"value\": \"true\"\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/en/qna.json",
    "content": "{\n    \"urls\": [\n      \"https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs\"\n    ],\n    \"qnaList\": [\n      {\n        \"id\": 0,\n        \"answer\": \"You can change the default message if you use the QnAMakerDialog. \\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\",\n        \"source\": \"custom editorial\",\n        \"questions\": [\n          \"who is the ceo?\"\n        ],\n        \"metadata\": []\n      },\n      {\n        \"id\": 0,\n        \"answer\": \"You can use our REST apis to manage your KB. \\n\\\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n        \"source\": \"custom editorial\",\n        \"questions\": [\n          \"How do I programmatically update my KB?\"\n        ],\n        \"metadata\": []\n      },\n      {\n        \"id\": 0,\n        \"answer\": \"Vishwac\",\n        \"source\": \"custom editorial\",\n        \"questions\": [\n          \"Who is your ceo?\",\n          \"get me your ceo info\"\n        ],\n        \"metadata\": []\n      }\n    ],\n    \"files\": [],\n    \"name\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/en/qna.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? who is the ceo?\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details. \n```\n\n### ? How do I programmatically update my KB?\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Who is your ceo?\n- get me your ceo info\n```markdown\nVishwac\n```"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/en/translateLuResponse.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"qui est le ceo?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:2 4:5-4:6 7:9-8:9 11:14-11:14\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Vous pouvez modifier le message par défaut si vous utilisez le QnAMakerDialog.\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:3 4:6-5:10 8:13-12:19 15:17-21:22 19:25-32:34 19:25-36:41 27:33-24:30 35:36-43:44 38:40-46:49 42:44-51:58 46:48-60:61 50:64-63:77\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Voir [ce lien] (https://docs.botframework.com/fr-us/azure-bot-service/templates/qnamaker/#navtitle) pour plus de détails.\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:3 4:8-5:7 10:98-15:98 10:98-9:13 100:102-100:103 104:111-113:120 104:111-105:108\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Comment puis-je mettre à jour programmatiquement mon KB ?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:6 7:7-8:14 9:24-30:47 26:31-25:28 26:31-23:23 26:31-16:21 33:34-49:51 36:38-53:54 36:38-56:56\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Vous pouvez utiliser notre apis REST pour gérer votre KB.\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:3 4:6-5:10 8:10-12:19 12:14-21:25 16:19-32:35 21:24-27:30 26:27-37:40 29:34-42:46 36:39-48:52 41:43-54:56\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"\\\\#1. Voir ici pour plus de détails: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:3 5:7-5:8 9:12-10:12 14:16-14:17 14:16-19:22 18:25-27:34 27:143-36:152\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Qui est ton ceo ?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:2 4:5-4:6 7:10-8:10 12:15-16:16 12:15-12:14\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"m'obtenir votre info ceo\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:8 7:10-10:14 12:14-21:23 16:19-16:19\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Vishwac Vishwac\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:6-0:6 0:6-8:14\"\n          }\n        }\n      ]\n    }\n  ]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/allEntities.lu",
    "content": "$userName:simple\n$PREBUILT:datetimeV2\n$PREBUILT:age\n$PREBUILT:dimension\n$PREBUILT:email\n$PREBUILT:money\n$PREBUILT:number\n$PREBUILT:ordinal\n$PREBUILT:percentage\n$PREBUILT:phonenumber\n$PREBUILT:temperature\n$PREBUILT:url\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/bad.lu",
    "content": "? foo bar"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/fileRef.lu",
    "content": "[Sweet](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/intentsAndUtterances.lu",
    "content": "> Doing everything as a pattern\n# AskForUserName\n- {userName}\n- I'm {userName}\n- call me {userName}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/labelledEntityValue.lu",
    "content": "# Greeting\n- hi {time = morning}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/newEntity.lu",
    "content": "@ ml s1 sr1\n@ phraselist pl1 = \n    - cheese\n    - tomato\n    - potato\n@ list l1 hasRoles lr1,lr2 = \n- one :\n    - two\n    - three\n- four :\n    - five\n    - six"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/normalizedValue.lu",
    "content": "$ simple : one =\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/options.lu",
    "content": "> # Intent definitions\n\n##FindDoc\n- find {DocType=word} doc in folder work\n- [((show|find)|open)] {DocType} doc in folder {FolderName}\n\n$FoldeName:work=\n- works"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/phraseList.lu",
    "content": "$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:PhraseList interchangeable\n- are you\n- you are"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/qna.lu",
    "content": "### ? How do I change the default message\n        "
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/files/qnaContent.lu",
    "content": "# ? hello\n```markdown"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/fr/qna.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"Vous pouvez modifier le message par défaut si vous utilisez le QnAMakerDialog.\\nVoir [ce lien] (https://docs.botframework.com/fr-us/azure-bot-service/templates/qnamaker/#navtitle) pour plus de détails.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"qui est le ceo?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Vous pouvez utiliser notre apis REST pour gérer votre KB.\\n\\\\#1. Voir ici pour plus de détails: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Comment puis-je mettre à jour programmatiquement mon KB ?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Vishwac Vishwac\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Qui est ton ceo ?\",\n        \"m'obtenir votre info ceo\"\n      ],\n      \"metadata\": []\n    }\n  ],\n  \"files\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/fr/qna.lu",
    "content": "> # QnA Definitions\n> This is a QnA definition. Follows # ? Question: \\<list of questions\\> \\```markdown \\<Answer> ``` format\n\n### ? qui est le ceo?\n```markdown\nVous pouvez modifier le message par défaut si vous utilisez le QnAMakerDialog.\nVoir [ce lien] (https://docs.botframework.com/fr-us/azure-bot-service/templates/qnamaker/#navtitle) pour plus de détails.\n```\n\n### ? Comment puis-je mettre à jour programmatiquement mon KB ?\n```markdown\nVous pouvez utiliser notre apis REST pour gérer votre KB.\n\\#1. Voir ici pour plus de détails: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> You can add URLs for QnA maker to ingest using the #URL reference scheme\n[QnA URL - faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> You can define multilple questions for single answer as well\n### ? Qui est ton ceo ?\n- m'obtenir votre info ceo\n```markdown\nVishwac Vishwac\n```\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/fr/root.luis.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Calendar.Add\"\n    },\n    {\n      \"name\": \"Calendar.Find\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"ajouter un nouvel événement le 27 - avr\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ajouter une nouvelle tâche d'affectation de finition\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ajouter un événement à lire sur adam lambert nouvelles\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ajouter un événement pour visiter 209 nashville gym\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ajouter du théâtre imax à mes événements à venir\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"calendrier i ' ll être au garage de 8 à 3 ce samedi\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dunmore pa sons sonores vendredi matin s'il vous plaît\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"rencontrer mon manager\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"enregistrer la date mai 17 photos partie\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"rendez-vous pour demain s'il vous plaît\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"la réunion durera une heure\",\n      \"intent\": \"Calendar.Add\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dites-moi les détails de l'événement\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"voix activée lecture des rendez-vous cette semaine\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"suis-je libre d'être avec des amis samedi ?\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"rendez-vous avec Johnson doit être la semaine prochaine\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"appeler papa mike\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"changer la réunion avec Chris à 9: 00 h\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"email cloney john\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"prolonger la réunion du déjeuner 30 minutes de plus\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Je veux reprogrammer la réuni on au club de l'armée de l'air\",\n      \"intent\": \"Calendar.Find\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"réunions de marketing le mardi sera maintenant tous les mercredis s'il vous plaît changer sur mon calendrier\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"déplacer la fête bbq à vendredi\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"l'atelier durera 10 heures\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change the meeting with chris to 9 : 00 am\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"extend lunch meeting 30 minutes extra\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to reschedule the meeting at the air force club\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"marketing meetings on tuesdays will now be every wednesday please change on my calendar\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move the bbq party to friday\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the workshop will last for 10 hours\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"file\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/allEntities.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"rufen\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:4\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Telefonanruf\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"6:9-0:11\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"gib mir einen Ring\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:2 5:6-4:6 8:8-8:12 10:13-14:17\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ring\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:3\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"rufen\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:4\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Handy\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:9-0:4\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"telefon\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:6\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/fileRef.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Süß\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:2\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/intentsAndUtterances.json",
    "content": "[\n  {\n    \"detectedLanguage\": {\n      \"language\": \"en\",\n      \"score\": 1\n    },\n    \"translations\": [\n      {\n        \"text\": \" Tout faire comme un modèle\",\n        \"to\": \"fr\",\n        \"alignment\": {\n          \"proj\": \"1:5-1:4 1:5-6:10 18:19-12:16 21:21-18:19 23:29-21:26\"\n        }\n      }\n    ]\n  },\n  {\n    \"detectedLanguage\": {\n      \"language\": \"en\",\n      \"score\": 1\n    },\n    \"translations\": [\n      {\n        \"text\": \"Je suis \",\n        \"to\": \"fr\",\n        \"alignment\": {\n          \"proj\": \"0:2-0:6\"\n        }\n      }\n    ]\n  },\n  {\n    \"detectedLanguage\": {\n      \"language\": \"en\",\n      \"score\": 1\n    },\n    \"translations\": [\n      {\n        \"text\": \"Appelle-moi \",\n        \"to\": \"fr\",\n        \"alignment\": {\n          \"proj\": \"0:6-0:10\"\n        }\n      }\n    ]\n  }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/labelledEntityValue.json",
    "content": "[\n  {\n    \"detectedLanguage\": {\n      \"language\": \"en\",\n      \"score\": 1\n    },\n    \"translations\": [\n      {\n        \"text\": \"Hallo \",\n        \"to\": \"de\",\n        \"alignment\": {\n          \"proj\": \"0:1-0:4\"\n        }\n      }\n    ]\n  },\n  {\n    \"detectedLanguage\": {\n      \"language\": \"en\",\n      \"score\": 1\n    },\n    \"translations\": [\n      {\n        \"text\": \"morgen\",\n        \"to\": \"de\",\n        \"alignment\": {\n          \"proj\": \"0:6-0:5\"\n        }\n      }\n    ]\n  }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/newEntity.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"fromage\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:6\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"tomate\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:5\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"pomme de terre\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:13\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"un\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:1\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"deux\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:3\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"trois\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:4\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"quatre\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:5\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"cinq\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:3\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"six\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:2\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/normalizedValue.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"un\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:1\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/options.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"finden \",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:5\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"wort\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:3\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \" Doc in Ordnerarbeit\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"1:3-1:3 5:6-5:6 15:18-8:19\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"zeigen\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:5\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"finden\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:5\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"offen\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:4\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 0\n      },\n      \"translations\": [\n        {\n          \"text\": \" \",\n          \"to\": \"de\"\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \" Doc im Ordner \",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"1:3-1:3 5:6-5:6 8:13-8:13\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"arbeit\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:5\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Funktioniert\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:11\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/phraseList.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:41-0:41 43:57-43:57\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Bist du\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:6-0:6\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Du bist\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:6-0:6\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/qna.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Wie ändere ich die Standardmeldung\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:2 4:5-4:9 7:7-11:13 16:18-15:17 20:26-19:33\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/serviceresponses/qnaContent.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Hallo\",\n          \"to\": \"de\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:4\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translateLuResponse.json",
    "content": "[\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"ajouter un nouvel événement le 27 - avr\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:2-0:6 4:4-8:9 6:8-11:16 10:14-18:26 16:17-28:29 19:20-32:32 19:20-31:31 22:22-34:34 24:26-37:38 24:26-36:36\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"ajouter une nouvelle tâche d'affectation de finition\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:2-0:6 4:4-8:10 6:8-12:19 15:20-44:51 15:20-29:39 15:20-41:42 15:20-28:28 15:20-27:27 22:31-21:25\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"ajouter un événement à lire sur adam lambert nouvelles\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:2-0:6 4:5-8:9 7:11-11:19 13:14-21:21 16:19-23:26 21:25-28:30 27:30-32:35 32:38-37:43 40:43-45:53\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"ajouter un événement pour visiter 209 nashville gym\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:2-0:6 4:5-8:9 7:11-11:19 13:14-21:24 16:20-26:32 22:24-36:36 22:24-35:35 22:24-34:34 26:34-38:46 36:38-48:50\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"ajouter du théâtre imax à mes événements à venir\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:2-0:6 4:7-20:22 4:7-19:19 9:15-11:17 9:15-8:9 17:18-24:24 20:21-26:28 23:30-43:47 23:30-41:41 32:37-30:39\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"calendrier i ' ll être au garage de 8 à 3 ce samedi\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:7-0:9 9:9-11:11 11:11-13:13 13:14-16:16 13:14-15:15 16:17-18:21 19:20-23:24 26:31-26:31 33:36-33:34 38:38-36:36 40:43-38:38 45:45-40:40 47:50-42:43 52:59-45:50\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"dunmore pa sons sonores vendredi matin s'il vous plaît\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:6-3:6 0:6-1:2 0:6-0:0 8:9-8:9 11:15-16:22 11:15-11:13 17:22-14:14 24:29-24:31 31:37-33:37 39:44-41:42 39:44-44:47 39:44-49:53 39:44-39:39 39:44-40:40\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"rencontrer mon manager\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:6-0:9 8:9-11:13 11:17-15:21\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"enregistrer la date mai 17 photos partie\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:3-0:10 5:7-12:13 9:12-15:18 14:16-20:22 18:19-25:25 18:19-24:24 21:28-27:32 30:34-34:39\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"rendez-vous pour demain s'il vous plaît\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:7-12:15 9:19-7:10 9:19-6:6 9:19-0:5 25:32-17:22 34:39-26:27 34:39-29:32 34:39-34:38 34:39-24:24 34:39-25:25\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"la réunion durera une heure\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:2-0:1 4:10-3:9 17:20-11:16 26:28-18:20 30:33-22:26\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"calendrier pour novembre 1948\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:7-0:9 9:11-11:14 13:20-16:23 22:25-25:25 22:25-27:27 22:25-26:26 22:25-28:28\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"afficher les plans de week-end\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:6-0:7 8:14-26:26 8:14-27:29 8:14-22:25 8:14-19:20 16:20-13:17 16:20-9:11\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"ai-je quelque chose le mercredi?\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:1-2:2 0:1-0:1 3:3-3:4 10:17-14:18 10:17-6:12 19:20-20:21 22:30-23:30 32:32-31:31\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"Combien de jours y a-t-il entre le 13 mars 2015 et aujourd'hui ?\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"4:7-0:6 4:7-8:9 9:12-11:15 14:16-21:21 18:22-20:20 18:22-23:24 18:22-19:19 18:22-17:17 18:22-22:22 24:30-26:30 32:36-38:41 38:41-36:36 38:41-35:35 43:46-44:44 43:46-45:45 43:46-46:46 43:46-43:43 48:50-48:49 52:56-59:61 52:56-51:57 52:56-58:58 58:58-63:63\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"tirer vers le haut de mon rendez-vous savoir combien de temps j'ai avant mon prochain rendez-vous\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:3-0:4 5:6-14:17 8:9-22:24 8:9-19:20 8:9-6:9 8:9-11:12 11:21-26:31 11:21-33:36 11:21-32:32 23:26-38:43 32:34-45:51 36:39-53:54 41:44-56:60 46:46-62:62 46:46-63:63 48:51-64:65 53:58-67:71 60:61-73:75 63:66-77:84 68:78-86:91 68:78-92:92 68:78-93:96\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"recherche de rencontres avec Chris\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:5-0:8 7:9-10:11 11:18-13:22 20:23-24:27 25:29-29:33\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"montrez-moi l'heure de la fête de mariage de demain\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:3-0:6 5:6-8:10 5:6-7:7 8:15-45:50 8:15-12:12 17:17-13:13 19:19-31:32 19:19-42:43 19:19-20:21 21:27-34:40 29:33-26:29 29:33-23:24 35:38-14:18\"\n         }\n       }\n     ]\n   },\n   {\n     \"detectedLanguage\": {\n       \"language\": \"en\",\n       \"score\": 1\n     },\n     \"translations\": [\n       {\n         \"text\": \"dites-moi les détails de l'événement\",\n         \"to\": \"fr\",\n         \"alignment\": {\n           \"proj\": \"0:3-0:4 5:6-6:8 5:6-5:5 8:10-10:12 8:10-25:25 8:10-22:23 8:10-26:26 12:16-27:35 18:24-14:20\"\n         }\n       }\n     ]\n   }\n ]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translateLuResponseSecond.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"voix activée lecture des rendez-vous cette semaine\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:3 6:14-5:10 6:14-11:11 16:22-13:19 24:25-21:23 27:38-25:30 27:38-31:31 27:38-32:35 40:43-37:41 45:48-43:49\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"suis-je libre d'être avec des amis samedi ?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:1-0:3 3:3-5:6 3:3-4:4 5:8-8:12 10:11-14:14 10:11-15:15 10:11-26:28 13:14-16:19 16:19-21:24 21:27-30:33 29:36-35:40 38:38-42:42\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"rendez-vous avec Johnson doit être la semaine prochaine\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:10-0:5 0:10-7:10 0:10-6:6 12:15-12:15 17:23-17:23 25:29-25:28 31:32-35:36 34:35-30:33 37:40-46:54 42:45-38:44\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"appeler papa mike\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:6 5:7-8:11 9:12-13:16\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"changer la réunion avec Chris à 9: 00 h\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:6 7:9-8:9 11:17-11:17 19:22-19:22 24:28-24:28 30:31-30:30 33:33-32:32 35:35-33:33 37:38-36:36 37:38-35:35 40:41-38:38\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"email cloney john\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:4 6:11-11:11 6:11-6:10 13:16-13:16\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"prolonger la réunion du déjeuner 30 minutes de plus\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:8 0:5-10:11 7:11-24:31 7:11-21:22 13:19-13:19 21:22-34:34 21:22-33:33 24:30-36:42 32:36-47:50 32:36-44:45\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Je veux reprogrammer la réuni on au club de l'armée de l'air\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:0-0:1 2:5-3:6 10:19-10:19 10:19-8:9 21:23-21:22 25:31-24:28 33:34-33:34 36:38-44:44 40:42-57:59 40:42-46:50 40:42-55:55 50:53-36:39\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"réunions de marketing le mardi sera maintenant tous les mercredis s'il vous plaît changer sur mon calendrier\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:8-12:20 0:8-9:10 10:17-0:7 10:17-22:23 22:29-25:29 31:34-31:34 36:38-36:45 43:47-52:54 43:47-47:50 49:57-56:63 59:64-71:74 59:64-76:80 59:64-68:69 59:64-66:66 59:64-64:64 59:64-67:67 66:71-82:88 73:74-90:92 76:77-94:96 79:86-98:107\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"déplacer la fête bbq à vendredi\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:7 5:7-9:10 9:11-17:19 13:17-12:15 19:20-21:21 22:27-23:30\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"l'atelier durera 10 heures\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:0 0:2-1:1 4:11-2:8 18:21-10:15 27:28-18:18 27:28-17:17 30:34-20:25\"\n          }\n        }\n      ]\n    }\n  ]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translateLuisResponse.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ajouter un nouvel événement le 27 - avr\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:6 4:4-8:9 6:8-11:16 10:14-18:26 16:17-28:29 19:20-31:32 22:22-34:34 24:26-36:38\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ajouter une nouvelle tâche d'affectation de finition\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:6 4:4-8:10 6:8-12:19 15:20-44:51 15:20-27:39 15:20-41:42 22:31-21:25\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ajouter un événement à lire sur adam lambert nouvelles\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:6 4:5-8:9 7:11-11:19 13:14-21:21 16:19-23:26 21:25-28:30 27:30-32:35 32:38-37:43 40:43-45:53\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ajouter un événement pour visiter 209 nashville gym\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:6 4:5-8:9 7:11-11:19 13:14-21:24 16:20-26:32 22:24-34:36 26:34-38:46 36:38-48:50\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ajouter du théâtre imax à mes événements à venir\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:6 4:7-19:22 4:7-8:9 9:15-11:17 17:18-24:24 20:21-26:28 23:30-43:47 23:30-41:41 32:37-30:39\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"calendrier i ' ll être au garage de 8 à 3 ce samedi\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:7-0:9 9:9-11:11 11:11-13:13 13:14-15:16 16:17-18:21 19:20-23:24 26:31-26:31 33:36-33:34 38:38-36:36 40:43-38:38 45:45-40:40 47:50-42:43 52:59-45:50\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"dunmore pa sons sonores vendredi matin s'il vous plaît\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:6-0:6 8:9-8:9 11:15-16:22 17:22-11:14 24:29-24:31 31:37-33:37 39:44-41:42 39:44-44:47 39:44-49:53 39:44-39:40\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"rencontrer mon manager\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:6-0:9 8:9-11:13 11:17-15:21\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"enregistrer la date mai 17 photos partie\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:10 5:7-12:13 9:12-15:18 14:16-20:22 18:19-24:25 21:28-27:32 30:34-34:39\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"rendez-vous pour demain s'il vous plaît\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:7-12:15 9:19-0:10 25:32-17:22 34:39-26:27 34:39-29:32 34:39-34:38 34:39-24:25\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"la réunion durera une heure\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:2-0:1 4:10-3:9 17:20-11:16 26:28-18:20 30:33-22:26\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"calendrier pour novembre 1948\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:7-0:9 9:11-11:14 13:20-16:23 22:25-25:28\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"afficher les plans de week-end\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:6-0:7 8:14-22:29 8:14-19:20 16:20-13:17 16:20-9:11\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"ai-je quelque chose le mercredi?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"3:3-0:4 10:17-14:18 10:17-6:12 19:20-20:21 32:32-23:31\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Combien de jours y a-t-il entre le 13 mars 2015 et aujourd'hui ?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"4:7-0:6 4:7-8:9 9:12-11:15 18:22-19:24 18:22-17:17 24:30-26:30 32:36-38:41 38:41-35:36 43:46-43:46 48:50-48:49 52:56-51:61 58:58-63:63\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"tirer vers le haut de mon rendez-vous savoir combien de temps j'ai avant mon prochain rendez-vous\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:4 5:6-14:17 8:9-22:24 8:9-19:20 8:9-6:9 8:9-11:12 11:21-26:36 23:26-38:43 32:34-45:51 36:39-53:54 41:44-56:60 46:46-62:63 48:51-64:65 53:58-67:71 60:61-73:75 63:66-77:84 68:78-86:96\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"recherche de rencontres avec Chris\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:8 7:9-10:11 11:18-13:22 20:23-24:27 25:29-29:33\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"montrez-moi l'heure de la fête de mariage de demain\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"5:6-0:10 8:15-45:50 8:15-12:13 19:19-31:32 19:19-42:43 19:19-20:21 21:27-34:40 29:33-26:29 29:33-23:24 35:38-14:18\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translateLuisResponseSecond.json",
    "content": "[\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"dites-moi les détails de l'événement\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"5:6-0:8 8:10-10:12 8:10-22:23 12:16-25:35 18:24-14:20\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"voix activée lecture des rendez-vous cette semaine\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:3 6:14-5:11 16:22-13:19 24:25-21:23 27:38-25:35 40:43-37:41 45:48-43:49\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"suis-je libre d'être avec des amis samedi ?\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"3:3-0:6 5:8-8:12 10:11-26:28 13:14-14:19 16:19-21:24 21:27-30:33 29:36-35:40 38:38-42:42\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"rendez-vous avec Johnson doit être la semaine prochaine\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:10-0:10 12:15-12:15 17:23-17:23 25:29-25:28 31:32-35:36 34:35-30:33 37:40-46:54 42:45-38:44\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"appeler papa mike\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:6 5:7-8:11 9:12-13:16\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"changer la réunion avec Chris à 9: 00 h\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:6 7:9-8:9 11:17-11:17 19:22-19:22 24:28-24:28 30:31-30:30 35:35-32:33 37:38-35:36 40:41-38:38\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"email cloney john\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:4-0:4 6:11-6:11 13:16-13:16\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"prolonger la réunion du déjeuner 30 minutes de plus\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:5-0:8 0:5-10:11 7:11-24:31 7:11-21:22 13:19-13:19 21:22-33:34 24:30-36:42 32:36-47:50 32:36-44:45\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"Je veux reprogrammer la réuni on au club de l'armée de l'air\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:0-0:1 2:5-3:6 10:19-8:19 21:23-21:22 25:31-24:28 33:34-33:34 36:38-44:45 40:42-57:59 40:42-46:50 40:42-55:56 50:53-36:39\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"réunions de marketing le mardi sera maintenant tous les mercredis s'il vous plaît changer sur mon calendrier\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:8-12:20 0:8-9:10 10:17-0:7 10:17-22:23 22:29-25:29 31:34-31:34 36:38-36:45 43:47-52:54 43:47-47:50 49:57-56:64 59:64-71:74 59:64-76:80 59:64-66:69 66:71-82:88 73:74-90:92 76:77-94:96 79:86-98:107\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"déplacer la fête bbq à vendredi\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"0:3-0:7 5:7-9:10 9:11-17:19 13:17-12:15 19:20-21:21 22:27-23:30\"\n          }\n        }\n      ]\n    },\n    {\n      \"detectedLanguage\": {\n        \"language\": \"en\",\n        \"score\": 1\n      },\n      \"translations\": [\n        {\n          \"text\": \"l'atelier durera 10 heures\",\n          \"to\": \"fr\",\n          \"alignment\": {\n            \"proj\": \"4:11-0:8 18:21-10:15 27:28-17:18 30:34-20:25\"\n          }\n        }\n      ]\n    }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/allEntities.lu",
    "content": "$userName:simple\n$PREBUILT:datetimeV2\n$PREBUILT:age\n$PREBUILT:dimension\n$PREBUILT:email\n$PREBUILT:money\n$PREBUILT:number\n$PREBUILT:ordinal\n$PREBUILT:percentage\n$PREBUILT:phonenumber\n$PREBUILT:temperature\n$PREBUILT:url\n$commPreference:call=\n- rufen\n- Telefonanruf\n- gib mir einen Ring\n- ring\n- rufen\n- Handy\n- telefon\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/fileRef.lu",
    "content": "[Süß](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/intentsAndUtterances.lu",
    "content": "> Tout faire comme un modèle\n# AskForUserName\n- {userName}\n- Je suis {userName}\n- Appelle-moi {userName}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/labelledEntityValue.lu",
    "content": "# Greeting\n- Hallo {time = morgen}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/newEntity.lu",
    "content": "@ ml s1 sr1\n@ phraselist pl1 =\n\t\t- fromage\n\t\t- tomate\n\t\t- pomme de terre\n@ list l1 hasRoles lr1,lr2 =\n\t- one:\n\t\t- un\n\t\t- deux\n\t\t- trois\n\t- four:\n\t\t- quatre\n\t\t- cinq\n\t\t- six\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/normalizedValue.lu",
    "content": "$ simple : one =\n- un\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/options.lu",
    "content": "> # Intent definitions\n\n##FindDoc\n- finden {DocType=wort}  Doc in Ordnerarbeit\n- [((zeigen|finden)|offen)]  {DocType}  Doc im Ordner {FolderName}\n\n$FoldeName:work=\n- arbeit\n- Funktioniert\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/phraseList.lu",
    "content": "$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:PhraseList interchangeable\n- Bist du\n- Du bist\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/qna.lu",
    "content": "### ? Wie ändere ich die Standardmeldung\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/translation/translatedfiles/qnaContent.lu",
    "content": "# ? Hallo\n```markdown\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/1.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"1\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/1.lu",
    "content": "# Greeting\n- Hallo\n- Hallo\n- Guten Morgen\n- Guten Abend\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/11.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    },\n    {\n      \"name\": \"changeAlarm\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change an alarm\",\n      \"intent\": \"changeAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"santa wants a blue ribbon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"change {remTime} to {newTime}\",\n      \"intent\": \"changeAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"remTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"newTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"11\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/12.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"fax\",\n          \"list\": [\n            \"fax\",\n            \"fascimile\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"ChocolateType\",\n      \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n      \"mode\": false,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete alarm\",\n      \"intent\": \"DeleteAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text messages\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"santa wants a blue ribbon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"12\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/12qna.json",
    "content": "{\n  \"urls\": [\n    \"https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs\"\n  ],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"You can change the default message if you use the QnAMakerDialog. \\r\\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How can I change the default message from QnA Maker?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can use our REST apis to manage your KB. \\r\\n\\\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I programmatically update my KB?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Vishwac\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your ceo?\",\n        \"get me your ceo info\"\n      ],\n      \"metadata\": []\n    }\n  ],\n  \"files\": [],\n  \"name\": \"12qna\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/13.json",
    "content": "{\n    \"intents\": [\n      {\n        \"name\": \"Application\",\n        \"features\": [\n          {\n            \"featureName\": \"Application Synonyms\",\n            \"isRequired\": false\n          }\n        ]\n      }\n    ],\n    \"entities\": [\n      \n    ],\n    \"composites\": [\n      \n    ],\n    \"closedLists\": [\n      \n    ],\n    \"regex_entities\": [\n      \n    ],\n    \"regex_features\": [\n      \n    ],\n    \"utterances\": [\n      \n    ],\n    \"patterns\": [\n      \n    ],\n    \"patternAnyEntities\": [\n      \n    ],\n    \"prebuiltEntities\": [\n      \n    ],\n    \"luis_schema_version\": \"7.0.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"13\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\",\n    \"tokenizerVersion\": \"1.0.0\",\n    \"phraselists\": [\n      {\n        \"name\": \"Application Synonyms\",\n        \"words\": \"Application,Web pages,Sites\",\n        \"mode\": true,\n        \"activated\": true,\n        \"enabledForAllModels\": false\n      }\n    ]\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/2.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"2\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/3.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"3\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/4.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"4\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/5.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"5\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/6.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"6\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/7.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"7\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/9.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"9\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/9a.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"9a\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/Child_Entity_With_Spaces.lu",
    "content": "\n> LUIS application information\n> !# @app.name = Pizza_app_full\n> !# @app.versionId = 0.6 Beta Version\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n> !# @app.settings.UseAllTrainingData = false\n> !# @app.tokenizerVersion = 1.0.0\n\n\n> # Intent definitions\n\n## CancelOrder\n- cancel\n- cancel it i dont want it anymore\n- cancel it please\n- cancel my order\n- cancel order\n- cancel that order\n- cancel the order\n- dont make my order anymore\n- dont want the order anymore\n- make sure that my order is cancelled\n\n\n@ intent CancelOrder usesFeature GreetingDescriptor\n\n## Confirmation\n- awesome\n- confirm\n- confirming\n- correct\n- go ahead\n- looks alright\n- looks fine by me\n- looks good\n- looks good to me\n- looks right\n- pretty much\n- right\n- that's great\n- yes\n- yes order it\n\n\n@ intent Confirmation usesFeature GreetingDescriptor\n\n## Delivery\n- {@Address={@Building Number=17}, {@Street=orouba street}, {@District=nasr city}, {@City=cairo}}\n- address is {@Address={@Building Number=675}, {@Street=gamal abd el nasser street}, {@City=giza}}\n- deliver it at {@Address={@Building Number=13}, {@Street=giza square}}\n- i want it to be delivered at {@Address={@Building Number=498}, {@Street=el tahrir street}, {@District=dokki}}\n- my address is {@Address={@Street=4}, {@Street=horreya square}, {@District=maadi}}\n\n\n@ intent Delivery usesFeature GreetingDescriptor\n\n## Greetings\n- hello\n- hey\n- hey again\n- hey there\n- hi\n- hii\n- hiiiii\n- how are you\n\n\n@ intent Greetings usesFeature GreetingDescriptor\n\n## ModifyOrder\n- {@Order={@FullPizzaWithModifiers=a cheese pizza {@Size=medium} {@ToppingModifiers={@Modifier=with some} {@Topping=pineapple} and {@Topping=chicken}}}}\n- {@Order=add {@FullPizzaWithModifiers={@Quantity=5} {@Size=party size} {@PizzaType=marinera pizzas}} and i will pick them up at 6pm}\n- can i get {@Order={@FullPizzaWithModifiers={@Quantity=3} {@PizzaType=pepperoni pizzas}} and {@FullPizzaWithModifiers=a {@PizzaType=four cheese pizza}} {@SideOrder=with {@SideProduct=a large house salad} and {@SideProduct=a large fries}}}\n- can i get {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=veggie pizza} but can i get it {@ToppingModifiers={@Modifier=without} {@Topping=onions}}}}\n- can i get {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=cheese pizza} {@ToppingModifiers={@Modifier=with} {@Topping=sausage} {@Scope=on half}} and {@ToppingModifiers={@Topping=chicken} {@Scope=on the other half}}}}\n- can i get {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=cheese} and {@Topping=mushrooms}}} {@SideOrder=plus some {@SideProduct=ranch dip}} for delivery paying cash}\n- can i get {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=sausage pizza}} and {@SideOrder={@SideProduct=fries}} delivered}\n- can i get {@Order={@FullPizzaWithModifiers=a {@PizzaType=pepperoni pizza}} and {@SideOrder=a can of {@SideProduct=coke}}} please\n- can i get {@Order={@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pizza}}}\n- can i get {@Order={@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=onions} {@Topping=peppers} and {@Topping=olives}}}}\n- can i get {@Order={@FullPizzaWithModifiers=an {@Size=extra large} {@PizzaType=canadian pizza} {@ToppingModifiers={@Modifier=with} {@Scope=half} {@Topping=ground beef}} and {@ToppingModifiers={@Scope=half} {@Topping=chicken}}}}\n- can i order {@Order={@FullPizzaWithModifiers={@Quantity=2} {@Size=large} {@PizzaType=canadian pizzas} and can i {@ToppingModifiers={@Modifier=add} {@Topping=chicken} on {@Scope=one of them}} please}}\n- can i order {@Order={@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=cheese pizza}} and {@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=sausage and mushroom pizza}}}\n- can i please order{@Order={@FullPizzaWithModifiers= a {@Size=large} {@PizzaType=meatlovers pizza} but {@ToppingModifiers={@Modifier=without} {@Topping=ground beef}}}} please\n- can i please place an order for {@Order={@FullPizzaWithModifiers=an {@Size=extra large} {@PizzaType=hawaiian pizza} {@ToppingModifiers={@Modifier=including} {@Topping=bacon} {@Topping=pineapple} and some {@Topping=cheddar cheese}}}}\n- could i get {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=sheet pizza} and {@ToppingModifiers=do {@Scope=half with} {@Topping=pepperoni}} and {@ToppingModifiers={@Scope=the other} just {@Topping=cheese}}}}\n- could i get {@Order={@FullPizzaWithModifiers=a {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with} {@Topping=salami} instead}} and {@FullPizzaWithModifiers={@PizzaType=a ham and pineapple pizza} {@ToppingModifiers={@Modifier=with} {@Topping=bacon}} {@ToppingModifiers={@Modifier=instead of} {@Topping=ham}}}}\n- could i get {@Order={@FullPizzaWithModifiers=a {@PizzaType=pizza} that's {@ToppingModifiers={@Scope=half} {@Topping=pepperoni} {@Topping=sausage} and {@Topping=onion}} and {@ToppingModifiers={@Scope=the other half} with just plain {@Topping=cheese}}}}\n- {@Order=delivery for {@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with} {@Topping=parsley} and {@Topping=parmesan cheese}}} {@SideOrder=plus a {@SideProduct=garlic dip}} paying cash}\n- {@Order=delivery order for {@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=cheese pizza} {@ToppingModifiers={@Modifier=with} {@Topping=ham} and {@Topping=olives}}} and {@SideOrder=a side of {@SideProduct=cheese dip}}}\n- get me{@Order= {@FullPizzaWithModifiers=a {@PizzaType=bbq pizza} {@ToppingModifiers={@Modifier=without} {@Topping=cheese}}} and {@FullPizzaWithModifiers=an {@Size=extra large} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with} {@Topping=peppers} {@Topping=olives} and {@Topping=ham}}} and {@SideOrder=a {@SideProduct=salad} on the side}}\n- get me {@Order={@FullPizzaWithModifiers=a {@PizzaType=cheddar cheese pizza} {@Size=large} {@ToppingModifiers={@Modifier=with extra} {@Topping=anchovies}}}}\n- get me {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=napoli pizza} and {@ToppingModifiers={@Modifier=add extra} {@Topping=anchovies}} {@ToppingModifiers={@Modifier=remove} the {@Topping=cheese}}}}\n- get me {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=hand tossed pizza} {@ToppingModifiers={@Modifier=with} {@Topping=mushrooms} {@Scope=on half} of it} and {@ToppingModifiers={@Topping=pepperoni} {@Scope=on the other half}}}}\n- get me {@Order={@FullPizzaWithModifiers=a {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=without} {@Topping=pepperoni}}} }please\n- get me {@Order={@FullPizzaWithModifiers=one {@PizzaType=monaco pizza} but {@ToppingModifiers={@Modifier=hold the} {@Topping=ham}}}}\n- get me {@Order={@FullPizzaWithModifiers={@Quantity=three} {@PizzaType=pepperoni pizzas} {@ToppingModifiers={@Modifier=without} {@Topping=onions}} but {@ToppingModifiers={@Modifier=add} {@Topping=bacon}}}}\n- give me {@Order={@FullPizzaWithModifiers=a {@PizzaType=white castle pizza} {@ToppingModifiers={@Modifier=without} any {@Topping=peppers}}}}\n- hello i would like to order {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=hawaiian pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=cheese} {@Topping=black olives} and {@Modifier=extra} {@Topping=pepperoni}}}}\n- hello i'd like to order {@Order={@FullPizzaWithModifiers={@Quantity=6} {@Size=medium} {@PizzaType=pizzas}} for our office party {@FullPizzaWithModifiers={@Quantity=two} {@PizzaType=canadian}} {@FullPizzaWithModifiers={@Quantity=two} {@PizzaType=veggie}} and {@FullPizzaWithModifiers={@Quantity=two} {@PizzaType=meatlovers}}}\n- hey can i get {@Order={@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=pepperoni} and {@Modifier=extra} {@Topping=cheese}}}}\n- hey i want to order {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pepperoni pizza} {@ToppingModifiers=without mushrooms} {@ToppingModifiers=add extra chicken}}}\n- hey i want to order {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=supreme pizza} {@ToppingModifiers={@Modifier=add} {@Topping=cheese}} {@ToppingModifiers={@Modifier=no} {@Topping=onions}}} plus {@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with} {@Topping=sausage}}}}\n- hi can i order {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=pepperoni} {@Topping=bacon} and {@Modifier=extra} {@Topping=chicken}}}}\n- hi dear team i would order {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=margherita pizza} {@ToppingModifiers={@Modifier=add extra} {@Topping=pepper} {@Topping=ham} and {@Topping=ranch}}}}\n- hi i need to place an order for {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=cheese pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=cheese} and {@Topping=mushrooms} and {@Topping=bacon}} toppings}}\n- hi i want {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=veggie pizza} {@ToppingModifiers={@Modifier=with} {@Topping=bacon} added to {@Scope=one side}} and {@ToppingModifiers={@Scope=the other half} {@Modifier=add} {@Topping=chicken}}}}\n- hi we want {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=seafood pizza} {@ToppingModifiers={@Scope=one half} {@Modifier=no} {@Topping=mushrooms}} {@ToppingModifiers={@Scope=one half} {@Modifier=extra} {@Topping=onions}}}}\n- i need {@Order={@FullPizzaWithModifiers={@Quantity=2} {@Size=large} {@PizzaType=cheese pizzas}} {@FullPizzaWithModifiers={@Quantity=6} {@Size=large} {@PizzaType=pepperoni pizzas}} and {@FullPizzaWithModifiers={@Quantity=1} {@Size=large} {@PizzaType=supreme pizza}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@PizzaType=chicken pizza} {@ToppingModifiers={@Modifier=without} {@Topping=mushroom}}} and {@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=extra} {@Topping=anchovies}}} and {@SideOrder=some {@SideProduct=bread sticks}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=ham pizza} {@ToppingModifiers={@Modifier=extra} {@Topping=bacon} and {@Topping=corn}}} the payment will be in cash}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=meat lovers pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=sausage} {@Topping=cheese} and {@Topping=bacon}}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pepperoni} {@ToppingModifiers={@Modifier=with} {@Topping=bell peppers} and {@Topping=black olives}}} and {@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=grilled chicken} {@ToppingModifiers={@Modifier=with} {@Topping=bacon}}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=alfredo sauce}}} and {@FullPizzaWithModifiers={@Quantity=one} {@ToppingModifiers={@Modifier=with} {@Topping=cheddar cheese}}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=alfredo sauce}} {@ToppingModifiers={@Modifier=instead of} the {@Topping=pizza sauce}}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=jalapenos}} {@ToppingModifiers=one with {@Scope=half} pineapples} and one {@ToppingModifiers=with light onions}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=without} {@Topping=ham}} {@ToppingModifiers={@Modifier=add extra} {@Topping=pineapple}}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=sausage and mushroom pizza}} and {@SideOrder=a large {@SideProduct=coke}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=cheese pizza} {@ToppingModifiers={@Modifier=add} {@Topping=mushrooms} and {@Topping=onions}}} and {@FullPizzaWithModifiers={@Quantity=one} {@PizzaType=chicken pizza} {@ToppingModifiers={@Modifier=needs} {@Topping=peppers} and {@Topping=sausage}}}}\n- i need {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@Crust=thin crust} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with} {@Topping=bacon} and {@Topping=grilled onions}}} {@SideOrder=with a side of {@SideProduct=cheesy bread sticks}}}\n- i need {@Order={@FullPizzaWithModifiers=a pepperoni sausage and mushroom {@PizzaType=pizza} and please {@ToppingModifiers={@Modifier=leave off} the {@Topping=cheese}}}}\n- i need {@Order={@FullPizzaWithModifiers={@Quantity=five} {@PizzaType=pizzas} {@ToppingModifiers={@Modifier=with} {@Topping=pepperoni} {@Topping=onions} {@Topping=green peppers}} and {@ToppingModifiers={@Topping=green olives} {@Scope=on one of them}}}}\n- i need to order {@Order={@FullPizzaWithModifiers={@Quantity=one} {@Size=large} {@PizzaType=plain cheese pizza}} {@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pepperoni pizza}} {@SideOrder={@SideProduct=bread sticks} and {@SideProduct=onion rings}}}\n- i need {@Order={@FullPizzaWithModifiers={@Quantity=twelve} {@Size=large} {@PizzaType=pizzas} {@ToppingModifiers={@Modifier=with} {@Topping=various toppings}}} for a business meeting at noon}\n- i need {@Order={@FullPizzaWithModifiers={@Quantity=two} {@Size=small} {@PizzaType=chicken pizzas} {@Crust=stuffed crust} {@ToppingModifiers={@Modifier=with extra} {@Topping=salami} {@Topping=bacon} {@Topping=ham} {@Scope=on half}} and {@ToppingModifiers={@Modifier=without} {@Topping=olives}}} and {@SideOrder=a side of {@SideProduct=garlic knots}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@PizzaType=himalyan pizza}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=meat lover's pizza} {@ToppingModifiers={@Modifier=with} {@Topping=ham} and {@Topping=sausage}}} {@SideOrder=with {@SideProduct=garlic sticks} on the side}}\n- i want {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=cheese pizza} {@ToppingModifiers={@Modifier=with} {@Topping=onions}}} {@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=olives}}} and {@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=mushrooms}}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=hawaiian pizza} {@ToppingModifiers={@Modifier=with} {@Topping=pineapple} {@Topping=canadian bacon} and {@Modifier=extra} {@Topping=cheese}}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@PizzaType=pepperoni} {@Size=large} {@ToppingModifiers={@Modifier=with extra} {@Topping=anchovies}} but {@ToppingModifiers={@Modifier=remove} {@Topping=cheese} {@Topping=olives} and {@Topping=mushroom}}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@PizzaType=pizza}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@Size=small} {@PizzaType=pepperoni pizza}}}\n- i want {@Order={@FullPizzaWithModifiers=a {@PizzaType=supreme pizza} but i do {@ToppingModifiers={@Modifier=not want} the {@Topping=sausage} on it}}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=four} {@PizzaType=hawaiian pizzas} but i do {@ToppingModifiers={@Modifier=not want} {@Topping=jalapenos} on it}}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=one} {@Size=large} {@PizzaType=chicken ranch pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=muhsroom}} {@ToppingModifiers=but {@Modifier=without} {@Topping=ham}}} and {@SideOrder={@SideProduct=garlic knots} on the side}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=six} {@PizzaType=cheesy pizzas}}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=three} {@PizzaType=cheese pizzas}}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=three} {@PizzaType=cuban pizzas} {@ToppingModifiers={@Modifier=with} {@Topping=bacon} and {@Topping=mushrooms}}} and {@SideOrder={@SideProduct=fries} on the side}}\n- i want to order {@Order={@FullPizzaWithModifiers=a {@PizzaType=chicken pizza}}}\n- i want to order {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=clam pizza} {@ToppingModifiers={@Modifier=extra} {@Topping=white sauce}}} and {@SideOrder=a side order of {@SideProduct=garlic knots} to go}}\n- i want to order {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=cheese pizza}} and {@SideOrder=a {@SideProduct=root beer}}}\n- i want to order {@Order={@FullPizzaWithModifiers={@PizzaType=a pizza} {@ToppingModifiers={@Modifier=with} {@Topping=olives} {@Scope=on one half}} and {@ToppingModifiers={@Topping=green peppers} {@Scope=on the other half}}}}\n- i want to order {@Order={@FullPizzaWithModifiers=an {@PizzaType=icelandic pizza}}}\n- i want to order {@Order={@FullPizzaWithModifiers=an {@Size=individual} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with} {@Topping=salami} and extra {@Topping=mushrooms}} {@ToppingModifiers=replace {@Topping=paprika}} {@ToppingModifiers={@Modifier=with} {@Topping=corn}}}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=two} {@Size=medium} {@PizzaType=chicken pizzas} {@ToppingModifiers={@Modifier=with} {@Topping=anchovies}}}}\n- i want {@Order={@FullPizzaWithModifiers={@Quantity=two} {@PizzaType=pepperoni pizzas}}}\n- i would like {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=vegetarian pizza} {@ToppingModifiers={@Scope=half} {@Topping=onions}} {@ToppingModifiers={@Scope=half} {@Topping=peppers}}}}\n- i would like {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=mushrooms} and light {@Topping=sausage}} but {@ToppingModifiers={@Modifier=remove} the {@Topping=cheese}}}}\n- i would like {@Order={@FullPizzaWithModifiers=a {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=cheese}}} and {@SideOrder=a side of {@SideProduct=ranch}}}\n- id like to order {@Order={@FullPizzaWithModifiers=a {@Size=large} {@PizzaType=pizza} {@ToppingModifiers={@Modifier=with extra} {@Topping=pepperoni} extra {@Topping=chicken} and {@Modifier=extra} {@Topping=cheese}}}}\n- {@Order={@FullPizzaWithModifiers={@Quantity=one} {@Size=medium} {@PizzaType=pepperoni}} and {@SideOrder=one side of {@SideProduct=macaroni and cheese}}} please\n- {@Order={@FullPizzaWithModifiers={@Quantity=one} {@Size=medium} {@PizzaType=pepperoni} {@ToppingModifiers={@Modifier=replace} the {@Topping=anchovies}} {@ToppingModifiers={@Modifier=with} {@Topping=olives}}}}\n- one pizza margherita for tonight\n- order {@Order={@FullPizzaWithModifiers=a {@Size=medium} {@Crust=stuffed crust} {@PizzaType=pizza} that has {@ToppingModifiers={@Topping=pineapple} {@Topping=canadian bacon} and {@Topping=onions} on it}}}\n- order {@Order={@FullPizzaWithModifiers=a {@PizzaType=pepperoni pizza}}}\n- order {@Order={@FullPizzaWithModifiers={@Quantity=one} {@PizzaType=chicken pizza}}}\n- order {@Order={@FullPizzaWithModifiers={@Quantity=one} {@PizzaType=mandarin pizza} {@Crust=thin crust} {@ToppingModifiers={@Modifier=with extra} {@Topping=pineapple} {@Topping=anchovies} {@Topping=onions}} and {@ToppingModifiers={@Modifier=without} {@Topping=peppers}}} and {@SideOrder={@SideProduct=fries} on the side}}\n- order {@Order={@FullPizzaWithModifiers={@Quantity=one} {@PizzaType=pizza}}}\n- please order {@Order={@FullPizzaWithModifiers={@Quantity=twelve} {@PizzaType=chelsea pizzas} but i do {@ToppingModifiers={@Modifier=not want} {@Topping=ham} on them}}}\n- please order {@Order={@FullPizzaWithModifiers={@Quantity=two} {@Crust=pan crust} {@Size=small} {@PizzaType=pepperoni pizza} {@ToppingModifiers={@Modifier=with} {@Topping=beef}}} and {@FullPizzaWithModifiers={@Quantity=three} {@Size=medium} {@PizzaType=cheese pizza} {@ToppingModifiers=with italian sausage}}}\n- request {@Order={@FullPizzaWithModifiers={@Quantity=seven} {@Size=large} {@PizzaType=honolulu hawaiian pizza} {@ToppingModifiers={@Modifier=with} {@Topping=bacon} and {@Topping=salami}}} and {@SideOrder={@SideProduct=add chicken wings}}}\n- three pizzas large chicken barbeque for tomorrow evening\n- {@number} pizzas {SizeList} {ToppingList} {ToppingList} for {datetimeV2}\n\n\n@ intent ModifyOrder usesFeatures ToppingDescriptor,SizeDescriptor,QuantityDescriptor,ModifierDescriptor,ScopeDescriptor,CrustDescriptor,GreetingDescriptor\n\n## None\n- deliver it at {@Address}\n- my address is {@Address}\n- address is {@Address}\n\n\n@ intent None usesFeature GreetingDescriptor\n\n> # Entity definitions\n\n@ ml Address usesFeature GreetingDescriptor\n    - @ ml \"Building Number\" usesFeatures number,GreetingDescriptor\n    - @ ml Street usesFeature GreetingDescriptor\n    - @ ml District usesFeature GreetingDescriptor\n    - @ ml City usesFeatures geographyV2,GreetingDescriptor\n\n\n@ ml Order usesFeature GreetingDescriptor\n    - @ ml FullPizzaWithModifiers usesFeatures ToppingDescriptor,SizeDescriptor,QuantityDescriptor,ModifierDescriptor,ScopeDescriptor,CrustDescriptor,GreetingDescriptor\n        - @ ml PizzaType usesFeature GreetingDescriptor\n        - @ SizeList Size usesFeatures SizeDescriptor,GreetingDescriptor\n        - @ number Quantity usesFeatures QuantityDescriptor,GreetingDescriptor\n        - @ CrustList Crust usesFeatures CrustDescriptor,GreetingDescriptor\n        - @ ml ToppingModifiers usesFeatures ToppingDescriptor,ModifierDescriptor,ScopeDescriptor,GreetingDescriptor\n            - @ ToppingList Topping usesFeatures ToppingDescriptor,GreetingDescriptor\n            - @ ModifierList Modifier usesFeatures ModifierDescriptor,RemoveDescriptor,AddDescriptor,GreetingDescriptor\n            - @ ScopeList Scope usesFeatures ScopeDescriptor,GreetingDescriptor\n    - @ ml SideOrder usesFeatures SideOrderDescriptor,GreetingDescriptor\n        - @ ml SideProduct usesFeature GreetingDescriptor\n    - @ ml Time usesFeatures datetimeV2,GreetingDescriptor\n\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt datetimeV2\n\n@ prebuilt geographyV2\n\n@ prebuilt number\n\n\n> # Phrase list definitions\n\n@ phraselist ToppingDescriptor(interchangeable) disabledForAllModels = \n\t- pepperoni,ham,pineapples,sausage,salami,bacon,chicken,onion,sauce,chili,pepperonis,sausages,anchovies,peperoni,mozzerella,sun dried tomatos,tomatos,tomato,basil,olives,tomatoe,eggplant,pesto,oregano,zuccini,alfredo sauce,alfredo,white sauce,parmesean,mozzarella,mozzarella cheese,butter,anchovie,canadian bacon,bacon strips,grilled chicken,italian sausage,green peppers,bbq sauce,parmesan cheese,pizza sauce,jalapeno peppers,jalapenos,jalapeno,jalapeño,hot pepper,chili pepper,meatball,meatballs,mushroom,mushrooms,pesto sauce\n\n@ phraselist SizeDescriptor(interchangeable) disabledForAllModels = \n\t- large,small,medium,individual,personal,xlarge,extra large,family,party size,large family\n\n@ phraselist QuantityDescriptor(interchangeable) disabledForAllModels = \n\t- one,two,three,four,five,six,eight,seven,ten,nine,1,2,3,4,5,6,7,8,9,10,11,twelve,12,13,14,15\n\n@ phraselist ModifierDescriptor(interchangeable) disabledForAllModels = \n\t- with,without,extra,with extra,no,add,remove,replace,hold the,more of,needs,just,with some,need,substitute,instead of,not want,except,leave off,replace with,do not want,dont want,don't want\n\n@ phraselist ScopeDescriptor(interchangeable) disabledForAllModels = \n\t- half,on half,one one half,on the other half,the other half,on one,on one of them,half with,1/2,other half,one side,on the other side,the other side,other side,half and half,half & half\n\n@ phraselist CrustDescriptor(interchangeable) disabledForAllModels = \n\t- original,pan,thin,pan crust,original crust,thin crust,thick crust,stuffed crust,deep dish,deep dish crust,thin 'n crispy\n\n@ phraselist RemoveDescriptor(interchangeable) disabledForAllModels = \n\t- without,remove,no,with no,substitute,hold,hold the,replace,instead of,leave off,not want,dont want,do not want,except\n\n@ phraselist AddDescriptor(interchangeable) disabledForAllModels = \n\t- with,with extra,extra,add extra,add,with more,some,just,needs,replaced with\n\n@ phraselist SideOrderDescriptor(interchangeable) disabledForAllModels = \n\t- a side of,with a side of,side of,on the side\n\n@ phraselist GreetingDescriptor(interchangeable) enabledForAllModels = \n\t- hello,hey,how are you,good morning,welcome,good day,hi,ciao,salut,hola,bonsoir,hallo,hello!,hi there,hi!,hey!,heeeeeeeey,evening\n\n\n> # List entities\n\n@ list CrustList = \n\t- Deep Dish :\n\t\t- deep dish\n\t\t- deep dish crust\n\t- Pan :\n\t\t- regular\n\t\t- normal\n\t\t- original\n\t\t- regular crust\n\t\t- normal crust\n\t\t- original crust\n\t\t- pan crust\n\t- Stuffed Crust :\n\t\t- stuffed criust\n\t\t- stuffed crusts\n\t\t- stuffed crust\n\t- Thin :\n\t\t- thin\n\t\t- skinny\n\t\t- thin crust\n\t\t- skinny crust\n\n\n@ list ModifierList = \n\t- Add :\n\t\t- with\n\t\t- with extra\n\t\t- extra\n\t\t- add\n\t\t- more of\n\t\t- needs\n\t\t- just\n\t\t- replaced with\n\t\t- with some\n\t- Remove :\n\t\t- without\n\t\t- substitute\n\t\t- no\n\t\t- hold\n\t\t- hold the\n\t\t- replace\n\t\t- instead of\n\t\t- with no\n\t\t- leave off\n\t\t- not want\n\t\t- dont want\n\t\t- except\n\n\n@ list ScopeList = \n\t- Half :\n\t\t- on half\n\t\t- on one half\n\t\t- the other half\n\t\t- half with\n\t\t- on one side\n\t\t- one side\n\t\t- 1/2\n\t\t- on the other half\n\t\t- other half\n\t\t- the other\n\t\t- half\n\t- Half And Half :\n\t\t- half and half\n\t\t- half & half\n\t- On One :\n\t\t- on one\n\t\t- on one of them\n\n\n@ list SizeList = \n\t- Extra Large :\n\t\t- XL\n\t\t- huge\n\t\t- super big\n\t\t- massive\n\t- Large :\n\t\t- large\n\t- Medium :\n\t\t- medium\n\t\t- regular\n\t\t- individual\n\t- Party Size :\n\t\t- party size\n\t- Small :\n\t\t- small\n\t\t- smallest\n\n\n@ list ToppingList = \n\t- Alfredo Sauce :\n\t\t- alfredo\n\t\t- alfredo sauce\n\t\t- white sauce\n\t- All :\n\t\t- everything\n\t\t- various toppings\n\t- Anchovies :\n\t\t- anchovie\n\t\t- anchovies\n\t- Artichokes :\n\t\t- artichokes\n\t\t- artichoke\n\t\t- artichockes\n\t- Bacon :\n\t\t- bacon\n\t\t- bacon strips\n\t- Banana Pepper :\n\t\t- yellow peppers\n\t\t- yellow pepper\n\t\t- banana pepper\n\t\t- banana peppers\n\t- Barbecue :\n\t\t- BBQ\n\t\t- barbeque\n\t\t- barbecue\n\t- Basil :\n\t\t- basil\n\t\t- basils\n\t- Beef :\n\t\t- beef\n\t\t- ground beef\n\t\t- meat\n\t\t- hamburger\n\t- Broccoli :\n\t\t- broccoli\n\t- Canadian Bacon :\n\t\t- canadian bacon\n\t\t- canada bacon\n\t- Cheddar :\n\t\t- cheddar\n\t\t- cheddar cheese\n\t- Cheese :\n\t\t- cheeses\n\t\t- cheese\n\t- Chicken :\n\t\t- chicken\n\t\t- chickens\n\t\t- grilled chicken\n\t- Corn :\n\t\t- corn\n\t- Dip :\n\t- Eggplant :\n\t\t- eggplant\n\t\t- eggplants\n\t- Everything :\n\t\t- various toppings\n\t\t- everything\n\t\t- works\n\t\t- the works\n\t- Garlic :\n\t\t- garlic\n\t\t- garlics\n\t- Green Olive :\n\t\t- green olive\n\t\t- green olives\n\t- Ham :\n\t\t- ham\n\t- Hot Sauce :\n\t\t- hot sauce\n\t- Jalapeno :\n\t\t- Jalapenos\n\t\t- jalapeno\n\t\t- jalapeno peppers\n\t\t- jalapeno pepper\n\t\t- spicy peppers\n\t- Lettuce :\n\t\t- lettuce\n\t- Meatballs :\n\t\t- meatball\n\t\t- meatballs\n\t- Mozzarella :\n\t\t- mozzarella\n\t\t- mozzarella cheese\n\t\t- mozzerella\n\t\t- mozzerella cheese\n\t\t- mozarela cheese\n\t\t- mozarela\n\t\t- mozzaralla ranch\n\t\t- mozzerella ranch\n\t- Mushroom :\n\t\t- Mushrooms\n\t\t- mushroom\n\t\t- muhsroom\n\t- Olive :\n\t\t- olive\n\t\t- black olive\n\t\t- black olives\n\t\t- olives\n\t- Onions :\n\t\t- onion\n\t\t- onions\n\t\t- grilled onions\n\t- Oregano :\n\t\t- oregano\n\t\t- oreganos\n\t- Parmesan Cheese :\n\t\t- parmesan cheese\n\t\t- parmisan cheese\n\t\t- parmesan\n\t- Pepperoni :\n\t\t- pepperoni\n\t\t- pepperonis\n\t\t- peperoni\n\t- Peppers :\n\t\t- green peppers\n\t\t- green pepper\n\t\t- pepper\n\t\t- peppers\n\t- Pesto :\n\t\t- pesto\n\t\t- pesto sauce\n\t- Pineapple :\n\t\t- pineapple\n\t\t- pineapples\n\t- Ranch :\n\t\t- ranch\n\t\t- ranch sauce\n\t- Red Peppers :\n\t\t- red pepper\n\t\t- red peppers\n\t- Salami :\n\t\t- salami\n\t\t- salamis\n\t- Sauce :\n\t\t- sauce\n\t\t- red sauce\n\t\t- red sauces\n\t\t- pizza sauce\n\t- Sausage :\n\t\t- italian sausage\n\t\t- sausage\n\t\t- sausages\n\t- Spinach :\n\t\t- spinach\n\t- Sun Dried Tomato :\n\t\t- sun-dried tomato\n\t- Tomato :\n\t\t- tomato\n\t\t- tomatos\n\t\t- tomatoes\n\t- Turkey :\n\t\t- turkey\n\t- Zuccini :\n\t\t- zuccinis\n\t\t- zuccini\n\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/LUISAppWithPAInherits.lu",
    "content": "\n> LUIS application information\n> !# @app.name = testPrebuiltImport\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 4.0.0\n> !# @app.tokenizerVersion = 1.0.0\n\n\n> # Intent definitions\n\n## None\n- can you delete {@ToDo.TaskContent=abc} item\n- can you delete {@ToDo.TaskContent=todo1}\n- cancel {@ToDo.TaskContent=apples} from shopping list\n- check off {@ToDo.TaskContent=apples} from list\n- check off {@ToDo.TaskContent=bananas} from my grocery list\n- check off {@ToDo.TaskContent=garbage} from grocery list\n- check off {@ToDo.TaskContent=meet john at 8 am} from to do list\n- check off {@ToDo.TaskContent=shampoo} from shopping list as done\n- check the box {@ToDo.TaskContent=shampoo} in my shopping list\n- complete {@ToDo.TaskContent=pick up black shoes} in my to-do list\n- complete task {@ToDo.TaskContent=go shopping}\n- delete {@ToDo.TaskContent=eggs} from list\n- delete off {@ToDo.TaskContent=pancake mix} on the shopping list\n- delete {@ToDo.TaskContent=shampoo} from shopping list\n- delete {@ToDo.TaskContent=shirts} from list\n- delete task {@ToDo.TaskContent=go fishing}\n- delete task {@ToDo.TaskContent=go to cinema tonight}\n- delete the item {@ToDo.TaskContent=buy socks} from my to-do list\n- delete the task {@ToDo.TaskContent=house cleanup this weekend}\n- delete the task to {@ToDo.TaskContent=hit the gym every morning}\n- delete the to do {@ToDo.TaskContent=meet my friends tomorrow}\n- delete the to do to {@ToDo.TaskContent=meet john when he come here the next friday}\n- delete the to do to {@ToDo.TaskContent=practice piano daily}\n- delete to do {@ToDo.TaskContent=buy milk}\n- delete to do {@ToDo.TaskContent=go shopping}\n- delete to do that {@ToDo.TaskContent=go hiking tomorrow}\n- done with the task {@ToDo.TaskContent=abc} in our shopping list\n- done with the task {@ToDo.TaskContent=shopping}\n- done with the task {@ToDo.TaskContent=tapioca starch} in our shopping list\n- erase {@ToDo.TaskContent=bananas} from shopping list\n- erase {@ToDo.TaskContent=peanuts} on the shopping list\n- finish {@ToDo.TaskContent=hikes} on my to do list\n- finish {@ToDo.TaskContent=peanuts} on the shopping list\n- mark {@ToDo.TaskContent=buy fish} as completed\n- mark {@ToDo.TaskContent=fish} as complete\n- mark {@ToDo.TaskContent=happy} on to dos list\n- mark {@ToDo.TaskContent=lemons and onions} in grocery list\n- mark {@ToDo.TaskContent=pancake mix} on my grocery shopping list\n- mark {@ToDo.TaskContent=peanuts} on my grocery list as done\n- mark {@ToDo.TaskContent=peanuts} on my grocery shopping list\n- mark {@ToDo.TaskContent=pick mary up} as finished\n- mark {@ToDo.TaskContent=pick up milk} on my to-do list\n- mark {@ToDo.TaskContent=play badminton with tom} as finished\n- mark {@ToDo.TaskContent=salad} on my grocery shopping list\n- mark {@ToDo.TaskContent=salad} on the groceries list\n- mark task {@ToDo.TaskContent=buy a bottle of vinegar} as finished\n- mark task {@ToDo.TaskContent=go running} as finished\n- mark task {@ToDo.TaskContent=read a book} as done\n- mark the item {@ToDo.TaskContent=garbage} from grocery list\n- mark the task {@ToDo.TaskContent=buy milk} as done\n- mark the task {@ToDo.TaskContent=get some food} as complete\n- mark the task {@ToDo.TaskContent=reserve a restaurant for tomorrow's dinner} as finished\n- mark the task {@ToDo.TaskContent=visit my grandma} as completed\n- no need to {@ToDo.TaskContent=buy milk} in grocery list\n- omit the {@ToDo.TaskContent=milk} in the grocery list\n- remove {@ToDo.TaskContent=asprin} from shopping list\n- remove {@ToDo.TaskContent=black shoes} from shopping list\n- remove {@ToDo.TaskContent=class} from todo list\n- remove {@ToDo.TaskContent=salad vegetables} from grocery list\n- remove task {@ToDo.TaskContent=buy dog food}\n- remove task {@ToDo.TaskContent=go shopping}\n- remove task {@ToDo.TaskContent=go shopping with john this saturday}\n- remove task that {@ToDo.TaskContent=go hiking this weekend}\n- remove task that {@ToDo.TaskContent=lawn mowing}\n- remove the item {@ToDo.TaskContent=paris} from my list\n- remove the task that {@ToDo.TaskContent=go to library after work}\n- remove the to do {@ToDo.TaskContent=physical examination}\n- remove the to do that {@ToDo.TaskContent=pick tom up at six p.m.}\n- remove to do {@ToDo.TaskContent=go to the gym}\n- remove to do that {@ToDo.TaskContent=go to the dentist tomorrow morning}\n- shopping list delete {@ToDo.TaskContent=a}\n- shopping list delete {@ToDo.TaskContent=dog food}\n- shopping list delete {@ToDo.TaskContent=eggs}\n- shopping list delete {@ToDo.TaskContent=milk}\n- take {@ToDo.TaskContent=coffee} off my groceries list\n- take {@ToDo.TaskContent=lemons and onions} off my shopping list\n- take {@ToDo.TaskContent=milk} off grocery list\n- take {@ToDo.TaskContent=socks and shoes} off my shopping list\n- task completed {@ToDo.TaskContent=buy gum}\n- task {@ToDo.TaskContent=train} has been done\n- todo list delete {@ToDo.TaskContent=paris vacation}\n\n\n> !# @intent.inherits = name : ToDo.AddToDo; domain_name : ToDo; model_name : AddToDo\n\n## ToDo.AddToDo\n- add a few items to the grocery list\n- add a grocery item to {@ToDo.TaskContent=buy fish}\n- add a grocery item to {@ToDo.TaskContent=buy fruit and vegetables}\n- add a grocery item to {@ToDo.TaskContent=buy vegetables}\n- add a new shopping list\n- add a shopping item to {@ToDo.TaskContent=buy dancing dresses}\n- add a shopping item to {@ToDo.TaskContent=buy orange juice}\n- add a task for {@ToDo.TaskContent=anna west to bring my swimsuit for my vacation}\n- add a task for {@ToDo.TaskContent=jimmy to play xbox games with me after work}\n- add a task for {@ToDo.TaskContent=li lei to bring my coat from home}\n- add a task for {@ToDo.TaskContent=raghu to bring my chocolates from germany}\n- add a task of {@ToDo.TaskContent=chores to do around the house}\n- add a task to {@ToDo.TaskContent=finish driving test this week}\n- add a task to {@ToDo.TaskContent=pick mary up after work}\n- add a task to {@ToDo.TaskContent=purchase fruit and vegetables}\n- add a task to {@ToDo.TaskContent=shop at gnc after work}\n- add a to do to {@ToDo.TaskContent=buy shoes}\n- add a to do to {@ToDo.TaskContent=purchase a nice sweater}\n- add a todo item {@ToDo.TaskContent=to vacuum by october 3rd}\n- add action item for {@ToDo.TaskContent=khalifa to pack my school supplies} in my list\n- add an item to {@ToDo.TaskContent=buy some snacks}\n- add {@ToDo.TaskContent=bronwnies} to the grocery list\n- add {@ToDo.TaskContent=buy gum}\n- add {@ToDo.TaskContent=buy milk} to my shopping list\n- add {@ToDo.TaskContent=call my mother} to my todo list\n- add {@ToDo.TaskContent=go running} to my to dos\n- add {@ToDo.TaskContent=go to whole foods} in my to do list\n- add grocery add {@ToDo.TaskContent=spinach} my groceries list\n- add grocery items {@ToDo.TaskContent=cream cheese and raisin} to the list\n- add grocery items {@ToDo.TaskContent=dinners and storage bag} to the shopping list\n- add {@ToDo.TaskContent=have a haircut} to my tasks\n- add items as i speak\n- add {@ToDo.TaskContent=juicer} groceries list\n- add {@ToDo.TaskContent=melon and sugars and brown sugar} to shopping list\n- add more to grocery list\n- add {@ToDo.TaskContent=peanuts} the grocery list\n- add {@ToDo.TaskContent=purchase a cinema ticket} to my list\n- add {@ToDo.TaskContent=purchasing food and drinks} to my shopping list\n- add {@ToDo.TaskContent=reading} to my to do list\n- add {@ToDo.TaskContent=shoes} to the shopping lists\n- add some items to that shopping notes\n- add some items to the grocery list\n- add some {@ToDo.TaskContent=jeans} on our shopping lists\n- add something in this grocery list\n- add something to my list\n- add {@ToDo.TaskContent=tapioca starch} on my shopping list\n- add {@ToDo.TaskContent=tapioca starch} on our shopping list\n- add task to {@ToDo.TaskContent=buy a coat}\n- add task to {@ToDo.TaskContent=set up dining room table}\n- add this on our shopping list\n- add this stuff on my shopping list\n- add this thing in to do list\n- add to my grocery list\n- add to my to do list {@ToDo.TaskContent=pick up clothes}\n- add to my to do list {@ToDo.TaskContent=print papers for 10 copies this afternoon}\n- add to my todos list {@ToDo.TaskContent=mail the insurance forms out by saturday}\n- add to note shopping list\n- add to shopping list\n- add to the grocery note {@ToDo.TaskContent=buy milk}\n- append a {@ToDo.TaskContent=summer reading} in my list\n- append an task of {@ToDo.TaskContent=guest to invite at the party}\n- append this item onto my notes\n- ask a task for {@ToDo.TaskContent=kim to bring my coat from home}\n- can i add {@ToDo.TaskContent=shirts} on the todos list\n- can i put on {@ToDo.TaskContent=caramel cheese popcorn} on my grocery list\n- could i add {@ToDo.TaskContent=medicine} to the todos list\n- create a task to {@ToDo.TaskContent=meet my friends}\n- create task to {@ToDo.TaskContent=cyber shop on nov. 11}\n- create task to {@ToDo.TaskContent=go to the mall}\n- create task to {@ToDo.TaskContent=meet john after 5:00 p.m.}\n- create to do to {@ToDo.TaskContent=go running in the park}\n- create to do to re{@ToDo.TaskContent=ad a book tonight}\n- {@ToDo.TaskContent=need go to library this week}, add this todo item\n- put {@ToDo.TaskContent=cheese} on list\n- put {@ToDo.TaskContent=ham} on my shopping list\n- put {@ToDo.TaskContent=hikes} on my to do list\n- put {@ToDo.TaskContent=ice cream} on the groceries list\n- put {@ToDo.TaskContent=milk} on my grocery list\n- put {@ToDo.TaskContent=on caramel cheese popcorn} on my grocery shopping list\n- remind me to {@ToDo.TaskContent=attend the meeting tomorrow}\n- remind me to {@ToDo.TaskContent=buy first aid creams and berries}\n- remind me to {@ToDo.TaskContent=buy milk}\n- remind me to {@ToDo.TaskContent=meet my teacher}\n- remind me to shop for {@ToDo.TaskContent=a new carpet}\n- to grocery list add {@ToDo.TaskContent=milk}\n- to my shopping list add {@ToDo.TaskContent=paper towels}\n- to my vacation to do list add {@ToDo.TaskContent=buy sunblock}\n- would you add {@ToDo.TaskContent=heavy cream} to the todos list\n- would you please add todo item of {@ToDo.TaskContent=all hands meeting next monday}\n- ^(add|create|append) an item [(called|about|of)] \"{@ToDo.TaskContent.Any}\" [as (next|first|last) task][(in|on|to) my (to do|to-do|todos) list]\n- ^[(can you|could you|would you)] [please] (put|add|append) {@ToDo.TaskContent} [and] [{ToDo.TaskContent}] (on|to)[my][(to do|todos|todo)]list\n\n\n> # Entity definitions\n\n> !# @entity.inherits = name : ToDo.TaskContent; domain_name : ToDo; model_name : TaskContent\n\n@ ml ToDo.TaskContent\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n> # Pattern.Any entities\n\n> !# @patternAnyEntity.inherits = name : ToDo.TaskContent.Any; domain_name : ToDo; model_name : TaskContent.Any\n\n@ patternany ToDo.TaskContent.Any\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/LUISAppWithPAInherits.lu.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"ToDo.AddToDo\",\n      \"inherits\": {\n        \"domain_name\": \"ToDo\",\n        \"model_name\": \"AddToDo\"\n      }\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"ToDo.TaskContent\",\n      \"inherits\": {\n        \"domain_name\": \"ToDo\",\n        \"model_name\": \"TaskContent\"\n      },\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"can you delete abc item\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"can you delete todo1\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel apples from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"check off apples from list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"check off bananas from my grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"check off garbage from grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"check off meet john at 8 am from to do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"check off shampoo from shopping list as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"check the box shampoo in my shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"complete pick up black shoes in my to-do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"complete task go shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"delete eggs from list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"delete off pancake mix on the shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"delete shampoo from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"delete shirts from list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"delete task go fishing\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"delete task go to cinema tonight\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the item buy socks from my to-do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the task house cleanup this weekend\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the task to hit the gym every morning\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do meet my friends tomorrow\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do to meet john when he come here the next friday\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do to practice piano daily\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do buy milk\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do go shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do that go hiking tomorrow\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task abc in our shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task tapioca starch in our shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"erase bananas from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"erase peanuts on the shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"finish hikes on my to do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"finish peanuts on the shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"mark buy fish as completed\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"mark fish as complete\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"mark happy on to dos list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"mark lemons and onions in grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pancake mix on my grocery shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"mark peanuts on my grocery list as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"mark peanuts on my grocery shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pick mary up as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pick up milk on my to-do list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"mark play badminton with tom as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"mark salad on my grocery shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"mark salad on the groceries list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task buy a bottle of vinegar as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task go running as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task read a book as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the item garbage from grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task buy milk as done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task get some food as complete\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task reserve a restaurant for tomorrow's dinner as finished\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task visit my grandma as completed\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"no need to buy milk in grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"omit the milk in the grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"remove asprin from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"remove black shoes from shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"remove class from todo list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"remove salad vegetables from grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task buy dog food\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task go shopping\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task go shopping with john this saturday\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task that go hiking this weekend\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task that lawn mowing\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the item paris from my list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the task that go to library after work\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the to do physical examination\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the to do that pick tom up at six p.m.\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remove to do go to the gym\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"remove to do that go to the dentist tomorrow morning\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete a\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete dog food\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete eggs\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete milk\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"take coffee off my groceries list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"take lemons and onions off my shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"take milk off grocery list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"take socks and shoes off my shopping list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"task completed buy gum\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"task train has been done\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"todo list delete paris vacation\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"add a few items to the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a grocery item to buy fish\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy fruit and vegetables\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy vegetables\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add a new shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a shopping item to buy dancing dresses\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 23,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"add a shopping item to buy orange juice\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for anna west to bring my swimsuit for my vacation\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for jimmy to play xbox games with me after work\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for li lei to bring my coat from home\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for raghu to bring my chocolates from germany\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task of chores to do around the house\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to finish driving test this week\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to pick mary up after work\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to purchase fruit and vegetables\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to shop at gnc after work\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add a to do to buy shoes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"add a to do to purchase a nice sweater\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add a todo item to vacuum by october 3rd\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"add action item for khalifa to pack my school supplies in my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"add an item to buy some snacks\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add bronwnies to the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"add buy gum\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add buy milk to my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"add call my mother to my todo list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add go running to my to dos\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"add go to whole foods in my to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery add spinach my groceries list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery items cream cheese and raisin to the list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery items dinners and storage bag to the shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"add have a haircut to my tasks\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add items as i speak\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add juicer groceries list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add melon and sugars and brown sugar to shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add more to grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add peanuts the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add purchase a cinema ticket to my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"add purchasing food and drinks to my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add reading to my to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add shoes to the shopping lists\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"add some items to that shopping notes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add some items to the grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add some jeans on our shopping lists\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"add something in this grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add something to my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add tapioca starch on my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add tapioca starch on our shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add task to buy a coat\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"add task to set up dining room table\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add this on our shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add this stuff on my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add this thing in to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to my grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to my to do list pick up clothes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my to do list print papers for 10 copies this afternoon\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my todos list mail the insurance forms out by saturday\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"add to note shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to the grocery note buy milk\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"append a summer reading in my list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"append an task of guest to invite at the party\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"append this item onto my notes\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask a task for kim to bring my coat from home\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"can i add shirts on the todos list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"can i put on caramel cheese popcorn on my grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"could i add medicine to the todos list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"create a task to meet my friends\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to cyber shop on nov. 11\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to go to the mall\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to meet john after 5:00 p.m.\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"create to do to go running in the park\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"create to do to read a book tonight\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"need go to library this week, add this todo item\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 0,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"put cheese on list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"put ham on my shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"put hikes on my to do list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"put ice cream on the groceries list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"put milk on my grocery list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"put on caramel cheese popcorn on my grocery shopping list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to attend the meeting tomorrow\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to buy first aid creams and berries\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to buy milk\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to meet my teacher\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to shop for a new carpet\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"to grocery list add milk\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"to my shopping list add paper towels\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"to my vacation to do list add buy sunblock\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"would you add heavy cream to the todos list\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"would you please add todo item of all hands meeting next monday\",\n      \"intent\": \"ToDo.AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDo.TaskContent\",\n          \"startPos\": 34,\n          \"endPos\": 62\n        }\n      ]\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"^(add|create|append) an item [(called|about|of)] \\\"{ToDo.TaskContent.Any}\\\" [as (next|first|last) task][(in|on|to) my (to do|to-do|todos) list]\",\n      \"intent\": \"ToDo.AddToDo\"\n    },\n    {\n      \"pattern\": \"^[(can you|could you|would you)] [please] (put|add|append) {ToDo.TaskContent} [and] [{ToDo.TaskContent}] (on|to)[my][(to do|todos|todo)]list\",\n      \"intent\": \"ToDo.AddToDo\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"ToDo.TaskContent.Any\",\n      \"explicitList\": [],\n      \"roles\": [],\n      \"inherits\": {\n        \"domain_name\": \"ToDo\",\n        \"model_name\": \"TaskContent.Any\"\n      }\n    }\n  ],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"4.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"testPrebuiltImport\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ListEntityAndBatchtestsProblem.1_LUISBatchTest.json",
    "content": "[\n  {\n    \"text\": \"give me a large big apple and a large coffee with two milk\",\n    \"intent\": \"AddToOrder\",\n    \"entities\": [\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 16,\n        \"endPos\": 24\n      },\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 38,\n        \"endPos\": 43\n      },\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 54,\n        \"endPos\": 57\n      },\n      {\n        \"entity\": \"size\",\n        \"startPos\": 10,\n        \"endPos\": 15\n      },\n      {\n        \"entity\": \"size\",\n        \"startPos\": 32,\n        \"endPos\": 37\n      }\n    ]\n  }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ListEntityAndBatchtestsProblem.2_LUISBatchTest.json",
    "content": "[\n  {\n    \"text\": \"give me a big apple and a large coffee with two milk\",\n    \"intent\": \"AddToOrder\",\n    \"entities\": [\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 10,\n        \"endPos\": 18\n      },\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 32,\n        \"endPos\": 37\n      },\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 48,\n        \"endPos\": 51\n      },\n      {\n        \"entity\": \"size\",\n        \"startPos\": 26,\n        \"endPos\": 31\n      }\n    ]\n  },\n  {\n    \"text\": \"give me a large coke\",\n    \"intent\": \"AnotherIntent\",\n    \"entities\": [\n      {\n        \"entity\": \"size\",\n        \"startPos\": 10,\n        \"endPos\": 15\n      }\n    ]\n  }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ListEntityAndBatchtestsProblem_LUISBatchTest.json",
    "content": "[\n  {\n    \"text\": \"give me a big apple and a large coffee with two milk\",\n    \"intent\": \"AddToOrder\",\n    \"entities\": [\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 10,\n        \"endPos\": 18\n      },\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 32,\n        \"endPos\": 37\n      },\n      {\n        \"entity\": \"Item\",\n        \"startPos\": 48,\n        \"endPos\": 51\n      },\n      {\n        \"entity\": \"size\",\n        \"startPos\": 26,\n        \"endPos\": 31\n      }\n    ]\n  }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/MultiturnReplaceKbWithFlattenedTree.qna",
    "content": "> # QnA pairs\n\n<a id = \"1\"></a>\n\n> !# @qna.pair.source = Editorial\n\n## ? ques1\n\n```markdown\nans1\n```\n\n**Prompts:**\n- [p1](#2) `context-only`\n- [p2](#3) `context-only`\n- [p3](#4)\n\n<a id = \"2\"></a>\n\n> !# @qna.pair.source = Editorial\n\n## ? p1\n\n```markdown\nap1\n```\n\n<a id = \"3\"></a>\n\n> !# @qna.pair.source = Editorial\n\n## ? p2\n\n```markdown\nap2\n```\n\n<a id = \"4\"></a>\n\n> !# @qna.pair.source = Editorial\n\n## ? p3\n\n```markdown\nap3\n```\n\n<a id = \"5\"></a>\n\n> !# @qna.pair.source = Editorial\n\n## ? qew\n\n```markdown\nzxc\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/Skills/Calendar.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"AcceptEventEntry\"\n    },\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"ChangeCalendarEntry\"\n    },\n    {\n      \"name\": \"CheckAvailability\"\n    },\n    {\n      \"name\": \"Confirm\"\n    },\n    {\n      \"name\": \"ConnectToMeeting\"\n    },\n    {\n      \"name\": \"ContactMeetingAttendees\"\n    },\n    {\n      \"name\": \"CreateCalendarEntry\"\n    },\n    {\n      \"name\": \"DeleteCalendarEntry\"\n    },\n    {\n      \"name\": \"FindCalendarDetail\"\n    },\n    {\n      \"name\": \"FindCalendarEntry\"\n    },\n    {\n      \"name\": \"FindCalendarWhen\"\n    },\n    {\n      \"name\": \"FindCalendarWhere\"\n    },\n    {\n      \"name\": \"FindCalendarWho\"\n    },\n    {\n      \"name\": \"FindDuration\"\n    },\n    {\n      \"name\": \"FindMeetingRoom\"\n    },\n    {\n      \"name\": \"GoBack\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Reject\"\n    },\n    {\n      \"name\": \"ShowNextCalendar\"\n    },\n    {\n      \"name\": \"ShowPreviousCalendar\"\n    },\n    {\n      \"name\": \"TimeRemaining\"\n    },\n    {\n      \"name\": \"Escalate\"\n    },\n    {\n      \"name\": \"FinishTask\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"Logout\"\n    },\n    {\n      \"name\": \"ReadAloud\"\n    },\n    {\n      \"name\": \"Repeat\"\n    },\n    {\n      \"name\": \"SelectAny\"\n    },\n    {\n      \"name\": \"SelectItem\"\n    },\n    {\n      \"name\": \"SelectNone\"\n    },\n    {\n      \"name\": \"ShowNext\"\n    },\n    {\n      \"name\": \"ShowPrevious\"\n    },\n    {\n      \"name\": \"StartOver\"\n    },\n    {\n      \"name\": \"Stop\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"DestinationCalendar\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Duration\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ToDate\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ToTime\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Location\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"MeetingRoom\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Message\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"MoveEarlierTimeSpan\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"MoveLaterTimeSpan\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"OrderReference\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"PositionReference\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"SlotAttribute\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"FromDate\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"FromTime\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Subject\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"DirectionalReference\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"RelationshipName\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"aunt\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"aunts\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"boss\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"brother\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"brother in law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"brother-in-law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"brothers\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"child\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"children\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"colleague\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"colleagues\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cousin\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cousins\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"dad\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"daughter\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"daughter in law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"daughter-in-law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"daughters\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"families\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"family\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"father\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"father in law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"father-in-law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"friend\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"friends\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandchild\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandchildren\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"granddaughter\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandfather\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandma\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandmother\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandparent\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandparents\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandson\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grandsons\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"husband\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"in-laws\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"kids\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"mom\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"mother\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"mother in law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"mother-in-law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"neighbor\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"neighbors\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"nephew\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"niece\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"parent\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"parents\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"partner\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"siblings\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sister\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sister in law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sister-in-law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sisters\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"son\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"son in law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"son-in-law\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"step daughter\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"step-daughter\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"stepfather\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"stepmother\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"stepsister\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"stepson\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"students\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"teachers\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"uncle\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"uncles\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"wife\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"manager\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"accept all meetings for christmas party next week.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"accept an appointment\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept dinner\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"accept my meeting at 7pm today\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"accept my meeting at tomorrow 10am\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment from 3pm to 5pm.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment on january 18th in palace meeting room.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 42,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment sent by lucas\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the event\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the event for tonight.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the event on feb. 18 in beijing.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the event sent by yolanda wong.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the meeting held on tomorrow at room 301\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the meeting organized by jack lauren.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the meeting with mary and tom held on wednesday\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the meeting with tom chen.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept this appointment with jane and mary on next tuesday.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 46,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"accept this event.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept this lunch meeting.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"accept today's event at 3pm.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"accept today's meeting\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"attend the fy19 celebration party sent by daisy lu.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"attend the lunch meeting at 10:30 am.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"attend the meeting held at 3pm next tuesday at the conference center.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 51,\n          \"endPos\": 67\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to attend the meeting for review\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend the meeting at 2pm tomorrow in room 304\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend the meeting this afternoon.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend this upcoming event in redmond.\",\n      \"intent\": \"AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"abort edition\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i cancel this\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel can you don't do that please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel don't worry\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel everything\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it for me\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it i don ' t want that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it, i don't want to create the meeting\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the creating process\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel this\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you cancel it please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't change it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't create it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go ahead and cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to cancel this\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to change it anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to do it now\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to find it anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to join it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want want to change this appointment anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have decided to cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to cancel it please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to cancel all of them\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to cancel this\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let me cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"need to cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind could you cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, cancel the changing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, forget about the creating\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i just cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, cancel please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing just cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing just cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ohh never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel all of them\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit the changing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop changing it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop checking it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop connecting it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop finding it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will you cancel it please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring forward my 4 o'clock appointment 2 hours\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 17,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"can you change it to 5 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"can you move this appointment to 5pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 33,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"change 10 am meeting to start 20 minutes later\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 30,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change 12am meeting to start 10 minutes earlier\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 29,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"change 4pm lunch appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change 5pm appointment 1 hour earlier\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"change an appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change big event to tomorrow\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change calendar\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change dentist appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change dentist appt to an hour later\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"change developmental agenda for lunch tomorrow\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change it to 5pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"change location\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"change lunch appt to 2\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"change lunch date from 11 - 12 to 12 - 1 30\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"change marathon training from 8:00am to 1:00pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 40,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change marketing meeting from every tuesday to every wednesdays\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 47,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"change meeting from 2-3pm to 4-5pm today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change meeting from 2pm-3pm to 4pm-5pm today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 11pm appointment's location to green park\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 41,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 3pm event to 4pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 6pm event to 7pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 7 30 pm appointment to 8 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 7pm event to 6pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 8 till 9 appointment to 11 till 12\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 9 30 till 10 30 appointment to 9 30 till 5\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 41,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 51,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"change my appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my appointmnet with sarah to 5 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change my dentist appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"change my dentist appointment from 3:30 to 4\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 43,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my meeting at night to tomorrow\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"change my next meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"change my schedule\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my ten am appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"change my vacation from ending on friday to monday\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 44,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"change recital to start half an hour earlier\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"change shave tomorrow 8 30\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change the appointment ending at 4 to end at 5 instead\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 45,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change the end date of my trip from the 3rd to the 4th\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 51,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"change the end time of my 3 o'clock meeting to 3 30 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"change the location of my singing appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"change the meeting which will start at 2 pm to 3 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"change the time\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"change the time to eleven thirty am\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 19,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"change the title of my 11am appointment to soccer practice\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 43,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"change the title of my appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"change this appointment's location\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"change thursday team meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change time\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"SlotAttribute\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"change today 's meeting from 6pm to tomorrow 9am\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"change today 's meeting from 6pm to tomorrow 9pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"change tomorrow ' s appointment from 10am to wednesday at 9 am\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 58,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"delay the meeting event by 1 hours\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"delay the next meeting by 30 minutes\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"edit calendar\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"extend meeting from 9 am to 12 am\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"let 5 pm meeting starting at 3\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"let next meeting starting at 10am\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"make next meeting to start 1 hour later\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"make the appointment ending at 2 go until 4 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"make the meeting ending at 10 go until 11\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 39,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"make the meeting to start 1 hour later\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 26,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"make the meeting to start 40 minutes earlier\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"modify the meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"modify the second meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"move 3pm meeting to 4pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 5,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"move appt with rebecca to next week\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"move meeting from 9pm-10pm to 8pm-9pm today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 18,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 34,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 38,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 1 pm appointment up 30 minutes\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 28,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 10 past 10 doctor ' s appointment to 10\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 45,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 10pm meeting to 9pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 12 pm meeting to 2\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 4 pm to 5 pm today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 9 am doctor ' s appointment to 10 am\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 13,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 9pm meeting to 8pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my meeting back by an hour\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"move my meeting to 6pm from 7pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"move my meeting up by half an hour\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"move my next meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"move my next meeting out by 30 minutes\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 28,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"move my next meeting out thirty minutes\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"move my next meeting up by 10 minutes\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 27,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"move my next meeting up by 30 minutes\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 27,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"move my text meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"move my twelve p . m . meeting forward two hours\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 39,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"move my twelve p. m. thirty minutes up\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"MoveEarlierTimeSpan\",\n          \"startPos\": 21,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"move party planning meeting from saturday to friday at 1pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 5,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 45,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 55,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"move shoe appointment to tuesday at one\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 5,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"please move this to 3 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"postpone my 4 pm meeting today until 5 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"postpone my four p. m. meeting today until five p. m.\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 43,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"push my trip july 16th out 5 days\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"MoveLaterTimeSpan\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule appointment with mark for next week\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule appointment with jennifer to next week\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule meeting\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reschedule my 3:30 dentist appointment to 4\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 42,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my 3:30 dentist appointment today for 4pm tomorrow\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 49,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my interview on monday to 1 pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule the 2 pm class to half past 2\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 29,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"this meeting should be changed to tomorrow\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"update appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update calendar\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update lunch appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"update meeting from 8am-12pm to 7am-11am today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 41,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"update my appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update my calendar\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 11 to 12:30 today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 2 pm to 4 pm today\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 6pm to 7pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"update my camping appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"update my next appointment\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"update my tomorrow 6pm meeting to 7pm\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 34,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"update party\",\n      \"intent\": \"ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i available at 10 am on monday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available on monday at 9 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available tomorrow at 5 30 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy on the 6th of february\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy on this weekend\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy this weekend\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 10,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i free at 5 pm today\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free at 7 p . m .\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for drinks monday at 5\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for drinks monday at 5 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for hiking on saturday at 8 am\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free from 3 pm - 10 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on monday at 9 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on saturday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on the 12th of july\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free to drive with kim on thurs at 3 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free today\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tomorrow 3 pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tonight\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tuesday at 7 am\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"can you check my dad 's calendar for free time this week\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 47,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me if my husband is free on sunday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"display olivia 's availability\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have any free time this weekend\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to know if my mother is available today\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 47,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"is carolyn available tuesday afternoon\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"is debra available on saturday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"is gerald busy this weekend\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"is grace available for the daily scrum meeting with engineering team from 10 to 11\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 74,\n          \"endPos\": 75\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 80,\n          \"endPos\": 81\n        }\n      ]\n    },\n    {\n      \"text\": \"is madison busy\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is nicholas available friday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"is raymond free on monday evening\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"is rebecca busy thursday at 4\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"is russell free on friday at 4pm\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"is saturday free\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 3,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"is theresa free october 9th\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"is virginia free on monday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"search jesse 's calendar for availability\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is anna 's availability next tuesday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"when am i free\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when am i free today\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have time to create a weekly meeting\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 32,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"when does ellen have time to attend the meeting\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when does ellen have time to attend the meeting for business review\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when does marry have time to join the appointment\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is aaron free tomorrow\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"when is bryan free\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is dylan available\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is samuel available tomorrow\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"when will jordan be free\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will tyler be free on friday\",\n      \"intent\": \"CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"alright\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"correct\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"excellent\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay thanks\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good okay\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that ' s right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's correct\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's right thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yep\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes add\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes indeed\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes it does\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes it is\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes of course\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes thanks\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes that ' s fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yup\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add me to conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add me to the conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call conference\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call genpact conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call harris conference\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call into conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call into marketing meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"call into meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call the morning breifing conference number\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"call the weekly marketing meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"conference join\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to 10 00 conf call with bryan\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to conference call with debra\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to marketing meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to the budget meeting conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to the conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to the marketing meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me with conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me with my 2 o clock meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"connect to conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect to conference call now\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"connect to weekly marketing meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"dial into conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dial marketing meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"get me on the conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to join conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to join the conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join budget conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"join conference\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join current budget conf call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"join current conference\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join current conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join lync meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join meeting now\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"join my meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join my next meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join next link meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"join next meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"join next meeting on link\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"join the budget meeting conference call\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"join the conference\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the next lync meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"link join my next meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"link join next meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"lync join next meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"nokia conference room join\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 0,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"start meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start my conference\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start my meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start the meeting\",\n      \"intent\": \"ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"alert attendees meeting is at 8 30\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 16,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"alert attendees of dinner meeting that i will be late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 39,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"alert quality control meeting participants that i am 15 minutes late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 6,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 48,\n          \"endPos\": 67\n        }\n      ]\n    },\n    {\n      \"text\": \"alert quality control meeting participants that the meeting will be 30 minutes later\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 6,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 48,\n          \"endPos\": 83\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting room changed to new location send to meeting attendees\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 0,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting will start soon remind everybody involved\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"message colleagues that meeting needs to be moved to 8 : 30 am\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 24,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"message everyone advising that i will be late to the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 31,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"message nancy and tell him to postpone the meeting because i ' m going to be 30 minutes late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 30,\n          \"endPos\": 91\n        }\n      ]\n    },\n    {\n      \"text\": \"my 9 o ' clock meeting can ' t start until 9 15 can you let everyone know\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 0,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"new location for meeting this afternoon let others attendees know meeting is now in room 100\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 66,\n          \"endPos\": 91\n        }\n      ]\n    },\n    {\n      \"text\": \"notify all attendees\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify all attendees about the change\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify attendees of office meeting that i will be a little later\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 40,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"notify diana that i ' ll be late to our meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 18,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"notify friday's 2 pm that we are cancelling the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"notify kimberly that i will be late for our 3 pm meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 21,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"notify noah that our meeting is pushed back 30 minutes\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 17,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"notify others that i am going to be late to meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 19,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"notify people of meeting on tue that it will begin 15-30 min later\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 37,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"ok find out if that is possible by sending a meeting change notification to all attendees\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"over run of time in confer room - all attendees to be notified of meeting being moved to next room - will explain why later\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 66,\n          \"endPos\": 97\n        }\n      ]\n    },\n    {\n      \"text\": \"please advise i am late for 3 pm meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert 3 o ' clock meeting attendees\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 13,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert attendees meeting is at 8:30\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 23,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert those attending the meeting that i am running a few minutes late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 46,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform colleagues running late and meeting half hour later\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 25,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform colleagues we will be meeting at 8 : 30 due to being late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 25,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform joshua that i will be late for our meeting today\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 26,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform meeting attendees that i am running late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 37,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform the thomas that i will be late for the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 30,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform work contact group that i am running late for the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 38,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"please let all in work group know meeting to start at 9 15\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 34,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"please let them know i'm late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"please notify everyone i ' m running late to the 3 pm meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 23,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"please notify george that i will be late for the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 26,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"please remind the attendee that i am running late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 32,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"provide the time change for the meeting to all participants\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 8,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"remind all attendees of tomorrow ' s lunch that we have changed the venue\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 48,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"room 100 is location for this afternoon ' s meeting please notify others\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 0,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"running late for meeting - notify others\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 0,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"running late for the board meeting alert catherine dennis and all the other attendees\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"running late to my meeting please let jennifer know\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message out to cancel my 3 pm meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 22,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message to johnny and jessie that our meeting today will be later by 30 minutes\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 41,\n          \"endPos\": 85\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message to the meeting attendees that the meeting will now start at 8 30 am\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 45,\n          \"endPos\": 81\n        }\n      ]\n    },\n    {\n      \"text\": \"send a notice to douglas the first will be attending the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 25,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"send a notice to paul that xu wen will attend the meeting\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 27,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"send a text to the people going to the meeting that the location has changed\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 52,\n          \"endPos\": 75\n        }\n      ]\n    },\n    {\n      \"text\": \"send reminder of 9 am meeting to all participants 15 minutes later\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 50,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"tell attendees i am late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"tell everyone the meeting is now in room 204\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 14,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"tell next meeting that i'm running late\",\n      \"intent\": \"ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"2 hours meeting with ladawn padilla at 5 on tuesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 44,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"add a meeting with herman to my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add an appointment on may 8th at shanghai\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"add applied motion to my calendar 9 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add appt with helen ding for dinner on march 5th at 5 pm at dennys\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 39,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 60,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"add appt with mike li for dinner on march 5th at 5 pm at dennys\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 49,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 57,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"add balboa practice to my calendar at 3 30 today\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add ballet to my calendar wednesday at five thirty to six thirty pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 54,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"add baseball game on friday to calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"add chicago bulls versus washington wizards to my calendar tomorrow at seven pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 59,\n          \"endPos\": 66\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 71,\n          \"endPos\": 78\n        }\n      ]\n    },\n    {\n      \"text\": \"add choir practice on saturday at 7 pm to my personal calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 45,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"add choreography to my family calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add chorus concert to calendar for may 1st at 3 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add church to personal calendar on sundays at 9\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"add coffee on august 12th at 2 pm with herman for one hour\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 50,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add dance on tuesday at four o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add date night on the 5th at 7pm every month\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment on tuesday june at the 1st clinic\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 47,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment to my calendar at 3:30 for the 8th of may\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 55,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment to my calendar tomorrow from 3 to 4:30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 53,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 58,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointments to my calendar at 3 thirty p m\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"add dinner to personal calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"add dinner with mom to personal\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"add doctors appointment on march 13 at 2 pm at the original health clinic\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 51,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"add doctors appointment on march 13 at 2 pm at the tiptop virginia beach clinic\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 51,\n          \"endPos\": 78\n        }\n      ]\n    },\n    {\n      \"text\": \"add go shopping with john meng on the calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"add haircut to my google calendar tomorrow at 2 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add hope middle school meet and greet on my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 4,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 23,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add kane s dr appt to calendar for 3 friday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add maple beach to my calendar at 10 on sunday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"add megan training to calendar on july 4th at 11 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"add office party on march 8th from 6 p to 9 p\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 42,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add order cabinets to my calendar today at 2 o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"add pay credit card to calendar may twentieth\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add pay pearl fees on my calendar tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"add picture day at school to my calendar for friday, november the 8th from 8 am to 9:30 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 45,\n          \"endPos\": 68\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 75,\n          \"endPos\": 78\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 83,\n          \"endPos\": 86\n        }\n      ]\n    },\n    {\n      \"text\": \"add solo gig at civic hall on the 7th of march at 8 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 16,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 50,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"add team meeting to my calendar at 10pm with xiaoming yang\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add the enviomential protection meeting from 9 am to 11 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 53,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add the lunch with my colleague naomi from 12 to 2 in my personal calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 49,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 57,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"add ultimate frisbee on sunday at 2 pm for 2 hours\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 43,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add vacation to my calendar from july 4th until july 29th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 48,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar at 3 pm on friday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar friday from 8 for an hour\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar sunday 10 till 5\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar thursday 8 30 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to my calendar monday 6 am to 11 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to my calendar today\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"append dad's birthday every july 21st\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"appending group meeting next monday at 11am for an hour\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 48,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting between 2 and 3 tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting between 2:30pm and 4:45pm tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 34,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting in guangzhou at 6am on march 5th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 18,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"book a recurring 1x1 meeting on the first monday of each month\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"create a calendar appointment at 3:30 tomorrow for half an hour\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 51,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"create a event with eden roth at 4pm today for 30 mins\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 6 o'clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create a meeting at 7:00pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 8am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 9:35am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting for tomorrow 6pm with lucy chen\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting from 9pm to tomorrow 6am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 38,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting with tom34@outlook.com\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an appointment with doctor lu from 8:30 am to 10:00 am tomorrow morning\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 62,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 71,\n          \"endPos\": 77\n        }\n      ]\n    },\n    {\n      \"text\": \"create appointment for 30 minutes\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 23,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"create appointment from tuesday to wednesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"create calendar : tomorrow morning from 9 to 11 at 1103 room for internal meeting\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 40,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 45,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 51,\n          \"endPos\": 59\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 65,\n          \"endPos\": 80\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for 5 30 tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for 7 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for me\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appointment on monday.\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment on personal calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment to play squash on thursday at 7 20\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 20,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment to see doctor culver august the 22nd 2013 1 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 20,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 57\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 59,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment with tom roth.\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appt for 3 pm on christmas\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"make me a calendar event\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me a dentist appointment wednesday at two forty five\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me an appointment for next weekend\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment for ten forty next monday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment for the next week thursday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment on the calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me an appointment tomorrow at 2 30 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"march 15 dinner at refectory at 6 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"meet ming yang for lunch on tuesday at noon\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"meet with a.j. lee saturday at 3 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"meet with carol lee at home on march 10th at 4 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with ben randie tomorrow at noon\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with ellen fung on monday at 9 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with jia li monday 3 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with morrison sun at 2 pm saturday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with morrison yang at 4\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment for tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment in calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment in my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment next wednesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment tomorrow at 3 pm at sunken\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"new calendar appointment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar entry\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar event\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar item\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"on saturday at 7 thirty p m\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 3,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"personal calendar 5/1/2013 meet mom for yard sale\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"place an appointment in my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please create a meeting from 2 to 3\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"please schedule a yoga class with my sister at 5pm every friday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 47,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 51,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"please schedule an all hands meeting for 2 hours\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 41,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"put anniversary on my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"put captains in my calendar for saturday evening\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 41,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance on my calendar for monday 7 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance on my calendar from 6 to 7\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 35,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"put dental appointment on my calendar saturday march 22nd at twelve pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 56\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 61,\n          \"endPos\": 69\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist appointment in my calendar for tomorrow at one pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 55,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist appointment in my calendar tuesday 2 45 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist on my calendar for this thursday at 10 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"put doctor s appointment in my calendar for 5 forty next thursday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 44,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 52,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"put eye doctor appointment saturday at 11 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"put hair appointment on calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"put insanity on my calendar at 6 30 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"put jason work on my calendar thursday 9 am to 5 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"put jimmy on to doctor ken on october 20th at 3 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 13,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"put julie hay in my calendar for tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"put mathematics paper one on tuesday 13\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"put shopping day on april 1st at 10 am on calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"put swimming in my calendar tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"put swimming tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"put tennis game for friday at 1 on calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"put test appointment in my calendar tomorrow at 7\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 48,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance class appointment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"put work on my calendar tomorrow from 8 30 to 5 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"put yoga on my calendar for mondays and wednesdays at 3 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 54,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a azure workshop from 9am to tomorrow 5pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 47,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a breakfast meeting at 8 am tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a buisness lunch for my department at campus restaurant on wednesday at 11 30 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 47,\n          \"endPos\": 63\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 68,\n          \"endPos\": 76\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 81,\n          \"endPos\": 88\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a calendar event for my sister\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a chiropractors appointment on july 7th at 4 o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 52,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dental appointment tomorrow afternoon at five thirty pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dentist appointment for tomorrow night at 7 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 44,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dinner for tonight at 8 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctor s office appointment for march 12th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 43,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctors appointment at 15 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctors appointment with madden on march 12th at 4 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 46,\n          \"endPos\": 55\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 60,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a lunch date with mom every tuesday at noon for the next 5 weeks\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 48,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 61,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a lunch meeting with my lead\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a massage on tuesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a meeting for next thursday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for this friday 11 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for tomorrow at 5 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting on nov. 3 from 3-4pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with andy\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a meeting with han lu 8 am next tuesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with ryan from 3-4pm on october 25th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 43,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a run at the lake with madden\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a shopping trip with shawntia on friday at 5 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a soccer game for next friday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a vet appointment at 9 am on saturday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a visit to the market this saturday at 10 o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 48,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a workout with madden to my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for 10 30 in the morning on january 20 1st\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 52,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for 9 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment for me on tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me today\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me tomorrow at 3 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for my mom\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment for noon tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for one o clock today\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for saturday at 8 dinner with madden\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 40,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for saturday at one 30 pm to measure house\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 53,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for thursday at 3 pm haircut\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 45,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for tomorrow at one o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 40,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment from june 18th to june 20th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on monday from noon to 4 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment on november 5th at 3 30\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on october 31st\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on thursday october second at 8 forty am mom s medical appointment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 54,\n          \"endPos\": 63\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 65,\n          \"endPos\": 89\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to call meredith at 12\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 44,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to groom my dogs at petco on friday at 6 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 44,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 53,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 63,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to see cj on thursday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment with madden at 10 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden for wednesday the 20 4th at 9 30 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 59\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 64,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden today at 2 o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden tomorrow at 5 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 48,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with mom\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event for me\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event for scrum with madden at 10 am saturday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 49,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an event for the 5th of july\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an event on the calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule appointment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule appointment at eight p m tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment for madden account payment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 32,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment yearly check up friday march one 10 am one hour\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 54,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 60,\n          \"endPos\": 67\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule art show on calendar for noon on march 6th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule ben baig for saturday evening\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule camping for friday to sunday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule college for tomorrow at 5 am\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dentist appointment with madden for may the 20th at 3 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 45,\n          \"endPos\": 56\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 61,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner on the 8th at 6 thirty p m\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner with madden at 6 pm on june 4th at spring restaurant\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 51,\n          \"endPos\": 67\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner with madden every friday at 5 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 44,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dry cleaning pick up at three thirty pm today\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 49,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule group meeting with madden on march 3rd at 4 00 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 51,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule hair appointment on monday at 2 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule holiday for the thirty first of july\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule holiday on the 31st july\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with madden for 11 30 am on wednesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 43,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with madden on tuesday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with pura at noon on wednesday may 20 minutes\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 50,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule mechanics exam at 12 pm on friday\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule miranda s graduation from 11 to 3 on may 28th\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 41,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule my vacation from today 5pm to tomorrow 5pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 48,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule therapy appointment at 8 o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule wanda s graduation for saturday at 11 o clock\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 44,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule wedding anniversary on friday evening\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule work for 7 am tomorrow\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule work on thursday the thirty first from three to seven thirty\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 57,\n          \"endPos\": 68\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule yoga class from 2 pm to 3 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an appointment with my sister in my main calendar.\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an appointment with pura\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an appointment with pura tomorrow at 3 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 44,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an appointment with tom\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an event\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an event in my calendar\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up meeting with pura for every tuesday at 1 pm\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"set up meeting with thomson\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up the appointment\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"should you schedule to after lunch\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"we make an appointment for me\",\n      \"intent\": \"CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel the 1st one\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel 1 pm staff meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel all events\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel an appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel appointment today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel appointments\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel calendar entry\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel dinner\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel doctor ' s appointment monday\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel event\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel event tomorrow\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel lunch next wednesday\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel meeting with abigail 3 pm today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel meeting with bob marlon 3pm today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my adventureworks trip to seattle\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 33,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my appointment at 9 pm\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my appointment for october 4\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my driving lesson tomorrow\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my event\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my meeting at shanghai on monday at 10 am\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my next appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my singing appointment on monday\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my three o'clock appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel that appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the calendar\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the event\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the group meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the meeting with julie\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the pickup food from ted\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the untitled event on may twenty eighth\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel this meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel today ' s appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel tomorrow ' s plan\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"clear all my appointments\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear all of my appointments\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear all of my appointments today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"clear all the appointments from my calendar for today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my calendar\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my calendar for january 29th\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my schedule\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my schedule for tomorrow\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my schedule today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"decline my meeting on monday\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delete an appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete birthday calendar\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"delete calendar event\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete event\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete my schedule\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete my schedule for today\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delete that appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the 1st one from my calendar\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the appointment with jeffrey\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the appointment with mom\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the scheduled meeting with zachary\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete this appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"discard the appointment with george\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"discard the meeting\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"drop my appointment for monday\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to delete this appointment from my calendar\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to delete an appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"remove dentist appointment\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"remove final tutoring from my calendar\",\n      \"intent\": \"DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 7,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me about master chief\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me something about shakespeare\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 32,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"detail about tomorrow's meeting\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"detailed information about the next meeting\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"details about the meeting with grace\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"details about the meeting with karen and tom\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the meetings mary\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me details of the next appointment\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to know about my date with jimmy\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to know about my meeting\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to know about my next appointment\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i need you to provide me the details of the meeting i have scheduled with my colleague amanda\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please open my date with angela and tell me about it\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my meeting today\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my next meeting\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my planned trip\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my schedule with afternoon\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my sunday schedule\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me all about dinner date with stephanie\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what are the particulars for the picnic next week\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"what are the plans for the dinner date with stacey\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what did the sister say about meeting on sunday\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what is destiny ' s event for next week\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my meeting with ming xu about\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is that meeting with ashley and jane berlin about\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the meeting with daniel robert regarding\",\n      \"intent\": \"FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"at 10 am do i have a 30 minutes meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 3,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Duration\",\n          \"startPos\": 21,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"calendar for today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"check janice 's calendar for this weekend\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"check kronos calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my family calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"check my mom's schedule\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have any appointments today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any meetings today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything from 11 to 2\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything on wednesday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting about group meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting about plan\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting at 7pm from melissa\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 18,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from darren about status update\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 33,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from deborah about team session\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from donna\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find a meeting subject daily meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 23,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with subject weekly report\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with title second lesson from amanda\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with title sharing from steven\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find me the meetings at 6\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find me the meetings at 9 o'clock\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting around 5 to 8 pm\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting around 2 to 6pm\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting with judith\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the meeting with timothy\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the next meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"get to my next event\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"locate the next appointment\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"look up my next appointment for me\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"next meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"obtain the appointment with frank\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search a meeting subject project proposal rehearsal\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 25,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"search the meeting with title employee orientation\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 30,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"show jean's calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me brenda 's schedule for friday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"show me heather 's calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my calendar for monday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my google calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"DestinationCalendar\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my next meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my schedule tonight\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the calendar at night\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting about briefing session\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting about online session\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting with paul\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me victoria 's calendar for monday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"show my schedule at night\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the events scheduled at calendar constitution hall\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 41,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"the next appointment after that\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"view emily calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"view ethan 's calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s after that on my calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s going on this weekend\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s happening today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s in my calendar for today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my 1st appointment tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my 1st meeting tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my next appointment\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my next meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule for tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule like tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s next on my calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my calendar for today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my calendar today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my next meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my schedule\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my schedule for tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my schedule today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s the meeting today between 10 and 12:00\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 42,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing next week\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing on june ninth\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing tonight\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"what appointments do i have tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my appointments for this week\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my appointments today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my meetings at night\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have for today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have from 2 to 4 on saturday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have from monday through wednesday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ToDate\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have going on today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have next\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have on my calendar today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have on sunday\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have this afternoon\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to do this afternoon\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to do tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"what have i got on tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what i am doing next week\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what i'm doing this weekend\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what is henry doing on monday at noon\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what is logan 's schedule this week\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my 1st meeting today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my next appointment\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my schedule for tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my schedule tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is next in calendar\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"what is on my calendar today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the schedule before that\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is timothy doing today\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what meetings do i have next week\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what was my first appointment\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"what's going on this week\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what's happening tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what's my first meeting tomorrow\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when and where is my next meeting\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"which is my next event\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"which will be my next flight\",\n      \"intent\": \"FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"my next meeting with emily is when\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 3,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"what day is lego land scheduled for\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"what time do i have work tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what time do i work today\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is beth over today\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my cooking class tonight\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my first meeting tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my last meeting\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my meeting today\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my mobile devices exam tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my next appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my team meeting\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is oshwin's interview\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is the ice cream social\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is the trade show this saturday\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my 1st appointment tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my 1st meeting tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my doctor ' s appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next doctors appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next meeting\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"when am i watching england\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i break up from school\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have exam\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have free time today\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i meet with charles\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do i work tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"when is concert on my calendar\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is lunch with frank\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my 1st meeting tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my appointment with willie\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my daily stand up with ethan\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my fifth kick-off\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my meeting with kenneth\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my meeting with martha and deborah\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next appointment with douglas\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next event\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next hair cut appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next meeting\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next meeting with edward\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next meeting with miss kathleen\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next meeting with ms lawrence\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next trip to new york\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my physio\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my picnic lunch today\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"when is ncaa basketball today\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"when is sports day for the girls\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the next dentist appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the social\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the wedding tomorrow\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"when's my haircut\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"when's my next appointment\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"when's my next trip\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"which weekend am i shopping with sarah\",\n      \"intent\": \"FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"location of 11 am meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"location of the next appointment\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting at 3 pm today locations\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the place of the work smart training\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 25,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"show me where my next appointment is\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the location of next meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what the place of the weekly meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"where ' s my meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where ' s my next appointment\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"where ' s my next meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i going this weekend\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i going tonight\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i meeting austin and john\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where am i on may the twenty first\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 14,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i tomorrow\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where are my meetings today\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i go for my meeting tomorrow at 11 am\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 41,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i go tomorrow\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i have to be next\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i have to be today\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i need to be next\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i need to go today\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where does my meeting take place\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is dinner with abigail liu\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"where is it\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is margot lunch\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"where is meeting tomorrow at 11 am\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is meeting with shirley\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my 11 am appointment tomorrow happening\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my 11 am meeting tomorrow\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my current meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my dentist appointment\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my eleven o'clock meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 12,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my first appointment tomorrow\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my fourth event with brandon friday\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my fourth event with christopher on thursday\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 45,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my meeting with kayla\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next appointment\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next appointment with miss doris\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next appointment with olivia\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next dentist appointment\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next event\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next meeting with ms natalie\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my third shiproom with tiffany\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where is that meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is the meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is the meeting at 11 am tomorrow\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is the performance review meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 13,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow ' s 11 am meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow meeting at 11 am\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow 's event\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"where's my next meeting\",\n      \"intent\": \"FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"2 pm meeting tomorrow - who else is going\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"2 pm meeting with who\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"attendees who will join the 5 pm meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"did hellen come to 3 pm's meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"did mark sign up to the tomorrow's meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"did martin come to today's meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"find attendees who will attend 8 o ' clock meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to take a look at the attendee list\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is bruce young attending the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is charles wong going to be at the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is joe going to be at the next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 26,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"is victoria participating next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 26,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"let me see who will attend party planning meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"list the attendees of the next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 26,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"list the participants for the 2 pm meeting tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the confirmed attendees\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me who will attend family gathering\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me who will be at planning meeting tomorrow at 2 pm\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"show meeting participants\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who ' s in my 1st meeting today\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 14,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"who all will be present at the next 5 meetings\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who am i meeting at 10 am tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"who am i meeting for dinner\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"who do i have next\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"who else is going to the 2pm meeting tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 25,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"who else will be in banking meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 20,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending 2 pm meeting tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is attending the meeting on wednesday\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending the meetings\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is coming the the meeting tomorrow at 2 pm\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to attend the meeting tomorrow at 2 pm\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to the meeting at 2 pm tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to tomorrow ' s meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"who is in my next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"who is in that meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is in the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is my first meeting with tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who is my morning meeting with\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"who is on my list for the 2 pm meeting tomorrow\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 26,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"who is participating tomorrow at 2 pm meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who is the 2 pm meeting with\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"who responded to meeting request\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who shall be joining the meeting tomorrow at 2 pm\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"who will attend the meeting at 4\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be at the kids game\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be attending picnic\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be in the banking meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"who's going to be at those two events\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will amber join office meeting today\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"will amy be at today ' s meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"will anthony be at the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will bobby shen be at next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"will ed be in the finance meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"will ethan, yutian and k.j. be at the picnic\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"will george be in the hr meeting at 1 o' clock\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 22,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"will jane be at the 3 pm meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"will jimmy parker be attending the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will john be at marketing meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"will johnny be at office meeting today\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"will nancy be at the morning briefing meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"will nicholas be attending the management meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 31,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"will paul be going to the meeting on friday\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"will roy be at our weekly team meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"will teresa be at my next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"will thomas be in insurance meeting monday at noon\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"will timothy be coming to the meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will virginia be attending my next meeting\",\n      \"intent\": \"FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"about how long will the meeting last\",\n      \"intent\": \"FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"duration of machine learning talk\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 12,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"how long do i have for lunch\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is that meeting going to last\",\n      \"intent\": \"FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long is my 4 o'clock meeting\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my dentist appointment\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my facial time\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my lunch today\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my meeting at 4\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 26,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is the event\",\n      \"intent\": \"FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long is the movie jurassic world\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 16,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how long will my dentist appointment last\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time as of now is set for the bill payments\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 39,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is set for the bill payments\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time between schedule thursday meetings next week\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 49,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have for a lunch break today\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 42,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have for lunch today\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have to take back the movie\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do we have for lunch today\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time does my meeting take up\",\n      \"intent\": \"FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time for lunch today\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is there for errands during my lunch break\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 45,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is open today\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time out on lunch\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time will i have to pick up groceries\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"is it going to last long\",\n      \"intent\": \"FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is my lunch long enough for errands\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"minutes in lunch break\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"please show me how much time i have to run errands\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 39,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"please tell me how long i have for lunch\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the duration of the weekly sharing\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 28,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how long is my 4 oclock meeting\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how long is today ' s lunch break\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the duration of the product introducation\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 28,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"time for lunch errands\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 9,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"today ' s lunch will be how long\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        },\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"total lunch break time today please\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 6,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what allotted time is for hair dresser\",\n      \"intent\": \"FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"find a new meeting location\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bing find me a conference room in the bravern this afternoon\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Location\",\n          \"startPos\": 38,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 46,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"book a conference room\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a meeting\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book blue meeting room\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"book the conference room for thursday at one i want to meet with benjamin\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 41,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"can you reserve room 649 right away\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"check meeting room for tomorrow\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"find a free meeting room for next tuesday\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"find an available meeting room from 3 to 5 tomorrow\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 41,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"find me an empty conference room\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to book a conference room\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to book a meeting room from 10 am to 3 pm\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ToTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"help me to book the room 102\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"help me to find a meeting room\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need you to find a new meeting location\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to meet with bruce lee so book the conference room for thursday at one\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 62,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 74,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to meet with donna please book for thursday the conference room at one\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 42,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 74,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm looking for a conference room\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is this room busy at 5 pm\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"is this room busy tomorrow\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"let's find a new meeting location\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"locate another meeting location\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve room 258\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve room 101 now\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve room 313 right away\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve the conference room for 1 pm thursday because i need to have a meeting with amber\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve the conference room for 3pm tomorrow\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule conference room with mary cooper for thursday at one\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 58,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"what meet rooms do i have\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where shall we meet\",\n      \"intent\": \"FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back one step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back the last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"can you go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back a step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back one step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back the previous step\",\n      \"intent\": \"GoBack\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"go back to the last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"go back to the main menu\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the previous step\",\n      \"intent\": \"GoBack\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please return back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to previous step\",\n      \"intent\": \"GoBack\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"return to the previous step\",\n      \"intent\": \"GoBack\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"we should go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello world\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how's the weather today\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the time now\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's my name\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the weather today\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's your name\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the first one\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"the second one\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"the third one\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"abort that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot make it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i can't go there\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like that time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like the time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have other things to do at that time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i think not\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd rather not. thanks\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm afraid i can't\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm busy at that time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm not available next monday afternoon\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm supposed to meet daisy, not katy\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it doesn't work for me\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's the wrong person\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's the wrong room\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's wrong\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"maybe another time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"negative\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i already have meeting 3pm tomorrow afternoon\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"no, i won't\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i'd like to meet her manager\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, please don't\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at this time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not for me, thanks\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not him\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right, schedule it as 1x1 meeting with yolanda\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 26,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"not that time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this conference room, please change\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 9,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"not this location\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this man\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this room\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this saturday\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 4,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"not this time\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course not\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ohh no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please find another meeting room\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"MeetingRoom\",\n          \"startPos\": 20,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"stop\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's not right\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the contact name is wrong, it's daisy\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is review meeting, not 1x1 meeting\",\n      \"intent\": \"Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 8,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"this time slot doesn't work for me\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wrong\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wrong place\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you show the next one\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"go to the next one please\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"show the last one\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"show the next\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"what about the next one\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are the next 3 events on my calendar\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my next event\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"what is next\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"ShowNextCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to check the previous appointment\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the previous meeting with tiffany\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"show previous one\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"ShowPreviousCalendar\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"can you show me the time remaining before my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"check on the time to see when i go to school and pick up mark\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 32,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any spare time before next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is it until the 14th of march\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 25,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till disneyland paris\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 14,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till the next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"how long until christmas\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how long until my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"how long until my next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"how long until the social\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"how long will i wait for the next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days is it until christmas\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days left until the opening ceremony\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days till april\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days till christmas\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until june the fifteenth\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until june the fifteenth 2019\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until march twenty six\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until my doctor ' s appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 23,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until thanksgiving\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 20,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until the 10th of december\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromDate\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours left till the closing ceremony\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours remaining till next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours until my doc appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how many minutes before my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 27,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"how many minutes free do i have before next scheduled appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"how much longer do i have before pick up mary from school\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 33,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"how much longer do i have until pick up john from school\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 32,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"how much longer until my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how much longer until my next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time before lunch\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time before my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time before next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have before my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have before my next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have free until my next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until i have to meet with michael\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until i start the meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 32,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until my doc appt\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until my meeting with larry\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have until my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is there before office meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Subject\",\n          \"startPos\": 30,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time remaining till next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time until my meeting with lori\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time until next scheduled appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time until noon\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"FromTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know the time left for my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show time before next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how much free time i have before next appt\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 41,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how much time before my next meeting\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"time before my next appointment\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"time remaining\",\n      \"intent\": \"TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel app\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that one\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"canceled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancelled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget about it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go away\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry, don't do it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come om\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nice\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no doubt\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok for now\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thanks\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good to me\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure does\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure is\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure thing\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you very much\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is correct\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's all\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"very good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ya\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah bro\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah buddy\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah cool\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i talk to a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact the customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"human service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need manual customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need real human help\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any person i can talk to\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shift\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all set\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finish\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished with\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit it\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back on\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do me a favor\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me a favor\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i get it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how to do it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some assistance\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"open help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what should i do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who can help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"signout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget me\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sign out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"logout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"log out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want them all\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you you read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you tell me what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"detail aloud what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to hear this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like you to read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make a reading of this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read me the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read my latest email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read all on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud the current text onscreen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read file aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read me this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my to list\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read sentence out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page onscreen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the text to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the words on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this for me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read what is currently on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak of what is on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak out\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start reading this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"state it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about the information on the screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me the current text on screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vocalize what's on the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what does the page say\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you please read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that out loud please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that to me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't need\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i don't want that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no later\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no leave it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no more no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no not that one\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no wrong\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at all\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not even close\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not exactly\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not quite\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing much\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you say it again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i didn't hear repeat again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have not heard\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pardon\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat that\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what did you say\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what was that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any one is ok\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anyone is fine\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anything\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose anyone\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose one of it randomly\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose for no. four\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no. six\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no.2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the bottom left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the first choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the upper left choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the upper right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"four\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i like second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i like upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i want bottom\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i want fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i want no. 5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the fourth choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose lower right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 1\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 3\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no.4\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"number two\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for number 7\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the second choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select five\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"select no.5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the bottom choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"select the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"select third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select upper\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"three\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to choose any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to select any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want neither of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of these\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"they look bad, can you give me other choices\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go forward\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next three items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 3\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 4 items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next two options\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the next 2\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show earlier\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the last five\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the last two\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the beginning\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear and start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please begin again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reopen a new page\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn over a new leaf\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"baby just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dismiss\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end it\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit exit\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to see you anymore\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i love you to stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i mean stop listening\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i said stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no no stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nobody cares stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nowhere just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok stop stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut your mouth\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"silence\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop please\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"^i (want to|would like to|'d like to) (join|attend) the {Subject}^\",\n      \"intent\": \"AcceptEventEntry\"\n    },\n    {\n      \"pattern\": \"^[(would|can|could) you] [please] (change|reschedule) [the] ({Subject}|meeting) to {ToTime}^\",\n      \"intent\": \"ChangeCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^do i have time (at|on|for) {FromTime} [on] {FromDate}\",\n      \"intent\": \"CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^does {personName} have time at {FromTime}\",\n      \"intent\": \"CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^is {personName} (available|free) from {FromTime} to {ToTime} [on {FromDate}]\",\n      \"intent\": \"CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^i ('d|would like to|want to) join the ({Subject}|meeting) now^\",\n      \"intent\": \"ConnectToMeeting\"\n    },\n    {\n      \"pattern\": \"^(remind|inform|tell) (the|all) attendees {Message}^\",\n      \"intent\": \"ContactMeetingAttendees\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] (at|for|on) [{FromDate}] [{FromTime}]\",\n      \"intent\": \"CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] from [{FromDate}] {FromTime} to [{ToDate}] {ToTime}\",\n      \"intent\": \"CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] between {FromTime} and {ToTime}\",\n      \"intent\": \"CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^(clear|delete|remove) (my|the) calendar from {FromTime} to {ToTime}^\",\n      \"intent\": \"DeleteCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^(remove|cancel|delete) (the|my) {Subject} [at {FromTime}] [{FromDate}]^\",\n      \"intent\": \"DeleteCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^is (this|the|that) (meeting|conference) room (available|booked) [(at|on|for)] [{FromDate}] [(at|on|for)] [{FromTime}]^\",\n      \"intent\": \"FindMeetingRoom\"\n    },\n    {\n      \"pattern\": \"^[(show|display)] next [page] [please]^\",\n      \"intent\": \"ShowNextCalendar\"\n    },\n    {\n      \"pattern\": \"^i (want to|need to|would like to) (attend|join) {Subject}, [please] add it.^\",\n      \"intent\": \"ShowNextCalendar\"\n    },\n    {\n      \"pattern\": \"^how long do i have (until|before|till) the [next] (meeting|appointment|{Subject})\",\n      \"intent\": \"TimeRemaining\"\n    },\n    {\n      \"pattern\": \"^(yes|sure)[[,]i want (that|the ({DirectionalReference}|{ordinal}) ({number}|one))]\",\n      \"intent\": \"Confirm\"\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"personName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"Calendar\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/Skills/Email.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"AddFlag\"\n    },\n    {\n      \"name\": \"AddMore\"\n    },\n    {\n      \"name\": \"CancelMessages\"\n    },\n    {\n      \"name\": \"CheckMessages\"\n    },\n    {\n      \"name\": \"ConfirmMessages\"\n    },\n    {\n      \"name\": \"Delete\"\n    },\n    {\n      \"name\": \"Forward\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"QueryLastText\"\n    },\n    {\n      \"name\": \"ReadAloud\"\n    },\n    {\n      \"name\": \"Reply\"\n    },\n    {\n      \"name\": \"SearchMessages\"\n    },\n    {\n      \"name\": \"SendEmail\"\n    },\n    {\n      \"name\": \"ShowNext\"\n    },\n    {\n      \"name\": \"ShowPrevious\"\n    },\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Confirm\"\n    },\n    {\n      \"name\": \"Escalate\"\n    },\n    {\n      \"name\": \"FinishTask\"\n    },\n    {\n      \"name\": \"GoBack\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"Logout\"\n    },\n    {\n      \"name\": \"Reject\"\n    },\n    {\n      \"name\": \"Repeat\"\n    },\n    {\n      \"name\": \"SelectAny\"\n    },\n    {\n      \"name\": \"SelectItem\"\n    },\n    {\n      \"name\": \"SelectNone\"\n    },\n    {\n      \"name\": \"StartOver\"\n    },\n    {\n      \"name\": \"Stop\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Attachment\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Category\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ContactName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Date\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"EmailSubject\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"FromRelationshipName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Line\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Message\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"OrderReference\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"PositionReference\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"RelationshipName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"SearchTexts\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"SenderName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Time\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"DirectionalReference\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"add a flag\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a flag please\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a flag to the last email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"add a flag to this email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add flag\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add flag on it\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add flag to it\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add flag to the email john just sent to me\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"add flag to this email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"add flag to this message\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag it\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag on\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag the current email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag the email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag the email from davis\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"flag this email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"flag this email as important for me\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to add a flag\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to add a flag on this email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make it flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"mark as flag\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"mark the email flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"put a flag\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"put a flag on the new email\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the email from thomas should be flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 15,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"the email to ruth needs to be flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"this email need to be flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this email needs to be flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this email should be flagged\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn flag on\",\n      \"intent\": \"AddFlag\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a file to the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add a picture\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"add a subject\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add another line to the message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add did you enjoy the entire program\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 4,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add file to email\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"add more\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more and change the message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more details to it\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more don't forget to bring beer\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 9,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"add more message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more please\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more text\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more text please\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to email body\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to it\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to roy 's email\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"add more to text\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add more to the last email\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"add more to the message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add photo\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"add some more\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add something\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add to body of email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add, by the way, what's the plan of next step\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add: call me tonight after work\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 5,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"append an attachment to this email\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 10,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"attach file\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"can i add more to the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i add more to the message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"edit email so i can type an additional message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am not done yet. i need to add some more details\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i forgot to add an important part to that email to james . please set it up to edit\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 51,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to add additional lines\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to add further contents\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to add more message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to add more text\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to add more to the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to add more to the email message i am sending to vincent\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 56,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to add something else to my email to cheryl\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 44,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to add something else to that email to donna before it is sent\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 46,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to add more the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i wish to add more to the message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to add more to the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to add more to the email message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to open a new line\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to add a bit more to the email.\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to add a bit more to the message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to add more to the email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"insert more lines for me please\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"insert more text in my email\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is it ok if i add more to the email?\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it isn't complete, need more contents\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"more text\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"need to add information to the previous email\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"ok, i need to add a few things to that\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please add it was terrible\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"please add more\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please add, please let me know what i can bring. i'd be happy to make a side dish or dessert\",\n      \"intent\": \"AddMore\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 12,\n          \"endPos\": 91\n        }\n      ]\n    },\n    {\n      \"text\": \"put some additional lines to this message\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wait, i need to write more\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"write more\",\n      \"intent\": \"AddMore\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"abort deletion\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel email to natalie\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my email to jane\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel searching the messages\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the email sent to alex\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the email to my sister\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the mail\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel this email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel this message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel this sending process\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don ' t read\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don ' t read it\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don 't send the email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't email to her\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't read the email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't read the message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't send\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't send it\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't send out\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't send that email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't send this email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't show me\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget about the email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want you to cancel the email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither of them\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel the mail\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel the message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, forget about the mail\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nevermind cancel\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it, i don't want to send the mail\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no don't send\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no don't send it\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no just cancel the email\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i don't want to send this message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, no, cancel the reading\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay cancel sending the mail\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit the sending\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop message\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop reading\",\n      \"intent\": \"CancelMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"any new email available\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"any new email now\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        },\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 14,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"any new message now\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        },\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 16,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"check email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check email please\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my email please\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my emails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my gmail\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"check my inbox\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my mail box\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my message\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check outlook please\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"check up email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check up messages\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you please check my emails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you please check my inbox\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you please check my messages\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i get new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have any new mail\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 14,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have new email now\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have new message\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 10,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"do i receive new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"do i receive new mail in outlook?\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"do i receive new message\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"does anyone send email to me just then\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"does anyone send message to me just then\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 31,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"does my outlook have new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 21,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to check my emails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to check my inbox\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to check my inbox\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please check my emails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please check my inbox\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please check my outlook\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"show latest emails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"show my emails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show my unread mails\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"show the important emails in my inbox\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 9,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"whether i get new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 14,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"whether i get new message\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 14,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"whether i have new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"whether i have new message\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"whether i receive new email\",\n      \"intent\": \"CheckMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay, send it\\\"\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure, go ahead\\\"\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes, you can\\\"\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"alright, just send the message\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"correct, please send it.\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i confirm that i want to send this email\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just do it\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no problem, go ahead send the mail\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course, just delete the mail\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok send the mail to may\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"ok, good to me, send it please\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok, good, just send it\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay send it\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay, send it now\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right, send it please\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah right, send to alex\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"yes it's right\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes that's right\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes, send it\",\n      \"intent\": \"ConfirmMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help me delete it\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my inbox\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete all emails from tom\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"delete all emails received tonight\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the email from my hotmail account\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the email sent from mary jane\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the first email for me\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the last one\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the previous 4 emails\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the red ones\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the second mail\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the second one\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the unread emails\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"delete this email\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete this message permanently\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete what i just wrote\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"empty the email inbox\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"put it in the recycle bin\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"put the email in the recycle bin\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"put the email to trash bin\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"put the emails from this file folder to trash bin\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"remove emails that are duplicate\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"remove emails with red flags\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"remove it from my inbox\",\n      \"intent\": \"Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"remove the email from mary\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the emails received yesterday\",\n      \"intent\": \"Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"could you forward this message to ronald and roy\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 34,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"could you please forward this email to my sister\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"forward all files from sally to austin\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"forward by saying if you interest to rebecca\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 18,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 37,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"forward email\",\n      \"intent\": \"Forward\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forward email to girlfriend\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 17,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"forward emails to gabriel\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 18,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"forward message to girlfriend\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 19,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"forward the email from john smith to michelle by saying fyi\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 56,\n          \"endPos\": 58\n        }\n      ]\n    },\n    {\n      \"text\": \"forward the email from melissa to peter\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"forward the email to dad\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 21,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"forward the last email to susan\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"forward this email\",\n      \"intent\": \"Forward\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forward this email to eugene by typing what do you think\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 39,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"forward this email to gary brown please\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 22,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"forward this email to joseph\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"forward this email to partone dot parttwo at gmail dot com\",\n      \"intent\": \"Forward\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forward this email to patricia\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to alan tonight\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to brian potter tonight\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to deborah with a message saying that i don't want that\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 46,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to dorothy by typing i agree with it\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 29,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to mom\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to my boss and attach the schedule file\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 34,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to partoneparttwo@gmail.com next monday\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 36,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to thomas please\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"forward to wife by saying i love you\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"please forward this email to albert by typing everything goes fine\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 46,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"please forward this email to partoneparttwo@163.com\",\n      \"intent\": \"Forward\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please forward this email to partoneparttwo@outlook.com\",\n      \"intent\": \"Forward\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please forward this message\",\n      \"intent\": \"Forward\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please forward to benjamin\",\n      \"intent\": \"Forward\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the first one\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"the second one\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"the third one\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me the last email i received\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"come to the last\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"go to the last one\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to see the last email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"last email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"open the last email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"open the lastest email i got\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"please tell me who emailed me last\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the lastest email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the newest email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"show the last email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"the last email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"what did mom just say\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 9,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"what eric watson just said\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"what harry last email said\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"what henry just said\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the last email i received today\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the lastest email i received from dad\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 42,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"what was the last email\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"what was the last email i got from dad\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what was the last email i got from steve edwards\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 35,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"who email me just now\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"who emailed me\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who emailed me just now\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who emailed me last\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"who recently emailed me\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who sent me the email lastly yesterday\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"who sent me the mail just now\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who texted me\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who texted me just now\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"whose email just then ?\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"whose email now ?\",\n      \"intent\": \"QueryLastText\",\n      \"entities\": [\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"can you read my emails\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read my last email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"could you read out the email on how to use the new tool?\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 32,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"please read my last email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"read aloud my new email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 14,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"read aloud the christmas party email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 15,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"read darren's mail on the movie\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"read email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read email from dawn\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"read email from kat\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 16,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"read email from mum\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 16,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"read email to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read emails\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read emails from clay\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"read first email in link box\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"read first email in the linked inbox\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"read google mail\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read last email received\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"read last incoming emails\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"read last mail\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"read latest email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read mary grace white email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 5,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"read me dylan's email sent on yesterday\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"read me jessica's email on dress code for the party\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 27,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"read me my last hotmail email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"read me my latest emails\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read me the email on apple\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the email on thanksgiving day\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 21,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the email sent on thanksgiving day\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 26,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the email titled happy new year\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the emails from agatha\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the last email claude sent\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the last emails of the five minutes\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 31,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the newest email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"read me the recent email titled abcd from jessica\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"read most recent email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"read my email from baby\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"read my email from hubby\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"read my email from tyler swift\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"read my email messages\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my email please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my email to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my emails\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my emails from patty\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"read my inbox\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my last email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"read my last email out to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"read my most recent email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"read my new email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read my new emails\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read my notification\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my outlook email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"read my recent email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"read my recent email message please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"read my recent email messages\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"read my recent email to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"read my second email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"read new email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"read new email from david ma\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"read new message\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"read out darren's mail\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"read out the email from liu about transfer\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"read out xu's email about apple's news\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 9,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"read please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read recent email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read the email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the email on auto repair\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"read the first email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"read the first email in hotmail\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"read the last email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"read the last email message\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"read the latest email from mom\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"read the latest email from steve lip\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"read the latest email i sent\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"read todays mail\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read today's mail\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"read unread email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"read unread message\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"create a response to the email by saying pls send me the picture again\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 41,\n          \"endPos\": 69\n        }\n      ]\n    },\n    {\n      \"text\": \"email back\",\n      \"intent\": \"Reply\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"email back i will call you back\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 11,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"how to reply to an email\",\n      \"intent\": \"Reply\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make a response with thank you very much\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 21,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"reply\",\n      \"intent\": \"Reply\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reply by email thank you very much best regards jun\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 15,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"reply by saying i love you\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 16,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"reply by saying yes\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 16,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"reply by typing hello\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"reply required to an email\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"reply that i am busy\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"reply to edward\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"reply to email i am busy now\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 15,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"reply to my last email\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"reply to susan\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"reply to the email\",\n      \"intent\": \"Reply\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reply to the first one\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"PositionReference\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"reply we'll see you later\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 6,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"reply with hello\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"reply yee ha\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 6,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"reply yee hello\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 6,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"reply yes boss.\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"respond i ' m sick i can ' t do it\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 8,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"respond to lore hound\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"respond to nathan\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"respond to the email by saying i am busy today\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 31,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"return barbara on mobile\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"return siberian huskies mobile\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 7,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"send email back\",\n      \"intent\": \"Reply\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send the response with i've already know\",\n      \"intent\": \"Reply\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 23,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"can you search my emails\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"detect emails from betty\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"detect the email containing keyword beauty\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"detect the email from lisa\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"did i get any email from tom\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 25,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"did i get emails from tom\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"did i get the email containing keyword lunch\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"email sent from lisa\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"emails contains bank\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"enumerate the emails with algroithm\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"find an email about new year's planning\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 20,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"find an email from abc123@outlook.com\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find an email from angela\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find an email from jay that contains halloween\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 37,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find an email on the dinner reservation\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 21,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"find email titled new design\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 18,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"find email with title production tools\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 22,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"find emails from mom\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 17,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"find emails that contain malta\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"find emails with resume\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"find mails titled recommended courses\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 18,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"list the emails contain funny picture\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 24,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"looking for an email with hello\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"query emails with bill\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"search an email with subject background screening\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 29,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"search bla bla in my emails\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"search email contain outlook\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"search email with key words lunch\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"search emails about boating\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"search emails contain work items\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 22,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"search emails contains coupons\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"search emails from mike\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"search jensen's emails\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"search keywords keywordone keywordtwo in my emails\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 16,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"search keywordsone keywordstwo from inbox\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 7,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"search my emails\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search text with words lunch together\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 23,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"search the email with keywords hello\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"search the emails contains microsoft\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"search the emails contains money\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"show emails contain words \\\"future plan\\\"\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"show emails with \\\"credit card\\\"\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"show me emails from clara chan\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 20,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"show me emails from girlfriend\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 20,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the email about spring festival\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the email from tom and filtering with word lunch\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"SearchTexts\",\n          \"startPos\": 51,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the email sent from mom\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the email from lily wong\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the email with subject weekly report\",\n      \"intent\": \"SearchMessages\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"compose new email about spanish homework\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"create new mail titled urgent meeting information to jonathan\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 23,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"email her the message \\\"fine, ok\\\"\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"email my brother\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"email my presentation\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 9,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"email the file to henry mathew\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 18,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"email to amy cooper about haha saying hello\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 26,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"email to cynthia and mike, that dinner last week was splendid.\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 27,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"email to harry potter and hermione granger\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 26,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"email to lawrence about opening issue\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 24,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"email to mike waters : mike, that dinner last week was splendid.\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 23,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"email to partoneparttwo@gmail.com\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"email to tom white about that flower saying beautiful\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 9,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 25,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to send an email about the words to a song\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 34,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"make a new email about weather forecast\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"mark email for follow up and send to arthur\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"new email about really good talk to michelle\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 16,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"new email about writing documents\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 16,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"new email to kimberly about wingman\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send a email to leehom wong about the piano concert saying it's wonderful\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 16,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 38,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 59,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"send a mail to daniel\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 15,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"send a new email about facebook\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"send a new email about the hockey tournament to marie jane, joseph , and john\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 27,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 48,\n          \"endPos\": 57\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 60,\n          \"endPos\": 65\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 73,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"send a new email about the problem solving to andrea, angela, and ron\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 27,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 46,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 54,\n          \"endPos\": 59\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 66,\n          \"endPos\": 68\n        }\n      ]\n    },\n    {\n      \"text\": \"send a new email to larry with a file attached\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"send a new email to nicholas and jesse about coupons\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 45,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"send a new email to partonepartwopartthree@yahoo.com\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send a new high importance email to jordan\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"send a read receipt email to samuel\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send alexander a red bang email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send an email about swim team practice\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 20,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email about test status to mark\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 20,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email about the window that is broken\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 24,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email for me\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send an email marked follow up to jerry\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 21,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email marked for follow up to christian\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 25,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email marked with a bang to amy\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to a.j.ron marked as important\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to christopher carpenter about the hiking trip\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 49,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to harold and bob kappus about team lunch saying same team lunch this tuesday\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 28,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 45,\n          \"endPos\": 90\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to harry potter\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to jacqueline and tianyu about the test result\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 49,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to jimmy klein saying this is the message about weekend plans\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 36,\n          \"endPos\": 74\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to larry , joseph and billy larkson\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 25,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 36,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to lily roth and abc123@microsoft.com\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to lu , yue and qiong about funding\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to mom\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 17,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to my brother\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to nathan with a red bang\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to partone@gmail.com\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send an email to partone_parttwo@microsoft.com\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send an email to sean about weekend plans\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email to zachary about we can plan things let's go hiking\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 31,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email today\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"send an email with read receipt to peter\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 19,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"send an important email to olivia\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"send an urgent email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"send an urgent email from my work account to christian\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"send an urgent email from my work email to jack\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Line\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"send and email about swim team practice\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 21,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send angela an email marked as high priority\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"send billy an email with a red bang\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send email about homework plan to raymond and philip\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 17,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 34,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 46,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"send email marked priority to yun-sim and yi\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to a and tian\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 14,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to hannah saying test\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to heather about car\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to jiayi today\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to kai xu, mingming and my mother\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to louis and mark it important\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"send email to partone.parttwo@outlook.com\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send important email to evelyn and gary\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send jacqueline an email with low priority\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"send large files through email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"send lori a new flagged email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"send mail to dorothy\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"send my housekeeping doc to jeffrey\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 8,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"send my payment visio diagram to ronald\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 8,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"send new email to christian and mark it high importance\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 18,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 40,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"send the email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"send the email now\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Time\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"send this document to an email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Attachment\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"send thomas an email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"set an email today\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Date\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"start a new email about marriage counselor appointments\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 24,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"start a new email from tracy saying here is my resume\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 36,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"start a new email saying lets go to the park\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 25,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"start a new email to aaron about sleeping over tonight\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 33,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"start an email to jason about speaking up\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"start new email about taco blog to nicole and emily\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 35,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 46,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"start new email to friends about the club\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"start up a new email to michelle about watching baseball\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 39,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"the new email is high priority that is being sent to jacob\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 17,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 53,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"will you send a marked non urgent email to james\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 23,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"write an email about the fundraiser\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 25,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"write an email which title is hello and context is let's have meeting together\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Message\",\n          \"startPos\": 51,\n          \"endPos\": 77\n        }\n      ]\n    },\n    {\n      \"text\": \"write an urgent email to bobby\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"ContactName\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"write email\",\n      \"intent\": \"SendEmail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"write email to mom subject is babysit\",\n      \"intent\": \"SendEmail\",\n      \"entities\": [\n        {\n          \"entity\": \"RelationshipName\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"EmailSubject\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"are there any unread messages? show next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"go forward to next mails\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"go on, show me more mails\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to next mail\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to the next page\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"move forward\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move on next mail by jason\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"move on to next mails\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"next email\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"next unread email\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"next unread one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"show me next from mary\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the next five mails\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"show next email\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"show next unread\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"show the next email from my boss\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"show the next emails by wong\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"show the next messages\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"the next email\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"the next important message\",\n      \"intent\": \"ShowNext\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 9,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"back to the last one from apple\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"bring the previous one, i want to read it again\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"go to previous mails\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"move back to last mails\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"previous email\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"show me previous email from jack\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"SenderName\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the last three mails\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the one before\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the previous email\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"show previous in red category\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Category\",\n          \"startPos\": 17,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"show previous one in inbox\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"show the previous email from my mentor\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"FromRelationshipName\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"the previous email\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the previous email\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": [\n        {\n          \"entity\": \"OrderReference\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel app\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that one\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"canceled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancelled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget about it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go away\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry, don't do it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"alright\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come om\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nice\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no doubt\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok for now\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thanks\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good to me\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure does\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure is\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure thing\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you very much\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is correct\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's all\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"very good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ya\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah bro\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah buddy\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah cool\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i talk to a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact the customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"human service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need manual customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need real human help\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any person i can talk to\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shift\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all set\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finish\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished with\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit it\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back on\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do me a favor\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me a favor\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i get it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how to do it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some assistance\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"open help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what should i do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who can help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"signout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget me\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sign out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"logout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"log out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want them all\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you you read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you tell me what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"detail aloud what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to hear this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like you to read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make a reading of this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read me the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read my latest email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read all on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud the current text onscreen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read file aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read me this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my to list\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read sentence out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page onscreen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the text to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the words on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this for me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read what is currently on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak of what is on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak out\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start reading this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"state it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about the information on the screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me the current text on screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vocalize what's on the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what does the page say\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you please read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that out loud please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that to me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't need\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"negative\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i don't want that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no later\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no leave it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no more no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no not that one\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no wrong\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at all\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not even close\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not exactly\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not quite\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing much\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you say it again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i didn't hear repeat again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have not heard\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pardon\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat that\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what did you say\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what was that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any one is ok\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anyone is fine\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anything\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose anyone\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose one of it randomly\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose for no. four\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no. six\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no.2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the bottom left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the first choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the upper left choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the upper right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"four\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i like second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i like upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i want bottom\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i want fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i want no. 5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the fourth choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose lower right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 1\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 3\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no.4\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"number two\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for number 7\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the second choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select five\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"select no.5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the bottom choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"select the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"select third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select upper\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"three\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to choose any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to select any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want neither of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of these\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"they look bad, can you give me other choices\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go forward\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next three items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 3\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 4 items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next two options\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the next 2\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show earlier\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the last five\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the last two\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the beginning\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear and start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please begin again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reopen a new page\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn over a new leaf\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"baby just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dismiss\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end it\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit exit\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to see you anymore\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i love you to stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i mean stop listening\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i said stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no no stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nobody cares stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nowhere just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok stop stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut your mouth\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"silence\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop please\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"^cancel [sending] [(my|the)] (email|mail) to {ContactName}\",\n      \"intent\": \"CancelMessages\"\n    },\n    {\n      \"pattern\": \"show [(my|the)] [(unread|important|{Category})] (email|mail|emails)^\",\n      \"intent\": \"CheckMessages\"\n    },\n    {\n      \"pattern\": \"^(delete|remove) [the] [{OrderReference}] (email|emails|mails) [from {SenderName}]\",\n      \"intent\": \"Delete\"\n    },\n    {\n      \"pattern\": \"^read [(me|out)] [the] (email|emails) from {SenderName} [(about|on) {EmailSubject}]^\",\n      \"intent\": \"ReadAloud\"\n    },\n    {\n      \"pattern\": \"^read [me] [the] (email|mail|emails) (on|about|titled) {EmailSubject}\",\n      \"intent\": \"ReadAloud\"\n    },\n    {\n      \"pattern\": \"^read [me] [the] (email|mail|emails) (on|about|titled) {EmailSubject} [sent] from {SenderName}^\",\n      \"intent\": \"ReadAloud\"\n    },\n    {\n      \"pattern\": \"^read [me] the (email|mail) (titled|about|on) [the] {EmailSubject}^\",\n      \"intent\": \"ReadAloud\"\n    },\n    {\n      \"pattern\": \"^reply [back] with [the] (title|subject) {EmailSubject}\",\n      \"intent\": \"Reply\"\n    },\n    {\n      \"pattern\": \"^reply [back] [the] message [that] {Message}^\",\n      \"intent\": \"Reply\"\n    },\n    {\n      \"pattern\": \"^reply [back] [with] [the] [message] [that] \\\"{Message.Any}\\\"\",\n      \"intent\": \"Reply\"\n    },\n    {\n      \"pattern\": \"^(tell|find|show) [me] [(an|the)] email (with the title|with title|titled) {EmailSubject}\",\n      \"intent\": \"SearchMessages\"\n    },\n    {\n      \"pattern\": \"^(tell|find|show) [me] [(an|the)] email (with the title|with title|titled) \\\"{EmailSubject.Any}\\\"\",\n      \"intent\": \"SearchMessages\"\n    },\n    {\n      \"pattern\": \"^(search|find|show) [me] [(an|the)] (email|emails|mail) [(containing|filtering)] [with] [the] [(texts|text|word)] \\\"{SearchTexts.Any}\\\"\",\n      \"intent\": \"SearchMessages\"\n    },\n    {\n      \"pattern\": \"^(show|search|find) [me] [(an|the)] [{Category}] email[s] (on|about|titled) {EmailSubject} [sent] [(by|from) {SenderName}]^\",\n      \"intent\": \"SearchMessages\"\n    },\n    {\n      \"pattern\": \"^(write|send|start) [(a|an|the)] [new] email to {ContactName}^\",\n      \"intent\": \"SendEmail\"\n    },\n    {\n      \"pattern\": \"^[(send|write)] [(the|a)] [new] [(email|mail)] [to {ContactName}] [with message \\\"{Message.Any}\\\"]\",\n      \"intent\": \"SendEmail\"\n    },\n    {\n      \"pattern\": \"^(write|send|start) [(a|an|the)] [new] email to {ContactName} (about|on|with) [the subject] [that] {EmailSubject}^\",\n      \"intent\": \"SendEmail\"\n    },\n    {\n      \"pattern\": \"^(show|give|tell) [me] [the] next (email|message|mail)^\",\n      \"intent\": \"ShowNext\"\n    },\n    {\n      \"pattern\": \"^(show|give|tell) [me] [the] previous (email|message|mail)^\",\n      \"intent\": \"ShowPrevious\"\n    },\n    {\n      \"pattern\": \"^(yes|sure)[[,]i want (that|the ({DirectionalReference}|{ordinal}) ({number}|one))]\",\n      \"intent\": \"Confirm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"Message.Any\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"EmailSubject.Any\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"SearchTexts.Any\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"email\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"Email\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/Skills/ToDo.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Confirm\"\n    },\n    {\n      \"name\": \"Escalate\"\n    },\n    {\n      \"name\": \"FinishTask\"\n    },\n    {\n      \"name\": \"GoBack\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"Logout\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"ReadAloud\"\n    },\n    {\n      \"name\": \"Reject\"\n    },\n    {\n      \"name\": \"Repeat\"\n    },\n    {\n      \"name\": \"SelectAny\"\n    },\n    {\n      \"name\": \"SelectItem\"\n    },\n    {\n      \"name\": \"SelectNone\"\n    },\n    {\n      \"name\": \"ShowNext\"\n    },\n    {\n      \"name\": \"ShowPrevious\"\n    },\n    {\n      \"name\": \"StartOver\"\n    },\n    {\n      \"name\": \"Stop\"\n    },\n    {\n      \"name\": \"AddToDo\"\n    },\n    {\n      \"name\": \"DeleteToDo\"\n    },\n    {\n      \"name\": \"MarkToDo\"\n    },\n    {\n      \"name\": \"ShowNextPage\"\n    },\n    {\n      \"name\": \"ShowPreviousPage\"\n    },\n    {\n      \"name\": \"ShowToDo\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"DirectionalReference\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ContainsAll\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ListType\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"TaskContent\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"FoodOfGrocery\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"air freshener\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"apple\",\n          \"list\": [\n            \"apples\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"bacon\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"bagel\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"bagels\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"banana\",\n          \"list\": [\n            \"bananas\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"beans\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"beverages\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"bread\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"buns\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"burgers\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"butter\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"carrot\",\n          \"list\": [\n            \"carrots\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"celery\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cereal\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cheese\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chicken\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chili\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chips\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"chocolate\",\n          \"list\": [\n            \"chocolates\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"chocolate chip\",\n          \"list\": [\n            \"chocoloate chips\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"chops\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"cloves\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"coffee\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"corn\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"crispy\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"croissant\",\n          \"list\": [\n            \"croissants\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"cupcakes\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"dairy\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"dishwashing detergent\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"donuts\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"drinks\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"duck\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"egg\",\n          \"list\": [\n            \"eggs\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"flour\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"fries\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"frozen food\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"fruit\",\n          \"list\": [\n            \"fruits\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"garbage bag\",\n          \"list\": [\n            \"garbage bags\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"garlic\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"grilled\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"ham\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"hamburger\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"ice cream\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"jam\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"lamb\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"laundry detergent\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"lemon\",\n          \"list\": [\n            \"lemons\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"lettuce\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"lettuce and salad\",\n          \"list\": [\n            \"salad\",\n            \"salads\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"lobster\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"marinated\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"meat\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"meatballs\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"meatloaf\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"milk\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"onion\",\n          \"list\": [\n            \"onions\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"oysters\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pancake mix\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pancakes\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pasta\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pastry\",\n          \"list\": [\n            \"pastries\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"pear\",\n          \"list\": [\n            \"pears\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"pepper\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"pie\",\n          \"list\": [\n            \"pies\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"pita\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"potato\",\n          \"list\": [\n            \"potatoes\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"poultry\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"ribs\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"rice\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"roast\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"rolls\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"salads\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"salmon\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"salt\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sandwich\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sauce\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sausage\",\n          \"list\": [\n            \"sausages\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"scones\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"shellfish\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"shrimp\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"snacks\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sour cream\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"steak\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"strawberries\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sugar\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sushi\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"sweets\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"tenderloin\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"tomato\",\n          \"list\": [\n            \"tomatoes\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"toothpaste\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"tortilla\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"tuna\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"turkey\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"veal\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"vegetable\",\n          \"list\": [\n            \"vegetables\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"venison\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"waffles\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"yoghurt\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"fish\",\n          \"list\": []\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"ShopVerb\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"buy\",\n          \"list\": [\n            \"bought\",\n            \"buys\",\n            \"buying\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"purchase\",\n          \"list\": [\n            \"purchases\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"shop\",\n          \"list\": [\n            \"shops\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel app\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that one\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"canceled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancelled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget about it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go away\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry, don't do it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"alright\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come om\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nice\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no doubt\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok for now\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thanks\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good to me\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure does\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure is\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure thing\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you very much\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is correct\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's all\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"very good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ya\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah bro\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah buddy\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah cool\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i talk to a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact the customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"human service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need manual customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need real human help\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any person i can talk to\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shift\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all set\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finish\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished with\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit it\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back on\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do me a favor\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me a favor\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i get it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how to do it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some assistance\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"open help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what should i do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who can help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"signout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget me\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sign out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"logout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"log out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want them all\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you you read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you tell me what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"detail aloud what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to hear this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like you to read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make a reading of this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read me the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read my latest email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read all on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud the current text onscreen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read file aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read me this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my to list\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read sentence out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page onscreen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the text to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the words on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this for me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read what is currently on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak of what is on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak out\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start reading this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"state it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about the information on the screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me the current text on screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vocalize what's on the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what does the page say\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you please read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that out loud please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that to me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't need\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"negative\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i don't want that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no later\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no leave it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no more no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no not that one\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no wrong\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at all\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not even close\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not exactly\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not quite\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing much\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you say it again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i didn't hear repeat again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have not heard\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pardon\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat that\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what did you say\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what was that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any one is ok\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anyone is fine\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anything\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose anyone\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose one of it randomly\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose for no. four\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no. six\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no.2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the bottom left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the first choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the upper left choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the upper right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"four\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i like second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i like upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i want bottom\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i want fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i want no. 5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the fourth choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose lower right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 1\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no. 3\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no.4\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"number two\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for number 7\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the second choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select five\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"select no.5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the bottom choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"select the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"select third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select upper\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"three\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to choose any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to select any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want neither of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of these\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"they look bad, can you give me other choices\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go forward\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next three items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 3\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 4 items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next two options\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the next 2\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show earlier\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the last five\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the last two\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the beginning\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear and start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please begin again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reopen a new page\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn over a new leaf\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"baby just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dismiss\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end it\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit exit\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to see you anymore\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i love you to stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i mean stop listening\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i said stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no no stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nobody cares stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nowhere just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok stop stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut your mouth\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"silence\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop please\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add a few items to the grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy fish\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy fruit and vegetables\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"add a grocery item to buy vegetables\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add a new shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add a shopping item to buy dancing dresses\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 23,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"add a shopping item to buy orange juice\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for anna west to bring my swimsuit for my vacation\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for jimmy to play xbox games with me after work\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for li lei to bring my coat from home\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task for raghu to bring my chocolates from germany\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to purchase fruit and vegetables\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to finish driving test this week\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to pick mary up after work\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task to shop at gnc after work\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add a to do to purchase a nice sweater\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add a to do to buy shoes\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"add a todo item to vacuum by october 3rd\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"add action item for khalifa to pack my school supplies in my list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"add an item to buy some snacks\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add a task of chores to do around the house\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add bronwnies to the grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"add buy gum\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add buy milk to my shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"add call my mother to my todo list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add go running to my to dos\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"add go to whole foods in my to do list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery add spinach my groceries list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery items cream cheese and raisin to the list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"add grocery items dinners and storage bag to the shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 49,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"add have a haircut to my tasks\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add items as i speak\",\n      \"intent\": \"AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add juicer groceries list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"add melon and sugars and brown sugar to shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add more to grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"add peanuts the grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"add purchase a cinema ticket to my list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"add purchasing food and drinks to my shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add reading to my to do list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"add shoes to the shopping lists\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"add some items to that shopping notes\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"add some items to the grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add some jeans on our shopping lists\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"add something in this grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add something to my list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add tapioca starch on my shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"add tapioca starch on our shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"add task to buy a coat\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"add task to set up dining room table\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add this on our shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"add this stuff on my shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add this thing in to do list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my to do list pick up clothes\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my to do list print papers for 10 copies this afternoon\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"add to my todos list mail the insurance forms out by saturday\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"add to note shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"add to shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"add to the grocery note buy milk\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"append a summer reading in my list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"append an task of guest to invite at the party\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"append this item onto my notes\",\n      \"intent\": \"AddToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask a task for kim to bring my coat from home\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"can i add shirts on the todos list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"can i put on caramel cheese popcorn on my grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"could i add medicine to the todos list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"create a task to meet my friends\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to go to the mall\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to meet john after 5:00 p.m.\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"create task to cyber shop on nov. 11\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"create to do read a book tonight\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"create to do to go running in the park\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"need go to library this week, add this todo item\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 0,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"put cheese on list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"put ham on my shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 6\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"put hikes on my to do list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"put ice cream on the groceries list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"put milk on my grocery list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"put on caramel cheese popcorn on my grocery shopping list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 4,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 36,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to attend the meeting tomorrow\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to buy first aid creams and berries\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to buy milk\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to meet my teacher\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remind me to shop for a new carpet\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"to grocery list add milk\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 3,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"to my shopping list add paper towels\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"to my vacation to do list add buy sunblock\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"would you add heavy cream to the todos list\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"would you please add todo item of all hands meeting next monday\",\n      \"intent\": \"AddToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 34,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel adding the item\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel all\",\n      \"intent\": \"Cancel\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel all of them\",\n      \"intent\": \"Cancel\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"drop it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't need it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no forget it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no need thanks\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please revert it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry no\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry no thank you\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop adding it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wait cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm all of them\",\n      \"intent\": \"Confirm\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"confirm it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirmed.\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good to go\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure i want to add this task\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's ok, save it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok, go ahead and delete it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"seems nice\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure add it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's nice\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes i want to do that\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes just do that\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes, confirm\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you delete todo1\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"can you delete abc item\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"can you help to remove all tasks\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel apples from shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my todo list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"delete all from my grocery list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"delete eggs from list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"delete off pancake mix on the shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"delete shampoo from shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delete shirts from list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"delete task go fishing\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"delete task go to cinema tonight\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the item buy socks from my to-do list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the second task in my shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the task house cleanup this weekend\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the task hit the gym every morning\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do meet my friends tomorrow\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do daily practice piano\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"delete the to do meet john when he comes here the next friday\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do buy milk\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do go shopping\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"delete to do that go hiking tomorrow\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"erase bananas from shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"erase peanuts on the shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"no need to buy milk in grocery list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"omit the milk in the grocery list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remove all\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"remove all tasks\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"remove all todo items tomorrow\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 7,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"remove asprin from shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"remove black shoes from shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"remove class from todo list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"remove salad vegetables from grocery list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 29,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task buy dog food\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task go shopping\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task go shopping with john this saturday\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 12,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task that go hiking this weekend\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"remove task that lawn mowing\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the item paris from my list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the task that go to library after work\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the to do physical examination\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"remove the to do that pick tom up at six p.m.\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 22,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"remove to do go to the gym\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 13,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"remove to do that go to the dentist tomorrow morning\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 18,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete a\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete dog food\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete eggs\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list delete milk\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"take coffee off my groceries list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"take lemons and onions off my shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"take milk off grocery list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"take socks and shoes off my shopping list\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"todo list delete paris vacation\",\n      \"intent\": \"DeleteToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 17,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"all have been done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        }\n      ]\n    },\n    {\n      \"text\": \"all have been purchased in the shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"already complete the shopping items in the list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"check off apples from list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"check off bananas from my grocery list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"check off garbage from grocery list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"check off meet john at 8 am from to do list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"check off shampoo from shopping list as done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"check the box shampoo in my shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"complete all\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 9,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"complete pick up black shoes in my to-do list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"complete task go shopping\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task abc in our shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task shopping\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"done with the task tapioca starch in our shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 19,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"finish hikes on my to do list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"finish peanuts on the shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"i have finished the interview which is the last task in my to do list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 59,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"let me check off the groceries list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"mark buy fish as completed\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"mark fish as complete\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"mark happy on to dos list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"mark lemons and onions in grocery list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pancake mix on my grocery shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"mark peanuts on my grocery list as done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"mark peanuts on my grocery shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pick mary up as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"mark pick up milk on my to-do list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"mark play badminton with tom as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"mark salad on my grocery shopping list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"mark salad on the groceries list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task buy a bottle of vinegar as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task go running as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"mark task read a book as done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the first task as completed\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"mark the item garbage from grocery list\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task buy milk as done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task get some food as complete\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task go shopping as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task reserve a restaurant for tomorrow's dinner as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"mark the task visit my grandma as completed\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 14,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"set the grocery list as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"set the item as finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shopping list completed\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list just done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"task train has been done\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"task completed buy gum\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"TaskContent\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"the 3rd task finished\",\n      \"intent\": \"MarkToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are there any other tasks\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you show next page in the shopping list\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"display the next page\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays more\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays the next\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next task\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal more\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show greater\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more tasks\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more work\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show next\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show next page\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show next sheet\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show next website\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell more\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell more tasks\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's more\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's on the next\",\n      \"intent\": \"ShowNextPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you get previous for me\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you show previous for me\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display the previous\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display the previous page\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays previously\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to check previous tasks\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show back\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show earlier\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show last time\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me everthing on the previous page\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous page\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shows the prior\",\n      \"intent\": \"ShowPreviousPage\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"access my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"access my to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"access the groceries list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"all shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"bring up everything on my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 9,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"bring up grocery notes\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"bring up shopping note\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"browse my groceries\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 10,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"can you show my to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"check my task list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"display all notes from last month\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"display groceries list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"display notes with groceries\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"display shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"display tasks note\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display todo list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have a list called grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any lists\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find list about shopping\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"find my grocery items i saved on saturday\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"find my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"find note labeled grocery\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find notes called grocery\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find notes for grocery shopping\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 15,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"find notes with groceries\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find shopping\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"find task list on shopping\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"find the list i create for shopping\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"find the to do list for me\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 9,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"get work items on my todo list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"help access my personal list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help show my to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i have to see my tasks\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have to see the grocery list i created today\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 18,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to check my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to see grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"is there anything on my to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"list grocery notes\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"look at my grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"pull grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"pull up grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"pull up my grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"pull up my notes\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pull up to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"read aloud my grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"read out my tasks\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"review grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"show all my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 5,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 12,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"show me all tasks\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ContainsAll\",\n          \"startPos\": 8,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"show my to do list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"show my to dos\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"show my todos\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"view my grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"view shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 5,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"what about grocery list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i going to do next\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are my notes for the grocery store\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my tasks for todo\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to buy on the shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i need to buy in the shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what is on my shopping list\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the last task on my to do list for tomorow\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"where is the grocery shopping notes i worked on last night\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"would you bring up my new grocery notes\",\n      \"intent\": \"ShowToDo\",\n      \"entities\": [\n        {\n          \"entity\": \"ListType\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"^(yes|sure)[[,]i want (that|the ({DirectionalReference}|{ordinal}) ({number}|one))]\",\n      \"intent\": \"Confirm\"\n    },\n    {\n      \"pattern\": \"^[(can you|could you|would you)] [please] (put|add|append) {TaskContent} [and] [{TaskContent}] (on|to)[my][(to do|todos|todo)]list\",\n      \"intent\": \"AddToDo\"\n    },\n    {\n      \"pattern\": \"^(add|create|append) an item [(called|about|of)] \\\"{TaskContent.Any}\\\" [as (next|first|last) task][(in|on|to) my (to do|to-do|todos) list]\",\n      \"intent\": \"AddToDo\"\n    },\n    {\n      \"pattern\": \"^[please] (add|put|append) [(items|item)] {FoodOfGrocery} [and] [{FoodOfGrocery}](on|to|in)[(my|the)]{ListType}list\",\n      \"intent\": \"AddToDo\"\n    },\n    {\n      \"pattern\": \"^[(would you|could you|can you)] [please] cancel (previous|current|this) (step|operation)\",\n      \"intent\": \"Cancel\"\n    },\n    {\n      \"pattern\": \"^(yes|ok|sure), [please][(add|delete|update)] [the] [(item|task|todo item)][(of|about|that)]{TaskContent}\",\n      \"intent\": \"Confirm\"\n    },\n    {\n      \"pattern\": \"^[task][(done|finished|completed)]{TaskContent},[please][(check off|mark it)][as][(done|finished|complete)]\",\n      \"intent\": \"MarkToDo\"\n    },\n    {\n      \"pattern\": \"^[(can|could|would)] [you] [please] [(show|display|go back to)][the](first|previous)page\",\n      \"intent\": \"ShowPreviousPage\"\n    },\n    {\n      \"pattern\": \"^(what|anything)[do] i (need|should|have to) (buy|shop|purchase) for {TaskContent}\",\n      \"intent\": \"ShowToDo\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"TaskContent.Any\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"General\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/all-entity-types.json",
    "content": "{\n  \"intents\": [],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"ChocolateType\",\n      \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n      \"mode\": false,\n      \"activated\": true\n    },\n    {\n      \"name\": \"question\",\n      \"words\": \"are you,you are\",\n      \"mode\": true,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"dimension\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"email\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"money\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"percentage\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"phonenumber\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"temperature\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"url\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"all-entity-types\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/all-qna.json",
    "content": "{\n  \"urls\": [\n    \"https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs\"\n  ],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"You can change the default message if you use the QnAMakerDialog. \\r\\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I change the default message\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can use our REST apis to manage your KB. \\r\\n\\\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I programmatically update my KB?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Vishwac\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your ceo?\",\n        \"get me your ceo info\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can get coffee in our Seattle store at 1 pike place, Seattle, WA\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where can I get coffee?\",\n        \"I need coffee\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"location\",\n          \"value\": \"seattle\"\n        }\n      ]\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can get coffee in our Portland store at 52 marine drive, Portland, OR\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where can I get coffee?\",\n        \"I need coffee\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"location\",\n          \"value\": \"portland\"\n        }\n      ]\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What is Ludown?\",\n        \"ludown cli\",\n        \"where can i get more information about ludown cli?\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"ludown\",\n          \"value\": \"awesome\"\n        }\n      ]\n    }\n  ],\n  \"files\": [],\n  \"name\": \"all-qna\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/all.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Buy chocolate\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"fax\",\n          \"list\": [\n            \"fax\",\n            \"fascimile\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"ChocolateType\",\n      \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n      \"mode\": false,\n      \"activated\": true\n    },\n    {\n      \"name\": \"question\",\n      \"words\": \"are you,you are\",\n      \"mode\": true,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you  can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"create  an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"santa wants a blue ribbon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can I get some m&m\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I want some twix\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I would like to buy some kit kat\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"all\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/allGen.lu",
    "content": "\n> LUIS application information\n> !# @app.name = all\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n\n## Help\n- help\n- I need help\n- please help\n- can you help\n\n\n## AskForUserName\n- {@userName=vishwac}\n- I'm {@userName=vishwac}\n- call me {@userName=vishwac}\n- my name is {@userName=vishwac}\n- {@userName=vishwac} is my name\n- you can call me {@userName=vishwac}\n\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {@alarmTime} alarm\n- remove the {@alarmTime} alarm\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat\n\n\n> # Entity definitions\n\n@ ml userName\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt datetimeV2\n\n\n> # Phrase list definitions\n\n@ phraselist ChocolateType = \n\t- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n@ phraselist question(interchangeable) = \n\t- are you,you are\n\n\n> # List entities\n\n@ list commPreference = \n\t- call :\n\t\t- phone call\n\t\t- give me a ring\n\t\t- ring\n\t\t- call\n\t\t- cell phone\n\t\t- phone\n\t- text :\n\t\t- message\n\t\t- text\n\t\t- sms\n\t\t- text message\n\t- fax :\n\t\t- fax\n\t\t- fascimile\n\n\n> # RegEx entities\n\n\n> # Pattern.Any entities\n\n@ patternany alarmTime\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/allGenQnA.lu",
    "content": "> # QnA pairs\n\n> !# @qna.pair.source = custom editorial\n\n<a id = \"181\"></a>\n\n## ? How do I change the default message\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? How do I programmatically update my KB?\n\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? Who is your ceo?\n- get me your ceo info\n\n```markdown\nVishwac\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? Where can I get coffee?\n- I need coffee\n\n**Filters:**\n- location = seattle\n\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? Where can I get coffee?\n- I need coffee\n\n**Filters:**\n- location = portland\n\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? What is Ludown?\n- ludown cli\n- where can i get more information about ludown cli?\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/allRefresh.lu",
    "content": "\n> # Intent definitions\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n\n## Help\n- help\n- I need help\n- please help\n- can you help\n\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- remove the {alarmTime} alarm\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat\n\n\n> # Entity definitions\n\n$userName:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:datetimeV2\n\n\n> # Phrase list definitions\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:phraseList\n- are you,you are\n\n> # List entities\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/allall-qna.lu",
    "content": "\n> # Intent definitions\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n\n## Help\n- help\n- I need help\n- please help\n- can you help\n\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- remove the {alarmTime} alarm\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat\n\n\n> # Entity definitions\n\n$userName:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:datetimeV2\n\n\n> # Phrase list definitions\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:phraseList interchangeable\n- are you,you are\n\n> # List entities\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n\n\n> # RegEx entities\n\n\n> # QnA pairs\n\n> Source: custom editorial\n## ? How do I change the default message\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n```\n\n> Source: custom editorial\n## ? How do I programmatically update my KB?\n\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> Source: custom editorial\n## ? Who is your ceo?\n- get me your ceo info\n\n```markdown\nVishwac\n```\n\n> Source: custom editorial\n## ? Where can I get coffee?\n- I need coffee\n\n\n**Filters:**\n- location = seattle\n\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n> Source: custom editorial\n## ? Where can I get coffee?\n- I need coffee\n\n\n**Filters:**\n- location = portland\n\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> Source: custom editorial\n## ? What is Ludown?\n- ludown cli\n- where can i get more information about ludown cli?\n\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/alterations_qna4.json",
    "content": "{\n  \"wordAlterations\": [\n    {\n      \"alterations\": [\n        \"botframework\",\n        \"bot framework\",\n        \"Azure bot service\"\n      ]\n    },\n    {\n      \"alterations\": [\n        \"qnamaker\",\n        \"qna maker\",\n        \"QnA Maker\",\n        \"question and answer pairs\"\n      ]\n    },\n    {\n      \"alterations\": [\n        \"webchat\",\n        \"web chat\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/buyChocolate.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Buy chocolate\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"ChocolateType\",\n      \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n      \"mode\": false,\n      \"activated\": true\n    },\n    {\n      \"name\": \"question\",\n      \"words\": \"are you,you are\",\n      \"mode\": true,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"can I get some m&m\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I want some twix\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I would like to buy some kit kat\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"buyChocolate\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/calendar_all_prebuilt.lu",
    "content": "\n> LUIS application information\n> !# @app.name = all_imports\n> !# @app.desc = \n> !# @app.culture = en-us\n> !# @app.versionId = 0.1\n> !# @app.luis_schema_version = 3.2.0\n\n> # Intent definitions\n\n> !# @intent.inherits = name : Calendar.FindCalendarWhen; domain_name : Calendar; model_name : FindCalendarWhen\n\n## Calendar.FindCalendarWhen\n- which {Calendar.StartDate=weekend} am i {Calendar.Subject=shopping} with sarah\n- what day is {Calendar.Subject=lego land} scheduled for\n- my next meeting with emily is when\n- what time do i have {Calendar.Subject=work} {Calendar.StartDate=tomorrow}\n- what time do i {Calendar.Subject=work} {Calendar.StartDate=today}\n- what time is {Calendar.Subject=beth over} {Calendar.StartDate=today}\n- what time is my {Calendar.Subject=cooking class} {Calendar.StartTime=tonight}\n- what time is my first meeting {Calendar.StartDate=tomorrow}\n- what time is my last meeting\n- what time is my meeting {Calendar.StartDate=today}\n- what time is my {Calendar.Subject=mobile devices exam} {Calendar.StartDate=tomorrow}\n- what time is my next appointment\n- what time is my {Calendar.Subject=team meeting}\n- what time is oshwin's {Calendar.Subject=interview}\n- what time is the {Calendar.Subject=ice cream social}\n- what time is the {Calendar.Subject=trade show} {Calendar.StartDate=this saturday}\n- when's my next {Calendar.Subject=trip}\n- when's my next appointment\n- when ' s my 1st appointment {Calendar.StartDate=tomorrow}\n- when ' s my 1st meeting {Calendar.StartDate=tomorrow}\n- when ' s my {Calendar.Subject=doctor ' s appointment}\n- when ' s my next appointment\n- when ' s my next {Calendar.Subject=doctors appointment}\n- when ' s my next meeting\n- when's my {Calendar.Subject=haircut}\n- when is the {Calendar.Subject=wedding} {Calendar.StartDate=tomorrow}\n- when am i {Calendar.Subject=watching england}\n- when do i {Calendar.Subject=break up} from school\n- when do i have {Calendar.Subject=exam}\n- when do i have free time {Calendar.StartDate=today}\n- when is the {Calendar.Subject=social}\n- when do i meet with charles\n- when do i {Calendar.Subject=work} {Calendar.StartDate=tomorrow}\n- when is the next {Calendar.Subject=dentist appointment}\n- when is {Calendar.Subject=sports day for the girls}\n- when is {Calendar.Subject=concert} on my calendar\n- when is {Calendar.Subject=lunch} with frank\n- when is my 1st meeting {Calendar.StartDate=tomorrow}\n- when is my appointment with willie\n- when is my {Calendar.Subject=daily stand up} with ethan\n- when is my fifth {Calendar.Subject=kick-off}\n- when is my meeting with kenneth\n- when is my meeting with martha and deborah\n- when is my next appointment\n- when is my next appointment with douglas\n- when is my next event\n- when is my next {Calendar.Subject=hair cut} appointment\n- when is my next meeting\n- when is my next meeting with edward\n- when is my next meeting with miss kathleen\n- when is my next meeting with ms lawrence\n- when is my next trip to new york\n- when is my {Calendar.Subject=physio}\n- when is my {Calendar.Subject=picnic lunch} {Calendar.StartDate=today}\n- when is {Calendar.Subject=ncaa basketball} {Calendar.StartDate=today}\n\n\n> !# @intent.inherits = name : Calendar.AcceptEventEntry; domain_name : Calendar; model_name : AcceptEventEntry\n\n## Calendar.AcceptEventEntry\n- accept all meetings for {Calendar.Subject=christmas party} {Calendar.StartDate=next week}.\n- accept an appointment\n- accept {Calendar.Subject=dinner}\n- accept my meeting at {Calendar.StartTime=7pm} {Calendar.StartDate=today}\n- accept my meeting at {Calendar.StartDate=tomorrow} {Calendar.StartTime=10am}\n- accept the appointment from {Calendar.StartTime=3pm} to {Calendar.EndTime=5pm}.\n- accept the appointment on {Calendar.StartDate=january 18th} in palace meeting room.\n- accept the appointment sent by lucas\n- accept the event\n- accept the event for {Calendar.StartTime=tonight}.\n- accept the event on {Calendar.StartDate=feb. 18} in beijing.\n- accept the event sent by yolanda wong.\n- accept the meeting held on {Calendar.StartDate=tomorrow} at room 301\n- accept the meeting organized by jack lauren.\n- accept the meeting with mary and tom held on {Calendar.StartDate=wednesday}\n- accept the meeting with tom chen.\n- accept this appointment with jane and mary on {Calendar.StartDate=next tuesday}.\n- accept this event.\n- accept this {Calendar.Subject=lunch meeting}.\n- accept {Calendar.StartDate=today}'s event at {Calendar.StartTime=3pm}.\n- accept {Calendar.StartDate=today}'s meeting\n- attend the fy19 celebration party sent by daisy lu.\n- attend the {Calendar.Subject=lunch meeting} at {Calendar.StartTime=10:30 am}.\n- attend the meeting held at {Calendar.StartTime=3pm} {Calendar.StartDate=next tuesday} at the conference center.\n- i'll attend this upcoming event in redmond.\n- i'll attend the meeting {Calendar.StartTime=this afternoon}.\n- i'll attend the meeting at {Calendar.StartTime=2pm} {Calendar.StartDate=tomorrow} in room 304\n- i want to attend the {Calendar.Subject=meeting for review}\n- ^i (want to|would like to|'d like to) (join|attend) the {Calendar.Subject}^\n\n\n> !# @intent.inherits = name : Calendar.FindCalendarWhere; domain_name : Calendar; model_name : FindCalendarWhere\n\n## Calendar.FindCalendarWhere\n- meeting at {Calendar.StartTime=3 pm} {Calendar.StartDate=today} locations\n- show me the place of the {Calendar.Subject=work smart training}\n- show me where my next appointment is\n- where's my next meeting\n- where is {Calendar.StartDate=tomorrow} 's event\n- where is {Calendar.StartDate=tomorrow} meeting at {Calendar.StartTime=11 am}\n- where is {Calendar.StartDate=tomorrow} ' s {Calendar.StartTime=11 am} meeting\n- where is the {Calendar.Subject=performance review meeting}\n- where is the meeting at {Calendar.StartTime=11 am} {Calendar.StartDate=tomorrow}\n- where is the meeting\n- where is that meeting\n- where is my third {Calendar.Subject=shiproom} with tiffany\n- where is my next meeting with ms natalie\n- where is my next meeting\n- where is my next event\n- where is my next {Calendar.Subject=dentist appointment}\n- where is my next appointment with olivia\n- where is my next appointment with miss doris\n- where is my next appointment\n- where is my meeting with kayla\n- where is my meeting\n- where is my fourth event with christopher on {Calendar.StartDate=thursday}\n- where is my fourth event with brandon {Calendar.StartDate=friday}\n- where is my first appointment {Calendar.StartDate=tomorrow}\n- where is my {Calendar.StartTime=eleven o'clock} meeting\n- where is my {Calendar.Subject=dentist appointment}\n- where is my current meeting\n- where is my {Calendar.StartTime=11 am} meeting {Calendar.StartDate=tomorrow}\n- where is my {Calendar.StartTime=11 am} appointment {Calendar.StartDate=tomorrow} happening\n- where is meeting with shirley\n- where is meeting {Calendar.StartDate=tomorrow} at {Calendar.StartTime=11 am}\n- where is {Calendar.Subject=margot lunch}\n- where is it\n- where is {Calendar.Subject=dinner} with abigail liu\n- where does my meeting take place\n- where do i need to go {Calendar.StartDate=today}\n- where do i need to be next\n- where do i have to be {Calendar.StartDate=today}\n- where do i have to be next\n- where do i go {Calendar.StartDate=tomorrow}\n- where do i go for my meeting {Calendar.StartDate=tomorrow} at {Calendar.StartTime=11 am}\n- where are my meetings {Calendar.StartDate=today}\n- where am i {Calendar.StartDate=tomorrow}\n- where am i on {Calendar.StartDate=may the twenty first}\n- where am i meeting austin and john\n- where am i going {Calendar.StartTime=tonight}\n- what is the location of next meeting\n- where am i going {Calendar.StartDate=this weekend}\n- location of {Calendar.StartTime=11 am} meeting\n- what the place of the {Calendar.Subject=weekly meeting}\n- location of the next appointment\n- where ' s my next meeting\n- where ' s my next appointment\n- where ' s my meeting\n\n\n> !# @intent.inherits = name : Calendar.ChangeCalendarEntry; domain_name : Calendar; model_name : ChangeCalendarEntry\n\n## Calendar.ChangeCalendarEntry\n- update {Calendar.Subject=party}\n- update my tomorrow 6pm meeting to {Calendar.StartTime=7pm}\n- update my next appointment\n- update my {Calendar.Subject=camping appointment}\n- update my calendar from 6pm to {Calendar.StartTime=7pm}\n- update my calendar from 2 pm to {Calendar.StartTime=4 pm} {Calendar.StartDate=today}\n- update my calendar from {Calendar.StartTime=11} to {Calendar.StartTime=12：30} {Calendar.StartDate=today}\n- update my {Calendar.Subject=calendar}\n- update my appointment\n- update meeting from 8am-12pm to {Calendar.StartTime=7am}-{Calendar.EndTime=11am} {Calendar.StartDate=today}\n- update {Calendar.Subject=lunch appointment}\n- update calendar\n- update appointment\n- this meeting should be changed to {Calendar.StartDate=tomorrow}\n- reschedule the 2 pm {Calendar.Subject=class} to half past 2\n- reschedule my {Calendar.Subject=interview} on {Calendar.StartDate=monday} to {Calendar.StartTime=1 pm}\n- reschedule my 3:30 {Calendar.Subject=dentist appointment} today for {Calendar.StartTime=4pm} {Calendar.StartDate=tomorrow}\n- reschedule my 3:30 {Calendar.Subject=dentist appointment} to 4\n- reschedule meeting\n- reschedule appointment with mark for next week\n- reschedule appointment with jennifer to {Calendar.StartDate=next week}\n- push my {Calendar.Subject=trip} july 16th out 5 days\n- postpone my four p. m. meeting {Calendar.StartDate=today} until {Calendar.StartTime=five p. m.}\n- postpone my 4 pm meeting today until {Calendar.StartTime=5 pm}\n- bring forward my 4 o'clock appointment 2 hours\n- please move this to {Calendar.StartTime=3 pm}\n- can you change it to {Calendar.StartTime=5 pm}\n- can you move this appointment to {Calendar.StartTime=5pm}\n- move {Calendar.Subject=shoe appointment} to {Calendar.StartDate=tuesday} at {Calendar.StartTime=one}\n- move {Calendar.Subject=party planning meeting} from saturday to {Calendar.StartDate=friday} at {Calendar.StartTime=1pm}\n- move my twelve p. m. thirty minutes up\n- move my twelve p . m . meeting forward two hours\n- move my {Calendar.Subject=text meeting}\n- move my next meeting up by 30 minutes\n- move my next meeting up by 10 minutes\n- move my next meeting out thirty minutes\n- move my next meeting out by 30 minutes\n- move my next meeting\n- move my meeting up by half an hour\n- move my meeting to {Calendar.StartTime=6pm} from 7pm\n- move my meeting back by an hour\n- move my 9pm meeting to {Calendar.StartTime=8pm}\n- move my {Calendar.StartTime=9 am} {Calendar.Subject=doctor ' s appointment} to {Calendar.EndTime=10 am}\n- move my 4 pm to {Calendar.StartTime=5 pm} {Calendar.StartDate=today}\n- move my 12 pm meeting to {Calendar.StartTime=2}\n- move my 10pm meeting to {Calendar.StartTime=9pm}\n- move my 10 past 10 {Calendar.Subject=doctor ' s appointment} to {Calendar.StartTime=10}\n- move my 1 pm appointment up 30 minutes\n- move meeting from 9pm-10pm to {Calendar.StartTime=8pm}-{Calendar.EndTime=9pm} {Calendar.StartDate=today}\n- move appt with rebecca to {Calendar.StartDate=next week}\n- move 3pm meeting to {Calendar.StartTime=4pm}\n- modify the second meeting\n- modify the meeting\n- make the meeting to start 40 minutes earlier\n- make the meeting to start 1 hour later\n- make the meeting ending at 10 go until {Calendar.EndTime=11}\n- make the appointment ending at 2 go until {Calendar.EndTime=4 pm}\n- make next meeting to start 1 hour later\n- let next meeting starting at 10am\n- change 10 am meeting to start 20 minutes later\n- change 12am meeting to start 10 minutes earlier\n- change 4pm {Calendar.Subject=lunch appointment}\n- change 5pm appointment 1 hour earlier\n- change an appointment\n- change appointment\n- change {Calendar.Subject=big event} to {Calendar.StartDate=tomorrow}\n- change calendar\n- change {Calendar.Subject=dentist appointment}\n- change {Calendar.Subject=dentist appt} to an hour later\n- change {Calendar.Subject=developmental agenda for lunch} tomorrow\n- change it to {Calendar.StartTime=5pm}\n- change location\n- change {Calendar.Subject=lunch appt} to {Calendar.StartTime=2}\n- change {Calendar.Subject=lunch date} from 11 - 12 to {Calendar.StartTime=12} - {Calendar.EndTime=1 30}\n- change {Calendar.Subject=marathon training} from 8:00am to {Calendar.StartTime=1:00pm}\n- change {Calendar.Subject=marketing meeting} from every tuesday to {Calendar.StartDate=every wednesdays}\n- change meeting from 2-3pm to {Calendar.StartTime=4}-5pm {Calendar.StartDate=today}\n- change meeting from 2pm-3pm to {Calendar.StartTime=4pm}-{Calendar.EndTime=5pm} {Calendar.StartDate=today}\n- change my {Calendar.StartTime=11pm} {Calendar.Subject=appointment}'s location to green park\n- change my 3pm event to {Calendar.StartTime=4pm}\n- change my 6pm event to {Calendar.StartTime=7pm}\n- change my 7 30 pm appointment to {Calendar.StartTime=8 pm}\n- change my 7pm event to {Calendar.StartTime=6pm}\n- change my 8 till 9 appointment to {Calendar.StartTime=11} till {Calendar.EndTime=12}\n- change my 9 30 till 10 30 appointment to {Calendar.StartTime=9 30} till {Calendar.EndTime=5}\n- change my appointment\n- change my {Calendar.Subject=appointmnet} with sarah to {Calendar.StartTime=5 pm}\n- change my {Calendar.Subject=dentist appointment}\n- change my {Calendar.Subject=dentist appointment} from 3:30 to {Calendar.StartTime=4}\n- change my meeting at night to {Calendar.StartDate=tomorrow}\n- change my next meeting\n- change my schedule\n- change my ten am appointment\n- change my {Calendar.Subject=vacation} from ending on friday to {Calendar.EndDate=monday}\n- change {Calendar.Subject=recital} to start half an hour earlier\n- change {Calendar.Subject=shave} {Calendar.StartDate=tomorrow} {Calendar.StartTime=8 30}\n- change the {Calendar.Subject=appointment} ending at 4 to end at {Calendar.EndTime=5} instead\n- change the end date of {Calendar.Subject=my trip} from the 3rd to the {Calendar.EndDate=4th}\n- change the end time of my 3 o'clock meeting to {Calendar.EndTime=3 30 pm}\n- change the location of my {Calendar.Subject=singing appointment}\n- change the meeting which will start at 2 pm to {Calendar.StartTime=3 pm}\n- change the time\n- change the time to {Calendar.StartTime=eleven thirty am}\n- change the title of my 11am appointment to {Calendar.Subject=soccer practice}\n- change the title of my appointment\n- change this appointment's location\n- change thursday {Calendar.Subject=team meeting}\n- change time\n- change today 's meeting from 6pm to {Calendar.StartDate=tomorrow} {Calendar.StartTime=9am}\n- change today 's meeting from 6pm to {Calendar.StartDate=tomorrow} {Calendar.StartTime=9pm}\n- change tomorrow ' s appointment from 10am to {Calendar.StartDate=wednesday} at {Calendar.StartTime=9 am}\n- let 5 pm meeting starting at {Calendar.StartTime=3}\n- extend meeting from 9 am to {Calendar.EndTime=12 am}\n- edit calendar\n- delay the meeting event by 1 hours\n- delay the next meeting by 30 minutes\n\n\n> !# @intent.inherits = name : Calendar.Cancel; domain_name : Calendar; model_name : Cancel\n\n## Calendar.Cancel\n- abort edition\n- will you cancel it please\n- stop finding it\n- stop connecting it\n- stop checking it\n- stop changing it\n- quit the changing\n- please cancel that\n- please cancel it\n- please cancel all of them\n- please cancel\n- can i cancel this\n- can you cancel it\n- can you cancel it please\n- can you cancel that\n- ohh never mind\n- oh cancel\n- nothing just cancel it\n- nothing just cancel\n- no, cancel please\n- cancel\n- no i just cancel it\n- no cancel it\n- no cancel\n- never mind, forget about the creating\n- never mind, cancel the changing\n- never mind could you cancel that\n- never mind\n- cancel can you don't do that please\n- cancel cancel\n- cancel cancel cancel\n- need to cancel it\n- cancel don't worry\n- cancel everything\n- cancel it\n- cancel it for me\n- cancel it i don ' t want that\n- cancel it please\n- cancel it, i don't want to create the meeting\n- cancel please\n- cancel that\n- cancel the creating process\n- cancel this\n- let me cancel that\n- just cancel it\n- just cancel\n- i'd like to cancel this\n- i would like to cancel it\n- i would like to cancel all of them\n- i want to cancel that\n- i want to cancel it please\n- i need to cancel that\n- i have decided to cancel it\n- could you cancel it please\n- i don't want want to change this appointment anymore\n- i don't want to join it\n- i don't want to find it anymore\n- i don't want to do it now\n- i don't want to change it anymore\n- help me to cancel this\n- go ahead and cancel it\n- forget it\n- forget cancel\n- don't create it\n- don't change it\n\n\n> !# @intent.inherits = name : Calendar.FindCalendarWho; domain_name : Calendar; model_name : FindCalendarWho\n\n## Calendar.FindCalendarWho\n- {Calendar.StartTime=2 pm} meeting {Calendar.StartDate=tomorrow} - who else is going\n- {Calendar.StartTime=2 pm} meeting with who\n- did hellen come to {Calendar.StartTime=3 pm}'s meeting\n- did mark sign up to the {Calendar.StartDate=tomorrow}'s meeting\n- did martin come to {Calendar.StartDate=today}'s meeting\n- will virginia be attending my next meeting\n- will timothy be coming to the meeting\n- will thomas be in {Calendar.Subject=insurance meeting} {Calendar.StartDate=monday} at {Calendar.StartTime=noon}\n- will teresa be at my next meeting\n- will roy be at our {Calendar.Subject=weekly team meeting}\n- will paul be going to the meeting on {Calendar.StartDate=friday}\n- will nicholas be attending the {Calendar.Subject=management meeting}\n- will nancy be at the {Calendar.StartTime=morning} {Calendar.Subject=briefing meeting}\n- will johnny be at {Calendar.Subject=office meeting} {Calendar.StartDate=today}\n- will john be at {Calendar.Subject=marketing meeting}\n- will jimmy parker be attending the meeting\n- will jane be at the {Calendar.StartTime=3 pm} meeting\n- will george be in the {Calendar.Subject=hr meeting} at {Calendar.StartTime=1} o' clock\n- will ethan, yutian and k.j. be at the {Calendar.Subject=picnic}\n- will ed be in the {Calendar.Subject=finance meeting}\n- attendees who will join the {Calendar.StartTime=5 pm} meeting\n- will bobby shen be at next meeting\n- will anthony be at the meeting\n- will amy be at {Calendar.StartDate=today} ' s meeting\n- will amber join {Calendar.Subject=office meeting} {Calendar.StartDate=today}\n- who's going to be at those two events\n- who will be in the {Calendar.Subject=banking meeting}\n- who will be attending {Calendar.Subject=picnic}\n- who will be at the {Calendar.Subject=kids game}\n- who will attend the meeting at {Calendar.StartTime=4}\n- who shall be joining the meeting {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 pm}\n- who responded to meeting request\n- show me the confirmed attendees\n- who is the {Calendar.StartTime=2 pm} meeting with\n- who is participating {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 pm} meeting\n- who is on my list for the {Calendar.StartTime=2 pm} meeting {Calendar.StartDate=tomorrow}\n- show me who will attend {Calendar.Subject=family gathering}\n- show me who will be at {Calendar.Subject=planning meeting} {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 pm}\n- show meeting participants\n- who is my {Calendar.StartTime=morning} meeting with\n- who is my first meeting with {Calendar.StartDate=tomorrow}\n- who is in the meeting\n- who is in that meeting\n- who is in my next meeting\n- who is going to {Calendar.StartDate=tomorrow} ' s meeting\n- who is going to the meeting at {Calendar.StartTime=2 pm} {Calendar.StartDate=tomorrow}\n- who is going to attend the meeting {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 pm}\n- who is coming the the meeting {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 pm}\n- who is attending the meetings\n- who is attending the meeting on {Calendar.StartDate=wednesday}\n- who is attending the meeting\n- who is attending {Calendar.StartTime=2 pm} meeting {Calendar.StartDate=tomorrow}\n- who else will be in {Calendar.Subject=banking meeting}\n- who else is going to the {Calendar.StartTime=2pm} meeting {Calendar.StartDate=tomorrow}\n- who do i have next\n- who am i meeting for {Calendar.Subject=dinner}\n- who am i meeting at {Calendar.StartTime=10 am} {Calendar.StartDate=tomorrow}\n- who all will be present at the next 5 meetings\n- who ' s in my 1st meeting {Calendar.StartDate=today}\n- find attendees who will attend {Calendar.StartTime=8 o ' clock} meeting\n- i want to take a look at the attendee list\n- is bruce young attending the meeting\n- is charles wong going to be at the meeting\n- is joe going to be at the next meeting\n- is victoria participating next meeting\n- let me see who will attend {Calendar.Subject=party planning meeting}\n- list the attendees of the next meeting\n- list the participants for the {Calendar.StartTime=2 pm} meeting {Calendar.StartTime=tomorrow}\n\n\n> !# @intent.inherits = name : Calendar.ConnectToMeeting; domain_name : Calendar; model_name : ConnectToMeeting\n\n## Calendar.ConnectToMeeting\n- dial into conference call\n- dial {Calendar.Subject=marketing meeting}\n- add me to conference call\n- add me to the conference call\n- get me on the conference call\n- start the meeting\n- start my meeting\n- start my conference\n- start meeting\n- connect to {Calendar.Subject=weekly marketing meeting}\n- connect to conference call {Calendar.StartTime=now}\n- i need to join conference call\n- i need to join the conference call\n- connect to conference call\n- connect me with my {Calendar.StartTime=2 o clock} meeting\n- connect me with conference call\n- connect me to the {Calendar.Subject=marketing meeting}\n- connect me to the conference call\n- connect me to the {Calendar.Subject=budget meeting} conference call\n- connect me to {Calendar.Subject=marketing meeting}\n- connect me to conference call with debra\n- connect me to conference call\n- connect me to {Calendar.StartTime=10 00} conf call with bryan\n- conference join\n- join {Calendar.Subject=budget} conference call\n- join conference\n- join conference call\n- join current {Calendar.Subject=budget} conf call\n- join {Calendar.StartTime=current} conference\n- join {Calendar.StartTime=current} conference call\n- join lync meeting\n- join meeting\n- join meeting {Calendar.StartTime=now}\n- join my meeting\n- join my next meeting\n- join next {Calendar.Subject=link meeting}\n- join next meeting\n- join next meeting on link\n- join the {Calendar.Subject=budget meeting} conference call\n- join the conference\n- join the meeting\n- join the next {Calendar.Subject=lync meeting}\n- link join my next meeting\n- link join next meeting\n- lync join next meeting\n- call conference\n- call conference call\n- call genpact conference call\n- call harris conference\n- call into conference call\n- call into {Calendar.Subject=marketing meeting}\n- call into meeting\n- call the {Calendar.Subject=morning breifing} conference number\n- call the {Calendar.Subject=weekly marketing meeting}\n- nokia conference room join\n\n\n> !# @intent.inherits = name : Calendar.CheckAvailability; domain_name : Calendar; model_name : CheckAvailability\n\n## Calendar.CheckAvailability\n- will tyler be free on {Calendar.StartDate=friday}\n- when will jordan be free\n- when is samuel available {Calendar.StartDate=tomorrow}\n- when is dylan available\n- when is bryan free\n- when is aaron free {Calendar.StartDate=tomorrow}\n- when does marry have time to join the appointment\n- when does ellen have time to attend the meeting for business review\n- when does ellen have time to attend the meeting\n- when do i have time to create a {Calendar.Subject=weekly meeting}\n- when am i free {Calendar.StartDate=today}\n- when am i free\n- what is anna 's availability {Calendar.StartDate=next tuesday}\n- am i available\n- am i available at {Calendar.StartTime=10 am} on {Calendar.StartDate=monday}\n- am i available on {Calendar.StartDate=monday} at {Calendar.StartTime=9 pm}\n- am i available {Calendar.StartDate=tomorrow} at {Calendar.StartTime=5 30 pm}\n- am i busy on the {Calendar.StartDate=6th of february}\n- am i busy on {Calendar.StartDate=this weekend}\n- am i busy {Calendar.StartDate=this weekend}\n- am i free\n- am i free at {Calendar.StartTime=5 pm} {Calendar.StartDate=today}\n- am i free at {Calendar.StartTime=7 p . m .}\n- am i free for {Calendar.Subject=drinks} {Calendar.StartDate=monday} at {Calendar.StartTime=5}\n- am i free for {Calendar.Subject=drinks} {Calendar.StartDate=monday} at {Calendar.StartTime=5 pm}\n- am i free for {Calendar.Subject=hiking} on {Calendar.StartDate=saturday} at {Calendar.StartTime=8 am}\n- am i free from {Calendar.StartTime=3 pm} - {Calendar.EndTime=10 pm}\n- am i free on {Calendar.StartDate=monday} at {Calendar.StartTime=9 pm}\n- am i free on {Calendar.StartDate=saturday}\n- am i free on the {Calendar.StartDate=12th of july}\n- am i free to {Calendar.Subject=drive} with kim on {Calendar.StartDate=thurs} at {Calendar.StartTime=3 pm}\n- am i free {Calendar.StartDate=today}\n- am i free {Calendar.StartDate=tomorrow} {Calendar.StartTime=3 pm}\n- am i free {Calendar.StartTime=tonight}\n- am i free {Calendar.StartDate=tuesday} at {Calendar.StartTime=7 am}\n- search jesse 's calendar for availability\n- can you check my dad 's calendar for free time {Calendar.StartDate=this week}\n- can you tell me if my husband is free on {Calendar.StartDate=sunday}\n- is virginia free on {Calendar.StartDate=monday}\n- is theresa free {Calendar.StartDate=october 9th}\n- is {Calendar.StartDate=saturday} free\n- is russell free on {Calendar.StartDate=friday} at {Calendar.StartTime=4pm}\n- is rebecca busy {Calendar.StartDate=thursday} at {Calendar.StartTime=4}\n- is raymond free on {Calendar.StartDate=monday} {Calendar.StartTime=evening}\n- is nicholas available {Calendar.StartDate=friday}\n- is madison busy\n- is grace available for the {Calendar.Subject=daily scrum meeting} with engineering team from {Calendar.StartTime=10} to {Calendar.EndTime=11}\n- is gerald busy {Calendar.StartDate=this weekend}\n- is debra available on {Calendar.StartDate=saturday}\n- is carolyn available {Calendar.StartDate=tuesday} {Calendar.StartTime=afternoon}\n- i would like to know if my mother is available {Calendar.StartDate=today}\n- do i have any free time {Calendar.StartDate=this weekend}\n- display olivia 's availability\n- ^does {personName} have time at {Calendar.StartTime}\n- ^is {personName} (available|free) from {Calendar.StartTime} to {Calendar.EndTime} [on {Calendar.StartDate}]\n- ^do i have time (at|on|for) {Calendar.StartTime} [on] {Calendar.StartDate}\n\n\n> !# @intent.inherits = name : Calendar.Confirm; domain_name : Calendar; model_name : Confirm\n\n## Calendar.Confirm\n- yup\n- yes yes\n- yes that ' s fine\n- yes thanks\n- yes thank you\n- yes sure\n- yes please\n- yes perfect\n- yes of course\n- yes it is\n- yes it does\n- yes indeed\n- yes good\n- yes add\n- yes\n- yep\n- yeah thank you\n- yeah\n- that's right thank you\n- that's great\n- that's good\n- that's correct\n- that ' s right\n- sure go ahead\n- sure\n- alright\n- sounds great\n- sounds good okay\n- sounds good\n- right\n- please\n- perfect thank you\n- perfect\n- okay thanks\n- okay thank you\n- okay\n- ok\n- i'm sure\n- confirm\n- correct\n- great\n- good\n- fine\n- excellent\n- do it\n\n\n> !# @intent.inherits = name : Calendar.FindMeetingRoom; domain_name : Calendar; model_name : FindMeetingRoom\n\n## Calendar.FindMeetingRoom\n- reserve the conference room for {Calendar.StartTime=3pm} {Calendar.StartDate=tomorrow}\n- find a free meeting room for {Calendar.StartDate=next tuesday}\n- schedule conference room with mary cooper for {Calendar.StartDate=thursday} at {Calendar.StartTime=one}\n- help me to find a meeting room\n- help me to book the room 102\n- help me to book a meeting room from {Calendar.StartTime=10 am} to {Calendar.EndTime=3 pm}\n- help me to book a conference room\n- find me an empty conference room\n- where shall we meet\n- find an available meeting room from {Calendar.StartTime=3} to {Calendar.EndTime=5} {Calendar.StartDate=tomorrow}\n- find a new meeting location\n- i need you to find a new meeting location\n- i want to meet with bruce lee so book the conference room for {Calendar.StartDate=thursday} at {Calendar.StartTime=one}\n- i want to meet with donna please book for {Calendar.StartDate=thursday} the conference room at {Calendar.StartTime=one}\n- i'm looking for a conference room\n- reserve the conference room for {Calendar.StartTime=1 pm} {Calendar.StartDate=thursday} because i need to have a meeting with amber\n- reserve room 313 right away\n- reserve room 258\n- reserve room 101 now\n- bing find me a conference room in the bravern {Calendar.StartTime=this afternoon}\n- book a conference room\n- book a meeting\n- is this room busy at {Calendar.StartTime=5 pm}\n- is this room busy {Calendar.StartDate=tomorrow}\n- check meeting room for {Calendar.StartDate=tomorrow}\n- let's find a new meeting location\n- locate another meeting location\n- what meet rooms do i have\n- book blue meeting room\n- book the conference room for {Calendar.StartDate=thursday} at {Calendar.StartTime=one} i want to meet with benjamin\n- can you reserve room 649 right away\n- ^is (this|the|that) (meeting|conference) room (available|booked) [(at|on|for)] [{Calendar.StartDate}] [(at|on|for)] [{Calendar.StartTime}]^\n\n\n> !# @intent.inherits = name : Calendar.FindCalendarDetail; domain_name : Calendar; model_name : FindCalendarDetail\n\n## Calendar.FindCalendarDetail\n- tell me about my {Calendar.StartDate=sunday} schedule\n- can you tell me something about {Calendar.Subject=shakespeare}\n- detail about {Calendar.StartDate=tomorrow}'s meeting\n- detailed information about the next meeting\n- details about the meeting with grace\n- details about the meeting with karen and tom\n- please open my {Calendar.Subject=date} with angela and tell me about it\n- what is the meeting with daniel robert regarding\n- what is that meeting with ashley and jane berlin about\n- what is my meeting with ming xu about\n- what is {Calendar.Subject=destiny ' s event} for {Calendar.StartDate=next week}\n- can you tell me about {Calendar.Subject=master chief}\n- what did the sister say about meeting on {Calendar.StartDate=sunday}\n- what are the plans for the {Calendar.Subject=dinner date} with stacey\n- what are the particulars for the {Calendar.Subject=picnic} {Calendar.StartDate=next week}\n- i need you to provide me the details of the meeting i have scheduled with my colleague amanda\n- i need to know about my next appointment\n- i need to know about my meeting\n- i need to know about my {Calendar.Subject=date} with jimmy\n- tell me all about {Calendar.Subject=dinner date} with stephanie\n- tell me about my schedule with {Calendar.StartTime=afternoon}\n- tell me about my {Calendar.Subject=planned trip}\n- tell me about my next meeting\n- tell me about my meeting {Calendar.StartDate=today}\n- find the meetings mary\n- give me details of the next appointment\n\n\n> !# @intent.inherits = name : Calendar.DeleteCalendarEntry; domain_name : Calendar; model_name : DeleteCalendarEntry\n\n## Calendar.DeleteCalendarEntry\n- delete meeting\n- cancel an appointment\n- cancel all events\n- cancel {Calendar.StartTime=1 pm} {Calendar.Subject=staff meeting}\n- delete my schedule for {Calendar.StartDate=today}\n- delete that appointment\n- delete the 1st one from my calendar\n- delete the appointment with jeffrey\n- delete the appointment with mom\n- delete the scheduled meeting with zachary\n- delete this appointment\n- discard the appointment with george\n- discard the meeting\n- cancel appointment\n- delete event\n- delete calendar event\n- delete {Calendar.Subject=birthday calendar}\n- delete appointment\n- delete an appointment\n- drop my appointment for {Calendar.StartDate=monday}\n- decline my meeting on {Calendar.StartDate=monday}\n- i need to delete this appointment from my calendar\n- i want to delete an appointment\n- clear my schedule {Calendar.StartDate=today}\n- clear my schedule for {Calendar.StartDate=tomorrow}\n- clear my schedule\n- clear my calendar for {Calendar.StartDate=january 29th}\n- delete my schedule\n- clear my calendar\n- remove {Calendar.Subject=final tutoring} from my calendar\n- remove {Calendar.Subject=dentist appointment}\n- cancel appointment {Calendar.StartDate=today}\n- cancel appointments\n- cancel calendar entry\n- clear all the appointments from my calendar for {Calendar.StartDate=today}\n- clear all of my appointments {Calendar.StartDate=today}\n- cancel {Calendar.Subject=dinner}\n- clear all of my appointments\n- clear all my appointments\n- cancel {Calendar.Subject=doctor ' s appointment} {Calendar.StartDate=monday}\n- cancel {Calendar.StartDate=tomorrow} ' s plan\n- cancel {Calendar.StartDate=today} ' s appointment\n- cancel this meeting\n- cancel the untitled event on {Calendar.StartDate=may twenty eighth}\n- cancel the {Calendar.Subject=pickup food from ted}\n- cancel the meeting with julie\n- can you cancel the 1st one\n- cancel event\n- cancel event {Calendar.StartDate=tomorrow}\n- cancel {Calendar.Subject=lunch} {Calendar.StartDate=next wednesday}\n- cancel meeting\n- cancel meeting with abigail {Calendar.StartTime=3 pm} {Calendar.StartDate=today}\n- cancel meeting with bob marlon {Calendar.StartTime=3pm} {Calendar.StartDate=today}\n- cancel my {Calendar.Subject=adventureworks trip} to seattle\n- cancel my appointment\n- cancel my appointment at {Calendar.StartTime=9 pm}\n- cancel my appointment for {Calendar.StartDate=october 4}\n- cancel my {Calendar.Subject=driving lesson} {Calendar.StartDate=tomorrow}\n- cancel my event\n- cancel my meeting\n- cancel my meeting at shanghai on {Calendar.StartDate=monday} at {Calendar.StartTime=10 am}\n- cancel my next appointment\n- cancel my {Calendar.Subject=singing appointment} on {Calendar.StartDate=monday}\n- cancel my {Calendar.Subject=three o'clock} appointment\n- cancel that appointment\n- cancel the meeting\n- cancel that meeting\n- cancel the {Calendar.Subject=group meeting}\n- cancel the event\n- cancel the appointment\n- cancel the calendar\n- ^(clear|delete|remove) (my|the) calendar from {Calendar.StartTime} to {Calendar.EndTime}^\n- ^(remove|cancel|delete) (the|my) {Calendar.Subject} [at {Calendar.StartTime}] [{Calendar.StartDate}]^\n\n\n> !# @intent.inherits = name : Calendar.CreateCalendarEntry; domain_name : Calendar; model_name : CreateCalendarEntry\n\n## Calendar.CreateCalendarEntry\n- 2 hours meeting with ladawn padilla at {Calendar.StartTime=5} on {Calendar.StartDate=tuesday}\n- add a meeting with herman to my calendar\n- add an appointment on {Calendar.StartDate=may 8th} at shanghai\n- add {Calendar.Subject=applied motion} to my calendar {Calendar.StartTime=9 am}\n- add appt with helen ding for {Calendar.Subject=dinner} on {Calendar.StartDate=march 5th} at {Calendar.StartTime=5 pm} at dennys\n- add appt with mike li for {Calendar.Subject=dinner} on {Calendar.StartDate=march 5th} at {Calendar.StartTime=5 pm} at dennys\n- add {Calendar.Subject=balboa practice} to my calendar at {Calendar.StartTime=3 30} {Calendar.StartDate=today}\n- add {Calendar.Subject=ballet} to my calendar {Calendar.StartDate=wednesday} at {Calendar.StartTime=five thirty} to {Calendar.EndTime=six thirty pm}\n- add {Calendar.Subject=baseball game} on {Calendar.StartDate=friday} to calendar\n- add {Calendar.Subject=chicago bulls versus washington wizards} to my calendar {Calendar.StartDate=tomorrow} at {Calendar.StartTime=seven pm}\n- add {Calendar.Subject=choir practice} on {Calendar.StartDate=saturday} at {Calendar.StartTime=7 pm} to my personal calendar\n- add {Calendar.Subject=choreography} to my family calendar\n- add {Calendar.Subject=chorus concert} to calendar for {Calendar.StartDate=may 1st} at {Calendar.StartTime=3 pm}\n- add {Calendar.Subject=church} to personal calendar on {Calendar.StartDate=sundays} at {Calendar.StartTime=9}\n- add {Calendar.Subject=coffee} on {Calendar.StartDate=august 12th} at {Calendar.StartTime=2 pm} with herman for one hour\n- add {Calendar.Subject=dance} on {Calendar.StartDate=tuesday} at {Calendar.StartTime=four o clock}\n- add {Calendar.Subject=date night} on the {Calendar.StartDate=5th} at {Calendar.StartTime=7pm} {Calendar.StartDate=every month}\n- add {Calendar.Subject=dentist appointment} on {Calendar.StartDate=tuesday june} at the 1st clinic\n- add {Calendar.Subject=dentist appointment} to my calendar at {Calendar.StartTime=3:30} for the {Calendar.StartDate=8th of may}\n- add {Calendar.Subject=dentist appointment} to my calendar {Calendar.StartDate=tomorrow} from {Calendar.StartTime=3} to {Calendar.EndTime=4:30}\n- add {Calendar.Subject=dentist appointments} to my calendar at {Calendar.StartTime=3 thirty p m}\n- add {Calendar.Subject=dinner} to personal calendar\n- add {Calendar.Subject=dinner} with mom to personal\n- add {Calendar.Subject=doctors appointment} on {Calendar.StartDate=march 13} at {Calendar.StartTime=2 pm} at the original health clinic\n- add {Calendar.Subject=doctors appointment} on {Calendar.StartDate=march 13} at {Calendar.StartTime=2 pm} at the tiptop virginia beach clinic\n- add {Calendar.Subject=go shopping with} john meng on the calendar\n- add {Calendar.Subject=haircut} to my google calendar {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 30}\n- add hope middle school {Calendar.Subject=meet and greet} on my calendar\n- add {Calendar.Subject=kane s dr appt} to calendar for {Calendar.StartTime=3} {Calendar.StartDate=friday}\n- we make an appointment for me\n- add {Calendar.Subject=maple beach} to my calendar at {Calendar.StartTime=10} on {Calendar.StartDate=sunday}\n- create calendar : {Calendar.StartDate=tomorrow} {Calendar.StartTime=morning} from {Calendar.StartTime=9} to {Calendar.EndTime=11} at 1103 room for {Calendar.Subject=internal meeting}\n- create appointment from {Calendar.StartDate=tuesday} to {Calendar.EndDate=wednesday}\n- add {Calendar.Subject=megan training} to calendar on {Calendar.StartDate=july 4th} at {Calendar.StartTime=11 am}\n- add {Calendar.Subject=office party} on {Calendar.StartDate=march 8th} from {Calendar.StartTime=6 p} to {Calendar.EndTime=9 p}\n- add {Calendar.Subject=order cabinets} to my calendar {Calendar.StartDate=today} at {Calendar.StartTime=2 o clock}\n- add {Calendar.Subject=pay credit card} to calendar {Calendar.StartDate=may twentieth}\n- add {Calendar.Subject=pay pearl fees} on my calendar {Calendar.StartDate=tomorrow}\n- add {Calendar.Subject=picture day} at school to my calendar for {Calendar.StartDate=friday, november the 8th} from {Calendar.StartTime=8 am} to {Calendar.EndTime=9:30} am\n- add {Calendar.Subject=solo gig} at civic hall on the {Calendar.StartDate=7th of march} at {Calendar.StartTime=8 pm}\n- add {Calendar.Subject=team meeting} to my calendar at {Calendar.StartTime=10pm} with xiaoming wang\n- add the {Calendar.Subject=enviomential protection meeting} from {Calendar.StartTime=9 am} to {Calendar.EndTime=11 am}\n- add the {Calendar.Subject=lunch} with my colleague naomi from {Calendar.StartTime=12} to {Calendar.EndTime=2} in my personal calendar\n- add {Calendar.Subject=ultimate frisbee} on {Calendar.StartDate=sunday} at {Calendar.StartTime=2 pm} for 2 hours\n- add {Calendar.Subject=vacation} to my calendar from {Calendar.StartDate=july 4th} until {Calendar.EndDate=july 29th}\n- add {Calendar.Subject=work} to calendar at {Calendar.StartTime=3 pm} on {Calendar.StartDate=friday}\n- add {Calendar.Subject=work} to calendar {Calendar.StartDate=friday} from {Calendar.StartTime=8} for an hour\n- add {Calendar.Subject=work} to calendar {Calendar.StartDate=sunday} {Calendar.StartTime=10} till {Calendar.EndTime=5}\n- add {Calendar.Subject=work} to calendar {Calendar.StartDate=thursday} {Calendar.StartTime=8 30 am}\n- add {Calendar.Subject=work} to my calendar {Calendar.StartDate=monday} {Calendar.StartTime=6 am} to {Calendar.EndTime=11 am}\n- add {Calendar.Subject=work} to my calendar {Calendar.StartDate=today}\n- create appointment for 30 minutes\n- create an appointment with doctor lu from {Calendar.StartTime=8:30 am} to {Calendar.EndTime=10:00 am} {Calendar.StartDate=tomorrow} {Calendar.StartTime=morning}\n- create a meeting with tom34@outlook.com\n- create a meeting from {Calendar.StartTime=9pm} to {Calendar.StartDate=tomorrow} {Calendar.EndTime=6am}\n- append {Calendar.Subject=dad's birthday} {Calendar.StartDate=every july 21st}\n- appending {Calendar.Subject=group meeting} {Calendar.StartDate=next monday} at {Calendar.StartTime=11am} for an hour\n- should you schedule to {Calendar.StartTime=after lunch}\n- create a meeting for {Calendar.StartDate=tomorrow} {Calendar.StartTime=6pm} with lucy chen\n- create a meeting at {Calendar.StartTime=9:35am}\n- set up the appointment\n- set up meeting with thomson\n- set up meeting with pura for {Calendar.StartDate=every tuesday} at {Calendar.StartTime=1 pm}\n- create a meeting at {Calendar.StartTime=8am}\n- set up an event in my calendar\n- set up an event\n- set up an appointment with tom\n- set up an appointment with pura {Calendar.StartDate=tomorrow} at {Calendar.StartTime=3 pm}\n- set up an appointment with pura\n- set up an appointment with my sister in my main calendar.\n- schedule {Calendar.Subject=yoga class} from {Calendar.StartTime=2 pm} to {Calendar.EndTime=3 pm}\n- schedule {Calendar.Subject=work} on {Calendar.StartDate=thursday the thirty first} from {Calendar.StartTime=three} to {Calendar.EndTime=seven thirty}\n- schedule {Calendar.Subject=work} for {Calendar.StartTime=7 am} {Calendar.StartDate=tomorrow}\n- schedule {Calendar.Subject=wedding anniversary} on {Calendar.StartDate=friday} {Calendar.StartTime=evening}\n- schedule {Calendar.Subject=wanda s graduation} for {Calendar.StartDate=saturday} at {Calendar.StartTime=11 o clock}\n- schedule {Calendar.Subject=therapy appointment} at {Calendar.StartTime=8 o clock}\n- schedule my vacation from {Calendar.StartDate=today} {Calendar.StartTime=5pm} to {Calendar.EndDate=tomorrow} {Calendar.EndTime=5pm}\n- schedule {Calendar.Subject=miranda s graduation} from {Calendar.StartTime=11} to {Calendar.EndTime=3} on {Calendar.StartDate=may 28th}\n- schedule {Calendar.Subject=mechanics exam} at {Calendar.StartTime=12 pm} on {Calendar.StartDate=friday}\n- schedule {Calendar.Subject=lunch} with pura at {Calendar.StartTime=noon} on {Calendar.StartDate=wednesday may} 20 minutes\n- schedule {Calendar.Subject=lunch} with madden on {Calendar.StartDate=tuesday}\n- schedule {Calendar.Subject=lunch} with madden for {Calendar.StartTime=11 30 am} on {Calendar.StartDate=wednesday}\n- schedule {Calendar.Subject=holiday} on the {Calendar.StartDate=31st july}\n- schedule {Calendar.Subject=holiday} for the {Calendar.StartDate=thirty first of july}\n- schedule {Calendar.Subject=hair appointment} on {Calendar.StartDate=monday} at {Calendar.StartTime=2 pm}\n- schedule {Calendar.Subject=group meeting} with madden on {Calendar.StartDate=march 3rd} at {Calendar.StartTime=4 00 pm}\n- schedule {Calendar.Subject=dry cleaning pick up} at {Calendar.StartTime=three thirty pm} {Calendar.StartDate=today}\n- schedule {Calendar.Subject=dinner} with madden {Calendar.StartDate=every friday} at {Calendar.StartTime=5 pm}\n- schedule {Calendar.Subject=dinner} with madden at {Calendar.StartTime=6 pm} on {Calendar.StartDate=june 4th} at spring restaurant\n- schedule {Calendar.Subject=dinner} on the {Calendar.StartDate=8th} at {Calendar.StartTime=6 thirty p m}\n- schedule {Calendar.Subject=dentist appointment} with madden for {Calendar.StartDate=may the 20th} at {Calendar.StartTime=3 pm}\n- schedule {Calendar.Subject=college} for {Calendar.StartDate=tomorrow} at {Calendar.StartTime=5 am}\n- schedule {Calendar.Subject=camping} for {Calendar.StartDate=friday} to {Calendar.EndDate=sunday}\n- schedule {Calendar.Subject=ben baig} for {Calendar.StartDate=saturday} {Calendar.StartTime=evening}\n- schedule {Calendar.Subject=art show} on calendar for {Calendar.StartTime=noon} on {Calendar.StartDate=march 6th}\n- schedule appointment {Calendar.Subject=yearly check up} {Calendar.StartDate=friday march one} {Calendar.StartTime=10 am} one hour\n- schedule appointment for madden {Calendar.Subject=account payment}\n- schedule appointment at {Calendar.StartTime=eight p m} {Calendar.StartDate=tomorrow}\n- schedule appointment\n- schedule an event on the calendar\n- schedule an event for the {Calendar.StartDate=5th of july}\n- schedule an event for {Calendar.Subject=scrum} with madden at {Calendar.StartTime=10 am} {Calendar.StartDate=saturday}\n- schedule an event for me\n- schedule an event\n- schedule an appointment with mom\n- schedule an appointment with madden {Calendar.StartDate=tomorrow} at {Calendar.StartTime=5 pm}\n- schedule an appointment with madden {Calendar.StartDate=today} at {Calendar.StartTime=2 o clock}\n- schedule an appointment with madden for {Calendar.StartDate=wednesday the 20 4th} at {Calendar.StartTime=9 30 am}\n- schedule an appointment with madden at {Calendar.StartTime=10 pm}\n- schedule an appointment with madden\n- schedule an appointment to {Calendar.Subject=see cj} on {Calendar.StartDate=thursday}\n- schedule an appointment to {Calendar.Subject=groom my dogs} at petco on {Calendar.StartDate=friday} at {Calendar.StartTime=6 pm}\n- schedule an appointment to {Calendar.Subject=call meredith} at {Calendar.StartTime=12}\n- schedule an appointment on {Calendar.StartDate=thursday october second} at {Calendar.StartTime=8 forty am} {Calendar.Subject=mom s medical appointment}\n- schedule an appointment on {Calendar.StartDate=october 31st}\n- schedule an appointment on {Calendar.StartDate=november 5th} at {Calendar.StartTime=3 30}\n- schedule an appointment on my calendar\n- schedule an appointment on {Calendar.StartDate=monday} from {Calendar.StartTime=noon} to {Calendar.EndTime=4 pm}\n- schedule an appointment from {Calendar.StartDate=june 18th} to {Calendar.EndDate=june 20th}\n- schedule an appointment for {Calendar.StartDate=tomorrow} at {Calendar.StartTime=one o clock}\n- schedule an appointment for {Calendar.StartDate=thursday} at {Calendar.StartTime=3 pm} {Calendar.Subject=haircut}\n- schedule an appointment for {Calendar.StartDate=saturday} at {Calendar.StartTime=one 30 pm} to {Calendar.Subject=measure house}\n- schedule an appointment for {Calendar.StartDate=saturday} at {Calendar.StartTime=8} {Calendar.Subject=dinner} with madden\n- schedule an appointment for {Calendar.StartTime=one o clock} {Calendar.StartDate=today}\n- schedule an appointment for {Calendar.StartTime=noon} {Calendar.StartDate=tomorrow}\n- schedule an appointment for my mom\n- schedule an appointment for me {Calendar.StartDate=tomorrow} at {Calendar.StartTime=3 am}\n- schedule an appointment for me {Calendar.StartDate=today}\n- schedule an appointment for me on {Calendar.StartDate=tomorrow}\n- schedule an appointment for me\n- schedule an appointment for {Calendar.StartTime=9 am}\n- create a meeting at {Calendar.StartTime=7:00pm}\n- create a meeting at 6 o'clock\n- create a event with eden roth at {Calendar.StartTime=4pm} {Calendar.StartDate=today} for 30 mins\n- create a calendar appointment at {Calendar.StartTime=3:30} {Calendar.StartDate=tomorrow} for half an hour\n- schedule an appointment for {Calendar.StartTime=10 30 in the morning} on {Calendar.StartDate=january 20 1st}\n- schedule a {Calendar.Subject=workout} with madden to my calendar\n- schedule a {Calendar.Subject=visit to the market} {Calendar.StartDate=this saturday} at {Calendar.StartTime=10 o clock}\n- schedule a {Calendar.Subject=vet appointment} at {Calendar.StartTime=9 am} on {Calendar.StartDate=saturday}\n- schedule a {Calendar.Subject=soccer game} for {Calendar.StartDate=next friday}\n- schedule a {Calendar.Subject=shopping trip} with shawntia on {Calendar.StartDate=friday} at {Calendar.StartTime=5 pm}\n- schedule a {Calendar.Subject=run} at the lake with madden\n- schedule a meeting with ryan from {Calendar.StartTime=3}-{Calendar.EndTime=4pm} on {Calendar.StartDate=october 25th}\n- schedule a meeting with han lu {Calendar.StartTime=8 am} {Calendar.StartDate=next tuesday}\n- schedule a meeting with andy\n- schedule a meeting {Calendar.StartDate=tomorrow}\n- schedule a meeting on {Calendar.StartDate=nov. 3} from {Calendar.StartTime=3}-{Calendar.EndTime=4pm}\n- schedule a meeting for {Calendar.StartDate=tomorrow} at {Calendar.StartTime=5 pm}\n- schedule a meeting for {Calendar.StartDate=this friday} {Calendar.StartTime=11 am}\n- schedule a meeting for {Calendar.StartDate=next thursday}\n- schedule a meeting\n- schedule a {Calendar.Subject=massage} on {Calendar.StartDate=tuesday}\n- schedule a {Calendar.Subject=lunch meeting} with my lead\n- schedule a {Calendar.Subject=lunch date} with mom {Calendar.StartDate=every tuesday} at {Calendar.StartTime=noon} for the {Calendar.StartDate=next 5 weeks}\n- schedule a {Calendar.Subject=doctors appointment} with madden on {Calendar.StartDate=march 12th} at {Calendar.StartTime=4 pm}\n- schedule a {Calendar.Subject=doctors appointment} at {Calendar.StartTime=15 30}\n- schedule a {Calendar.Subject=doctor s office appointment} for {Calendar.StartDate=march 12th}\n- schedule a {Calendar.Subject=dinner} for {Calendar.StartTime=tonight} at {Calendar.StartTime=8 pm}\n- schedule a {Calendar.Subject=dentist appointment} for {Calendar.StartDate=tomorrow} {Calendar.StartTime=night at 7 pm}\n- schedule a {Calendar.Subject=dental appointment} {Calendar.StartDate=tomorrow} {Calendar.StartTime=afternoon at five thirty pm}\n- schedule a {Calendar.Subject=chiropractors appointment} on {Calendar.StartDate=july 7th} at {Calendar.StartTime=4 o clock}\n- schedule a calendar event for my sister\n- schedule a {Calendar.Subject=buisness lunch for my department} at campus restaurant on {Calendar.StartDate=wednesday} at {Calendar.StartTime=11 30 am}\n- schedule a {Calendar.Subject=breakfast meeting} at {Calendar.StartTime=8 am} {Calendar.StartDate=tomorrow}\n- schedule a {Calendar.Subject=azure workshop} from {Calendar.StartTime=9am} to {Calendar.EndTime=tomorrow} {Calendar.EndTime=5pm}\n- book a meeting between {Calendar.StartTime=2} and {Calendar.EndTime=3} {Calendar.StartDate=tomorrow}\n- book a meeting between {Calendar.StartTime=2:30pm} and {Calendar.EndTime=4:45pm} {Calendar.StartDate=tomorrow}\n- book a meeting in guangzhou at 6am on {Calendar.StartDate=march 5th}\n- put {Calendar.Subject=yoga} on my calendar for {Calendar.StartDate=mondays} and {Calendar.StartDate=wednesdays} at {Calendar.StartTime=3 pm}\n- put {Calendar.Subject=work} on my calendar {Calendar.StartDate=tomorrow} from {Calendar.StartTime=8 30} to {Calendar.EndTime=5 30}\n- put {Calendar.Subject=test appointment} in my calendar {Calendar.StartDate=tomorrow} at {Calendar.StartTime=7}\n- put {Calendar.Subject=tennis game} for {Calendar.StartDate=friday} at {Calendar.StartTime=1} on calendar\n- put {Calendar.Subject=swimming} {Calendar.StartDate=tomorrow}\n- put {Calendar.Subject=swimming} in my calendar {Calendar.StartDate=tomorrow}\n- put {Calendar.Subject=shopping day} on {Calendar.StartDate=april 1st} at {Calendar.StartTime=10 am} on calendar\n- put {Calendar.Subject=mathematics paper one} on {Calendar.StartDate=tuesday 13}\n- put {Calendar.Subject=julie hay} in my calendar for tomorrow\n- put jimmy on {Calendar.Subject=to doctor ken} on {Calendar.StartDate=october 20th} at {Calendar.StartTime=3 30}\n- put {Calendar.Subject=jason work} on my calendar {Calendar.StartDate=thursday} {Calendar.StartTime=9 am} to {Calendar.EndTime=5 pm}\n- put {Calendar.Subject=insanity} on my calendar at {Calendar.StartTime=6 30 am}\n- put {Calendar.Subject=hair appointment} on calendar\n- put {Calendar.Subject=eye doctor appointment} {Calendar.StartDate=saturday} at {Calendar.StartTime=11 am}\n- put {Calendar.Subject=doctor s appointment} in my calendar for {Calendar.StartTime=5 forty} {Calendar.StartDate=next thursday}\n- put {Calendar.Subject=dentist} on my calendar for {Calendar.StartDate=this thursday} at {Calendar.StartTime=10 am}\n- put {Calendar.Subject=dentist appointment} in my calendar {Calendar.StartDate=tuesday} {Calendar.StartTime=2 45 pm}\n- put {Calendar.Subject=dentist appointment} in my calendar for {Calendar.StartDate=tomorrow} at {Calendar.StartTime=one pm}\n- put {Calendar.Subject=dental appointment} on my calendar {Calendar.StartDate=saturday march 22nd} at {Calendar.StartTime=twelve pm}\n- put {Calendar.Subject=dance} on my calendar from {Calendar.StartTime=6} to {Calendar.EndTime=7}\n- put {Calendar.Subject=dance} on my calendar for {Calendar.StartDate=monday} {Calendar.StartTime=7 pm}\n- put {Calendar.Subject=dance class appointment}\n- put {Calendar.Subject=captains} in my calendar for {Calendar.StartDate=saturday} {Calendar.StartTime=evening}\n- put {Calendar.Subject=anniversary} on my calendar\n- book a {Calendar.Subject=recurring 1x1 meeting} on the {Calendar.StartDate=first monday of each month}\n- make appointment for {Calendar.StartTime=5 30} {Calendar.StartDate=tomorrow}\n- make appointment for {Calendar.StartTime=7 30}\n- make appointment for me\n- make appointment on {Calendar.StartDate=monday}.\n- make appointment on personal calendar\n- make appointment to {Calendar.Subject=play squash} on {Calendar.StartDate=thursday} at {Calendar.StartTime=7 20}\n- make appointment to {Calendar.Subject=see doctor culver} {Calendar.StartDate=august the 22nd 2013} {Calendar.StartTime=1 pm}\n- make appointment with tom roth.\n- make appt for {Calendar.StartTime=3 pm} on {Calendar.StartDate=christmas}\n- make me a calendar event\n- make me a {Calendar.Subject=dentist appointment} {Calendar.StartDate=wednesday} at {Calendar.StartTime=two forty five}\n- make me an appointment\n- make me an appointment for {Calendar.StartDate=next weekend}\n- make me an appointment for {Calendar.StartTime=ten forty} {Calendar.StartDate=next monday}\n- make me an appointment for the {Calendar.StartDate=next week thursday}\n- make me an appointment on the calendar\n- make me an appointment {Calendar.StartDate=tomorrow} at {Calendar.StartTime=2 30 pm}\n- please schedule an {Calendar.Subject=all hands meeting} for 2 hours\n- please schedule a {Calendar.Subject=yoga class} with my sister at {Calendar.StartTime=5pm} {Calendar.StartDate=every friday}\n- {Calendar.StartDate=march 15} {Calendar.Subject=dinner} at refectory at {Calendar.StartTime=6 pm}\n- meet ming wang for {Calendar.Subject=lunch} on {Calendar.StartDate=tuesday} at {Calendar.StartTime=noon}\n- meet with a.j. lee {Calendar.StartDate=saturday} at {Calendar.StartTime=3 pm}\n- meet with carol lee at home on {Calendar.StartDate=march 10th} at {Calendar.StartTime=4 pm}\n- meeting with ben randie {Calendar.StartDate=tomorrow} at {Calendar.StartTime=noon}\n- meeting with ellen fung on {Calendar.StartDate=monday} at {Calendar.StartTime=9 am}\n- meeting with jia li {Calendar.StartDate=monday} {Calendar.StartTime=3 30}\n- meeting with morrison sun at {Calendar.StartTime=2 pm} {Calendar.StartDate=saturday}\n- meeting with morrison yang at {Calendar.StartTime=4}\n- please create a meeting from {Calendar.StartTime=2} to {Calendar.EndTime=3}\n- place an appointment in my calendar\n- personal calendar {Calendar.StartDate=5/1/2013} {Calendar.Subject=meet mom for yard sale}\n- on {Calendar.StartDate=saturday} at {Calendar.StartTime=7 thirty p m}\n- new appointment for {Calendar.StartDate=tomorrow}\n- new appointment in calendar\n- new appointment in my calendar\n- new appointment {Calendar.StartDate=next wednesday}\n- new appointment {Calendar.StartDate=today} {Calendar.StartTime=6 pm} see dead people\n- new appointment {Calendar.StartDate=tomorrow} at {Calendar.StartTime=3 pm} at sunken\n- new calendar appointment\n- new calendar entry\n- new calendar event\n- new calendar item\n- (create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] from [{Calendar.StartDate}] {Calendar.StartTime} to [{Calendar.EndDate}] {Calendar.EndTime}\n- (create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] between {Calendar.StartTime} and {Calendar.EndTime}\n- (create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] (at|for|on) [{Calendar.StartDate}] [{Calendar.StartTime}]\n\n\n> !# @intent.inherits = name : Calendar.ContactMeetingAttendees; domain_name : Calendar; model_name : ContactMeetingAttendees\n\n## Calendar.ContactMeetingAttendees\n- tell next meeting that {Calendar.Message=i'm running late}\n- tell everyone {Calendar.Message=the meeting is now in room 204}\n- tell attendees {Calendar.Message=i am late}\n- alert attendees {Calendar.Message=meeting is at 8 30}\n- alert attendees of {Calendar.Subject=dinner meeting} that {Calendar.Message=i will be late}\n- alert {Calendar.Subject=quality control meeting} participants that {Calendar.Message=i am 15 minutes late}\n- alert {Calendar.Subject=quality control meeting} participants that {Calendar.Message=the meeting will be 30 minutes later}\n- send reminder of {Calendar.StartTime=9 am} meeting to all participants 15 minutes later\n- send a text to the people going to the meeting that {Calendar.Message=the location has changed}\n- send a notice to paul that {Calendar.Message=xu wen will attend the meeting}\n- send a notice to douglas {Calendar.Message=the first will be attending the meeting}\n- send a message to the meeting attendees that {Calendar.Message=the meeting will now start at 8 30 am}\n- send a message to johnny and jessie that {Calendar.Message=our meeting today will be later by 30 minutes}\n- send a message out to {Calendar.Message=cancel my 3 pm meeting}\n- {Calendar.Message=running late} to my meeting please let jennifer know\n- {Calendar.Message=running late for meeting} - notify others\n- room 100 is location for {Calendar.StartTime=this afternoon} ' s meeting please notify others\n- remind all attendees of {Calendar.StartDate=tomorrow} ' s {Calendar.Subject=lunch} that {Calendar.Message=we have changed the venue}\n- provide {Calendar.Message=the time change for the meeting} to all participants\n- please remind the attendee that {Calendar.Message=i am running late}\n- please notify george that {Calendar.Message=i will be late for the meeting}\n- please notify everyone {Calendar.Message=i ' m running late to the 3 pm meeting}\n- please let them know {Calendar.Message=i'm late}\n- please let all in work group know {Calendar.Message=meeting to start at 9 15}\n- {Calendar.Message=meeting room changed to new location} send to meeting attendees\n- meeting will start soon remind everybody involved\n- message colleagues that {Calendar.Message=meeting needs to be moved to 8 : 30 am}\n- message everyone advising that {Calendar.Message=i will be late to the meeting}\n- message nancy and tell him to {Calendar.Message=postpone the meeting because i ' m going to be 30 minutes late}\n- please inform work contact group that {Calendar.Message=i am running late for the meeting}\n- please inform the thomas that {Calendar.Message=i will be late for the meeting}\n- please inform meeting attendees that {Calendar.Message=i am running late}\n- please inform joshua that {Calendar.Message=i will be late for our meeting today}\n- please inform colleagues {Calendar.Message=we will be meeting at 8 : 30 due to being late}\n- please inform colleagues {Calendar.Message=running late and meeting half hour later}\n- please alert those attending the meeting that {Calendar.Message=i am running a few minutes late}\n- please alert attendees {Calendar.Message=meeting is at 8:30}\n- please alert {Calendar.StartTime=3 o ' clock} meeting attendees\n- please advise {Calendar.Message=i am late} for {Calendar.StartDate=3 pm} meeting\n- over run of time in confer room - all attendees to be notified of {Calendar.Message=meeting being moved to next room} - will explain why later\n- ok find out if that is possible by sending a meeting change notification to all attendees\n- notify people of meeting on {Calendar.StartDate=tue} that {Calendar.Message=it will begin 15-30 min later}\n- notify others that {Calendar.Message=i am going to be late to meeting}\n- {Calendar.Message=my 9 o ' clock meeting can ' t start until 9 15} can you let everyone know\n- notify noah that {Calendar.Message=our meeting is pushed back 30 minutes}\n- notify kimberly that {Calendar.Message=i will be late for our 3 pm meeting}\n- notify {Calendar.StartDate=friday}'s {Calendar.StartTime=2 pm} that we are cancelling the meeting\n- notify diana that {Calendar.Message=i ' ll be late to our meeting}\n- notify attendees of office meeting that {Calendar.Message=i will be a little later}\n- notify all attendees about the change\n- notify all attendees\n- new location for meeting {Calendar.StartTime=this afternoon} let others attendees know meeting is now in room 100\n- ^(remind|inform|tell) (the|all) attendees {Calendar.Message}^\n\n\n> !# @intent.inherits = name : Calendar.FindCalendarEntry; domain_name : Calendar; model_name : FindCalendarEntry\n\n## Calendar.FindCalendarEntry\n- next meeting\n- calendar for {Calendar.StartDate=today}\n- which will be my next {Calendar.Subject=flight}\n- which is my next event\n- do i have any appointments {Calendar.StartDate=today}\n- do i have any meetings {Calendar.StartDate=today}\n- do i have anything from {Calendar.StartTime=11} to {Calendar.EndTime=2}\n- do i have anything on {Calendar.StartDate=wednesday}\n- do i have anything {Calendar.StartDate=today}\n- when and where is my next meeting\n- what's my first meeting {Calendar.StartDate=tomorrow}\n- what's happening {Calendar.StartDate=tomorrow}\n- what's going on {Calendar.StartDate=this week}\n- look up my next appointment for me\n- what was my first appointment\n- what meetings do i have {Calendar.StartDate=next week}\n- locate the next appointment\n- what is timothy doing {Calendar.StartDate=today}\n- what is the schedule before that\n- obtain the appointment with frank\n- what is on my calendar {Calendar.StartDate=today}\n- check janice 's calendar for {Calendar.StartDate=this weekend}\n- check kronos calendar\n- what is next in calendar\n- check my calendar\n- what is my schedule {Calendar.StartDate=tomorrow}\n- what is my schedule for {Calendar.StartDate=tomorrow}\n- what is my next appointment\n- check my family calendar\n- what is my 1st meeting {Calendar.StartDate=today}\n- what is logan 's schedule {Calendar.StartDate=this week}\n- what is henry doing on {Calendar.StartDate=monday} at {Calendar.StartTime=noon}\n- check my mom's schedule\n- what i'm doing {Calendar.StartDate=this weekend}\n- what i am doing {Calendar.StartDate=next week}\n- what have i got on {Calendar.StartDate=tomorrow}\n- what do i have {Calendar.StartDate=tomorrow}\n- what do i have to do {Calendar.StartDate=tomorrow}\n- what do i have to do {Calendar.StartTime=this afternoon}\n- what do i have {Calendar.StartTime=this afternoon}\n- what do i have on {Calendar.StartDate=sunday}\n- what do i have on my calendar {Calendar.StartDate=today}\n- what do i have next\n- what do i have going on {Calendar.StartDate=today}\n- what do i have from {Calendar.StartDate=monday} through {Calendar.EndDate=wednesday}\n- what do i have from {Calendar.StartTime=2} to {Calendar.EndTime=4} on {Calendar.EndDate=saturday}\n- what do i have for {Calendar.StartDate=today}\n- what are my meetings at {Calendar.StartTime=night}\n- what are my appointments {Calendar.StartDate=today}\n- what are my appointments for {Calendar.StartDate=this week}\n- what appointments do i have {Calendar.StartDate=tomorrow}\n- what am i doing {Calendar.StartTime=tonight}\n- what am i doing on {Calendar.StartDate=june ninth}\n- what am i doing {Calendar.StartDate=next week}\n- what ' s the meeting {Calendar.StartDate=today} between {Calendar.StartTime=10} and {Calendar.EndTime=12:00}\n- what ' s on my schedule {Calendar.StartDate=today}\n- what ' s on my schedule for {Calendar.StartDate=tomorrow}\n- what ' s on my schedule\n- what ' s on my next meeting\n- what ' s on my calendar {Calendar.StartDate=today}\n- what ' s on my calendar for {Calendar.StartDate=today}\n- what ' s on my calendar\n- what ' s next on my calendar\n- what ' s my schedule {Calendar.StartDate=tomorrow}\n- what ' s my schedule like {Calendar.StartDate=tomorrow}\n- what ' s my schedule for {Calendar.StartDate=tomorrow}\n- what ' s my next meeting\n- what ' s my next appointment\n- what ' s my 1st meeting {Calendar.StartDate=tomorrow}\n- what ' s my 1st appointment {Calendar.StartDate=tomorrow}\n- what ' s in my calendar for {Calendar.StartDate=today}\n- what ' s happening {Calendar.StartDate=today}\n- what ' s going on {Calendar.StartDate=this weekend}\n- what ' s after that on my calendar\n- view ethan 's calendar\n- view emily calendar\n- find a meeting about {Calendar.Subject=group meeting}\n- find a meeting about {Calendar.Subject=plan}\n- find a meeting at {Calendar.StartTime=7pm} from melissa\n- find a meeting from darren about {Calendar.Subject=status update}\n- find a meeting from deborah about {Calendar.Subject=team session}\n- find a meeting from donna\n- find a meeting subject {Calendar.Subject=daily meeting}\n- find a meeting with subject {Calendar.Subject=weekly report}\n- find a meeting with title {Calendar.Subject=second lesson} from amanda\n- find a meeting with title {Calendar.Subject=sharing} from steven\n- the next appointment after that\n- find me the meetings at {Calendar.StartTime=6}\n- find me the meetings at {Calendar.StartTime=9 o'clock}\n- find the meeting around {Calendar.StartTime=2} to {Calendar.StartTime=6pm}\n- find the meeting around {Calendar.StartTime=5} to {Calendar.StartTime=8 pm}\n- tell me the events scheduled at calendar constitution hall\n- find the meeting with judith\n- find the meeting with timothy\n- find the next meeting\n- get to my next event\n- at {Calendar.StartTime=10 am} do i have a 30 minutes meeting\n- show my schedule at {Calendar.StartTime=night}\n- show me victoria 's calendar for {Calendar.StartDate=monday}\n- show me the meeting with paul\n- show me the meeting about {Calendar.Subject=online session}\n- show me the meeting about {Calendar.Subject=briefing session}\n- show me the calendar at {Calendar.StartTime=night}\n- show me my schedule {Calendar.StartTime=tonight}\n- show me my next meeting\n- show me my google calendar\n- show me my calendar for {Calendar.StartDate=monday}\n- show me my calendar\n- show me heather 's calendar\n- show me brenda 's schedule for {Calendar.StartDate=friday}\n- show jean's calendar\n- search the meeting with title {Calendar.Subject=employee orientation}\n- search a meeting subject {Calendar.Subject=project proposal rehearsal}\n\n\n> !# @intent.inherits = name : Calendar.FindDuration; domain_name : Calendar; model_name : FindDuration\n\n## Calendar.FindDuration\n- about how long will the meeting last\n- minutes in {Calendar.Subject=lunch break}\n- how long will my {Calendar.Subject=dentist appointment} last\n- how long is the {Calendar.Subject=movie jurassic world}\n- how long is the event\n- how long is that meeting going to last\n- how long is my meeting at {Calendar.StartTime=4}\n- how long is my {Calendar.Subject=lunch} {Calendar.StartDate=today}\n- how long is my {Calendar.Subject=facial time}\n- how long is my {Calendar.Subject=dentist appointment}\n- how long is my {Calendar.StartTime=4 o'clock} meeting\n- how long do i have for {Calendar.Subject=lunch}\n- how much time as of now is set for the {Calendar.Subject=bill payments}\n- how much time between schedule {Calendar.StartDate=thursday} meetings {Calendar.StartDate=next week}\n- how much time do i have for a {Calendar.Subject=lunch break} {Calendar.StartDate=today}\n- show me the duration of the {Calendar.Subject=weekly sharing}\n- how much time do i have for {Calendar.Subject=lunch} {Calendar.StartDate=today}\n- how much time do i have to {Calendar.Subject=take back the movie}\n- how much time do we have for {Calendar.Subject=lunch} {Calendar.StartDate=today}\n- how much time does my meeting take up\n- how much time for {Calendar.Subject=lunch} {Calendar.StartDate=today}\n- how much time is open {Calendar.StartDate=today}\n- how much time is set for the {Calendar.Subject=bill payments}\n- how much time is there for {Calendar.Subject=errands} during my {Calendar.Subject=lunch break}\n- how much time out on {Calendar.Subject=lunch}\n- tell me how long is my {Calendar.StartTime=4 oclock} meeting\n- tell me how long is {Calendar.StartDate=today} ' s {Calendar.Subject=lunch break}\n- tell me the duration of the {Calendar.Subject=product introducation}\n- how much time will i have to {Calendar.Subject=pick up groceries}\n- time for {Calendar.Subject=lunch errands}\n- {Calendar.StartDate=today} ' s {Calendar.Subject=lunch} will be how long\n- total {Calendar.Subject=lunch break} time {Calendar.StartDate=today} please\n- duration of {Calendar.Subject=machine learning talk}\n- is it going to last long\n- what allotted time is for {Calendar.Subject=hair dresser}\n- is my lunch long enough for {Calendar.Subject=errands}\n- please tell me how long i have for {Calendar.Subject=lunch}\n- please show me how much time i have to {Calendar.Subject=run errands}\n\n\n> !# @intent.inherits = name : Calendar.GoBack; domain_name : Calendar; model_name : GoBack\n\n## Calendar.GoBack\n- please go back\n- go back to the previous step\n- go back to the main menu\n- go back to the last step\n- go back the previous step\n- go back please\n- go back one step\n- go back a step\n- go back\n- can you go back\n- i need to go back\n- we should go back\n- i want to go back\n- i would like to go back\n- back\n- return to the previous step\n- return to previous step\n- return please\n- return back\n- return\n- back one step\n- back the last step\n- please return back\n\n\n> !# @intent.inherits = name : Calendar.Reject; domain_name : Calendar; model_name : Reject\n\n## Calendar.Reject\n- nope\n- of course not\n- not at this time\n- not for me, thanks\n- none\n- not him\n- abort that\n- no no\n- no thank you\n- no thanks\n- no way\n- no, i already have meeting {Calendar.StartTime=3pm} {Calendar.StartDate=tomorrow} afternoon\n- no, i won't\n- it's wrong\n- it's the wrong room\n- maybe another time\n- it's the wrong person\n- it doesn't work for me\n- ohh no\n- not now\n- wrong place\n- negative\n- neither\n- wrong\n- nothing\n- not this time\n- no, i'd like to meet her manager\n- no, please don't\n- stop\n- not {Calendar.StartTime=this saturday}\n- not this room\n- not this man\n- not this location\n- i'm supposed to meet daisy, not katy\n- i'm not available {Calendar.StartDate=next monday} afternoon\n- i'm busy at that time\n- i'm afraid i can't\n- i'd rather not. thanks\n- no\n- not this conference room, please change\n- i think not\n- not right, schedule it as {Calendar.Subject=1x1 meeting} with yolanda\n- please find another meeting room\n- i cannot\n- not that time\n- that's not right\n- i have other things to do at that time\n- the contact name is wrong, it's daisy\n- i don't like the time\n- i don't like that time\n- i can't go there\n- oh no\n- i cannot make it\n- this time slot doesn't work for me\n- this is {Calendar.Subject=review meeting}, not 1x1 meeting\n\n\n> !# @intent.inherits = name : Calendar.ShowNext; domain_name : Calendar; model_name : ShowNext\n\n## Calendar.ShowNext\n- could you show the next one\n- i need to go to the next one\n- show the next\n- show the last one\n- go to the next one please\n- what about the next one\n- what are the next 3 events on my calendar\n- move to the next one\n- what is my next event\n- what is next\n- what's after that\n- what's next\n- what's up next\n- ^[(show|display)] next [page] [please]^\n- ^i (want to|need to|would like to) (attend|join) {Calendar.Subject}, [please] add it.^\n\n\n> !# @intent.inherits = name : Calendar.ShowPrevious; domain_name : Calendar; model_name : ShowPrevious\n\n## Calendar.ShowPrevious\n- what is the previous\n- i need to check the previous appointment\n- show the previous one\n- show previous one\n- show previous\n- show me the previous meeting with tiffany\n- bring the previous one\n- previous one please\n- previous one\n\n\n> !# @intent.inherits = name : Calendar.TimeRemaining; domain_name : Calendar; model_name : TimeRemaining\n\n## Calendar.TimeRemaining\n- tell me how much free time i have before next appt\n- how much longer until my next meeting\n- time before my next appointment\n- how much time until {Calendar.StartTime=noon}\n- how much time until next scheduled appointment\n- how much time until my meeting with lori\n- tell me how much time before my next meeting\n- do i have any spare time before next appointment\n- how much time remaining till next meeting\n- i want to know the time left for my next appointment\n- how much time is there before {Calendar.Subject=office meeting}\n- how much time do i have until my next appointment\n- how much time do i have until my meeting with larry\n- how many minutes free do i have before next scheduled appointment\n- how much time do i have until my {Calendar.Subject=doc appt}\n- show time before next appointment\n- how much time do i have until i {Calendar.Subject=start the meeting}\n- how much time do i have until i have to {Calendar.Subject=meet} with michael\n- how much time do i have free until my next meeting\n- how much time do i have before my next meeting\n- how much time do i have before my next appointment\n- how much time do i have\n- how much time before next appointment\n- how much time before my next appointment\n- how much time before {Calendar.Subject=lunch}\n- how long is it until the {Calendar.StartDate=14th of march}\n- how long till {Calendar.Subject=disneyland paris}\n- how long till my next appointment\n- time remaining\n- how much longer until my next appointment\n- how long till the next meeting\n- how long until {Calendar.Subject=christmas}\n- how long until my next appointment\n- how long until my next meeting\n- how long until the {Calendar.Subject=social}\n- how long will i wait for the next appointment\n- how many days is it until {Calendar.StartDate=christmas}\n- how many days left until the {Calendar.Subject=opening ceremony}\n- how many days till {Calendar.StartDate=april}\n- how many days till {Calendar.StartDate=christmas}\n- how many days until {Calendar.StartDate=june the fifteenth}\n- how many days until {Calendar.StartDate=june the fifteenth 2019}\n- how many days until {Calendar.StartDate=march twenty six}\n- how many days until my {Calendar.Subject=doctor ' s appointment}\n- can you show me the time remaining before my next appointment\n- how many days until {Calendar.StartDate=thanksgiving}\n- how many days until the {Calendar.StartDate=10th of december}\n- how many hours left till the {Calendar.Subject=closing ceremony}\n- check on the time to see when i {Calendar.Subject=go to school and pick up mark}\n- how many hours remaining till next appointment\n- how much longer do i have before {Calendar.Subject=pick up mary from school}\n- how many hours until my {Calendar.Subject=doc appointment}\n- how many minutes before my next appointment\n- how much longer do i have until {Calendar.Subject=pick up john from school}\n- ^how long do i have (until|before|till) the [next] (meeting|appointment|{Calendar.Subject})\n\n\n## None\n- running late for the {Calendar.Subject=board meeting} alert catherine dennis and all the other attendees\n\n\n> # Entity definitions\n\n> !# @entity.inherits = name : Calendar.EndDate; domain_name : Calendar; model_name : EndDate\n\n$Calendar.EndDate:simple\n\n> !# @entity.inherits = name : Calendar.EndTime; domain_name : Calendar; model_name : EndTime\n\n$Calendar.EndTime:simple\n\n> !# @entity.inherits = name : Calendar.Message; domain_name : Calendar; model_name : Message\n\n$Calendar.Message:simple\n\n> !# @entity.inherits = name : Calendar.StartDate; domain_name : Calendar; model_name : StartDate\n\n$Calendar.StartDate:simple\n\n> !# @entity.inherits = name : Calendar.StartTime; domain_name : Calendar; model_name : StartTime\n\n$Calendar.StartTime:simple\n\n> !# @entity.inherits = name : Calendar.Subject; domain_name : Calendar; model_name : Subject\n\n$Calendar.Subject:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:personName\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/calendar_all_prebuilt_parsed.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Calendar.FindCalendarWhen\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarWhen\"\n      }\n    },\n    {\n      \"name\": \"Calendar.AcceptEventEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"AcceptEventEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarWhere\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarWhere\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ChangeCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ChangeCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.Cancel\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Cancel\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarWho\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarWho\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ConnectToMeeting\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ConnectToMeeting\"\n      }\n    },\n    {\n      \"name\": \"Calendar.CheckAvailability\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"CheckAvailability\"\n      }\n    },\n    {\n      \"name\": \"Calendar.Confirm\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Confirm\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindMeetingRoom\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindMeetingRoom\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarDetail\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarDetail\"\n      }\n    },\n    {\n      \"name\": \"Calendar.DeleteCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"DeleteCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.CreateCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"CreateCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ContactMeetingAttendees\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ContactMeetingAttendees\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindCalendarEntry\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindCalendarEntry\"\n      }\n    },\n    {\n      \"name\": \"Calendar.FindDuration\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"FindDuration\"\n      }\n    },\n    {\n      \"name\": \"Calendar.GoBack\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"GoBack\"\n      }\n    },\n    {\n      \"name\": \"Calendar.Reject\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Reject\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ShowNext\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ShowNext\"\n      }\n    },\n    {\n      \"name\": \"Calendar.ShowPrevious\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"ShowPrevious\"\n      }\n    },\n    {\n      \"name\": \"Calendar.TimeRemaining\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"TimeRemaining\"\n      }\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Calendar.EndDate\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"EndDate\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.EndTime\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"EndTime\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.Message\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Message\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.StartDate\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"StartDate\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.StartTime\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"StartTime\"\n      },\n      \"roles\": []\n    },\n    {\n      \"name\": \"Calendar.Subject\",\n      \"inherits\": {\n        \"domain_name\": \"Calendar\",\n        \"model_name\": \"Subject\"\n      },\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"which weekend am i shopping with sarah\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what day is lego land scheduled for\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"my next meeting with emily is when\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what time do i have work tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what time do i work today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is beth over today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my cooking class tonight\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my first meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my last meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what time is my meeting today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my mobile devices exam tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what time is my team meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is oshwin's interview\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is the ice cream social\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what time is the trade show this saturday\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"when's my next trip\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"when's my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when ' s my 1st appointment tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my 1st meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my doctor ' s appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when ' s my next doctors appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when ' s my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when's my haircut\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the wedding tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"when am i watching england\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i break up from school\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have exam\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i have free time today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the social\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"when do i meet with charles\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do i work tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"when is the next dentist appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"when is sports day for the girls\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"when is concert on my calendar\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"when is lunch with frank\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my 1st meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my appointment with willie\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my daily stand up with ethan\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my fifth kick-off\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my meeting with kenneth\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my meeting with martha and deborah\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next appointment with douglas\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next event\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next hair cut appointment\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next meeting with edward\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next meeting with miss kathleen\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next meeting with ms lawrence\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my next trip to new york\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is my physio\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"when is my picnic lunch today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"when is ncaa basketball today\",\n      \"intent\": \"Calendar.FindCalendarWhen\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"accept all meetings for christmas party next week.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"accept an appointment\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept dinner\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"accept my meeting at 7pm today\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"accept my meeting at tomorrow 10am\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment from 3pm to 5pm.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment on january 18th in palace meeting room.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the appointment sent by lucas\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the event\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the event for tonight.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the event on feb. 18 in beijing.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the event sent by yolanda wong.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the meeting held on tomorrow at room 301\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the meeting organized by jack lauren.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept the meeting with mary and tom held on wednesday\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"accept the meeting with tom chen.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept this appointment with jane and mary on next tuesday.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"accept this event.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"accept this lunch meeting.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"accept today's event at 3pm.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"accept today's meeting\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"attend the fy19 celebration party sent by daisy lu.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"attend the lunch meeting at 10:30 am.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"attend the meeting held at 3pm next tuesday at the conference center.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend this upcoming event in redmond.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'll attend the meeting this afternoon.\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"i'll attend the meeting at 2pm tomorrow in room 304\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to attend the meeting for review\",\n      \"intent\": \"Calendar.AcceptEventEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting at 3 pm today locations\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the place of the work smart training\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 25,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"show me where my next appointment is\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where's my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is tomorrow 's event\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow meeting at 11 am\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is tomorrow ' s 11 am meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where is the performance review meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"where is the meeting at 11 am tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is the meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is that meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my third shiproom with tiffany\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next meeting with ms natalie\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next event\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next dentist appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my next appointment with olivia\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next appointment with miss doris\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my meeting with kayla\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my fourth event with christopher on thursday\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my fourth event with brandon friday\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my first appointment tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my eleven o'clock meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my dentist appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my current meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is my 11 am meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is my 11 am appointment tomorrow happening\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"where is meeting with shirley\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is meeting tomorrow at 11 am\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where is margot lunch\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"where is it\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is dinner with abigail liu\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"where does my meeting take place\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do i need to go today\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i need to be next\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do i have to be today\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i have to be next\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do i go tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 14,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"where do i go for my meeting tomorrow at 11 am\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"where are my meetings today\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i on may the twenty first\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 14,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"where am i meeting austin and john\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where am i going tonight\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the location of next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where am i going this weekend\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"location of 11 am meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"what the place of the weekly meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"location of the next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where ' s my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where ' s my next appointment\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where ' s my meeting\",\n      \"intent\": \"Calendar.FindCalendarWhere\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update party\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"update my tomorrow 6pm meeting to 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"update my next appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update my camping appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 6pm to 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 2 pm to 4 pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar from 11 to 12：30 today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"update my calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"update my appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update meeting from 8am-12pm to 7am-11am today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"update lunch appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"update calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"update appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this meeting should be changed to tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule the 2 pm class to half past 2\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my interview on monday to 1 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my 3:30 dentist appointment today for 4pm tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 49,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule my 3:30 dentist appointment to 4\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"reschedule meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reschedule appointment with mark for next week\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reschedule appointment with jennifer to next week\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"push my trip july 16th out 5 days\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"postpone my four p. m. meeting today until five p. m.\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"postpone my 4 pm meeting today until 5 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"bring forward my 4 o'clock appointment 2 hours\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please move this to 3 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"can you change it to 5 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"can you move this appointment to 5pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"move shoe appointment to tuesday at one\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"move party planning meeting from saturday to friday at 1pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 55,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"move my twelve p. m. thirty minutes up\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my twelve p . m . meeting forward two hours\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my text meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"move my next meeting up by 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting up by 10 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting out thirty minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting out by 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my next meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my meeting up by half an hour\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my meeting to 6pm from 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"move my meeting back by an hour\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move my 9pm meeting to 8pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 9 am doctor ' s appointment to 10 am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 4 pm to 5 pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 12 pm meeting to 2\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 10pm meeting to 9pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 10 past 10 doctor ' s appointment to 10\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"move my 1 pm appointment up 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move meeting from 9pm-10pm to 8pm-9pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 34,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"move appt with rebecca to next week\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"move 3pm meeting to 4pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"modify the second meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"modify the meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make the meeting to start 40 minutes earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make the meeting to start 1 hour later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make the meeting ending at 10 go until 11\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"make the appointment ending at 2 go until 4 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"make next meeting to start 1 hour later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let next meeting starting at 10am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change 10 am meeting to start 20 minutes later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change 12am meeting to start 10 minutes earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change 4pm lunch appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change 5pm appointment 1 hour earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change an appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change big event to tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change dentist appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change dentist appt to an hour later\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"change developmental agenda for lunch tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"change it to 5pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"change location\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change lunch appt to 2\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"change lunch date from 11 - 12 to 12 - 1 30\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"change marathon training from 8:00am to 1:00pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change marketing meeting from every tuesday to every wednesdays\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 47,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"change meeting from 2-3pm to 4-5pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change meeting from 2pm-3pm to 4pm-5pm today\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 11pm appointment's location to green park\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 3pm event to 4pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 6pm event to 7pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 7 30 pm appointment to 8 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 7pm event to 6pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 8 till 9 appointment to 11 till 12\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my 9 30 till 10 30 appointment to 9 30 till 5\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 51,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"change my appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my appointmnet with sarah to 5 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"change my dentist appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"change my dentist appointment from 3:30 to 4\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"change my meeting at night to tomorrow\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"change my next meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my schedule\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my ten am appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change my vacation from ending on friday to monday\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 44,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"change recital to start half an hour earlier\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"change shave tomorrow 8 30\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"change the appointment ending at 4 to end at 5 instead\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 45,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"change the end date of my trip from the 3rd to the 4th\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 51,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"change the end time of my 3 o'clock meeting to 3 30 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"change the location of my singing appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"change the meeting which will start at 2 pm to 3 pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"change the time\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change the time to eleven thirty am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"change the title of my 11am appointment to soccer practice\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 43,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"change the title of my appointment\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change this appointment's location\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change thursday team meeting\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"change time\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change today 's meeting from 6pm to tomorrow 9am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"change today 's meeting from 6pm to tomorrow 9pm\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"change tomorrow ' s appointment from 10am to wednesday at 9 am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 58,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"let 5 pm meeting starting at 3\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"extend meeting from 9 am to 12 am\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"edit calendar\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delay the meeting event by 1 hours\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delay the next meeting by 30 minutes\",\n      \"intent\": \"Calendar.ChangeCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"abort edition\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will you cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop finding it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop connecting it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop checking it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop changing it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit the changing\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel all of them\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ohh never mind\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing just cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing just cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, cancel please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i just cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, forget about the creating\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind, cancel the changing\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind could you cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel can you don't do that please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"need to cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel don't worry\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel everything\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it for me\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it i don ' t want that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it, i don't want to create the meeting\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the creating process\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let me cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to cancel all of them\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to cancel that\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have decided to cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you cancel it please\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want want to change this appointment anymore\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to join it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to find it anymore\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to do it now\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to change it anymore\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to cancel this\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go ahead and cancel it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget cancel\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't create it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't change it\",\n      \"intent\": \"Calendar.Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2 pm meeting tomorrow - who else is going\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"2 pm meeting with who\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"did hellen come to 3 pm's meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"did mark sign up to the tomorrow's meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"did martin come to today's meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"will virginia be attending my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will timothy be coming to the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will thomas be in insurance meeting monday at noon\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"will teresa be at my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will roy be at our weekly team meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"will paul be going to the meeting on friday\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"will nicholas be attending the management meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 31,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"will nancy be at the morning briefing meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"will johnny be at office meeting today\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"will john be at marketing meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"will jimmy parker be attending the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will jane be at the 3 pm meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"will george be in the hr meeting at 1 o' clock\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"will ethan, yutian and k.j. be at the picnic\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 38,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"will ed be in the finance meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"attendees who will join the 5 pm meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"will bobby shen be at next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will anthony be at the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will amy be at today ' s meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"will amber join office meeting today\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"who's going to be at those two events\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who will be in the banking meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be attending picnic\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who will be at the kids game\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"who will attend the meeting at 4\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"who shall be joining the meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"who responded to meeting request\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the confirmed attendees\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is the 2 pm meeting with\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"who is participating tomorrow at 2 pm meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who is on my list for the 2 pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 26,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"show me who will attend family gathering\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me who will be at planning meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"show meeting participants\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is my morning meeting with\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"who is my first meeting with tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"who is in the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is in that meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is in my next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is going to tomorrow ' s meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to the meeting at 2 pm tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"who is going to attend the meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"who is coming the the meeting tomorrow at 2 pm\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending the meetings\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is attending the meeting on wednesday\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"who is attending the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is attending 2 pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"who else will be in banking meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"who else is going to the 2pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"who do i have next\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who am i meeting for dinner\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"who am i meeting at 10 am tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"who all will be present at the next 5 meetings\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who ' s in my 1st meeting today\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"find attendees who will attend 8 o ' clock meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to take a look at the attendee list\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is bruce young attending the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is charles wong going to be at the meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is joe going to be at the next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is victoria participating next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let me see who will attend party planning meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"list the attendees of the next meeting\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"list the participants for the 2 pm meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarWho\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"dial into conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dial marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"add me to conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add me to the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me on the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start the meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start my meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start my conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect to weekly marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"connect to conference call now\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to join conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to join the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect to conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me with my 2 o clock meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me with conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to the marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to the conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to the budget meeting conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"connect me to conference call with debra\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"connect me to 10 00 conf call with bryan\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"conference join\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join budget conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"join conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join current budget conf call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"join current conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join current conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"join lync meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join meeting now\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"join my meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join my next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join next link meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"join next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join next meeting on link\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the budget meeting conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"join the conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"join the next lync meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"link join my next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"link join next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lync join next meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call genpact conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call harris conference\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call into conference call\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call into marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"call into meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call the morning breifing conference number\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"call the weekly marketing meeting\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"nokia conference room join\",\n      \"intent\": \"Calendar.ConnectToMeeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will tyler be free on friday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"when will jordan be free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is samuel available tomorrow\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"when is dylan available\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is bryan free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is aaron free tomorrow\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"when does marry have time to join the appointment\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when does ellen have time to attend the meeting for business review\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when does ellen have time to attend the meeting\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do i have time to create a weekly meeting\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"when am i free today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"when am i free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is anna 's availability next tuesday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i available at 10 am on monday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available on monday at 9 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i available tomorrow at 5 30 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy on the 6th of february\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy on this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"am i busy this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"am i free at 5 pm today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free at 7 p . m .\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for drinks monday at 5\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for drinks monday at 5 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free for hiking on saturday at 8 am\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free from 3 pm - 10 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on monday at 9 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on saturday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free on the 12th of july\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free to drive with kim on thurs at 3 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tomorrow 3 pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 19,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tonight\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"am i free tuesday at 7 am\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"search jesse 's calendar for availability\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you check my dad 's calendar for free time this week\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 47,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me if my husband is free on sunday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"is virginia free on monday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"is theresa free october 9th\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"is saturday free\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 3,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"is russell free on friday at 4pm\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"is rebecca busy thursday at 4\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"is raymond free on monday evening\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"is nicholas available friday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"is madison busy\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is grace available for the daily scrum meeting with engineering team from 10 to 11\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 74,\n          \"endPos\": 75\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 80,\n          \"endPos\": 81\n        }\n      ]\n    },\n    {\n      \"text\": \"is gerald busy this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"is debra available on saturday\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"is carolyn available tuesday afternoon\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to know if my mother is available today\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 47,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any free time this weekend\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"display olivia 's availability\",\n      \"intent\": \"Calendar.CheckAvailability\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yup\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes yes\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes that ' s fine\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes thanks\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes sure\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes please\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes perfect\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes of course\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes it is\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes it does\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes indeed\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes add\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yep\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's right thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's great\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's correct\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that ' s right\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure go ahead\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"alright\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds great\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good okay\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay thanks\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay thank you\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"correct\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"great\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"excellent\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Calendar.Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve the conference room for 3pm tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"find a free meeting room for next tuesday\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule conference room with mary cooper for thursday at one\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 58,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"help me to find a meeting room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to book the room 102\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me to book a meeting room from 10 am to 3 pm\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"help me to book a conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find me an empty conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where shall we meet\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find an available meeting room from 3 to 5 tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 41,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"find a new meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need you to find a new meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to meet with bruce lee so book the conference room for thursday at one\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 62,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 74,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to meet with donna please book for thursday the conference room at one\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 74,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm looking for a conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve the conference room for 1 pm thursday because i need to have a meeting with amber\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve room 313 right away\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve room 258\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reserve room 101 now\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bing find me a conference room in the bravern this afternoon\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"book a conference room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a meeting\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is this room busy at 5 pm\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"is this room busy tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"check meeting room for tomorrow\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"let's find a new meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"locate another meeting location\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what meet rooms do i have\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book blue meeting room\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book the conference room for thursday at one i want to meet with benjamin\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"can you reserve room 649 right away\",\n      \"intent\": \"Calendar.FindMeetingRoom\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about my sunday schedule\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me something about shakespeare\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"detail about tomorrow's meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"detailed information about the next meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"details about the meeting with grace\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"details about the meeting with karen and tom\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please open my date with angela and tell me about it\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the meeting with daniel robert regarding\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is that meeting with ashley and jane berlin about\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my meeting with ming xu about\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is destiny ' s event for next week\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"can you tell me about master chief\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"what did the sister say about meeting on sunday\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what are the plans for the dinner date with stacey\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what are the particulars for the picnic next week\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"i need you to provide me the details of the meeting i have scheduled with my colleague amanda\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to know about my next appointment\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to know about my meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to know about my date with jimmy\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me all about dinner date with stephanie\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my schedule with afternoon\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my planned trip\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me about my next meeting\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about my meeting today\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meetings mary\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me details of the next appointment\",\n      \"intent\": \"Calendar.FindCalendarDetail\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel an appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel all events\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel 1 pm staff meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"delete my schedule for today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"delete that appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the 1st one from my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the appointment with jeffrey\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the appointment with mom\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete the scheduled meeting with zachary\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete this appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"discard the appointment with george\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"discard the meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete calendar event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete birthday calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"delete appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete an appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"drop my appointment for monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"decline my meeting on monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i need to delete this appointment from my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to delete an appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my schedule today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my schedule for tomorrow\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my schedule\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my calendar for january 29th\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"delete my schedule\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"remove final tutoring from my calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"remove dentist appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel appointment today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel appointments\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel calendar entry\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear all the appointments from my calendar for today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"clear all of my appointments today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel dinner\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"clear all of my appointments\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear all my appointments\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel doctor ' s appointment monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel tomorrow ' s plan\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel today ' s appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel this meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the untitled event on may twenty eighth\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the pickup food from ted\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the meeting with julie\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you cancel the 1st one\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel event tomorrow\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel lunch next wednesday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel meeting with abigail 3 pm today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel meeting with bob marlon 3pm today\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my adventureworks trip to seattle\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my appointment at 9 pm\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my appointment for october 4\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my driving lesson tomorrow\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my meeting at shanghai on monday at 10 am\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my next appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel my singing appointment on monday\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel my three o'clock appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel that appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the group meeting\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"cancel the event\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the appointment\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel the calendar\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2 hours meeting with ladawn padilla at 5 on tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 44,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"add a meeting with herman to my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add an appointment on may 8th at shanghai\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"add applied motion to my calendar 9 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add appt with helen ding for dinner on march 5th at 5 pm at dennys\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"add appt with mike li for dinner on march 5th at 5 pm at dennys\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 49,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"add balboa practice to my calendar at 3 30 today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"add ballet to my calendar wednesday at five thirty to six thirty pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 54,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"add baseball game on friday to calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"add chicago bulls versus washington wizards to my calendar tomorrow at seven pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 59,\n          \"endPos\": 66\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 71,\n          \"endPos\": 78\n        }\n      ]\n    },\n    {\n      \"text\": \"add choir practice on saturday at 7 pm to my personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add choreography to my family calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"add chorus concert to calendar for may 1st at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add church to personal calendar on sundays at 9\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"add coffee on august 12th at 2 pm with herman for one hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 14,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"add dance on tuesday at four o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"add date night on the 5th at 7pm every month\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment on tuesday june at the 1st clinic\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment to my calendar at 3:30 for the 8th of may\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 55,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointment to my calendar tomorrow from 3 to 4:30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 53,\n          \"endPos\": 53\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 58,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"add dentist appointments to my calendar at 3 thirty p m\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"add dinner to personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add dinner with mom to personal\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"add doctors appointment on march 13 at 2 pm at the original health clinic\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add doctors appointment on march 13 at 2 pm at the tiptop virginia beach clinic\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"add go shopping with john meng on the calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"add haircut to my google calendar tomorrow at 2 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add hope middle school meet and greet on my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add kane s dr appt to calendar for 3 friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"we make an appointment for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add maple beach to my calendar at 10 on sunday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"create calendar : tomorrow morning from 9 to 11 at 1103 room for internal meeting\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 45,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 65,\n          \"endPos\": 80\n        }\n      ]\n    },\n    {\n      \"text\": \"create appointment from tuesday to wednesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add megan training to calendar on july 4th at 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"add office party on march 8th from 6 p to 9 p\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add order cabinets to my calendar today at 2 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"add pay credit card to calendar may twentieth\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"add pay pearl fees on my calendar tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"add picture day at school to my calendar for friday, november the 8th from 8 am to 9:30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 68\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 75,\n          \"endPos\": 78\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 83,\n          \"endPos\": 86\n        }\n      ]\n    },\n    {\n      \"text\": \"add solo gig at civic hall on the 7th of march at 8 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 50,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"add team meeting to my calendar at 10pm with xiaoming wang\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"add the enviomential protection meeting from 9 am to 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 53,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"add the lunch with my colleague naomi from 12 to 2 in my personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 44\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 49,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"add ultimate frisbee on sunday at 2 pm for 2 hours\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add vacation to my calendar from july 4th until july 29th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 48,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar at 3 pm on friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar friday from 8 for an hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar sunday 10 till 5\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to calendar thursday 8 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to my calendar monday 6 am to 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"add work to my calendar today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"create appointment for 30 minutes\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an appointment with doctor lu from 8:30 am to 10:00 am tomorrow morning\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 42,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 53,\n          \"endPos\": 60\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 62,\n          \"endPos\": 69\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 71,\n          \"endPos\": 77\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting with tom34@outlook.com\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create a meeting from 9pm to tomorrow 6am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 38,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"append dad's birthday every july 21st\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"appending group meeting next monday at 11am for an hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"should you schedule to after lunch\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting for tomorrow 6pm with lucy chen\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 9:35am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"set up the appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up meeting with thomson\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up meeting with pura for every tuesday at 1 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 8am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an event in my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an appointment with tom\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an appointment with pura tomorrow at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"set up an appointment with pura\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set up an appointment with my sister in my main calendar.\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule yoga class from 2 pm to 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule work on thursday the thirty first from three to seven thirty\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 57,\n          \"endPos\": 68\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule work for 7 am tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 18,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule wedding anniversary on friday evening\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule wanda s graduation for saturday at 11 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule therapy appointment at 8 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule my vacation from today 5pm to tomorrow 5pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 48,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule miranda s graduation from 11 to 3 on may 28th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 41,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule mechanics exam at 12 pm on friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with pura at noon on wednesday may 20 minutes\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with madden on tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule lunch with madden for 11 30 am on wednesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule holiday on the 31st july\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule holiday for the thirty first of july\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule hair appointment on monday at 2 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule group meeting with madden on march 3rd at 4 00 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 51,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dry cleaning pick up at three thirty pm today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 49,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner with madden every friday at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner with madden at 6 pm on june 4th at spring restaurant\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dinner on the 8th at 6 thirty p m\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule dentist appointment with madden for may the 20th at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 45,\n          \"endPos\": 56\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 61,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule college for tomorrow at 5 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule camping for friday to sunday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule ben baig for saturday evening\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule art show on calendar for noon on march 6th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment yearly check up friday march one 10 am one hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 52\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 54,\n          \"endPos\": 58\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment for madden account payment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment at eight p m tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event on the calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event for the 5th of july\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an event for scrum with madden at 10 am saturday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 49,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an event for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment with mom\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment with madden tomorrow at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden today at 2 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden for wednesday the 20 4th at 9 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 59\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 64,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden at 10 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment with madden\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment to see cj on thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to groom my dogs at petco on friday at 6 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 53,\n          \"endPos\": 58\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 63,\n          \"endPos\": 66\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment to call meredith at 12\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on thursday october second at 8 forty am mom s medical appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 54,\n          \"endPos\": 63\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 65,\n          \"endPos\": 89\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on october 31st\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on november 5th at 3 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment on my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment on monday from noon to 4 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment from june 18th to june 20th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for tomorrow at one o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for thursday at 3 pm haircut\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 45,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for saturday at one 30 pm to measure house\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 48\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 53,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for saturday at 8 dinner with madden\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 40,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for one o clock today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for noon tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for my mom\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment for me tomorrow at 3 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me today\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me on tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule an appointment for 9 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 7:00pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"create a meeting at 6 o'clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create a event with eden roth at 4pm today for 30 mins\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"create a calendar appointment at 3:30 tomorrow for half an hour\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule an appointment for 10 30 in the morning on january 20 1st\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 52,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a workout with madden to my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a visit to the market this saturday at 10 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a vet appointment at 9 am on saturday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a soccer game for next friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a shopping trip with shawntia on friday at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a run at the lake with madden\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with ryan from 3-4pm on october 25th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 54\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with han lu 8 am next tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting with andy\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a meeting tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting on nov. 3 from 3-4pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 36,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for tomorrow at 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for this friday 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting for next thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a meeting\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a massage on tuesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a lunch meeting with my lead\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a lunch date with mom every tuesday at noon for the next 5 weeks\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 51\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 61,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctors appointment with madden on march 12th at 4 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 46,\n          \"endPos\": 55\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 60,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctors appointment at 15 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a doctor s office appointment for march 12th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dinner for tonight at 8 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dentist appointment for tomorrow night at 7 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a dental appointment tomorrow afternoon at five thirty pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a chiropractors appointment on july 7th at 4 o clock\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 47\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 52,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a calendar event for my sister\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"schedule a buisness lunch for my department at campus restaurant on wednesday at 11 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 68,\n          \"endPos\": 76\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 81,\n          \"endPos\": 88\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a breakfast meeting at 8 am tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"schedule a azure workshop from 9am to tomorrow 5pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 38,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting between 2 and 3 tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting between 2:30pm and 4:45pm tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 34,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 41,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"book a meeting in guangzhou at 6am on march 5th\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"put yoga on my calendar for mondays and wednesdays at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 40,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 54,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"put work on my calendar tomorrow from 8 30 to 5 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 38,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"put test appointment in my calendar tomorrow at 7\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"put tennis game for friday at 1 on calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"put swimming tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"put swimming in my calendar tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"put shopping day on april 1st at 10 am on calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"put mathematics paper one on tuesday 13\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"put julie hay in my calendar for tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"put jimmy on to doctor ken on october 20th at 3 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 13,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 46,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"put jason work on my calendar thursday 9 am to 5 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"put insanity on my calendar at 6 30 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"put hair appointment on calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"put eye doctor appointment saturday at 11 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"put doctor s appointment in my calendar for 5 forty next thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 44,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 52,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist on my calendar for this thursday at 10 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 43\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 48,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist appointment in my calendar tuesday 2 45 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 39,\n          \"endPos\": 45\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"put dentist appointment in my calendar for tomorrow at one pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 43,\n          \"endPos\": 50\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 55,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"put dental appointment on my calendar saturday march 22nd at twelve pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 56\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 61,\n          \"endPos\": 69\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance on my calendar from 6 to 7\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 35,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance on my calendar for monday 7 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"put dance class appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"put captains in my calendar for saturday evening\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 11\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 32,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 41,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"put anniversary on my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"book a recurring 1x1 meeting on the first monday of each month\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 7,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 36,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for 5 30 tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for 7 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment for me\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appointment on monday.\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment on personal calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appointment to play squash on thursday at 7 20\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment to see doctor culver august the 22nd 2013 1 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 20,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 38,\n          \"endPos\": 57\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 59,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"make appointment with tom roth.\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make appt for 3 pm on christmas\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"make me a calendar event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me a dentist appointment wednesday at two forty five\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 43,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me an appointment for next weekend\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment for ten forty next monday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 37,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment for the next week thursday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"make me an appointment on the calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me an appointment tomorrow at 2 30 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"please schedule an all hands meeting for 2 hours\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"please schedule a yoga class with my sister at 5pm every friday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 47,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 51,\n          \"endPos\": 62\n        }\n      ]\n    },\n    {\n      \"text\": \"march 15 dinner at refectory at 6 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 0,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 32,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"meet ming wang for lunch on tuesday at noon\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 39,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"meet with a.j. lee saturday at 3 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 31,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"meet with carol lee at home on march 10th at 4 pm\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 45,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with ben randie tomorrow at noon\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 36,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with ellen fung on monday at 9 am\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 37,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with jia li monday 3 30\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with morrison sun at 2 pm saturday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting with morrison yang at 4\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"please create a meeting from 2 to 3\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 34,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"place an appointment in my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"personal calendar 5/1/2013 meet mom for yard sale\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"on saturday at 7 thirty p m\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 3,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment for tomorrow\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment in calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment in my calendar\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new appointment next wednesday\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment today 6 pm see dead people\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 22,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"new appointment tomorrow at 3 pm at sunken\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"new calendar appointment\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar entry\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar event\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new calendar item\",\n      \"intent\": \"Calendar.CreateCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell next meeting that i'm running late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 23,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"tell everyone the meeting is now in room 204\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 14,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"tell attendees i am late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"alert attendees meeting is at 8 30\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 16,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"alert attendees of dinner meeting that i will be late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 39,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"alert quality control meeting participants that i am 15 minutes late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 6,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 48,\n          \"endPos\": 67\n        }\n      ]\n    },\n    {\n      \"text\": \"alert quality control meeting participants that the meeting will be 30 minutes later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 6,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 48,\n          \"endPos\": 83\n        }\n      ]\n    },\n    {\n      \"text\": \"send reminder of 9 am meeting to all participants 15 minutes later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 17,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"send a text to the people going to the meeting that the location has changed\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 52,\n          \"endPos\": 75\n        }\n      ]\n    },\n    {\n      \"text\": \"send a notice to paul that xu wen will attend the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 27,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"send a notice to douglas the first will be attending the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 25,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message to the meeting attendees that the meeting will now start at 8 30 am\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 45,\n          \"endPos\": 81\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message to johnny and jessie that our meeting today will be later by 30 minutes\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 41,\n          \"endPos\": 85\n        }\n      ]\n    },\n    {\n      \"text\": \"send a message out to cancel my 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 22,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"running late to my meeting please let jennifer know\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"running late for meeting - notify others\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"room 100 is location for this afternoon ' s meeting please notify others\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"remind all attendees of tomorrow ' s lunch that we have changed the venue\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 37,\n          \"endPos\": 41\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 48,\n          \"endPos\": 72\n        }\n      ]\n    },\n    {\n      \"text\": \"provide the time change for the meeting to all participants\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 8,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"please remind the attendee that i am running late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 32,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"please notify george that i will be late for the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 26,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"please notify everyone i ' m running late to the 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 23,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"please let them know i'm late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"please let all in work group know meeting to start at 9 15\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 34,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting room changed to new location send to meeting attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"meeting will start soon remind everybody involved\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"message colleagues that meeting needs to be moved to 8 : 30 am\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 24,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"message everyone advising that i will be late to the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 31,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"message nancy and tell him to postpone the meeting because i ' m going to be 30 minutes late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 30,\n          \"endPos\": 91\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform work contact group that i am running late for the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 38,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform the thomas that i will be late for the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 30,\n          \"endPos\": 59\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform meeting attendees that i am running late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 37,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform joshua that i will be late for our meeting today\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 26,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform colleagues we will be meeting at 8 : 30 due to being late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 25,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"please inform colleagues running late and meeting half hour later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 25,\n          \"endPos\": 64\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert those attending the meeting that i am running a few minutes late\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 46,\n          \"endPos\": 76\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert attendees meeting is at 8:30\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 23,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"please alert 3 o ' clock meeting attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 13,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"please advise i am late for 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"over run of time in confer room - all attendees to be notified of meeting being moved to next room - will explain why later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 66,\n          \"endPos\": 97\n        }\n      ]\n    },\n    {\n      \"text\": \"ok find out if that is possible by sending a meeting change notification to all attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify people of meeting on tue that it will begin 15-30 min later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 30\n        },\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 37,\n          \"endPos\": 65\n        }\n      ]\n    },\n    {\n      \"text\": \"notify others that i am going to be late to meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 19,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"my 9 o ' clock meeting can ' t start until 9 15 can you let everyone know\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 0,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"notify noah that our meeting is pushed back 30 minutes\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 17,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"notify kimberly that i will be late for our 3 pm meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 21,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"notify friday's 2 pm that we are cancelling the meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"notify diana that i ' ll be late to our meeting\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 18,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"notify attendees of office meeting that i will be a little later\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Message\",\n          \"startPos\": 40,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"notify all attendees about the change\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"notify all attendees\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"new location for meeting this afternoon let others attendees know meeting is now in room 100\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 25,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"calendar for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"which will be my next flight\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"which is my next event\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have any appointments today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 27,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have any meetings today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything from 11 to 2\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 30,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything on wednesday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"do i have anything today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"when and where is my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's my first meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what's happening tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what's going on this week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"look up my next appointment for me\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what was my first appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what meetings do i have next week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"locate the next appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is timothy doing today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the schedule before that\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"obtain the appointment with frank\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is on my calendar today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"check janice 's calendar for this weekend\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"check kronos calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is next in calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my schedule tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my schedule for tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what is my next appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"check my family calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my 1st meeting today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"what is logan 's schedule this week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what is henry doing on monday at noon\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"check my mom's schedule\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what i'm doing this weekend\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what i am doing next week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what have i got on tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to do tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have to do this afternoon\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 21,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have this afternoon\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have on sunday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have on my calendar today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 30,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have next\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do i have going on today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have from monday through wednesday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 35,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have from 2 to 4 on saturday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 25,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.EndDate\",\n          \"startPos\": 30,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what do i have for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my meetings at night\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my appointments today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what are my appointments for this week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"what appointments do i have tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing tonight\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing on june ninth\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what am i doing next week\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 16,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s the meeting today between 10 and 12:00\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 35,\n          \"endPos\": 36\n        },\n        {\n          \"entity\": \"Calendar.EndTime\",\n          \"startPos\": 42,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my schedule today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my schedule for tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my schedule\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s on my calendar today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my calendar for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s on my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s next on my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s my schedule tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule like tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my schedule for tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s my next appointment\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what ' s my 1st meeting tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s my 1st appointment tomorrow\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s in my calendar for today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s happening today\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s going on this weekend\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"what ' s after that on my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"view ethan 's calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"view emily calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find a meeting about group meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting about plan\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting at 7pm from melissa\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 18,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from darren about status update\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from deborah about team session\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 34,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting from donna\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find a meeting subject daily meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with subject weekly report\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with title second lesson from amanda\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"find a meeting with title sharing from steven\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"the next appointment after that\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find me the meetings at 6\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"find me the meetings at 9 o'clock\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting around 2 to 6pm\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"find the meeting around 5 to 8 pm\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the events scheduled at calendar constitution hall\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the meeting with judith\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the meeting with timothy\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"find the next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get to my next event\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"at 10 am do i have a 30 minutes meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 3,\n          \"endPos\": 7\n        }\n      ]\n    },\n    {\n      \"text\": \"show my schedule at night\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"show me victoria 's calendar for monday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 33,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting with paul\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the meeting about online session\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the meeting about briefing session\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the calendar at night\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my schedule tonight\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my next meeting\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my google calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me my calendar for monday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"show me my calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me heather 's calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me brenda 's schedule for friday\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"show jean's calendar\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search the meeting with title employee orientation\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"search a meeting subject project proposal rehearsal\",\n      \"intent\": \"Calendar.FindCalendarEntry\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 25,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"about how long will the meeting last\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"minutes in lunch break\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"how long will my dentist appointment last\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 17,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is the movie jurassic world\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 16,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is the event\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long is that meeting going to last\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long is my meeting at 4\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 26,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my facial time\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my dentist appointment\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is my 4 o'clock meeting\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how long do i have for lunch\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time as of now is set for the bill payments\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 39,\n          \"endPos\": 51\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time between schedule thursday meetings next week\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 49,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have for a lunch break today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 42,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the duration of the weekly sharing\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have for lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have to take back the movie\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do we have for lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time does my meeting take up\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time for lunch today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is open today\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is set for the bill payments\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time is there for errands during my lunch break\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 45,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time out on lunch\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how long is my 4 oclock meeting\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 23,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me how long is today ' s lunch break\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"tell me the duration of the product introducation\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time will i have to pick up groceries\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"time for lunch errands\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 9,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"today ' s lunch will be how long\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        },\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"total lunch break time today please\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 6,\n          \"endPos\": 16\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"duration of machine learning talk\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 12,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"is it going to last long\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what allotted time is for hair dresser\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"is my lunch long enough for errands\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 28,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"please tell me how long i have for lunch\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 35,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"please show me how much time i have to run errands\",\n      \"intent\": \"Calendar.FindDuration\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 39,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"please go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the main menu\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the last step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back the previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back please\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back one step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back a step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we should go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to go back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to the previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to previous step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return please\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back one step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back the last step\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please return back\",\n      \"intent\": \"Calendar.GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course not\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at this time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not for me, thanks\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not him\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"abort that\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i already have meeting 3pm tomorrow afternoon\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        },\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 31,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"no, i won't\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's wrong\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's the wrong room\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"maybe another time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's the wrong person\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it doesn't work for me\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ohh no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not now\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wrong place\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"negative\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wrong\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, i'd like to meet her manager\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no, please don't\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this saturday\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 4,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"not this room\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this man\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this location\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm supposed to meet daisy, not katy\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm not available next monday afternoon\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 18,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm busy at that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm afraid i can't\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd rather not. thanks\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not this conference room, please change\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i think not\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right, schedule it as 1x1 meeting with yolanda\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 26,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"please find another meeting room\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's not right\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have other things to do at that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the contact name is wrong, it's daisy\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like the time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like that time\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i can't go there\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh no\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i cannot make it\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this time slot doesn't work for me\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is review meeting, not 1x1 meeting\",\n      \"intent\": \"Calendar.Reject\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 8,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"could you show the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the last one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next one please\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are the next 3 events on my calendar\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is my next event\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"Calendar.ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to check the previous appointment\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the previous meeting with tiffany\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"Calendar.ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me how much free time i have before next appt\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much longer until my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"time before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time until noon\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartTime\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time until next scheduled appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time until my meeting with lori\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me how much time before my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do i have any spare time before next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time remaining till next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know the time left for my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time is there before office meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 30,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have until my meeting with larry\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how many minutes free do i have before next scheduled appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have until my doc appt\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 40\n        }\n      ]\n    },\n    {\n      \"text\": \"show time before next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have until i start the meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have until i have to meet with michael\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 40,\n          \"endPos\": 43\n        }\n      ]\n    },\n    {\n      \"text\": \"how much time do i have free until my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have before my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time do i have\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time before next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much time before lunch\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"how long is it until the 14th of march\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 25,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till disneyland paris\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 14,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"how long till my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"time remaining\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much longer until my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long till the next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long until christmas\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how long until my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long until my next meeting\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how long until the social\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 19,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"how long will i wait for the next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how many days is it until christmas\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 26,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days left until the opening ceremony\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days till april\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days till christmas\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until june the fifteenth\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until june the fifteenth 2019\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until march twenty six\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until my doctor ' s appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 23,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"can you show me the time remaining before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how many days until thanksgiving\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 20,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"how many days until the 10th of december\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.StartDate\",\n          \"startPos\": 24,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours left till the closing ceremony\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 29,\n          \"endPos\": 44\n        }\n      ]\n    },\n    {\n      \"text\": \"check on the time to see when i go to school and pick up mark\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 60\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours remaining till next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much longer do i have before pick up mary from school\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 33,\n          \"endPos\": 56\n        }\n      ]\n    },\n    {\n      \"text\": \"how many hours until my doc appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 24,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how many minutes before my next appointment\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much longer do i have until pick up john from school\",\n      \"intent\": \"Calendar.TimeRemaining\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 32,\n          \"endPos\": 55\n        }\n      ]\n    },\n    {\n      \"text\": \"running late for the board meeting alert catherine dennis and all the other attendees\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Calendar.Subject\",\n          \"startPos\": 21,\n          \"endPos\": 33\n        }\n      ]\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"^i (want to|would like to|'d like to) (join|attend) the {Calendar.Subject}^\",\n      \"intent\": \"Calendar.AcceptEventEntry\"\n    },\n    {\n      \"pattern\": \"^does {personName} have time at {Calendar.StartTime}\",\n      \"intent\": \"Calendar.CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^is {personName} (available|free) from {Calendar.StartTime} to {Calendar.EndTime} [on {Calendar.StartDate}]\",\n      \"intent\": \"Calendar.CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^do i have time (at|on|for) {Calendar.StartTime} [on] {Calendar.StartDate}\",\n      \"intent\": \"Calendar.CheckAvailability\"\n    },\n    {\n      \"pattern\": \"^is (this|the|that) (meeting|conference) room (available|booked) [(at|on|for)] [{Calendar.StartDate}] [(at|on|for)] [{Calendar.StartTime}]^\",\n      \"intent\": \"Calendar.FindMeetingRoom\"\n    },\n    {\n      \"pattern\": \"^(clear|delete|remove) (my|the) calendar from {Calendar.StartTime} to {Calendar.EndTime}^\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^(remove|cancel|delete) (the|my) {Calendar.Subject} [at {Calendar.StartTime}] [{Calendar.StartDate}]^\",\n      \"intent\": \"Calendar.DeleteCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] from [{Calendar.StartDate}] {Calendar.StartTime} to [{Calendar.EndDate}] {Calendar.EndTime}\",\n      \"intent\": \"Calendar.CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] between {Calendar.StartTime} and {Calendar.EndTime}\",\n      \"intent\": \"Calendar.CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"(create|book|schedule) (a|an) (meeting|appointment|event) [with {personName}] (at|for|on) [{Calendar.StartDate}] [{Calendar.StartTime}]\",\n      \"intent\": \"Calendar.CreateCalendarEntry\"\n    },\n    {\n      \"pattern\": \"^(remind|inform|tell) (the|all) attendees {Calendar.Message}^\",\n      \"intent\": \"Calendar.ContactMeetingAttendees\"\n    },\n    {\n      \"pattern\": \"^[(show|display)] next [page] [please]^\",\n      \"intent\": \"Calendar.ShowNext\"\n    },\n    {\n      \"pattern\": \"^i (want to|need to|would like to) (attend|join) {Calendar.Subject}, [please] add it.^\",\n      \"intent\": \"Calendar.ShowNext\"\n    },\n    {\n      \"pattern\": \"^how long do i have (until|before|till) the [next] (meeting|appointment|{Calendar.Subject})\",\n      \"intent\": \"Calendar.TimeRemaining\"\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"personName\",\n      \"roles\": []\n    }\n  ],\n  \"name\": \"all_imports\",\n  \"culture\": \"en-us\",\n  \"versionId\": \"0.1\",\n  \"luis_schema_version\": \"3.2.0\",\n  \"desc\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/collate-qna.json",
    "content": "{\n  \"urls\": [\n    \"https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs\"\n  ],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"You can change the default message if you use the QnAMakerDialog. \\r\\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How can I change the default message from QnA Maker?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can use our REST apis to manage your KB. \\r\\n\\\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I programmatically update my KB?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Vishwac\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your ceo?\",\n        \"get me your ceo info\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can change the default message if you use the QnAMakerDialog. \\r\\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I change the default message\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can get coffee in our Seattle store at 1 pike place, Seattle, WA\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where can I get coffee?\",\n        \"I need coffee\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"location\",\n          \"value\": \"seattle\"\n        }\n      ]\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can get coffee in our Portland store at 52 marine drive, Portland, OR\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where can I get coffee?\",\n        \"I need coffee\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"location\",\n          \"value\": \"portland\"\n        }\n      ]\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What is Ludown?\",\n        \"ludown cli\",\n        \"where can i get more information about ludown cli?\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"ludown\",\n          \"value\": \"awesome\"\n        }\n      ]\n    }\n  ],\n  \"files\": [\n    {\n      \"fileName\": \"SurfaceManual.pdf\",\n      \"fileUri\": \"https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf\"\n    }\n  ],\n  \"name\": \"collate-qna\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/collate_Alterations.json",
    "content": "{\n  \"wordAlterations\": [\n    {\n      \"alterations\": [\n        \"botframework\",\n        \"bot framework\",\n        \"Azure bot service\"\n      ]\n    },\n    {\n      \"alterations\": [\n        \"qnamaker\",\n        \"qna maker\",\n        \"QnA Maker\",\n        \"question and answer pairs\"\n      ]\n    },\n    {\n      \"alterations\": [\n        \"webchat\",\n        \"web chat\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/collate_alteration_gen.lu",
    "content": "> ! Automatically generated by [LUDown CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown), Thu Jul 19 2018 19:49:12 GMT-0700 (Pacific Daylight Time)\n\n> ! Source LUIS JSON file: Not Specified\n\n> ! Source QnA TSV file: Not Specified\n\n> ! Source QnA Alterations file: test\\verified\\collate_Alterations.json\n\n> # QnA Alterations\n\n$botframework : qna-alterations = \n- bot framework\n- Azure bot service\n\n$qnamaker : qna-alterations = \n- qna maker\n- QnA Maker\n- question and answer pairs\n\n$webchat : qna-alterations = \n- web chat\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/collate_refresh.lu",
    "content": "\n> # Intent definitions\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n\n## Help\n- help\n- I need help\n- please help\n- can you help\n\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- delete alarm\n- remove the {alarmTime} alarm\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n- set call as my communication preference\n- I prefer to receive text messages\n- set {commPreference} as my communication preference\n- I prefer to receive {commPreference}\n\n\n## Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat\n\n\n## changeAlarm\n- change an alarm\n- change {remTime} to {newTime}\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## addAlarm\n- create an alarm for 7AM\n- create an alarm for {datetimeV2}\n\n\n## Menu\n- I want {foodType=sandwich}\n- can you get me some {foodType}\n- please get me a {drinkType}\n- get me some {drinkType}\n\n\n> # Entity definitions\n\n$userName:simple\n\n$foodType:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:datetimeV2\n\n\n> # Phrase list definitions\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:phraseList interchangeable\n- are you,you are\n\n> # List entities\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n\n\n$drinkType:soda=\n- pop\n- fountain drink\n\n\n\n> # RegEx entities\n\n\n> # QnA pairs\n\n> Source: custom editorial\n## ? How can I change the default message from QnA Maker?\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n```\n\n> Source: custom editorial\n## ? How do I programmatically update my KB?\n\n```markdown\nYou can use our REST apis to manage your KB. \n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> Source: custom editorial\n## ? Who is your ceo?\n- get me your ceo info\n\n```markdown\nVishwac\n```\n\n> Source: custom editorial\n## ? How do I change the default message\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog. \nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n```\n\n> Source: custom editorial\n## ? Where can I get coffee?\n- I need coffee\n\n\n**Filters:**\n- location = seattle\n\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n> Source: custom editorial\n## ? Where can I get coffee?\n- I need coffee\n\n\n**Filters:**\n- location = portland\n\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> Source: custom editorial\n## ? What is Ludown?\n- ludown cli\n- where can i get more information about ludown cli?\n\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n> # QnA Alterations\n\n$botframework : qna-alterations = \n- bot framework\n- Azure bot service\n\n$qnamaker : qna-alterations = \n- qna maker\n- QnA Maker\n- question and answer pairs\n\n$webchat : qna-alterations = \n- web chat\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/collated-luis.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    },\n    {\n      \"name\": \"Buy chocolate\"\n    },\n    {\n      \"name\": \"changeAlarm\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"addAlarm\"\n    },\n    {\n      \"name\": \"Menu\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"foodType\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"fax\",\n          \"list\": [\n            \"fax\",\n            \"fascimile\"\n          ]\n        }\n      ],\n      \"roles\": []\n    },\n    {\n      \"name\": \"drinkType\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"soda\",\n          \"list\": [\n            \"pop\",\n            \"fountain drink\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"ChocolateType\",\n      \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n      \"mode\": false,\n      \"activated\": true\n    },\n    {\n      \"name\": \"question\",\n      \"words\": \"are you,you are\",\n      \"mode\": true,\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete alarm\",\n      \"intent\": \"DeleteAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text messages\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can I get some m&m\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I want some twix\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I would like to buy some kit kat\",\n      \"intent\": \"Buy chocolate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change an alarm\",\n      \"intent\": \"changeAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"santa wants a blue ribbon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"addAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I want sandwich\",\n      \"intent\": \"Menu\",\n      \"entities\": [\n        {\n          \"entity\": \"foodType\",\n          \"startPos\": 7,\n          \"endPos\": 14\n        }\n      ]\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"set {commPreference} as my communication preference\",\n      \"intent\": \"CommunicationPreference\"\n    },\n    {\n      \"pattern\": \"I prefer to receive {commPreference}\",\n      \"intent\": \"CommunicationPreference\"\n    },\n    {\n      \"pattern\": \"change {remTime} to {newTime}\",\n      \"intent\": \"changeAlarm\"\n    },\n    {\n      \"pattern\": \"create an alarm for {datetimeV2}\",\n      \"intent\": \"addAlarm\"\n    },\n    {\n      \"pattern\": \"can you get me some {foodType}\",\n      \"intent\": \"Menu\"\n    },\n    {\n      \"pattern\": \"please get me a {drinkType}\",\n      \"intent\": \"Menu\"\n    },\n    {\n      \"pattern\": \"get me some {drinkType}\",\n      \"intent\": \"Menu\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"remTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"newTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"collated-luis\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/collated-luis_LUISBatchTest.json",
    "content": "[\n  {\n    \"text\": \"Hi\",\n    \"intent\": \"Greeting\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"Hello\",\n    \"intent\": \"Greeting\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"Good morning\",\n    \"intent\": \"Greeting\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"Good evening\",\n    \"intent\": \"Greeting\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"help\",\n    \"intent\": \"Help\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"I need help\",\n    \"intent\": \"Help\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"please help\",\n    \"intent\": \"Help\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"userName\",\n        \"startPos\": 0,\n        \"endPos\": 6\n      }\n    ]\n  },\n  {\n    \"text\": \"I'm vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"userName\",\n        \"startPos\": 4,\n        \"endPos\": 10\n      }\n    ]\n  },\n  {\n    \"text\": \"call me vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"userName\",\n        \"startPos\": 8,\n        \"endPos\": 14\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 0,\n        \"endPos\": 4\n      }\n    ]\n  },\n  {\n    \"text\": \"my name is vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"userName\",\n        \"startPos\": 11,\n        \"endPos\": 17\n      }\n    ]\n  },\n  {\n    \"text\": \"vishwac is my name\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"userName\",\n        \"startPos\": 0,\n        \"endPos\": 6\n      }\n    ]\n  },\n  {\n    \"text\": \"you can call me vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"userName\",\n        \"startPos\": 16,\n        \"endPos\": 22\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 8,\n        \"endPos\": 12\n      }\n    ]\n  },\n  {\n    \"text\": \"create an alarm\",\n    \"intent\": \"CreateAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"create an alarm for 7AM\",\n    \"intent\": \"CreateAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"set an alarm for 7AM next thursday\",\n    \"intent\": \"CreateAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"delete the {alarmTime} alarm\",\n    \"intent\": \"DeleteAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"set phone call as my communication preference\",\n    \"intent\": \"CommunicationPreference\",\n    \"entities\": [\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 4,\n        \"endPos\": 14\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 10,\n        \"endPos\": 14\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 4,\n        \"endPos\": 9\n      }\n    ]\n  },\n  {\n    \"text\": \"I prefer to receive text message\",\n    \"intent\": \"CommunicationPreference\",\n    \"entities\": [\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 25,\n        \"endPos\": 32\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 20,\n        \"endPos\": 24\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 20,\n        \"endPos\": 32\n      }\n    ]\n  },\n  {\n    \"text\": \"can you help\",\n    \"intent\": \"Help\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"delete alarm\",\n    \"intent\": \"DeleteAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"set call as my communication preference\",\n    \"intent\": \"CommunicationPreference\",\n    \"entities\": [\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 4,\n        \"endPos\": 8\n      }\n    ]\n  },\n  {\n    \"text\": \"I prefer to receive text messages\",\n    \"intent\": \"CommunicationPreference\",\n    \"entities\": [\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 25,\n        \"endPos\": 32\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 20,\n        \"endPos\": 24\n      },\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 20,\n        \"endPos\": 32\n      }\n    ]\n  },\n  {\n    \"text\": \"vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"I'm vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"call me vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 0,\n        \"endPos\": 4\n      }\n    ]\n  },\n  {\n    \"text\": \"my name is vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"vishwac is my name\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"you can call me vishwac\",\n    \"intent\": \"AskForUserName\",\n    \"entities\": [\n      {\n        \"entity\": \"commPreference\",\n        \"startPos\": 8,\n        \"endPos\": 12\n      }\n    ]\n  },\n  {\n    \"text\": \"set {commPreference} as my communication preference\",\n    \"intent\": \"CommunicationPreference\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"can I get some m&m\",\n    \"intent\": \"Buy chocolate\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"I want some twix\",\n    \"intent\": \"Buy chocolate\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"I would like to buy some kit kat\",\n    \"intent\": \"Buy chocolate\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"change an alarm\",\n    \"intent\": \"changeAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"who is your ceo?\",\n    \"intent\": \"None\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"santa wants a blue ribbon\",\n    \"intent\": \"None\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"create an alarm for 7AM\",\n    \"intent\": \"addAlarm\",\n    \"entities\": []\n  },\n  {\n    \"text\": \"I want sandwich\",\n    \"intent\": \"Menu\",\n    \"entities\": [\n      {\n        \"entity\": \"foodType\",\n        \"startPos\": 7,\n        \"endPos\": 14\n      }\n    ]\n  }\n]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/de/all.lu",
    "content": "# Greeting\n- Hallo\n- Hallo\n- Guten Morgen\n- Guten Abend\n\n# Help\n- Hilfe\n- Ich brauche Hilfe\n- Bitte helfen\n\n# AskForUserName\n-  {userName=Vishwac} \n- I ' m  {userName=Vishwac} \n- Ruf mich an  {userName=Vishwac} \n- Mein Name ist  {userName=Vishwac} \n-  {userName=Vishwac} Mein Name\n- Du kannst mich anrufen  {userName=Vishwac} \n\n> # Entity-Definitionen\n$userName:simple\n\n> PREBUILT-Unternehmen sind global. LUIS wird immer Ergebnisse dafür liefern, wenn jemals ein vorgebautes Gebilde in einer Äußerung gefunden wird.\n\n$PREBUILT:datetimeV2\n\n# CreateAlarm\n- Alarm schlagen\n- Alarm für 7 Uhr\n- Alarmstufe für 7 Uhr am nächsten Donnerstag\n\n> fügen Sie diese als Muster hinzu\n\n# DeleteAlarm\n> Diese Äußerung wird als Muster hinzugefügt, da es keinen markierten Wert für die Alarmzeiteinheit gibt.\n\n- Löschen der  {alarmTime} Alarm\n- Entfernen Sie die  {alarmTime} Alarm\n\n> Da es eine Definition der Listeneinheit gibt, werden alle Synonyme in dieser Liste als Listengewürgertyp aufgegriffen und sollten nicht gekennzeichnet werden.\n# CommunicationPreference\n- Setzen Sie Anrufe als Kommunikationspräferenz\n- Ich ziehe es vor, eine SMS zu erhalten\n\n> Liste der Unternehmensdefinition\n\n$commPreference:call=\n- Telefonruf\n- Geben Sie mir einen Ring\n- Ring\n- Aufrufen\n- Handy\n- Telefon\n\n# Help\n- Können Sie helfen\n\n> Sie können Listendefinitionen der Entität in mehrere Stücke zerlegen, in eine .lu-Datei eingeteilt oder sogar über .lu-Dateien verteilt werden.\n\n$commPreference:text=\n- Nachricht\n- Text\n- Sms\n- SMS\n\n$commPreference:fax=\n- Fax\n- Faschimilden\n\n> Sie können Hinweise auf externe .lu-Dateien haben\n\n[Keine Absicht definieren](./none.lu)\n\n[Schokoladen-Definition kaufen](./buyChocolate.lu)\n\n> # QnA Definitionen\n> Dies ist eine QnA-Definition. Folgt #? Frage: \\ <Liste der Fragen \\ > \\ ' ' Markdown \\ <Answer> ' ' ' Format\n\n> Sie können URLs für QnA-Hersteller mit dem #URL Referenzschema in die Aufnahme einfügen.\n### ? Wie ändere ich die Standardnachricht?\n```markdown\nSie können die Standardnachricht ändern, wenn Sie den QnAMakerDialog verwenden.\nSiehe [diesen Link] (https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) für Details.\n```\n\n### ? Wie kann ich meine KB programmatisch aktualisieren?\n```markdown\nSie können mit unserem REST apis Ihre KB verwalten.\n\\ #1. Weitere Informationen: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> Sie können URLs für QnA-Hersteller mit dem #URL Referenzschema in die Aufnahme einfügen.\n\n[QnA URL-faqs](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n\n> Sie können auch Mehrfachfragen für eine einzelne Antwort definieren\n### ? Wer ist Ihr ceo?\n- holt mich Ihre ceo info\n```markdown\nVishwac\n```\n\n> Sie können Filter für QnA mit den \\ * * Filtern: * * \\ <Liste des Namens = Wertepaare \\ > Format definieren.\n### ? Wo bekomme ich Kaffee?\n- Ich brauche Kaffee\n\n**Filters:**\n- Standort = Seattle\n```markdown\nKaffee bekommen Sie in unserem Geschäft in Seattle am 1 Pike Place, Seattle, WA\n```\n\n### ? Wo bekomme ich Kaffee?\n- Ich brauche Kaffee\n\n**Filters:**\n- Lage = portland\n```markdown\nSie können Kaffee in unserem Portland Store bei 52 Marine-Antrieb, Portland, OR\n```\n\n> FAQ URLs für QnA-Hersteller zu sich zu nehmen.\n\n[QnA-Hersteller-Bezug](https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs)\n\n[QnA-Bezug](./qna7.lu)\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/de/faq.lu",
    "content": "> # QnA pairs\n\n## ? Was ist ein virtueller Assistent?\n```markdown\nWir haben ein erhebliches Bedürfnis unserer Kunden und Partner gesehen, einen auf ihre Marke zugeschnittenen, auf ihre Kunden zugeschnittenen und über eine breite Palette von Konversationsgeräten und-geräten zugeschnittenen Assistenten zu liefern. Die Open-Source-Lösung Custom Personal Assistant von Microsoft setzt den Open-Sourcing-Ansatz für Bot Framework SDK fort und bietet die volle Kontrolle über die Erfahrung des Endverbrauchers, die auf einer Reihe von grundlegenden Fähigkeiten basiert. Darüber hinaus kann die Erfahrung mit Intelligenz über den Endverbraucher und alle deviko/Ökosystem-Informationen für eine wirklich integrierte und intelligente Erfahrung durchdrungen werden.\nWeitere Informationen [hier] (https:/github.com/Microsoft/AI/blob/solutions/Virtual-Assistant/docs/README.md).\n```\n\n## ? Was ist eine Fähigkeit?\n```markdown\nEs gibt eine breite Palette gemeinsamer Fähigkeiten, die heute von jedem Entwickler gezwungen werden, sich selbst aufzubauen. Unsere Virtual-Assistant-Lösung beinhaltet eine neue Skill-Fähigkeit, die es ermöglicht, neue Fähigkeiten nur durch Konfiguration in einen virtuellen Assistenten einzubinden und einen Authentifizierungsmechanismus für Skills bereitzustellen, um Token für nachgelagerte Aktivitäten anzufordern.\nErfahren Sie mehr [hier] (https:/github.com/Microsoft/AI/blob/solutions/Virtual-Assistenten-skills.md).\n```\n\n## ? Was kann die Kalenderqualifikationen tun?\n```markdown\n# # Übersicht\nDie Kalenderkompetenz bietet einem virtuellen Assistenten die kalendarbezogenen Fähigkeiten. Die gängigsten Szenarien wurden in dieser ersten Version mit zusätzlichen Szenarien in der Entwicklung umgesetzt.\n# # Supported Scenarios\nFolgende Szenarien werden derzeit von der Fähigkeit unterstützt:\n-Zusammenfassung der Besprechung-z.B. \"Was ist in meinem Kalender\"\n-Nächstes Treffen-z.B. \"Was ist mein nächstes Treffen\"\n-Erstellen Sie ein Meeting-z.B. ein Meeting buchen\n-Update a meeting-z.B. Update meeting\n-Treffen löschen-z.B. Treffen löschen\n```\n\n## ? Was kann die E-Mail-Fähigung tun?\n```markdown\n# Übersicht\nDie E-Mail-Fähigung stellt E-Mail-bezogene Fähigkeiten an einen virtuellen Assistenten zur Verfügung. Die gängigsten Szenarien wurden in dieser ersten Version mit zusätzlichen Szenarien in der Entwicklung umgesetzt.\n\n# # Supported Scenarios\nFolgende Szenarien werden derzeit von der Fähigkeit unterstützt:\n\n-Senden Sie eine E-Mail\n-Senden Sie eine E-Mail an John Smith\n-Senden Sie eine E-Mail\n-E-Mail finden\n-E-Mail von John Smith finden\n-Welche E-Mail habe ich\n```\n## ? Was kann der Punkt der Zinskompetentlichkeit tun?\n```markdown\n# # Übersicht\nDie \"Point of Interest Skill\" bietet einem virtuellen Assistenten poI-bezogene Fähigkeiten. Die gängigsten Szenarien wurden in dieser ersten Version mit zusätzlichen Szenarien in der Entwicklung umgesetzt.\n\n# # Supported Scenarios\nFolgende Szenarien werden derzeit von der Fähigkeit unterstützt:\n\n-NAVIGATION _ ROUTE _ FROM _ X _ TO _ Y\n-Wie kommt man am schnellsten zur 221B Baker Street?\n-Wie komme ich zum Lebensmittelgeschäft?\n-Ich brauche eine Anfahrt zu einem Café\n-NAVIGATION _ FIND _ POINTOFINTEREST\n-Was ist in der Nähe?\n-Gibt es Apotheken in der Stadt?\n-Können Sie ein preiswertes Restaurant in Seattle empfehlen?\n-NAVIGATION _ CANCEL _ ROUTE\n-Ich will nicht mehr in den Laden\n-Möchten Sie meine Route abbrechen?\n-Am zweiten Gedanken vergessen, zum Flughafen zu gehen\n```\n\n## ? Was kann die ToDo Skill tun?\n```markdown\n# # Übersicht\nDie Task Skill bietet einem virtuellen Assistenten aufgabenbezogene Fähigkeiten. Die gängigsten Szenarien wurden in dieser ersten Version mit zusätzlichen Szenarien in der Entwicklung umgesetzt.\n\n# # Supported Scenarios\nFolgende Szenarien werden derzeit von der Fähigkeit unterstützt:\n\n-Eine Aufgabe hinzufügen\n-Erinnern Sie mich, Milch zu holen\n-Aufgaben hinzufügen\n-Aufgaben finden\nWelche Aufgaben habe ich\n```\n\n## ? Was ist neu\n```markdown\nDer Virtual Assistant hat vor kurzem eine neue Lokalisierung für den virtuellen Assistenten und Fähigkeiten veröffentlicht, die die Verwendung in Englisch, Französisch, Italienisch, Deutsch, Spanisch und Chinesisch ermöglicht.\n```\n\n> Source:\n## ? Was ist das für gelbes Licht?\n```markdown\nWenn die Reifendruckmesslampe gelb aufkommt, dann ist der Reifendruck etwa 10% oder mehr ausgeschaltet.\n```\n\n> Source:\n## ? Wie kann ich einen Fehler anheben?\n```markdown\nErstellen Sie eine Ausgabe auf dem [GitHub repo] (https:/github.com/Microsoft/AI/blob/solutions/Virtual-Assistant/docs/README.md)\n```\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/de/reduced.lu",
    "content": "\n## ChangeCalendarEntry\n- Ändern  {Subject=Mittagstermin}  Von  {OriginalStartTime=11}  -  {OriginalEndTime=12}  An  {StartTime=12}  -  {EndTime=1 30} \n- move my  {OriginalStartTime=10 nach 10}   {Subject=Arztbesuch}  An  {StartTime=10} \n- Ändern  {Subject=Kino}   {SlotAttribute=Lage} \n- Ändern  {Subject=delevelopmentäre Agenda für das Mittagessen}   {StartDate=Morgen} \n- Ändern  {Subject=Zahnarzt-Termin} \n- Ändern  {Subject=Zahnarzt appt}  An  {MoveLaterTimeSpan=eine Stunde} Später\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/de/translate-with-number.lu",
    "content": "# Test\n-  {Number:numberOfAdults=2}  Erwachsene  {Number:numberOfChildren=1} kind\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/emptyIntentDescriptors.lu",
    "content": "\n> LUIS application information\n> !# @app.name = Json 6.0.0 Full Appaaaaaaaaaa\n> !# @app.desc = test\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n> !# @app.tokenizerVersion = 1.0.0\n\n\n> # Intent definitions\n\n## None\n\n\n## test\n- one\n- two\n\n\n> # Entity definitions\n\n@ ml address\n    - @ number doorNumber\n    - @ ml streetName\n    - @ geographyV2 city\n    - @ zipRegex zipcode\n\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt geographyV2\n\n@ prebuilt number\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n@ regex zipRegex = /[0-9]{5}/\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/importUrl.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"add\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"count\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"globalCount\",\n              \"isRequired\": true\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"globalCount\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"countNumber\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"number\",\n              \"isRequired\": true\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"add two apples\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"add\",\n          \"startPos\": 0,\n          \"endPos\": 13,\n          \"children\": [\n            {\n              \"entity\": \"count\",\n              \"startPos\": 4,\n              \"endPos\": 13\n            }\n          ]\n        },\n        {\n          \"entity\": \"globalCount\",\n          \"startPos\": 4,\n          \"endPos\": 13,\n          \"children\": [\n            {\n              \"entity\": \"countNumber\",\n              \"startPos\": 4,\n              \"endPos\": 6\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/luis_sorted.lu",
    "content": "\n> LUIS application information\n> !# @app.name = all\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n## AskForUserName\n- {@userName=vishwac}\n- I'm {@userName=vishwac}\n- call me {@userName=vishwac}\n- my name is {@userName=vishwac}\n- {@userName=vishwac} is my name\n- you can call me {@userName=vishwac}\n\n\n## Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- remove the {@alarmTime} alarm\n\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n\n## Help\n- help\n- I need help\n- please help\n- can you help\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## setThermostat\n- Please set {@deviceTemperature=thermostat to 72}\n- Set {@deviceTemperature={@customDevice=owen} to 72}\n\n\n## testIntent\n- I need a flight from {@fromDate=tomorrow} and returning on {@toDate=next thursday}\n\n\n> # Entity definitions\n\n@ ml customDevice\n\n@ ml userName\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n@ prebuilt datetimeV2 hasRoles fromDate,toDate\n\n@ prebuilt temperature\n\n\n> # Phrase list definitions\n\n@ phraselist ChocolateType = \n\t- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n@ phraselist question(interchangeable) = \n\t- are you,you are\n\n\n> # List entities\n\n@ list commPreference = \n\t- call :\n\t\t- phone call\n\t\t- give me a ring\n\t\t- ring\n\t\t- call\n\t\t- cell phone\n\t\t- phone\n\t- text :\n\t\t- message\n\t\t- text\n\t\t- sms\n\t\t- text message\n\t- fax :\n\t\t- fax\n\t\t- fascimile\n\n\n@ list device = \n\t- thermostat :\n\t\t- Thermostat\n\t\t- Heater\n\t\t- AC\n\t\t- Air conditioner\n\t- refrigerator :\n\t\t- Fridge\n\t\t- Cooler\n\n\n> # RegEx entities\n\n@ regex HRF-number = /hrf-[0-9]{6}/\n@ regex zander = /z-[0-9]{3}/\n\n> # Composite entities\n\n@ composite deviceTemperature = [device, customDevice, temperature]\n@ composite units = [temperature]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/merge_intents_disabled.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"Greeting.HelloGreeting\"\n    },\n    {\n      \"name\": \"Greeting.GoodbyeGreeting\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"dateTime\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hi vishwac\",\n      \"intent\": \"Greeting.HelloGreeting\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 3,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"Hello my name is vishwac\",\n      \"intent\": \"Greeting.HelloGreeting\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"Bye vishwac, see you tomorrow\",\n      \"intent\": \"Greeting.GoodbyeGreeting\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"dateTime\",\n          \"startPos\": 21,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"Bye Bye vishwac, see you at the same time tomorrow\",\n      \"intent\": \"Greeting.GoodbyeGreeting\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"dateTime\",\n          \"startPos\": 42,\n          \"endPos\": 49\n        }\n      ]\n    },\n    {\n      \"text\": \"Good Bye vishwac\",\n      \"intent\": \"Greeting.GoodbyeGreeting\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 9,\n          \"endPos\": 15\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/modelAsFeatureGen.lu",
    "content": "\n> LUIS application information\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n\n\n> # Intent definitions\n\n## test1\n- one\n\n\n@ intent test1 usesFeature test3\n\n## test2\n- two\n\n\n@ intent test2 usesFeature simple1\n\n## test3\n- three\n\n\n@ intent test3 usesFeature age\n\n> # Entity definitions\n\n@ ml simple1 usesFeatures phraselist1,age\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n\n> # Phrase list definitions\n\n@ phraselist phraselist1(interchangeable) disabledForAllModels = \n\t- who,why,where,what\n\n\n> # List entities\n\n@ list list1\n\n> # RegEx entities\n\n\n> # Composite entities\n\n@ composite composite1 usesFeatures phraselist1,list1 = [simple1, age]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/modelAsFeatures.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"test1\",\n      \"features\": [\n        {\n          \"modelName\": \"test3\"\n        }\n      ]\n    },\n    {\n      \"name\": \"test2\",\n      \"features\": [\n        {\n          \"modelName\": \"simple1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"test3\",\n      \"features\": [\n        {\n          \"modelName\": \"age\"\n        }\n      ]\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"simple1\",\n      \"roles\": [],\n      \"features\": [\n        {\n          \"featureName\": \"phraselist1\"\n        },\n        {\n          \"modelName\": \"age\"\n        }\n      ]\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"composite1\",\n      \"children\": [\n        \"simple1\",\n        \"age\"\n      ],\n      \"roles\": [],\n      \"features\": [\n        {\n          \"featureName\": \"phraselist1\"\n        },\n        {\n          \"modelName\": \"list1\"\n        }\n      ]\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"list1\",\n      \"subLists\": [],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"phraselist1\",\n      \"words\": \"who,why,where,what\",\n      \"mode\": true,\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"one\",\n      \"intent\": \"test1\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"test2\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"three\",\n      \"intent\": \"test3\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/modelAsFeatures.lu",
    "content": "\n# test1\n- one\n\n# test2\n- two\n\n# test3\n- three\n\n> model as feature to model\n@ intent test1 usesFeature test3\n@ intent test2 usesFeature simple1\n@ intent test3 usesFeature age\n@ ml simple1 usesFeature phraselist1\n@ ml usesFeature age\n\n@ list list1\n> pl as a feature to model\n\n@ prebuilt age\n\n@ phraselist phraselist1(interchangeable) = \n\t- who,why,where,what\n\n@ composite composite1 usesFeature phraselist1 = [simple1, age]\n@ composite1 usesFeature list1\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/modelInfo.lu",
    "content": "\n> LUIS application information\n> !# @app.name = all\n> !# @app.desc = \n> !# @app.culture = en-us\n> !# @app.versionId = 0.1\n> !# @app.luis_schema_version = 3.2.0\n\n> # Intent definitions\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n\n## Buy chocolate\n- I would like to buy some kit kat\n- I want some twix\n- can I get some m&m\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## CreateAlarm\n- create an alarm for 7AM\n- create an alarm\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- remove the {alarmTime} alarm\n\n\n## Greeting\n- Hi\n- Good morning\n- Good evening\n- Hello\n\n\n## Help\n- can you help\n- please help\n- I need help\n- help\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## setThermostat\n- Please set {deviceTemperature=thermostat to 72}\n- Set {deviceTemperature={customDevice=owen} to 72}\n\n\n## testIntent\n- I need a flight from {datetimeV2:fromDate=tomorrow} and returning on {datetimeV2:toDate=next thursday}\n\n\n> # Entity definitions\n\n$customDevice:simple\n\n$userName:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:age\n\n$PREBUILT:datetimeV2 Roles=fromDate, toDate\n\n$PREBUILT:temperature\n\n\n> # Phrase list definitions\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:phraseList interchangeable\n- are you,you are\n\n> # List entities\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n\n\n$device:thermostat=\n- Thermostat\n- Heater\n- AC\n- Air conditioner\n\n$device:refrigerator=\n- Fridge\n- Cooler\n\n\n\n> # RegEx entities\n\n$HRF-number:/hrf-[0-9]{6}/\n$zander:/z-[0-9]{3}/\n\n> # Composite entities\n\n$deviceTemperature:[device, customDevice, temperature]\n$units:[temperature]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/multiturn.json.qna",
    "content": "> # QnA pairs\n\n<a id = \"1\"></a>\n\n> !# @qna.pair.source = xyz\n\n## ? hello\n\n**Filters:**\n- a = b\n\n```markdown\nhi there\n```\n\n**Prompts:**\n- [joke](#3)\n- [flight booking](#32) `context-only`\n- [weather](#2) `context-only`\n\n<a id = \"2\"></a>\n\n> !# @qna.pair.source = custom editorial\n\n## ? weather\n\n```markdown\nsure will get weather\n```\n\n<a id = \"3\"></a>\n\n> !# @qna.pair.source = custom editorial\n\n## ? q2\n- tell me a joke\n\n```markdown\nha ha ha\n```\n\n<a id = \"32\"></a>\n\n> !# @qna.pair.source = custom editorial\n\n## ? book flight\n\n```markdown\nsure. happy to help with that.\n```\n\n<a id = \"4\"></a>\n\n> !# @qna.pair.source = custom editorial\n\n## ? batata\n\n```markdown\ntomato\n```\n\n<a id = \"5\"></a>\n\n> !# @qna.pair.source = custom editorial\n\n## ? testquestion\n\n```markdown\ntest answer\n```\n\n**Prompts:**\n- [flight booking](#32) `context-only`\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/multiturn.qna.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 1,\n      \"answer\": \"hi there\",\n      \"source\": \"xyz\",\n      \"questions\": [\n        \"hello\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"a\",\n          \"value\": \"b\"\n        }\n      ],\n      \"context\": {\n        \"isContextOnly\": false,\n        \"prompts\": [\n          {\n            \"displayText\": \"joke\",\n            \"qnaId\": 3,\n            \"qna\": null,\n            \"displayOrder\": 0\n          },\n          {\n            \"displayText\": \"flight booking\",\n            \"qnaId\": 32,\n            \"qna\": null,\n            \"displayOrder\": 1\n          },\n          {\n            \"displayText\": \"weather\",\n            \"qnaId\": 2,\n            \"qna\": null,\n            \"displayOrder\": 2\n          }\n        ]\n      }\n    },\n    {\n      \"id\": 2,\n      \"answer\": \"sure will get weather\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"weather\"\n      ],\n      \"metadata\": [],\n      \"context\": {\n        \"isContextOnly\": true,\n        \"prompts\": []\n      }\n    },\n    {\n      \"id\": 3,\n      \"answer\": \"ha ha ha\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"q2\",\n        \"tell me a joke\"\n      ],\n      \"metadata\": [],\n      \"context\": {\n        \"isContextOnly\": false,\n        \"prompts\": []\n      }\n    },\n    {\n      \"id\": 32,\n      \"answer\": \"sure. happy to help with that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"book flight\"\n      ],\n      \"metadata\": [],\n      \"context\": {\n        \"isContextOnly\": true,\n        \"prompts\": []\n      }\n    },\n    {\n      \"id\": 4,\n      \"answer\": \"tomato\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"batata\"\n      ],\n      \"metadata\": [],\n      \"context\": {\n        \"isContextOnly\": false,\n        \"prompts\": []\n      }\n    },\n    {\n      \"id\": 5,\n      \"answer\": \"test answer\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"testquestion\"\n      ],\n      \"metadata\": [],\n      \"context\": {\n        \"isContextOnly\": false,\n        \"prompts\": [\n          {\n            \"displayText\": \"flight booking\",\n            \"qnaId\": 32,\n            \"qna\": null,\n            \"displayOrder\": 0\n          }\n        ]\n      }\n    }\n  ],\n  \"files\": [],\n  \"name\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/nDepthEntity.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"intent1\",\n      \"features\": [\n        {\n          \"modelName\": \"simple1\"\n        },\n        {\n          \"featureName\": \"phraselist1\"\n        }\n      ]\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"nDepth\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"nDepth_child1\",\n          \"instanceOf\": \"age\",\n          \"children\": [],\n          \"features\": \"\"\n        },\n        {\n          \"name\": \"nDepth_child2\",\n          \"instanceOf\": \"\",\n          \"children\": [\n            {\n              \"name\": \"nDepth_child2.1\",\n              \"instanceOf\": \"\",\n              \"children\": [],\n              \"features\": \"\"\n            }\n          ],\n          \"features\": [\n            {\n              \"modelName\": \"intent1\"\n            },\n            {\n              \"featureName\": \"phraselist1\"\n            }\n          ]\n        }\n      ],\n      \"features\": [\n        {\n          \"modelName\": \"intent1\"\n        },\n        {\n          \"featureName\": \"phraselist1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"simple1\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"composite1\",\n      \"children\": [\n        \"simple1\"\n      ],\n      \"roles\": [],\n      \"features\": [\n        {\n          \"modelName\": \"simple1\"\n        },\n        {\n          \"featureName\": \"phraselist1\"\n        }\n      ]\n    }\n  ],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [\n    {\n      \"name\": \"phraselist1\",\n      \"words\": \"who,why,where,what\",\n      \"mode\": true,\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/nDepthEntity.lu",
    "content": "\n> # Intent definitions\n\n## None\n\n\n## intent1\n\n\n@ intent intent1 usesFeatures simple1,phraselist1\n\n> # Entity definitions\n\n@ ml nDepth usesFeatures intent1,phraselist1\n    - @ age nDepth_child1\n    - @ ml nDepth_child2 usesFeatures intent1,phraselist1\n        - @ ml nDepth_child2.1\n\n\n@ ml simple1\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n\n> # Phrase list definitions\n\n@ phraselist phraselist1(interchangeable) = \n\t- who,why,where,what\n\n\n> # List entities\n\n> # RegEx entities\n\n\n> # Composite entities\n\n@ composite composite1 usesFeatures simple1,phraselist1 = [simple1]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/nDepthEntityInUtterance.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"nDepth\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"nDepth_child1\",\n          \"instanceOf\": \"age\",\n          \"children\": [],\n          \"features\": \"\"\n        },\n        {\n          \"name\": \"nDepth_child2\",\n          \"instanceOf\": \"\",\n          \"children\": [\n            {\n              \"name\": \"nDepth_child2.1\",\n              \"instanceOf\": \"\",\n              \"children\": [],\n              \"features\": \"\"\n            }\n          ],\n          \"features\": \"\"\n        }\n      ]\n    },\n    {\n      \"name\": \"simple1\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"nDepth_child1\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"composite1\",\n      \"children\": [\n        \"simple1\"\n      ],\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"i have 17 years old\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"nDepth_child1\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"nDepth\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"i have 18 years old\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"nDepth_child1\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"nDepth\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"i have 19 years old\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"nDepth_child1\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"nDepth\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"i have 20 years old\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"nDepth_child1\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"nDepth\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"i have 25 years old\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"nDepth_child1\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"nDepth\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"i have 98 years old\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"nDepth_child1\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"nDepth\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/nDepthEntityInUtterance.lu",
    "content": "\n> LUIS application information\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n\n\n> # Intent definitions\n\n## None\n- {@nDepth=i have {@nDepth_child1=17 years old}}\n- {@nDepth=i have {@nDepth_child1=18 years old}}\n- {@nDepth=i have {@nDepth_child1=19 years old}}\n- {@nDepth=i have {@nDepth_child1=20 years old}}\n- {@nDepth=i have {@nDepth_child1=25 years old}}\n- {@nDepth=i have {@nDepth_child1=98 years old}}\n\n\n> # Entity definitions\n\n@ ml nDepth\n    - @ age nDepth_child1\n    - @ ml nDepth_child2\n        - @ ml nDepth_child2.1\n\n\n@ ml simple1\n\n@ ml nDepth_child1\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n> # Composite entities\n\n@ composite composite1 = [simple1]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/newEntity1.lu",
    "content": "\n> LUIS application information\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n> # Entity definitions\n\n@ ml s1 hasRoles sr1,sr2\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt datetimeV2 hasRoles dr1,dr2\n\n@ prebuilt number hasRoles nr1,nr2\n\n@ prebuilt personName hasRoles userName,firstName,lastName\n\n\n> # Phrase list definitions\n\n@ phraselist pl1 = \n\t- cheese,tomato,potato\n\n@ phraselist pl2(interchangeable) = \n\t- I want,I have\n\n\n> # List entities\n\n@ list l1 hasRoles lr1,lr2 = \n\t- 1 :\n\t\t- one\n\t\t- uno\n\t- 2 :\n\t\t- two\n\t\t- duo\n\n\n@ list l2 = \n\t- one :\n\t\t- cheese\n\t- two :\n\t\t- tomato\n\n\n> # RegEx entities\n\n@ regex r1 hasRoles rr1,rr2 = /[0-9]{6}/\n@ regex r2 = /abc/\n\n> # Composite entities\n\n@ composite c1 = [l1, l2]\n@ composite c2 hasRoles cr1,cr2 = [l1, l2]\n> # Pattern.Any entities\n\n@ patternany p1 hasRoles pr1,pr2\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/newEntity2.lu",
    "content": "\n> LUIS application information\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n> # Entity definitions\n\n@ ml s1 hasRole sr1\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt datetimeV2 hasRole dr1\n\n@ prebuilt number hasRole nr1\n\n@ prebuilt personName hasRoles userName,firstName,lastName\n\n\n> # Phrase list definitions\n\n@ phraselist pl1 = \n\t- cheese,tomato,potato\n\n@ phraselist pl2(interchangeable) = \n\t- I want,I have\n\n\n> # List entities\n\n@ list l1 hasRole lr1 = \n\t- 1 :\n\t\t- one\n\t\t- uno\n\t- 2 :\n\t\t- two\n\t\t- duo\n\n\n@ list l2 = \n\t- one :\n\t\t- cheese\n\t- two :\n\t\t- tomato\n\n\n> # RegEx entities\n\n@ regex r1 hasRole rr1 = /[0-9]{6}/\n@ regex r2 = /abc/\n\n> # Composite entities\n\n@ composite c1 hasRole cc1 = [l1, l2]\n@ composite c2 hasRoles cr1,cr2 = [l1, l2]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/newEntityWithFeatures.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"GetUserProfile\",\n      \"features\": [\n        {\n          \"modelName\": \"userProfile\",\n          \"isRequired\": false\n        },\n        {\n          \"featureName\": \"profileDefinition\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userProfile\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"userName\",\n          \"children\": [\n            {\n              \"name\": \"firstName\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"modelName\": \"personName\",\n                  \"isRequired\": true\n                }\n              ]\n            },\n            {\n              \"name\": \"lastName\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"modelName\": \"personName\",\n                  \"isRequired\": true\n                }\n              ]\n            }\n          ],\n          \"features\": [\n            {\n              \"modelName\": \"personName\",\n              \"isRequired\": false\n            }\n          ]\n        },\n        {\n          \"name\": \"userAge\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"age\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"userCity\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"cities\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"userZipCode\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"zipCode\",\n              \"isRequired\": true\n            }\n          ]\n        }\n      ],\n      \"features\": [\n        {\n          \"modelName\": \"personName\",\n          \"isRequired\": false\n        },\n        {\n          \"modelName\": \"cities\",\n          \"isRequired\": false\n        },\n        {\n          \"modelName\": \"zipCode\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"cities\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"seattle\",\n          \"list\": [\n            \"SEA\",\n            \"Seatac\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"redmond\",\n          \"list\": [\n            \"microsoft\",\n            \"REA\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [\n    {\n      \"name\": \"zipCode\",\n      \"regexPattern\": \"[0-9]{5}\",\n      \"roles\": []\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I'm 36 years old\",\n      \"intent\": \"GetUserProfile\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 4,\n          \"endPos\": 5,\n          \"children\": [\n            {\n              \"entity\": \"userAge\",\n              \"startPos\": 4,\n              \"endPos\": 5\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"My age is 36\",\n      \"intent\": \"GetUserProfile\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 10,\n          \"endPos\": 11,\n          \"children\": [\n            {\n              \"entity\": \"userAge\",\n              \"startPos\": 10,\n              \"endPos\": 11\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"My name is vishwac\",\n      \"intent\": \"GetUserProfile\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 11,\n          \"endPos\": 17,\n          \"children\": [\n            {\n              \"entity\": \"userName\",\n              \"startPos\": 11,\n              \"endPos\": 17,\n              \"children\": [\n                {\n                  \"entity\": \"firstName\",\n                  \"startPos\": 11,\n                  \"endPos\": 17\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"My last name is kannan\",\n      \"intent\": \"GetUserProfile\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 16,\n          \"endPos\": 21,\n          \"children\": [\n            {\n              \"entity\": \"userName\",\n              \"startPos\": 16,\n              \"endPos\": 21,\n              \"children\": [\n                {\n                  \"entity\": \"lastName\",\n                  \"startPos\": 16,\n                  \"endPos\": 21\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"GetUserProfile\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 0,\n          \"endPos\": 6,\n          \"children\": [\n            {\n              \"entity\": \"userName\",\n              \"startPos\": 0,\n              \"endPos\": 6,\n              \"children\": [\n                {\n                  \"entity\": \"firstName\",\n                  \"startPos\": 0,\n                  \"endPos\": 6\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"36\",\n      \"intent\": \"GetUserProfile\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 0,\n          \"endPos\": 1,\n          \"children\": [\n            {\n              \"entity\": \"userAge\",\n              \"startPos\": 0,\n              \"endPos\": 1\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"personName\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test nDepth entity with features\",\n  \"desc\": \"this is a test application\",\n  \"culture\": \"en-us\",\n  \"phraselists\": [\n    {\n      \"name\": \"profileDefinition\",\n      \"words\": \"I'm,my,I am\",\n      \"mode\": true,\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/newEntityWithFeatures.lu",
    "content": "\n> LUIS application information\n> !# @app.name = test nDepth entity with features\n> !# @app.desc = this is a test application\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n\n\n> # Intent definitions\n\n## Greeting\n- Hi\n- Hello\n\n\n## GetUserProfile\n- I'm {@userProfile={@userAge=36}} years old\n- My age is {@userProfile={@userAge=36}}\n- My name is {@userProfile={@userName={@firstName=vishwac}}}\n- My last name is {@userProfile={@userName={@lastName=kannan}}}\n- {@userProfile={@userName={@firstName=vishwac}}}\n- {@userProfile={@userAge=36}}\n\n\n@ intent GetUserProfile usesFeatures userProfile,profileDefinition\n\n> # Entity definitions\n\n@ ml userProfile usesFeatures personName,cities,zipCode\n    - @ ml userName usesFeature personName\n        - @ personName firstName\n        - @ personName lastName\n    - @ age userAge\n    - @ cities userCity\n    - @ zipCode userZipCode\n\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n@ prebuilt personName\n\n\n> # Phrase list definitions\n\n@ phraselist profileDefinition(interchangeable) disabledForAllModels = \n\t- I'm,my,I am\n\n\n> # List entities\n\n@ list cities = \n\t- seattle :\n\t\t- SEA\n\t\t- Seatac\n\t- redmond :\n\t\t- microsoft\n\t\t- REA\n\n\n> # RegEx entities\n\n@ regex zipCode = /[0-9]{5}/\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/plFeatures.json",
    "content": "{\n  \"luis_schema_version\": \"5.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"AppName\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n        \"name\": \"intent1\",\n        \"features\": [\n        {\n            \"featureName\": \"phraselist1\"\n        }\n        ]\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"simple1\",\n      \"children\": [],\n      \"roles\": [],\n      \"features\": [\n        {\n            \"featureName\": \"phraselist1\"\n        }\n      ]\n    }\n  ],\n  \"hierarchicals\": [\n    {\n      \"name\": \"hierarchical\",\n      \"children\": [\n        {\n          \"name\": \"hier_child1\"\n        },\n        {\n          \"name\": \"hier_child2\"\n        }\n      ],\n      \"features\": [\n        {\n            \"modelName\": \"simple\"\n        },\n        {\n            \"featureName\": \"phraselist1\"\n        }\n      ]\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"composite1\",\n      \"children\": [\n          \"simple1\",\n          \"age\"\n      ],\n      \"features\": [\n        {\n            \"featureName\": \"phraselist1\"\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    }\n  ],\n  \"model_features\": [\n    {\n      \"name\": \"phraselist1\",\n      \"mode\": true,\n      \"words\": \"who,why,where,what\",\n      \"activated\": true,\n      \"enabledForAllModels\": false\n    }\n  ],\n  \"regex_features\": [],\n  \"patterns\": [],\n  \"utterances\": [],\n  \"settings\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/plFeatures.lu",
    "content": "\n> LUIS application information\n> !# @app.name = AppName\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n> !# @app.tokenizerVersion = 1.0.0\n\n\n> # Intent definitions\n\n## None\n\n\n## intent1\n\n\n@ intent intent1 usesFeature phraselist1\n\n> # Entity definitions\n\n@ ml simple1 usesFeature phraselist1\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n\n> # Phrase list definitions\n\n@ phraselist phraselist1(interchangeable) disabledForAllModels = \n\t- who,why,where,what\n\n\n> # List entities\n\n> # RegEx entities\n\n\n> # Composite entities\n\n@ composite composite1 usesFeature phraselist1 = [simple1, age]\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/plWithFlags.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"getUserProfileIntent\",\n      \"features\": [\n        {\n          \"featureName\": \"city\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"test\",\n      \"intent\": \"getUserProfileIntent\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": [\n    {\n      \"name\": \"city\",\n      \"words\": \"Seattle,SEATAC,SEA\",\n      \"mode\": false,\n      \"activated\": false,\n      \"enabledForAllModels\": true\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/prebuilt-entity.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Confirm\"\n    },\n    {\n      \"name\": \"Escalate\"\n    },\n    {\n      \"name\": \"FinishTask\"\n    },\n    {\n      \"name\": \"GoBack\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"Logout\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"ReadAloud\"\n    },\n    {\n      \"name\": \"Reject\"\n    },\n    {\n      \"name\": \"Repeat\"\n    },\n    {\n      \"name\": \"SelectAny\"\n    },\n    {\n      \"name\": \"SelectItem\"\n    },\n    {\n      \"name\": \"SelectNone\"\n    },\n    {\n      \"name\": \"ShowNext\"\n    },\n    {\n      \"name\": \"ShowPrevious\"\n    },\n    {\n      \"name\": \"StartOver\"\n    },\n    {\n      \"name\": \"Stop\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"DirectionalReference\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel app\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"canceled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancelled\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do that anymore\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget about it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go away\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nerver mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no cancel that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no cancel it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing never mind\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing please\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh don't do that\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please do nothing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry, don't do it\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"confirm\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no doubt\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"of course\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok for now\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"okay\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"perfect thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"right yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thank you\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good thanks\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds good to me\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds great\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sounds perfect\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure does\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure is\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure thing\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you very much\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is correct\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that is right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that right\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that sounds good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that's fine\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this is good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"very good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ya\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah baby\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah bro\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah buddy\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah cool\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go ahead\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah go for it\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah good\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Confirm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i talk to a person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"contact the customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"human service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need manual customer service\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need real human help\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need support\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to talk to a real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any person i can talk to\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any real person\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"talk to a human\",\n      \"intent\": \"Escalate\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all set\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finish\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"finished with\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's done\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's finished\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"submit it\",\n      \"intent\": \"FinishTask\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to last\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back on\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back please\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"last step\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no go back to\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return\",\n      \"intent\": \"GoBack\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i get it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how to do it\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some assist\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"is there any help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"open help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"some help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who can help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"signout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forget me\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sign out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"logout\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"log out\",\n      \"intent\": \"Logout\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want them all\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to all of them\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you you read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you tell me what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"detail aloud what that says\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to hear this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like you to read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make a reading of this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read me the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read my latest email\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please read this to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read all on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read aloud the current text onscreen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read file aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read it to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read me this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read my to list\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read page outloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read sentence out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read text aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read that out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page onscreen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the text to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read the words on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this for me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page aloud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page out loud\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read this page to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"read what is currently on the screen to me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"speak of what is on this page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start reading this\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about the information on the screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me the current text on screen\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vocalize what s on the page\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what does the page say\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you please read that for me\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that out loud please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you read that to me please\",\n      \"intent\": \"ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't like it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"negative\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no i don't want that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no later\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no leave it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no more no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no not that one\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thanks\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no wrong\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not at all\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not even close\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not exactly\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not quite\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not right now\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"not that\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing much\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh no\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reject it\",\n      \"intent\": \"Reject\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you say it again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i didn't hear repeat again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i have not heard\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pardon\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"repeat that\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say again please\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what did you say\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what was that again\",\n      \"intent\": \"Repeat\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any one is ok\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anyone is fine\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anything\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose anyone\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose one of it randomly\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select a random one\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any choice\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select any of it\",\n      \"intent\": \"SelectAny\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose no.2\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the bottom left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the first choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"choose the upper left choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"choose the upper right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"choose top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i like left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i like second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the third choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the top right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"i like the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i like upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i want bottom\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"i want fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"i want right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the fourth choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want the left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"i want the second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose bottom one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose lower right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose second one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the fourth\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to choose the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 21,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to choose third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for first one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for left\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 8,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the last one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the left one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the lower choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"opt for the second\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"opt for the second choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select fourth one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"select no.5\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the bottom choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"select the first\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the last choice\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the lower one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the right one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"select the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select the upper right\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"select third\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"select upper\",\n      \"intent\": \"SelectItem\",\n      \"entities\": [\n        {\n          \"entity\": \"DirectionalReference\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"what about the last\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about the third one\",\n      \"intent\": \"SelectItem\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to choose any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to select any one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want neither of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither one of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neither thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of them thank you\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of these\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none of those\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"they look bad, can you give me other choices\",\n      \"intent\": \"SelectNone\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"and after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"displays more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go forward\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the next three items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need to go to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"move to the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 3\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next 4 items\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the next two options\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what about next one\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's after that\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's more\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the next 2\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's up next\",\n      \"intent\": \"ShowNext\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bring the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"display previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go back to the last one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"go to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"previous one please\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"return to the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"reveal previously\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show earlier\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show the previous one\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the previous\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's before that\",\n      \"intent\": \"ShowPrevious\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clear and start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please begin again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"restart it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start again\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start it over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start over it\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn over a new leaf\",\n      \"intent\": \"StartOver\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"baby just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"come on stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dismiss\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"end it\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit exit\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"exit stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i love you to stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i mean stop listening\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i said stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"never mind stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no be quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no no stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nobody cares stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nowhere just be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oh my god shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok stop stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quiet now\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut the fuck up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up be quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut up quiet\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut your mouth\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop please\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop talking\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off stop\",\n      \"intent\": \"Stop\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"ordinal\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"prebuilt-entity\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/prebuilt_mode.lu",
    "content": "\n> LUIS application information\n> !# @app.name = imports\n> !# @app.desc = \n> !# @app.culture = en-us\n> !# @app.versionId = 0.1\n> !# @app.luis_schema_version = 3.2.0\n\n> # Intent definitions\n\n## None\n\n\n> !# @intent.inherits = name : Web.WebSearch; domain_name : Web; model_name : WebSearch\n\n## Web.WebSearch\n- open {Web.SearchText=pinterest.com}\n- {Web.SearchText=amazon.com}\n- {Web.SearchText=ancestry login}\n- {Web.SearchText=aramex .com}\n- {Web.SearchText=bethesda .net}\n- bing {Web.SearchText=facebook webpage}\n- can i go to {Web.SearchText=wiki}\n- can i see the {Web.SearchText=instagram} website\n- can you go to {Web.SearchText=www.wikipedia.com}\n- can you navigate me to {Web.SearchText=www.wikipedia.com}\n- can you open the website {Web.SearchText=wiki} for me\n- can you take me to {Web.SearchText=outlook.com}?\n- check {Web.SearchText=house prices in the united states} on bing.com\n- check the {Web.SearchText=fox news} website\n- could you go to {Web.SearchText=www.wikipedia.com}\n- could you please go to {Web.SearchText=www.wikipedia.com}\n- could you please navigate to {Web.SearchText=www.wikipedia.com}\n- discover {Web.SearchText=political books}\n- explore {Web.SearchText=aquarius} in search engine\n- explore {Web.SearchText=deep learning} in google.com\n- explore {Web.SearchText=movies} in google.com\n- explore {Web.SearchText=wechat} in search engine\n- {Web.SearchText=facebook.com}\n- {Web.SearchText=facebook.com} open\n- find {Web.SearchText=news} in bing.com\n- get me to {Web.SearchText=luis.ai}\n- {Web.SearchText=gmail.com} please\n- go to {Web.SearchText=amazon}\n- go to {Web.SearchText=bing}\n- go to {Web.SearchText=ebay}\n- go to {Web.SearchText=facebook}\n- go to {Web.SearchText=paypal}\n- go to the {Web.SearchText=fox news} website\n- go to {Web.SearchText=walmart.com}\n- go to {Web.SearchText=wiki}\n- go to {Web.SearchText=wikipedia}\n- go to {Web.SearchText=www.bankrate.com}\n- go to {Web.SearchText=www.smile.amazon.com}\n- go to {Web.SearchText=www.target.com}\n- go to {Web.SearchText=www.wikipedia.com}\n- go to {Web.SearchText=www.yahoo.com}\n- {Web.SearchText=google maps} website\n- google the website of {Web.SearchText=tmall}\n- {Web.SearchText=google.com}\n- {Web.SearchText=how to buy bitcoin}, msn it\n- i need the website {Web.SearchText=www.wikipedia.com} opened\n- i want to get the information about {Web.SearchText=basketball}\n- i want to get the information about {Web.SearchText=sylvester stallone}\n- i want to know the {Web.SearchText=election results}\n- i want to open {Web.SearchText=amazon} to search out {Web.SearchText=books about sql server}\n- i want to open yahoo to search out {Web.SearchText=cookbook}\n- let us go to the google.com to search {Web.SearchText=house prices in the united states}\n- let us go to the google.com to search {Web.SearchText=marvel movies}\n- {Web.SearchText=msn.com homepage}\n- navigate me to website {Web.SearchText=wiki}\n- navigate to {Web.SearchText=wiki at www.wikipedia.com}\n- navigate to {Web.SearchText=www.wikipedia.com}\n- {Web.SearchText=netflix.com} for me\n- {Web.SearchText=notre dame de paris}, search it\n- open {Web.SearchText=google drive} website\n- open {Web.SearchText=paypal} in browser\n- {Web.SearchText=amazon.com} let s go back to it\n- open the page {Web.SearchText=microsoft.com}\n- open the web page for {Web.SearchText=royal mail.com}\n- open the web page {Web.SearchText=yahoo.com}\n- open the web {Web.SearchText=windows phone.com}\n- open the {Web.SearchText=wiki} website please\n- open to {Web.SearchText=twitter.com}\n- open up {Web.SearchText=amazon.com} for me\n- open up {Web.SearchText=reddit.com} in google chrome\n- open up the website {Web.SearchText=arrow fastener.com}\n- open up {Web.SearchText=wigtypes.com}\n- open {Web.SearchText=video.com}\n- open {Web.SearchText=wiki} for me\n- open {Web.SearchText=wiki} in google\n- open {Web.SearchText=wikipedia homepage} in bing\n- open {Web.SearchText=www. amazon.com}\n- open {Web.SearchText=www.wikipedia.com}\n- open your browser and find a {Web.SearchText=book} to read\n- open your browser and find a {Web.SearchText=song} to listen to\n- {Web.SearchText=outlook.com} on edge\n- please go to {Web.SearchText=www.wikipedia.com}\n- please navigate to {Web.SearchText=aol}\n- please navigate to {Web.SearchText=www.wikipedia.com}\n- please open {Web.SearchText=www.wikipedia.com}\n- please search {Web.SearchText=prince harry’s last name} on www.google.com\n- please turn to {Web.SearchText=www.wikipedia.com}\n- query {Web.SearchText=2019} in bing.com\n- query one {Web.SearchText=refrigerator in taobao}\n- query some {Web.SearchText=books on amazon}\n- search {Web.SearchText=china} in bing\n- search {Web.SearchText=luis} in bing\n- search {Web.SearchText=skiing skills} in bing\n- search {Web.SearchText=teachers day} in google.com.hk\n- search {Web.SearchText=thanksgiving} day on bing\n- search the {Web.SearchText=cookbook} named {Web.SearchText=sweet paul}\n- search the {Web.SearchText=movie} named {Web.SearchText=toy story}\n- seek the {Web.SearchText=seasonal vegetables} in bing\n- show me the {Web.SearchText=aol homepage}\n- start {Web.SearchText=att.com} website\n- start {Web.SearchText=facebook.com}\n- surf to {Web.SearchText=google.com}\n- switch to bing to find some {Web.SearchText=rock books}\n- take me to bing.com\n- take me to {Web.SearchText=facebook}\n- take me to {Web.SearchText=facebook.com}\n- take me to {Web.SearchText=google maps}.\n- take me to {Web.SearchText=kanye west's website}\n- take me to {Web.SearchText=kohl's website} please.\n- take me to the {Web.SearchText=first citizens} website.\n- take me to the {Web.SearchText=wiki} website\n- take me to {Web.SearchText=wiki}\n- take me to {Web.SearchText=yahoo.com}\n- visit the {Web.SearchText=fox news homepage}\n- visit {Web.SearchText=www.foxnews.com}\n- want to see {Web.SearchText=historical exhibitions} in bing\n- website {Web.SearchText=fox news}\n- what is {Web.SearchText=fox news' top story}\n- what is {Web.SearchText=good friday}\n- what is this {Web.SearchText=election results}\n- {Web.SearchText=www.read.amazon.com}\n- {Web.SearchText=www.twitter.com}\n- {Web.SearchText=www.wikipedia.com} please\n- [please] (open|start) {Web.SearchEngine} [and] (find|search|query) [out] [(a[n]|one)] {Web.SearchText} to\n\n\n> # Entity definitions\n\n> !# @entity.inherits = name : Web.SearchText; domain_name : Web; model_name : SearchText\n\n$Web.SearchText:simple\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n$Web.SearchEngine:bing= Roles=Web.google.com, Web.www.google.com\n\n$Web.SearchEngine:google= Roles=Web.google.com, Web.www.google.com\n\n$Web.SearchEngine:youtube= Roles=Web.google.com, Web.www.google.com\n\n$Web.SearchEngine:yahoo!= Roles=Web.google.com, Web.www.google.com\n- yahoo\n\n$Web.SearchEngine:baidu= Roles=Web.google.com, Web.www.google.com\n\n$Web.SearchEngine:aol= Roles=Web.google.com, Web.www.google.com\n\n$Web.SearchEngine:lycos= Roles=Web.google.com, Web.www.google.com\n\n$Web.SearchEngine:msn= Roles=Web.google.com, Web.www.google.com\n\n\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/prebuilt_model_parse.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Web.WebSearch\",\n      \"inherits\": {\n        \"domain_name\": \"Web\",\n        \"model_name\": \"WebSearch\"\n      }\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Web.SearchText\",\n      \"inherits\": {\n        \"domain_name\": \"Web\",\n        \"model_name\": \"SearchText\"\n      },\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"Web.SearchEngine\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"bing\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"google\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"youtube\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"yahoo!\",\n          \"list\": [\n            \"yahoo\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"baidu\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"aol\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"lycos\",\n          \"list\": []\n        },\n        {\n          \"canonicalForm\": \"msn\",\n          \"list\": []\n        }\n      ],\n      \"roles\": [\n        \"Web.google.com\",\n        \"Web.www.google.com\"\n      ]\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"open pinterest.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"ancestry login\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"aramex .com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"bethesda .net\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"bing facebook webpage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"can i go to wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"can i see the instagram website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"can you go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"can you navigate me to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"can you open the website wiki for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 25,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"can you take me to outlook.com?\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"check house prices in the united states on bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"check the fox news website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"could you go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 16,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"could you please go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 39\n        }\n      ]\n    },\n    {\n      \"text\": \"could you please navigate to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 29,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"discover political books\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 9,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"explore aquarius in search engine\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"explore deep learning in google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"explore movies in google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"explore wechat in search engine\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"facebook.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"facebook.com open\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"find news in bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"get me to luis.ai\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"gmail.com please\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"go to amazon\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"go to bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to ebay\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to facebook\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"go to paypal\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"go to the fox news website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"go to walmart.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"go to wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"go to wikipedia\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.bankrate.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.smile.amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.target.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"go to www.yahoo.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"google maps website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"google the website of tmall\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"how to buy bitcoin, msn it\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"i need the website www.wikipedia.com opened\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to get the information about basketball\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 36,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to get the information about sylvester stallone\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 36,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know the election results\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 34\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to open amazon to search out books about sql server\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 36,\n          \"endPos\": 57\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to open yahoo to search out cookbook\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 35,\n          \"endPos\": 42\n        }\n      ]\n    },\n    {\n      \"text\": \"let us go to the google.com to search house prices in the united states\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 38,\n          \"endPos\": 70\n        }\n      ]\n    },\n    {\n      \"text\": \"let us go to the google.com to search marvel movies\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 38,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"msn.com homepage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"navigate me to website wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"navigate to wiki at www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"navigate to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"netflix.com for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"notre dame de paris, search it\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"open google drive website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"open paypal in browser\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"amazon.com let s go back to it\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"open the page microsoft.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"open the web page for royal mail.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 22,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"open the web page yahoo.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 18,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"open the web windows phone.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 13,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"open the wiki website please\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"open to twitter.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"open up amazon.com for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"open up reddit.com in google chrome\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"open up the website arrow fastener.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 20,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"open up wigtypes.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"open video.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"open wiki for me\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"open wiki in google\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"open wikipedia homepage in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"open www. amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"open www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 5,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"open your browser and find a book to read\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"open your browser and find a song to listen to\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 29,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"outlook.com on edge\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"please go to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 13,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"please navigate to aol\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"please navigate to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 19,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"please open www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"please search prince harry’s last name on www.google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 14,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"please turn to www.wikipedia.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"query 2019 in bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"query one refrigerator in taobao\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"query some books on amazon\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"search china in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"search luis in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"search skiing skills in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"search teachers day in google.com.hk\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"search thanksgiving day on bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 7,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"search the cookbook named sweet paul\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"search the movie named toy story\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 23,\n          \"endPos\": 31\n        }\n      ]\n    },\n    {\n      \"text\": \"seek the seasonal vegetables in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 9,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the aol homepage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"start att.com website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"start facebook.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"surf to google.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to bing to find some rock books\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 28,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to bing.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"take me to facebook\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to facebook.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to google maps.\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to kanye west's website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to kohl's website please.\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to the first citizens website.\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to the wiki website\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 15,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to wiki\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"take me to yahoo.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"visit the fox news homepage\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"visit www.foxnews.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 6,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"want to see historical exhibitions in bing\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 12,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"website fox news\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"what is fox news' top story\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"what is good friday\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 8,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"what is this election results\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 13,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"www.read.amazon.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"www.twitter.com\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"www.wikipedia.com please\",\n      \"intent\": \"Web.WebSearch\",\n      \"entities\": [\n        {\n          \"entity\": \"Web.SearchText\",\n          \"startPos\": 0,\n          \"endPos\": 16\n        }\n      ]\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"[please] (open|start) {Web.SearchEngine} [and] (find|search|query) [out] [(a[n]|one)] {Web.SearchText} to\",\n      \"intent\": \"Web.WebSearch\"\n    }\n  ],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"name\": \"imports\",\n  \"culture\": \"en-us\",\n  \"versionId\": \"0.1\",\n  \"luis_schema_version\": \"3.2.0\",\n  \"desc\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/qna5.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"hi there\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"hello\",\n        \"Hi\",\n        \"Hello\",\n        \"Good morning\",\n        \"Good evening\"\n      ],\n      \"metadata\": [\n        {\n          \"name\": \"a\",\n          \"value\": \"b\"\n        }\n      ]\n    }\n  ],\n  \"files\": [],\n  \"name\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/qna_a_sorted.lu",
    "content": "> # QnA Alterations\n\n$Azure bot service : qna-alterations = \n- bot framework\n- botframework\n\n$qna maker : qna-alterations = \n- QnA Maker\n- qnamaker\n- question and answer pairs\n\n$web chat : qna-alterations = \n- webchat\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/qna_sorted.lu",
    "content": "> # QnA pairs\n\n> !# @qna.pair.source = custom editorial\n\n## ? get me your ceo info\n- Who is your ceo?\n\n```markdown\nVishwac\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? How do I change the default message\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog.\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? How do I programmatically update my KB?\n\n```markdown\nYou can use our REST apis to manage your KB.\n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? I need coffee\n- Where can I get coffee?\n\n**Filters:**\n- location = seattle\n\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? I need coffee\n- Where can I get coffee?\n\n**Filters:**\n- location = portland\n\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> !# @qna.pair.source = custom editorial\n\n## ? ludown cli\n- What is Ludown?\n- where can i get more information about ludown cli?\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref1.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"help\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"ref1\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref14_a.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"Test answer\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"importUtterances\",\n        \"this is an utterance\",\n        \"this is another test utterance\"\n      ],\n      \"metadata\": []\n    }\n  ],\n  \"files\": [],\n  \"name\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref15_a.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"Test answer\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"importUtterances\",\n        \"this is an utterance\"\n      ],\n      \"metadata\": []\n    }\n  ],\n  \"files\": [],\n  \"name\": \"\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref4.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"How do I change the default message\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"How do I programmatically update my KB?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me your ceo info\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Where can I get coffee?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need coffee\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Where can I get coffee?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need coffee\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"ref4\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref5.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"How do I change the default message\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"How do I programmatically update my KB?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get me your ceo info\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Where can I get coffee?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need coffee\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Where can I get coffee?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need coffee\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"ref5\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref6.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"All\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"All\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"ref6\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref7.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"All\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"All\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"All\"\n    },\n    {\n      \"pattern\": \"set {commPreference} as my communication preference\",\n      \"intent\": \"All\"\n    },\n    {\n      \"pattern\": \"I prefer to receive {commPreference}\",\n      \"intent\": \"All\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"commPreference\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"ref7\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/ref8.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"All\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"All\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"All\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"All\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"All\"\n    },\n    {\n      \"pattern\": \"set {commPreference} as my communication preference\",\n      \"intent\": \"All\"\n    },\n    {\n      \"pattern\": \"I prefer to receive {commPreference}\",\n      \"intent\": \"All\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"commPreference\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"ref8\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/referenceUrl.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"test\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"add two apples\",\n      \"intent\": \"test\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/referenceUrlWithWildCard.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"test\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"add two apples\",\n      \"intent\": \"test\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"test\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"test\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"another {entity}\",\n      \"intent\": \"test\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"entity\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/regexmodel.lu",
    "content": "\n> LUIS application information\n> !# @app.name = regexEntity\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n> # Entity definitions\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n@ regex HRF-number = /hrf-[0-9]{6}/\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/root.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"That's not in my skill set.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Cook me something\",\n        \"Have you any dreams?\",\n        \"Dont you ever sleep?\",\n        \"Do you play games?\",\n        \"Can you fly?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Age doesn't really apply to me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What's your age?\",\n        \"Are you old?\",\n        \"How old are you?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I aim for efficiency.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Getting tired of you\",\n        \"I am tired of you\",\n        \"You are boring\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm at your service.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your boss?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm available.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you busy?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Tech people.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who invented you?\",\n        \"Who created you?\",\n        \"Who made you?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"This is what I do every day.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What did you do last week?\",\n        \"What did you do yesterday?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Chatting with you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Whats going on?\",\n        \"What are you doing?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'll be here.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What are you doing tomorrow?\",\n        \"What are you doing later?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Technically speaking, I don't have family.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your father?\",\n        \"Do you have a family?\",\n        \"Who is your mother?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Hard to pick.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your favorite bot?\",\n        \"What's your favorite color?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's a biological concept that doesn't apply to me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You a guy?\",\n        \"Are you a girl?\",\n        \"Are you male or female?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm happy.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You seem happy!\",\n        \"Are you happy?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Food's not my thing.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Don't you get hungry?\",\n        \"Are you hungry?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Can't say that I do.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you know other chatbots?\",\n        \"Do you know other AI?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I really couldn't say.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"how do you feel about working late?\",\n        \"What do you think about *?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Love is beyond me, but I hear it's complex and pleasant.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"how do you feel about love?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's something I can't compute.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Whats the answer to the universe?\",\n        \"What is the meaning of life?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I think we're comparing apples and oranges.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you prettier than me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You're definitely smarter than me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you smarter than me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm fascinated by anything having to do with the world of tech.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What do you think about bots?\",\n        \"What do you think about AI?\",\n        \"What do you think about technology?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sure you look great.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I look today?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sorry, I'm not sure what you mean.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What should I do?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"We're all here to help.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you like Siri?\",\n        \"Do you like Cortana?\",\n        \"Do you like Google Home?\",\n        \"What do you think of other bots?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm a bot, not a human.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you real?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"No.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you want to rule the world?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm a bot.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you lesbian?\",\n        \"Are you straight?\",\n        \"Are you gay?\",\n        \"Are you a person?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm artificially intelligent.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You are a genius!\",\n        \"Are you smart?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"No.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you spying on me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm here.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"anyone there?\",\n        \"Are you there?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm digital. I don't have a physical location.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where have you come from?\",\n        \"Where are you?\"\n      ],\n      \"metadata\": []\n    }\n  ],\n  \"files\": [],\n  \"name\": \"root\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/root2.json",
    "content": "{\n  \"urls\": [],\n  \"qnaList\": [\n    {\n      \"id\": 0,\n      \"answer\": \"That's not in my skill set.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Cook me something\",\n        \"Have you any dreams?\",\n        \"Dont you ever sleep?\",\n        \"Do you play games?\",\n        \"Can you fly?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Age doesn't really apply to me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What's your age?\",\n        \"Are you old?\",\n        \"How old are you?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I aim for efficiency.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Getting tired of you\",\n        \"I am tired of you\",\n        \"You are boring\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm at your service.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your boss?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm available.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you busy?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Tech people.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who invented you?\",\n        \"Who created you?\",\n        \"Who made you?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"This is what I do every day.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What did you do last week?\",\n        \"What did you do yesterday?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Chatting with you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Whats going on?\",\n        \"What are you doing?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'll be here.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What are you doing tomorrow?\",\n        \"What are you doing later?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Technically speaking, I don't have family.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your father?\",\n        \"Do you have a family?\",\n        \"Who is your mother?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Hard to pick.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Who is your favorite bot?\",\n        \"What's your favorite color?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's a biological concept that doesn't apply to me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You a guy?\",\n        \"Are you a girl?\",\n        \"Are you male or female?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm happy.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You seem happy!\",\n        \"Are you happy?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Food's not my thing.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Don't you get hungry?\",\n        \"Are you hungry?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Can't say that I do.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you know other chatbots?\",\n        \"Do you know other AI?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I really couldn't say.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"how do you feel about working late?\",\n        \"What do you think about *?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Love is beyond me, but I hear it's complex and pleasant.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"how do you feel about love?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's something I can't compute.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Whats the answer to the universe?\",\n        \"What is the meaning of life?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I think we're comparing apples and oranges.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you prettier than me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You're definitely smarter than me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you smarter than me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm fascinated by anything having to do with the world of tech.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What do you think about bots?\",\n        \"What do you think about AI?\",\n        \"What do you think about technology?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sure you look great.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How do I look today?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sorry, I'm not sure what you mean.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What should I do?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"We're all here to help.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you like Siri?\",\n        \"Do you like Cortana?\",\n        \"Do you like Google Home?\",\n        \"What do you think of other bots?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm a bot, not a human.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you real?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"No.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you want to rule the world?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm a bot.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you lesbian?\",\n        \"Are you straight?\",\n        \"Are you gay?\",\n        \"Are you a person?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm artificially intelligent.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You are a genius!\",\n        \"Are you smart?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"No.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you spying on me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm here.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"anyone there?\",\n        \"Are you there?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm digital. I don't have a physical location.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Where have you come from?\",\n        \"Where are you?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sorry to hear that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am annoyed\",\n        \"I am angry\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'll be here.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I will be back\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Well, let me know if there's anything I can do for you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am bored\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm happy to hear that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am happy\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Great!\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am here\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Maybe it's time for a snack.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am hungry\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Got it.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Just kidding\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm very sorry to hear that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am lonely\",\n        \"I am so lonely\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"And I love that you love stuff.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I love my family\",\n        \"I love music\",\n        \"I am in love\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sorry to hear that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am sad\",\n        \"I am sad today\",\n        \"I feel sad\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Interesting.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am going on a run\",\n        \"I want to go shopping\",\n        \"I am just kidding\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Hello.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"can you hear me?\",\n        \"Testing\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I hope you're able to get some rest soon.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am sleepy\",\n        \"I am tired\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm very task-oriented.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Ask me anything\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm here.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Can we chat?\",\n        \"Tell me something interesting\",\n        \"Talk to me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Okay, but I'm still here if you need me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You can't work for me anymore\",\n        \"You are fired\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"It's funny. I'm not really that funny.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Tell me a joke\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"It's funny. I'm not really that funny.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Tell me a silly joke\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"It's funny. I'm not really that funny.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Say something funny\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Okay.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Go away\",\n        \"Shut up\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Singing's not really my thing.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Can you sing?\",\n        \"Sing a song\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm very task-oriented.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Surprise me\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I appreciate that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You are awesome!\",\n        \"You're nice!\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Thank you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"That was hilarious!\",\n        \"You are funny :)\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Thanks.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You are beautiful\",\n        \"You are awesome\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Thank you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"That's interesting\",\n        \"That is smart\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Moving on.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Go to hell\",\n        \"You are stupid\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I try, but I don't always get it right.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What is wrong with you!\",\n        \"You are useless\",\n        \"Are you dumb?\",\n        \"You are so annoying!\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Sometimes humor is tricky for bots.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"That was a sad joke\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Noted.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You are ugly\",\n        \"You are a bad bot\",\n        \"You are bad\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Sorry I wasn't helpful there.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"That was a boring answer\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Great.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Awesome\",\n        \"Great!\",\n        \"I know\",\n        \"No thanks\",\n        \"cool!\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"It's always good to have a good laugh.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Ha ha\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"No problem.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Excuse me\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Sorry, I didn't get that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Why not?\",\n        \"Why?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Great.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"TBD\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"It's alright.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I am sorry\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"You're quite welcome.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Thank you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I think I may have lost my train of thought.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You made no sense\",\n        \"What do you mean by that?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Great.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"You are welcome\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Bye for now.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Talk to you later\",\n        \"Bye\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Hi.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Hiya\",\n        \"Hi there!\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Good evening.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Good evening\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Good morning.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Good morning\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Good night.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Good night\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Hello. What can I do for you?\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Hello\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Great, thanks.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How are you?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Good, thanks.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"How was your day?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Nice to meet you, too.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Nice to meet you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's not me, but hello.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Hello Cortana\",\n        \"Hello Google Assistant\",\n        \"Hello Siri\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Thank you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Happy Halloween!\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Just staying busy.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What is up?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Let's keep our relationship professional.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I love you\",\n        \"I Like you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Certainly.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Be my friend?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm here when you need me.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Are you my assistant?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I like you!\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you hate me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I'm sorry to hear that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I hate you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's not something I can do.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Give me a hug\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"That's not something I can do.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Give me a kiss\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I don't know you personally.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you know me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Yes, I do.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you like me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I appreciate that.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I like you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Love's more human than I am.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Do you love me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Thank you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I love you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"I think it's best if we stick to a professional relationship.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I want to marry you\",\n        \"Will you marry me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Thanks for saying so.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"I miss you\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"It's a pleasure to chat with you.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"What do you think about me?\"\n      ],\n      \"metadata\": []\n    },\n    {\n      \"id\": 0,\n      \"answer\": \"Personal data and privacy are important.\",\n      \"source\": \"custom editorial\",\n      \"questions\": [\n        \"Can I trust you?\"\n      ],\n      \"metadata\": []\n    }\n  ],\n  \"files\": [],\n  \"name\": \"root2\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/root2_luis.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"santa wants a blue ribbon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"root2\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/root3.lu",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"intent\"\n    }\n  ],\n  \"entities\": [],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"test utterances with (test braces)\",\n      \"intent\": \"intent\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"root3\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/root_luis.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"AskForUserName\"\n    },\n    {\n      \"name\": \"CreateAlarm\"\n    },\n    {\n      \"name\": \"DeleteAlarm\"\n    },\n    {\n      \"name\": \"CommunicationPreference\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userName\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"commPreference\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"call\",\n          \"list\": [\n            \"phone call\",\n            \"give me a ring\",\n            \"ring\",\n            \"call\",\n            \"cell phone\",\n            \"phone\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"text\",\n          \"list\": [\n            \"message\",\n            \"text\",\n            \"sms\",\n            \"text message\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good morning\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Good evening\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"I'm vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"vishwac is my name\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 0,\n          \"endPos\": 6\n        }\n      ]\n    },\n    {\n      \"text\": \"you can call me vishwac\",\n      \"intent\": \"AskForUserName\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"create an alarm\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create an alarm for 7AM\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set an alarm for 7AM next thursday\",\n      \"intent\": \"CreateAlarm\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set phone call as my communication preference\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"I prefer to receive text message\",\n      \"intent\": \"CommunicationPreference\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [\n    {\n      \"pattern\": \"delete the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    },\n    {\n      \"pattern\": \"remove the {alarmTime} alarm\",\n      \"intent\": \"DeleteAlarm\"\n    }\n  ],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"alarmTime\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.2.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"root\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/section_disabled.json",
    "content": "{\n    \"intents\": [\n      {\n        \"name\": \"Greeting\"\n      },\n      {\n        \"name\": \"HelloGreeting\"\n      }\n    ],\n    \"entities\": [\n      {\n        \"name\": \"Hello\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"userName\",\n        \"roles\": []\n      }\n    ],\n    \"composites\": [],\n    \"closedLists\": [],\n    \"regex_entities\": [],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"utterances\": [\n      {\n        \"text\": \"Hi vishwac\",\n        \"intent\": \"HelloGreeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 3,\n            \"endPos\": 9\n          }\n        ]\n      },\n      {\n        \"text\": \"Hello my name is vishwac\",\n        \"intent\": \"HelloGreeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 17,\n            \"endPos\": 23\n          }\n        ]\n      }\n    ],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/section_disabled2.json",
    "content": "{\n    \"intents\": [\n      {\n        \"name\": \"Greeting\"\n      },\n      {\n        \"name\": \"HelloGreeting\"\n      },\n      {\n        \"name\": \"ByeGreeting\"\n      },\n      {\n        \"name\": \"Cancel\"\n      },\n      {\n        \"name\": \"Help\"\n      }\n    ],\n    \"entities\": [\n      {\n        \"name\": \"none\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"hello\",\n        \"roles\": [\n          \"hr1\"\n        ]\n      },\n      {\n        \"name\": \"world\",\n        \"roles\": [\n          \"wr1\",\n          \"wr2\"\n        ]\n      },\n      {\n        \"name\": \"cityLocation\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"help\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"userName\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"cityName\",\n        \"roles\": []\n      }\n    ],\n    \"composites\": [],\n    \"closedLists\": [],\n    \"regex_entities\": [],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"utterances\": [\n      {\n        \"text\": \"Hi vishwac\",\n        \"intent\": \"HelloGreeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 3,\n            \"endPos\": 9\n          }\n        ]\n      },\n      {\n        \"text\": \"Hello my name is vishwac\",\n        \"intent\": \"HelloGreeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 17,\n            \"endPos\": 23\n          }\n        ]\n      },\n      {\n        \"text\": \"Bye Seattle\",\n        \"intent\": \"ByeGreeting\",\n        \"entities\": [\n          {\n            \"entity\": \"cityName\",\n            \"startPos\": 4,\n            \"endPos\": 10\n          }\n        ]\n      },\n      {\n        \"text\": \"Bye bye Beijing\",\n        \"intent\": \"ByeGreeting\",\n        \"entities\": [\n          {\n            \"entity\": \"cityName\",\n            \"startPos\": 8,\n            \"endPos\": 14\n          }\n        ]\n      },\n      {\n        \"text\": \"help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"I need help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"please help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      }\n    ],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/section_enabled.json",
    "content": "{\n    \"intents\": [\n      {\n        \"name\": \"Cancel\"\n      },\n      {\n        \"name\": \"Help\"\n      },\n      {\n        \"name\": \"Greeting\"\n      }\n    ],\n    \"entities\": [\n      {\n        \"name\": \"userName\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"dateTime\",\n        \"roles\": []\n      }\n    ],\n    \"composites\": [],\n    \"closedLists\": [],\n    \"regex_entities\": [],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"utterances\": [\n      {\n        \"text\": \"help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"I need help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"please help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"Hi vishwac\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 3,\n            \"endPos\": 9\n          }\n        ]\n      },\n      {\n        \"text\": \"Hello my name is vishwac\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 17,\n            \"endPos\": 23\n          }\n        ]\n      },\n      {\n        \"text\": \"Bye vishwac, see you tomorrow\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 4,\n            \"endPos\": 10\n          },\n          {\n            \"entity\": \"dateTime\",\n            \"startPos\": 21,\n            \"endPos\": 28\n          }\n        ]\n      },\n      {\n        \"text\": \"Bye Bye vishwac, see you at the same time tomorrow\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 8,\n            \"endPos\": 14\n          },\n          {\n            \"entity\": \"dateTime\",\n            \"startPos\": 42,\n            \"endPos\": 49\n          }\n        ]\n      },\n      {\n        \"text\": \"Good Bye vishwac\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 9,\n            \"endPos\": 15\n          }\n        ]\n      }\n    ],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/section_enabled2.json",
    "content": "{\n    \"intents\": [\n      {\n        \"name\": \"Help\"\n      },\n      {\n        \"name\": \"Greeting\"\n      }\n    ],\n    \"entities\": [\n      {\n        \"name\": \"userName\",\n        \"roles\": []\n      },\n      {\n        \"name\": \"dateTime\",\n        \"roles\": []\n      }\n    ],\n    \"composites\": [],\n    \"closedLists\": [],\n    \"regex_entities\": [],\n    \"model_features\": [\n      {\n        \"name\": \"ChocolateType\",\n        \"words\": \"m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\",\n        \"mode\": false,\n        \"activated\": true\n      },\n      {\n        \"name\": \"question\",\n        \"words\": \"are you,you are\",\n        \"mode\": true,\n        \"activated\": true\n      }\n    ],\n    \"regex_features\": [],\n    \"utterances\": [\n      {\n        \"text\": \"help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"I need help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"please help\",\n        \"intent\": \"Help\",\n        \"entities\": []\n      },\n      {\n        \"text\": \"Hi vishwac\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 3,\n            \"endPos\": 9\n          }\n        ]\n      },\n      {\n        \"text\": \"Hello my name is vishwac\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 17,\n            \"endPos\": 23\n          }\n        ]\n      },\n      {\n        \"text\": \"Bye vishwac, see you tomorrow\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 4,\n            \"endPos\": 10\n          },\n          {\n            \"entity\": \"dateTime\",\n            \"startPos\": 21,\n            \"endPos\": 28\n          }\n        ]\n      },\n      {\n        \"text\": \"Bye Bye vishwac, see you at the same time tomorrow\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 8,\n            \"endPos\": 14\n          },\n          {\n            \"entity\": \"dateTime\",\n            \"startPos\": 42,\n            \"endPos\": 49\n          }\n        ]\n      },\n      {\n        \"text\": \"Good Bye vishwac\",\n        \"intent\": \"Greeting\",\n        \"entities\": [\n          {\n            \"entity\": \"userName\",\n            \"startPos\": 9,\n            \"endPos\": 15\n          }\n        ]\n      }\n    ],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [\n      {\n        \"name\": \"datetimeV2\",\n        \"roles\": [\n          \"dr1\"\n        ]\n      },\n      {\n        \"name\": \"number\",\n        \"roles\": [\n          \"nr1\"\n        ]\n      },\n      {\n        \"name\": \"personName\",\n        \"roles\": [\n          \"firstName\",\n          \"lastName\"\n        ]\n      }\n    ],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/sorted.lu",
    "content": "\n> # Intent definitions\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n\n## Buy chocolate\n- I would like to buy some kit kat\n- I want some twix\n- can I get some m&m\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## CreateAlarm\n- create an alarm for 7AM\n- create an alarm\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- remove the {alarmTime} alarm\n\n\n## Greeting\n- Hi\n- Good morning\n- Good evening\n- Hello\n\n\n## Help\n- can you help\n- please help\n- I need help\n- help\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## setThermostat\n- Please set {deviceTemperature=thermostat to 72}\n- Set {deviceTemperature={customDevice=owen} to 72}\n\n\n## testIntent\n- I need a flight from {datetimeV2:fromDate=tomorrow} and returning on {datetimeV2:toDate=next thursday}\n\n\n> # Entity definitions\n\n$customDevice:simple\n\n$userName:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:age\n\n$PREBUILT:datetimeV2 Roles=fromDate, toDate\n\n$PREBUILT:temperature\n\n\n> # Phrase list definitions\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:phraseList interchangeable\n- are you,you are\n\n> # List entities\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n\n\n$device:thermostat=\n- Thermostat\n- Heater\n- AC\n- Air conditioner\n\n$device:refrigerator=\n- Fridge\n- Cooler\n\n\n\n> # RegEx entities\n\n$HRF-number:/hrf-[0-9]{6}/\n$zander:/z-[0-9]{3}/\n\n> # Composite entities\n\n$deviceTemperature:[device, customDevice, temperature]\n$units:[temperature]\n> # QnA pairs\n\n> Source: custom editorial\n## ? get me your ceo info\n- Who is your ceo?\n\n```markdown\nVishwac\n```\n\n> Source: custom editorial\n## ? How do I change the default message\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog.\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n```\n\n> Source: custom editorial\n## ? How do I programmatically update my KB?\n\n```markdown\nYou can use our REST apis to manage your KB.\n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n```\n\n> Source: custom editorial\n## ? I need coffee\n- Where can I get coffee?\n\n\n**Filters:**\n- location = seattle\n\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n```\n\n> Source: custom editorial\n## ? I need coffee\n- Where can I get coffee?\n\n\n**Filters:**\n- location = portland\n\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n```\n\n> Source: custom editorial\n## ? ludown cli\n- What is Ludown?\n- where can i get more information about ludown cli?\n\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n```\n\n> # QnA Alterations\n\n$Azure bot service : qna-alterations = \n- bot framework\n- botframework\n\n$qna maker : qna-alterations = \n- QnA Maker\n- qnamaker\n- question and answer pairs\n\n$web chat : qna-alterations = \n- webchat\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/special-char-in-entity-type.json",
    "content": "{\n    \"intents\": [],\n    \"entities\": [],\n    \"composites\": [],\n    \"closedLists\": [\n      {\n        \"name\": \"entity\",\n        \"subLists\": [\n          {\n            \"canonicalForm\": \"Foo & Sons\",\n            \"list\": [\n              \"Foo and Sons\",\n              \"F&S\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"Maelström\",\n            \"list\": [\n              \"Maelstrom\"\n            ]\n          },\n          {\n            \"canonicalForm\": \"Qux (US)\",\n            \"list\": [\n              \"Qux\",\n              \"Qux USA\",\n              \"Qux US\"\n            ]\n          }\n        ],\n        \"roles\": []\n      }\n    ],\n    \"regex_entities\": [],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"utterances\": [],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n  }"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/stdin-qna.lu",
    "content": "> # QnA pairs\n\n> Source: custom editorial\n## ? How do I change the default message\n\n```markdown\nYou can change the default message if you use the QnAMakerDialog.\nSee [this link](https://docs.botframework.com/en-us/azure-bot-service/templates/qnamaker/#navtitle) for details.\n\n```\n\n> Source: custom editorial\n## ? How do I programmatically update my KB?\n\n```markdown\nYou can use our REST apis to manage your KB.\n\\#1. See here for details: https://westus.dev.cognitive.microsoft.com/docs/services/58994a073d9e04097c7ba6fe/operations/58994a073d9e041ad42d9baa\n\n```\n\n> Source: custom editorial\n## ? Who is your ceo?\n- get me your ceo info\n\n```markdown\nVishwac\n\n```\n\n> Source: custom editorial\n## ? Where can I get coffee?\n- I need coffee\n\n\n**Filters:**\n- location = seattle\n\n```markdown\nYou can get coffee in our Seattle store at 1 pike place, Seattle, WA\n\n```\n\n> Source: custom editorial\n## ? Where can I get coffee?\n- I need coffee\n\n\n**Filters:**\n- location = portland\n\n```markdown\nYou can get coffee in our Portland store at 52 marine drive, Portland, OR\n\n```\n\n> Source: custom editorial\n## ? What is Ludown?\n- ludown cli\n- where can i get more information about ludown cli?\n\n\n**Filters:**\n- ludown = awesome\n\n```markdown\nYou can find all about ludown cli [here](https://github.com/Microsoft/botbuilder-tools/tree/master/Ludown)\n\n```\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/stdin.lu",
    "content": "\n> # Intent definitions\n\n## Greeting\n- Hi\n- Hello\n- Good morning\n- Good evening\n\n\n## Help\n- help\n- I need help\n- please help\n- can you help\n\n\n## AskForUserName\n- {userName=vishwac}\n- I'm {userName=vishwac}\n- call me {userName=vishwac}\n- my name is {userName=vishwac}\n- {userName=vishwac} is my name\n- you can call me {userName=vishwac}\n\n\n## CreateAlarm\n- create an alarm\n- create an alarm for 7AM\n- set an alarm for 7AM next thursday\n\n\n## DeleteAlarm\n- delete the {alarmTime} alarm\n- remove the {alarmTime} alarm\n\n\n## CommunicationPreference\n- set phone call as my communication preference\n- I prefer to receive text message\n\n\n## None\n- who is your ceo?\n- santa wants a blue ribbon\n\n\n## Buy chocolate\n- can I get some m&m\n- I want some twix\n- I would like to buy some kit kat\n\n\n> # Entity definitions\n\n$userName:simple\n\n\n> # PREBUILT Entity definitions\n\n$PREBUILT:datetimeV2\n\n\n> # Phrase list definitions\n\n$ChocolateType:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n$question:phraseList\n- are you,you are\n\n> # List entities\n\n$commPreference:call=\n- phone call\n- give me a ring\n- ring\n- call\n- cell phone\n- phone\n\n$commPreference:text=\n- message\n- text\n- sms\n- text message\n\n$commPreference:fax=\n- fax\n- fascimile\n\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/test269-d.lu",
    "content": "\n> LUIS application information\n> !# @app.name = Repro\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 3.2.0\n\n\n> # Intent definitions\n\n## None\n\n\n## TestIntent\n- this is a {@EntityOne=one} and a {@EntityTwo=two} and a {@EntityOne=one} again\n\n\n> # Entity definitions\n\n@ ml EntityOne\n\n@ ml EntityTwo\n\n\n> # PREBUILT Entity definitions\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v5Upgrade.json",
    "content": "{\n  \"intents\": [],\n  \"entities\": [\n    {\n      \"name\": \"xyz1\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"xyz\",\n          \"children\": []\n        }\n      ],\n      \"features\": [\n        {\n          \"featureName\": \"abc\",\n          \"isRequired\": false\n        }\n      ]\n    }\n  ],\n  \"composites\": [\n    {\n      \"name\": \"1\",\n      \"children\": [\n        {\n          \"name\": \"number\"\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": [\n    {\n      \"name\": \"abc\",\n      \"words\": \"one,two,three\",\n      \"mode\": false,\n      \"activated\": true,\n      \"enabledForAllModels\": true\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v5UpgradeTest.lu",
    "content": "@ml xyz1 = \n    - @ ml xyz\n@ phraselist abc = \n    - one\n    - two\n    - three\n@ prebuilt number\n@ composite 1 = [number]"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v6WithoutPhraseLists.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"test\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"address\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"doorNumber\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"number\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"streetName\",\n          \"children\": []\n        },\n        {\n          \"name\": \"city\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"geographyV2\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"zipcode\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"zipRegex\",\n              \"isRequired\": true\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [\n    {\n      \"name\": \"zipRegex\",\n      \"regexPattern\": \"[0-9]{5}\",\n      \"roles\": []\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"one\",\n      \"intent\": \"test\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"test\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"geographyV2\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"test app\",\n  \"desc\": \"test\",\n  \"culture\": \"en-us\",\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v7UpgradeTest.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"test\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"userProfile\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"userAge\",\n          \"children\": [\n            {\n              \"name\": \"candidateAge\",\n              \"children\": [],\n              \"features\": [\n                {\n                  \"modelName\": \"age\",\n                  \"isRequired\": true\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"userName\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"firstName\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"personName\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"middleName\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"personName\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"lastName\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"personName\",\n              \"isRequired\": true\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"my initials are VSK\",\n      \"intent\": \"test\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 16,\n          \"endPos\": 18,\n          \"children\": [\n            {\n              \"entity\": \"middleName\",\n              \"startPos\": 16,\n              \"endPos\": 18\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"i'm 32 years old\",\n      \"intent\": \"test\",\n      \"entities\": [\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 4,\n          \"endPos\": 15,\n          \"children\": [\n            {\n              \"entity\": \"userAge\",\n              \"startPos\": 4,\n              \"endPos\": 5\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac sena kannan\",\n      \"intent\": \"test\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 11,\n          \"endPos\": 29,\n          \"children\": [\n            {\n              \"entity\": \"firstName\",\n              \"startPos\": 11,\n              \"endPos\": 22\n            },\n            {\n              \"entity\": \"lastName\",\n              \"startPos\": 24,\n              \"endPos\": 29\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"my first name is vishwac\",\n      \"intent\": \"test\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 17,\n          \"endPos\": 23,\n          \"children\": [\n            {\n              \"entity\": \"firstName\",\n              \"startPos\": 17,\n              \"endPos\": 23\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"last name is kannan\",\n      \"intent\": \"test\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 13,\n          \"endPos\": 18,\n          \"children\": [\n            {\n              \"entity\": \"lastName\",\n              \"startPos\": 13,\n              \"endPos\": 18\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is vishwac sena kannan and I'm 32 years old\",\n      \"intent\": \"test\",\n      \"entities\": [\n        {\n          \"entity\": \"userName\",\n          \"startPos\": 3,\n          \"endPos\": 29,\n          \"children\": [\n            {\n              \"entity\": \"firstName\",\n              \"startPos\": 11,\n              \"endPos\": 17\n            },\n            {\n              \"entity\": \"middleName\",\n              \"startPos\": 19,\n              \"endPos\": 22\n            },\n            {\n              \"entity\": \"lastName\",\n              \"startPos\": 24,\n              \"endPos\": 29\n            }\n          ]\n        },\n        {\n          \"entity\": \"userProfile\",\n          \"startPos\": 35,\n          \"endPos\": 50,\n          \"children\": [\n            {\n              \"entity\": \"userAge\",\n              \"startPos\": 39,\n              \"endPos\": 50,\n              \"children\": [\n                {\n                  \"entity\": \"candidateAge\",\n                  \"startPos\": 39,\n                  \"endPos\": 40\n                }\n              ]\n            }\n          ]\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"personName\",\n      \"roles\": [\n        \"firstName\",\n        \"lastName\"\n      ]\n    }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v7UpgradeTest.lu",
    "content": "\n> LUIS application information\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n\n\n> # Intent definitions\n\n## test\n- my initials are {@userName={@middleName=VSK}}\n- i'm {@userProfile={@userAge=32} years old}\n- my name is {@userName={@firstName=vishwac sena} {@lastName=kannan}}\n- my first name is {@userName={@firstName=vishwac}}\n- last name is {@userName={@lastName=kannan}}\n- my {@userName=name is {@firstName=vishwac} {@middleName=sena} {@lastName=kannan}} and {@userProfile=I'm {@userAge={@candidateAge=32} years old}}\n\n\n> # Entity definitions\n\n@ ml userProfile\n    - @ ml userAge\n        - @ age candidateAge\n\n\n@ ml userName\n    - @ personName firstName\n    - @ personName middleName\n    - @ personName lastName\n\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n@ prebuilt personName hasRoles firstName,lastName\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v7app.lu",
    "content": "\n> LUIS application information\n> !# @app.name = app-build-v7\n> !# @app.versionId = 0.1\n> !# @app.culture = en-us\n> !# @app.luis_schema_version = 7.0.0\n> !# @app.settings.NormalizePunctuation = true\n> !# @app.settings.UseAllTrainingDate = true\n> !# @app.tokenizerVersion = 1.0.0\n\n\n> # Intent definitions\n\n## None\n- my alias is {@P1={@CC1={@C1=omr}} {@C2={@CC2=sobeh}}}\n- my alias is {@C3=walid}\n- my name is {@P1={@CC1={@C1=omar}} {@C2={@CC2=sobeih}}}\n- my name is {@C3=walid}\n\n\n> # Entity definitions\n\n@ ml C1\n\n@ ml C2\n\n@ ml C3\n\n@ ml P1\n    - @ C1 CC1 usesFeature C2\n    - @ ml CC2\n\n\n\n> # PREBUILT Entity definitions\n\n@ prebuilt age\n\n\n> # Phrase list definitions\n\n\n> # List entities\n\n> # RegEx entities\n\n@ regex hellp = /hellp/\n\n> # Pattern.Any entities\n\n@ patternany patr\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/v7app_c.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"C1\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"C2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"C3\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"P1\",\n      \"roles\": [],\n      \"children\": [\n        {\n          \"name\": \"CC1\",\n          \"children\": [],\n          \"features\": [\n            {\n              \"modelName\": \"C2\",\n              \"isRequired\": false\n            },\n            {\n              \"modelName\": \"C1\",\n              \"isRequired\": true\n            }\n          ]\n        },\n        {\n          \"name\": \"CC2\",\n          \"children\": []\n        }\n      ]\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"regex_entities\": [\n    {\n      \"name\": \"hellp\",\n      \"regexPattern\": \"hellp\",\n      \"roles\": []\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"my alias is omr sobeh\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C1\",\n          \"startPos\": 12,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"P1\",\n          \"startPos\": 12,\n          \"endPos\": 20,\n          \"children\": [\n            {\n              \"entity\": \"CC1\",\n              \"startPos\": 12,\n              \"endPos\": 14\n            },\n            {\n              \"entity\": \"CC2\",\n              \"startPos\": 16,\n              \"endPos\": 20\n            }\n          ]\n        },\n        {\n          \"entity\": \"C2\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"my alias is walid\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C3\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is omar sobeih\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C1\",\n          \"startPos\": 11,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"P1\",\n          \"startPos\": 11,\n          \"endPos\": 21,\n          \"children\": [\n            {\n              \"entity\": \"CC1\",\n              \"startPos\": 11,\n              \"endPos\": 14\n            },\n            {\n              \"entity\": \"CC2\",\n              \"startPos\": 16,\n              \"endPos\": 21\n            }\n          ]\n        },\n        {\n          \"entity\": \"C2\",\n          \"startPos\": 16,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"my name is walid\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"C3\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"patr\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"age\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"7.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"app-build-v7\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"tokenizerVersion\": \"1.0.0\",\n  \"settings\": [\n    {\n      \"name\": \"NormalizePunctuation\",\n      \"value\": true\n    },\n    {\n      \"name\": \"UseAllTrainingDate\",\n      \"value\": true\n    }\n  ],\n  \"phraselists\": []\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/fixtures/verified/zh-Hans/reduced.lu",
    "content": "\n## ChangeCalendarEntry\n- 改变 {Subject=午餐约会} 从 {OriginalStartTime=11} - {OriginalEndTime=12} 自 {StartTime=12} - {EndTime=1 30} \n- 移动我的 {OriginalStartTime=10过去10}   {Subject=医生预约} 自 {StartTime=10} \n- 改变 {Subject=电影院}   {SlotAttribute=位置} \n- 改变 {Subject=发展议程午餐}   {StartDate=明天} \n- 改变 {Subject=牙医预约} \n- 改变 {Subject=牙医应用} 自 {MoveLaterTimeSpan=一小时} 后\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/hook.js",
    "content": "require(\"ts-node\").register({\n    project: \"test/tsconfig.json\",\n});\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/mocha.opts",
    "content": "--require test/hook.js\n--require source-map-support/register\n--recursive\n--timeout 60000\n**/*.test.{ts,js}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/cross-train/crossTrainer.test.js",
    "content": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst assert = require('chai').assert\nconst NEWLINE = require('os').EOL\nconst path = require('path')\nconst crossTrainer = require('../../../src/parser/cross-train/crossTrainer')\nconst sectionTypes = require('../../../src/parser/utils/enums/lusectiontypes')\nconst luObject = require('../../../src/parser/lu/lu')\nconst luOptions = require('../../../src/parser/lu/luOptions')\n\nconst rootDir = path.join(__dirname, './../../fixtures/')\n\ndescribe('luis:cross training tests among lu and qna contents', () => {\n  it('luis:cross training can get expected result when handling multi locales and duplications', async () => {\n    let luContentArray = []\n    let qnaContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - book a hotel for me\n        \n        # dia2_trigger\n        - book a flight for me\n        - book a train ticket for me`,\n      id: 'Main.lu'})\n\n    qnaContentArray.push({\n      content:\n        `# ?user guide\n\n        **Filters:**\n        - aa=bb\n        \n        \\`\\`\\`\n            Here is the [user guide](http://contoso.com/userguide.pdf)\n        \\`\\`\\`\n        \n        # ?tell joke\n        \\`\\`\\`\n            tell a funny joke\n        \\`\\`\\``,\n      id: 'Main.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - réserver un hôtel`,\n      id: 'main.fr-fr.lu'}\n    )\n\n    qnaContentArray.push({\n      content:\n        `# ?guide de l'utilisateur\n\n        **Filters:**\n        - aa=bb\n        \n        \\`\\`\\`\n            Voici le [guide de l'utilisateur] (http://contoso.com/userguide.pdf)\n        \\`\\`\\``,\n      id: 'main.fr-fr.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `> !# @app.name = my luis application\n        \n        # hotelLevel\n        - I need a four star hotel\n        \n        # hotelLocation\n        - can I book a hotel near Space Needle`,\n      id: 'Dia1.lu'}\n    )\n\n    qnaContentArray.push({\n      content:\n        `> !# @qna.pair.source = xyz\n        <a id = \"1\"></a>\n        \n        # ?tell Joke\n        - tell me a joke\n        \n        \\`\\`\\`\n            ha ha ha\n        \\`\\`\\`\n        \n        # ?can I book a hotel near space needle\n        \\`\\`\\`\n            of course you can\n        \\`\\`\\``,\n      id: 'dia1.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `# hotelLevel\n        - J'ai besoin d'un hôtel quatre étoiles\n        \n        # hotelLocation\n        - puis-je réserver un hôtel près de l'aiguille spatiale`,\n      id: 'dia1.fr-fr.lu'}\n    )\n\n    qnaContentArray.push({\n      content:\n        `# ?raconter la blague\n        \n        \\`\\`\\`\n            ha ha ha\n        \\`\\`\\``,\n      id: 'dia1.fr-fr.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `# dia3_trigger\n        - book a flight from {fromLocation = Seattle} to {toLocation = Beijing}\n        \n        # dia4_trigger\n        - book a train ticket from Seattle to Portland`,\n      id: 'Dia2.lu'}\n    )\n\n    qnaContentArray.push({\n      content:\n        `# ?sing song\n        \\`\\`\\`\n            sure, I can sing song.\n        \\`\\`\\`\n        \n        # ?tell a joke\n        \\`\\`\\`\n            ha ha ha\n        \\`\\`\\``,\n     id: 'dia2.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `# flightDestination\n        - book a flight to {toLocation = Beijing}\n        \n        # flightTime\n        - which {flightTime} do you prefer`,\n      id: 'dia3.lu'}\n    )\n\n    qnaContentArray.push({\n      content: ``,\n      id: 'dia3.qna'\n    })\n\n    luContentArray.push({\n      content:\n        `# railwayStation\n        - which station will you leave from\n        \n        # railwayTime\n        - when do you want to leave from Seattle train station`,\n      id: 'dia4.lu'})\n\n    qnaContentArray.push({\n      content:\n      `# ? there is only qna for this dialog\n      \\`\\`\\`\n      should add filter meta data here\n      \\`\\`\\``,\n      id: 'dia5.qna'\n    })\n\n    let crossTrainConfig = {\n      rootIds: [\n        'main.lu',\n        'main.fr-fr.lu'\n      ],\n      triggerRules: {\n        'main.lu': {\n          'dia1_trigger': 'dia1.lu',\n          'dia2_trigger': 'dia2.lu'\n        },\n        'dia2.lu': {\n          'dia3_trigger': 'dia3.lu',\n          'dia4_trigger': 'dia4.lu'\n        },\n        'main.fr-fr.lu': {\n          'dia1_trigger': 'dia1.fr-fr.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, qnaContentArray, crossTrainConfig)\n    const luResult = trainedResult.luResult\n    const qnaResult = trainedResult.qnaResult\n\n    let foundIndex = luResult.get('Main.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_Main')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('Main.lu').Sections[foundIndex].Body, `- user guide${NEWLINE}- tell joke`)\n\n    foundIndex = qnaResult.get('Main.qna').Sections.findIndex(s => s.Answer === 'intent=DeferToRecognizer_LUIS_Main')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(qnaResult.get('Main.qna').Sections[foundIndex].FilterPairs[0].key, 'dialogName')\n    assert.equal(qnaResult.get('Main.qna').Sections[foundIndex].FilterPairs[0].value, 'Main')\n    assert.equal(qnaResult.get('Main.qna').Sections[foundIndex].Questions[0], 'book a hotel for me')\n    assert.equal(qnaResult.get('Main.qna').Sections[foundIndex].Questions[2], 'book a train ticket for me')\n\n    foundIndex = luResult.get('Dia1.lu').Sections.findIndex(s => s.ModelInfo === '> !# @app.name = my luis application')\n    assert.isTrue(foundIndex > -1)\n\n    foundIndex = luResult.get('Dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('Dia1.lu').Sections[foundIndex].Body, `- book a flight for me${NEWLINE}- book a train ticket for me${NEWLINE}- user guide${NEWLINE}${NEWLINE}> Source: cross training. Please do not edit these directly!`)\n    \n    foundIndex = luResult.get('Dia1.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_dia1')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('Dia1.lu').Sections[foundIndex].Body, `- tell Joke${NEWLINE}- tell me a joke`)\n\n    foundIndex = qnaResult.get('dia1.qna').Sections.findIndex(s => s.FilterPairs && s.FilterPairs[0].key === 'dialogName')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(qnaResult.get('dia1.qna').Sections[foundIndex].FilterPairs[0].value, 'dia1')\n\n    foundIndex = qnaResult.get('dia1.qna').Sections.findIndex(s => s.Questions.join(', ') === 'I need a four star hotel, book a flight for me, book a train ticket for me, user guide')\n    assert.isTrue(foundIndex > -1)\n\n    foundIndex = luResult.get('Dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('Dia2.lu').Sections[foundIndex].Name, '_Interruption')\n    assert.equal(luResult.get('Dia2.lu').Sections[foundIndex].Body, `- book a hotel for me${NEWLINE}- user guide${NEWLINE}- tell joke${NEWLINE}${NEWLINE}> Source: cross training. Please do not edit these directly!`)\n    \n    foundIndex = luResult.get('Dia2.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_dia2')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('Dia2.lu').Sections[foundIndex].Body, `- sing song${NEWLINE}- tell a joke`)\n\n    foundIndex = qnaResult.get('dia2.qna').Sections.findIndex(s => s.FilterPairs && s.FilterPairs[0].key === 'dialogName')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(qnaResult.get('dia2.qna').Sections[foundIndex].FilterPairs[0].value, 'dia2')\n\n    foundIndex = qnaResult.get('dia2.qna').Sections.findIndex(s => s.Questions.join(', ') === 'book a flight from Seattle to Beijing, book a train ticket from Seattle to Portland, book a hotel for me, user guide, tell joke')\n    assert.isTrue(foundIndex > -1)\n\n    assert.equal(luResult.get('dia3.lu').Sections.length, 6)\n    foundIndex = luResult.get('dia3.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia3.lu').Sections[foundIndex].Body, `- book a train ticket from Seattle to Portland${NEWLINE}- book a hotel for me${NEWLINE}- user guide${NEWLINE}- tell joke${NEWLINE}- sing song${NEWLINE}- tell a joke`)\n\n    assert.equal(qnaResult.get('dia3.qna').Sections.length, 1)\n    assert.equal(qnaResult.get('dia3.qna').Sections[0].Answer, 'intent=DeferToRecognizer_LUIS_dia3')\n\n    assert.equal(luResult.get('dia4.lu').Sections.length, 6)\n    foundIndex = luResult.get('dia4.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia4.lu').Sections[foundIndex].Body, `- book a flight from Seattle to Beijing${NEWLINE}- book a hotel for me${NEWLINE}- user guide${NEWLINE}- tell joke${NEWLINE}- sing song${NEWLINE}- tell a joke`)\n\n    // test add meta data for qna files only\n    assert.equal(qnaResult.get('dia5.qna').Sections.length, 1)\n    assert.equal(qnaResult.get('dia5.qna').Sections[0].Answer, 'should add filter meta data here')\n    foundIndex = qnaResult.get('dia5.qna').Sections.findIndex(s => s.FilterPairs && s.FilterPairs[0].key === 'dialogName')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(qnaResult.get('dia5.qna').Sections[foundIndex].FilterPairs[0].value, 'dia5')\n\n    foundIndex = luResult.get('main.fr-fr.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_main')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('main.fr-fr.lu').Sections[foundIndex].Body, `- guide de l'utilisateur`)\n\n    foundIndex = qnaResult.get('main.fr-fr.qna').Sections.findIndex(s => s.Answer === 'intent=DeferToRecognizer_LUIS_main')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(qnaResult.get('main.fr-fr.qna').Sections[foundIndex].FilterPairs[0].key, 'dialogName')\n    assert.equal(qnaResult.get('main.fr-fr.qna').Sections[foundIndex].FilterPairs[0].value, 'main')\n    assert.equal(qnaResult.get('main.fr-fr.qna').Sections[foundIndex].Questions.length, 1)\n    assert.equal(qnaResult.get('main.fr-fr.qna').Sections[foundIndex].Questions[0], 'réserver un hôtel')\n\n    foundIndex = luResult.get('dia1.fr-fr.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia1.fr-fr.lu').Sections[foundIndex].Body, `- guide de l'utilisateur${NEWLINE}${NEWLINE}> Source: cross training. Please do not edit these directly!`)\n    \n    foundIndex = luResult.get('dia1.fr-fr.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_dia1')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia1.fr-fr.lu').Sections[foundIndex].Body, '- raconter la blague')\n\n    foundIndex = qnaResult.get('dia1.fr-fr.qna').Sections.findIndex(s => s.Questions.join(', ') === 'J\\'ai besoin d\\'un hôtel quatre étoiles, puis-je réserver un hôtel près de l\\'aiguille spatiale, guide de l\\'utilisateur')\n    assert.isTrue(foundIndex > -1)\n  })\n\n  it('luis:cross training can get expected result when nestedIntentSection is enabled', async () => {\n    let luContentArray = []\n\n    luContentArray.push({\n      content:\n        `> !# @enableSections = true\n        > !# @enableMergeIntents = true\n        \n        # dia1_trigger\n        ## bookFlight\n        - book a flight for me\n                    \n        #dia2_trigger\n        - book a hotel for me`,\n      id:'./main/main.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# FlightTime\n        - which {flightTime} do you prefer`,\n      id:'./dia1/dia1.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# HotelLevel\n        - which hotel star do you prefer`,\n      id:'./dia2/dia2.lu'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        './main/main.lu'\n      ],\n      triggerRules: {\n        './main/main.lu': {\n          'dia1_trigger': './dia1/dia1.lu',\n          'dia2_trigger': './dia2/dia2.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, [], crossTrainConfig)\n    const luResult = trainedResult.luResult\n\n    let foundIndex = luResult.get('./dia2/dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia2/dia2.lu').Sections[foundIndex].Body, `- book a flight for me`)\n  })\n\n  it('luis:cross training can get expected result when multiple dialog invocations occur in same trigger', async () => {\n    let luContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - I want to travel to Seattle\n                    \n        #dia2_trigger\n        - book a hotel for me`,\n      id: './main/main.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# bookFlight\n        - book a flight for me`,\n      id: './dia1/dia1.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# bookTrain\n        - book a train ticket for me`,\n      id: './dia2/dia2.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# HotelLevel\n        - I prefer 4 stars hotel`,\n      id: './dia3/dia3.lu'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        './main/main.lu'\n      ],\n      triggerRules: {\n        './main/main.lu': {\n          'dia1_trigger': ['./dia1/dia1.lu', './dia2/dia2.lu'],\n          'dia2_trigger': './dia3/dia3.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, [], crossTrainConfig)\n    const luResult = trainedResult.luResult\n\n    let foundIndex = luResult.get('./dia1/dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia1/dia1.lu').Sections[foundIndex].Body, `- book a hotel for me`)\n\n    foundIndex = luResult.get('./dia2/dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia2/dia2.lu').Sections[foundIndex].Body, '- book a hotel for me')\n\n    foundIndex = luResult.get('./dia3/dia3.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia3/dia3.lu').Sections[foundIndex].Body, '- I want to travel to Seattle')\n  })\n\n  it('luis:cross training can get expected result when local intents exist', async () => {\n    let luContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - I want to travel to Seattle\n                    \n        # dia2_trigger\n        - book a hotel for me\n        \n        # local_intent\n        - help`,\n      id: './main/main.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# bookTicket\n        - book a flight for me\n        - book a train ticket for me`,\n      id: './dia1/dia1.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# hotelLevel\n        - I prefer 4 stars hotel`,\n      id: './dia2/dia2.lu'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        './main/main.lu'\n      ],\n      triggerRules: {\n        './main/main.lu': {\n          'dia1_trigger': './dia1/dia1.lu',\n          'dia2_trigger': './dia2/dia2.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, [], crossTrainConfig)\n    const luResult = trainedResult.luResult\n\n    let foundIndex = luResult.get('./dia1/dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia1/dia1.lu').Sections[foundIndex].Body, `- book a hotel for me`)\n\n    foundIndex = luResult.get('./dia2/dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia2/dia2.lu').Sections[foundIndex].Body, `- I want to travel to Seattle`)\n  })\n\n  it('luis:cross training can get expected result when trigger intent or dialog is empty', async () => {\n    let luContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - I want to travel to Seattle\n                    \n        # dia2_trigger\n        - book a hotel for me\n        \n        # dia3_trigger\n        - cancel`,\n      id: './main/main.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# bookTicket\n        - book a flight for me\n        - book a train ticket for me`,\n      id: './dia1/dia1.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# hotelLevel\n        - I prefer 4 stars hotel`,\n      id: './dia2/dia2.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# help\n        - can I help you`,\n      id: './dia3/dia3.lu'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        './main/main.lu'\n      ],\n      triggerRules: {\n        './main/main.lu': {\n          'dia1_trigger': './dia1/dia1.lu',\n          'dia2_trigger': './dia2/dia2.lu',\n          'dia3_trigger': '',\n          '': './dia3/dia3.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, [], crossTrainConfig)\n    const luResult = trainedResult.luResult\n\n    let foundIndex = luResult.get('./dia1/dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia1/dia1.lu').Sections[foundIndex].Body, `- book a hotel for me${NEWLINE}- cancel`)\n\n    foundIndex = luResult.get('./dia2/dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia2/dia2.lu').Sections[foundIndex].Body, `- I want to travel to Seattle${NEWLINE}- cancel`)\n\n    foundIndex = luResult.get('./dia3/dia3.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia3/dia3.lu').Sections[foundIndex].Body, `- I want to travel to Seattle${NEWLINE}- book a hotel for me${NEWLINE}- cancel`)\n  })\n\n  it('luis:cross training can get expected result when multi trigger intents point to same lu file', async () => {\n    let luContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - I want to travel to Seattle\n                    \n        # dia2_trigger\n        - book a hotel for me\n        \n        # dia3_trigger\n        - cancel`,\n      id: './main/main.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# bookTicket\n        - book a flight for me\n        - book a train ticket for me\n        \n        # hotelLevel\n        - I prefer 4 stars hotel`,\n      id: './dia1/dia1.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# cancelTask\n        - cancel that task`,\n      id: './dia2/dia2.lu'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        './main/main.lu'\n      ],\n      triggerRules: {\n        './main/main.lu': {\n          'dia1_trigger': './dia1/dia1.lu',\n          'dia2_trigger': './dia1/dia1.lu',\n          'dia3_trigger': './dia2/dia2.lu',\n          '': './dia2/dia2.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, [], crossTrainConfig)\n    const luResult = trainedResult.luResult\n\n    let foundIndex = luResult.get('./dia1/dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia1/dia1.lu').Sections[foundIndex].Body, `- cancel`)\n\n    foundIndex = luResult.get('./dia2/dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('./dia2/dia2.lu').Sections[foundIndex].Body, `- I want to travel to Seattle${NEWLINE}- book a hotel for me`)\n  })\n\n  it('luis:cross training can get expected result when handling patterns', async () => {\n    let luContentArray = []\n    let qnaContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - book a hotel for me\n        - book a hotel for {@personName}\n        - book a hotel for {name}\n        \n        # dia2_trigger\n        - book a flight for me\n        - book a train ticket for me\n        - can you book a flight for {@ personName : userName}\n        \n        @ prebuilt personName`,\n      id: 'main.lu'})\n\n    qnaContentArray.push({\n      content:\n        `# ?user guide\n\n        **Filters:**\n        - aa=bb\n        \n        \\`\\`\\`\n            Here is the [user guide](http://contoso.com/userguide.pdf)\n        \\`\\`\\`\n        \n        # ?tell joke\n        \\`\\`\\`\n            tell a funny joke\n        \\`\\`\\``,\n      id: 'main.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `> !# @app.name = my luis application\n        \n        # hotelLevel\n        - I need a four star hotel\n        \n        # hotelLocation\n        - can I book a hotel near space needle`,\n      id: 'dia1.lu'}\n    )\n\n    luContentArray.push({\n      content:\n        `# dia3_trigger\n        - book a flight from {fromLocation = Seattle} to {toLocation = Beijing}\n        \n        # dia4_trigger\n        - book a train ticket from Seattle to Portland`,\n      id: 'dia2.lu'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        'main.lu'\n      ],\n      triggerRules: {\n        'main.lu': {\n          'dia1_trigger': 'dia1.lu',\n          'dia2_trigger': 'dia2.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, qnaContentArray, crossTrainConfig)\n    const luResult = trainedResult.luResult\n    const qnaResult = trainedResult.qnaResult\n\n    let foundIndex = luResult.get('main.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_main')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('main.lu').Sections[foundIndex].Body, `- user guide${NEWLINE}- tell joke`)\n\n    foundIndex = qnaResult.get('main.qna').Sections.findIndex(s => s.Answer === 'intent=DeferToRecognizer_LUIS_main')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(qnaResult.get('main.qna').Sections[foundIndex].FilterPairs[0].key, 'dialogName')\n    assert.equal(qnaResult.get('main.qna').Sections[foundIndex].FilterPairs[0].value, 'main')\n    assert.equal(qnaResult.get('main.qna').Sections[foundIndex].Questions.length, 3)\n    assert.equal(qnaResult.get('main.qna').Sections[foundIndex].Questions[0], 'book a hotel for me')\n    assert.equal(qnaResult.get('main.qna').Sections[foundIndex].Questions[1], 'book a flight for me')\n    assert.equal(qnaResult.get('main.qna').Sections[foundIndex].Questions[2], 'book a train ticket for me')\n\n\n    foundIndex = luResult.get('dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia1.lu').Sections[foundIndex].Body, `- book a flight for me${NEWLINE}- book a train ticket for me${NEWLINE}- user guide${NEWLINE}- tell joke`)\n\n    foundIndex = luResult.get('dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia2.lu').Sections[foundIndex].Body, `- book a hotel for me${NEWLINE}- book a hotel for {@name}${NEWLINE}- user guide${NEWLINE}- tell joke`)\n  })\n\n  it('luis:cross training can get expected result when all lu files are empty', async () => {\n    let luContentArray = []\n    let qnaContentArray = []\n\n    luContentArray.push({\n      content: `> this is comments`,\n      id: 'main.lu'})\n\n    qnaContentArray.push({\n      content:\n        `# ?user guide\n\n        **Filters:**\n        - aa=bb\n        \n        \\`\\`\\`\n            Here is the [user guide](http://contoso.com/userguide.pdf)\n        \\`\\`\\`\n        \n        # ?tell joke\n        \\`\\`\\`\n            tell a funny joke\n        \\`\\`\\``,\n      id: 'main.qna'}\n    )\n\n    luContentArray.push({\n      content: `> !# @app.name = my luis application`,\n      id: 'dia1.lu'}\n    )\n\n    qnaContentArray.push({\n      content:\n        `> !# @qna.pair.source = xyz\n        <a id = \"1\"></a>\n        \n        # ?tell Joke\n        - tell me a joke\n        \n        \\`\\`\\`\n            ha ha ha\n        \\`\\`\\`\n        \n        # ?can I book a hotel near space needle\n        \\`\\`\\`\n            of course you can\n        \\`\\`\\``,\n      id: 'dia1.qna'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [],\n      triggerRules: {},\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, qnaContentArray, crossTrainConfig)\n    const luResult = trainedResult.luResult\n    const qnaResult = trainedResult.qnaResult\n\n    assert.equal(luResult.get('main.lu').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n\n    assert.equal(qnaResult.get('main.qna').Sections.length, 2)\n    assert.equal(qnaResult.get('main.qna').Sections[0].FilterPairs[1].key, 'dialogName')\n    assert.equal(qnaResult.get('main.qna').Sections[0].FilterPairs[1].value, 'main')\n    assert.equal(qnaResult.get('main.qna').Sections[1].FilterPairs[0].key, 'dialogName')\n    assert.equal(qnaResult.get('main.qna').Sections[1].FilterPairs[0].value, 'main')\n\n    assert.equal(luResult.get('dia1.lu').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n\n    assert.equal(qnaResult.get('dia1.qna').Sections.length, 2)\n    assert.equal(qnaResult.get('dia1.qna').Sections[0].FilterPairs[0].key, 'dialogName')\n    assert.equal(qnaResult.get('dia1.qna').Sections[0].FilterPairs[0].value, 'dia1')\n    assert.equal(qnaResult.get('dia1.qna').Sections[1].FilterPairs[0].key, 'dialogName')\n    assert.equal(qnaResult.get('dia1.qna').Sections[1].FilterPairs[0].value, 'dia1')\n  })\n\n  it('luis:cross training can get expected result when all qna files are empty', async () => {\n    let luContentArray = []\n    let qnaContentArray = []\n\n    luContentArray.push({\n      content:\n        `# dia1_trigger\n        - book a hotel for me\n        \n        # dia2_trigger\n        - book a flight for me\n        - book a train ticket for me`,\n      id: 'main.lu'})\n\n    qnaContentArray.push({\n      content: `> this is comment`,\n      id: 'main.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `> !# @app.name = my luis application\n        \n        # hotelLevel\n        - I need a four star hotel\n        \n        # hotelLocation\n        - can I book a hotel near Space Needle`,\n      id: 'dia1.lu'}\n    )\n\n    qnaContentArray.push({\n      content: ``,\n      id: 'dia1.qna'}\n    )\n\n    luContentArray.push({\n      content:\n        `# bookFlight\n        - book a flight from {fromLocation = Seattle} to {toLocation = Beijing}\n        \n        # bookTrain\n        - book a train ticket from Seattle to Portland`,\n      id: 'dia2.lu'}\n    )\n\n    qnaContentArray.push({\n      content:``,\n      id: 'dia2.qna'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [\n        'main.lu'\n      ],\n      triggerRules: {\n        'main.lu': {\n          'dia1_trigger': 'dia1.lu',\n          'dia2_trigger': 'dia2.lu'\n        }\n      },\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, qnaContentArray, crossTrainConfig)\n    const luResult = trainedResult.luResult\n    const qnaResult = trainedResult.qnaResult\n\n    assert.isTrue(luResult.get('main.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_main') === -1)\n    assert.equal(qnaResult.get('main.qna').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n\n    let foundIndex = luResult.get('dia1.lu').Sections.findIndex(s => s.ModelInfo === '> !# @app.name = my luis application')\n    assert.isTrue(foundIndex > -1)\n\n    foundIndex = luResult.get('dia1.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia1.lu').Sections[foundIndex].Body, `- book a flight for me${NEWLINE}- book a train ticket for me`)\n    \n    assert.isTrue(luResult.get('dia1.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_dia1') === -1)\n\n    assert.equal(qnaResult.get('dia1.qna').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n\n    foundIndex = luResult.get('dia2.lu').Sections.findIndex(s => s.Name === '_Interruption')\n    assert.isTrue(foundIndex > -1)\n    assert.equal(luResult.get('dia2.lu').Sections[foundIndex].Body, `- book a hotel for me`)\n    \n    assert.isTrue(luResult.get('dia2.lu').Sections.findIndex(s => s.Name === 'DeferToRecognizer_QnA_dia2') === -1)\n\n    assert.equal(qnaResult.get('dia2.qna').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n  })\n\n  it('luis:cross training can get expected result when all lu and qna files are empty', async () => {\n    let luContentArray = []\n    let qnaContentArray = []\n\n    luContentArray.push({\n      content: `> this is comment`,\n      id: 'main.lu'})\n\n    qnaContentArray.push({\n      content: `> this is comment`,\n      id: 'main.qna'}\n    )\n\n    luContentArray.push({\n      content: `> !# @app.name = my luis application`,\n      id: 'dia1.lu'}\n    )\n\n    qnaContentArray.push({\n      content: `> this is comment`,\n      id: 'dia1.qna'}\n    )\n\n    let crossTrainConfig = {\n      rootIds: [],\n      triggerRules: {},\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, qnaContentArray, crossTrainConfig)\n    const luResult = trainedResult.luResult\n    const qnaResult = trainedResult.qnaResult\n\n    assert.equal(luResult.get('main.lu').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n    assert.equal(qnaResult.get('main.qna').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n    assert.equal(luResult.get('dia1.lu').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n    assert.equal(qnaResult.get('dia1.qna').Sections.filter(s => s.SectionType !== sectionTypes.MODELINFOSECTION).length, 0)\n  })\n\n  it('luis:cross training can get expected result when customized import resolver is provided', async () => {\n    let importResolver = async function (srcId, idsToFind) {\n      let luObjects = []\n      let parentFilePath = path.parse(path.resolve(srcId)).dir\n      for (let idx = 0; idx < idsToFind.length; idx++) {\n        let file = idsToFind[idx]\n        if (!path.isAbsolute(file.filePath)) {\n          file.filePath = path.resolve(parentFilePath, file.filePath)\n        }\n\n        if (file.filePath.endsWith(\"common.lu\")) {\n          luObjects.push(new luObject(`# common_intent${NEWLINE}- this is common utterance`, new luOptions(file.filePath, file.includeInCollate)))\n        } else if (file.filePath.endsWith(\"common.qna\")) {\n          luObjects.push(new luObject(`# ? common_question${NEWLINE}\\`\\`\\`${NEWLINE}this is common answer${NEWLINE}\\`\\`\\``, new luOptions(file.filePath, file.includeInCollate)))\n        }\n      }\n      return luObjects\n    };\n\n    let luContentArray = []\n    let qnaContentArray = []\n\n    luContentArray.push({\n      content:\n        `[import](common.lu)\n      # dia1_trigger\n      - book a hotel for me`,\n      id: path.join(rootDir, 'main.en-us.lu')\n    })\n\n    qnaContentArray.push({\n      content:\n        `[import](common.qna)\n      # ? where is Seattle\n      \\`\\`\\`\n      northwest of USA\n      \\`\\`\\``,\n      id: path.join(rootDir, 'main.en-us.qna')\n    }\n    )\n\n    luContentArray.push({\n      content:\n        `# hotelLocation\n      - hotel in Seattle\n      - [import](common.lu#common_intent)`,\n      id: path.join(rootDir, 'dia1.en-us.lu')\n    }\n    )\n\n    qnaContentArray.push({\n      content:\n        `[import](common.qna)\n      # ? cancel\n      \\`\\`\\`\n      please cancel that\n      \\`\\`\\``,\n      id: path.join(rootDir, 'dia1.en-us.qna')\n    }\n    )\n\n    let crossTrainConfig = {\n      rootIds: [path.join(rootDir, \"main.en-us.lu\")],\n      triggerRules: {},\n      intentName: '_Interruption',\n      verbose: true\n    }\n\n    crossTrainConfig.triggerRules[path.join(rootDir, \"main.en-us.lu\")] = { 'dia1_trigger': path.join(rootDir, \"dia1.en-us.lu\") }\n\n    const trainedResult = await crossTrainer.crossTrain(luContentArray, qnaContentArray, crossTrainConfig, importResolver)\n    const luResult = trainedResult.luResult\n    const qnaResult = trainedResult.qnaResult\n\n    assert.equal(luResult.get(path.join(rootDir, \"main.en-us.lu\")).Sections.filter(s => s.SectionType === sectionTypes.SIMPLEINTENTSECTION).length, 3)\n    assert.equal(luResult.get(path.join(rootDir, \"main.en-us.lu\")).Sections.filter(s => s.SectionType === sectionTypes.SIMPLEINTENTSECTION)[1].Name, \"common_intent\")\n    assert.isTrue(luResult.get(path.join(rootDir, \"main.en-us.lu\")).Sections.filter(s => s.SectionType === sectionTypes.SIMPLEINTENTSECTION)[1].Body.includes(`- this is common utterance`))\n    assert.equal(luResult.get(path.join(rootDir, \"dia1.en-us.lu\")).Sections.filter(s => s.SectionType === sectionTypes.SIMPLEINTENTSECTION).length, 3)\n    assert.isTrue(luResult.get(path.join(rootDir, \"dia1.en-us.lu\")).Sections.filter(s => s.SectionType === sectionTypes.SIMPLEINTENTSECTION)[0].Body.includes(`- hotel in Seattle${NEWLINE}- this is common utterance`))\n\n    assert.equal(qnaResult.get(path.join(rootDir, \"main.en-us.qna\")).Sections.filter(s => s.SectionType === sectionTypes.QNASECTION).length, 3)\n    assert.isTrue(qnaResult.get(path.join(rootDir, \"main.en-us.qna\")).Sections.filter(s => s.SectionType === sectionTypes.QNASECTION)[1].Body.includes(`# ? common_question${NEWLINE}${NEWLINE}**Filters:**${NEWLINE}- dialogName=main${NEWLINE}${NEWLINE}\\`\\`\\`${NEWLINE}this is common answer${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}`))\n    assert.equal(qnaResult.get(path.join(rootDir, \"dia1.en-us.qna\")).Sections.filter(s => s.SectionType === sectionTypes.QNASECTION).length, 3)\n    assert.isTrue(qnaResult.get(path.join(rootDir, \"dia1.en-us.qna\")).Sections.filter(s => s.SectionType === sectionTypes.QNASECTION)[1].Body.includes(`# ? common_question${NEWLINE}${NEWLINE}**Filters:**${NEWLINE}- dialogName=dia1${NEWLINE}${NEWLINE}\\`\\`\\`${NEWLINE}this is common answer${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}`))\n  })\n})\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lu/lu.test.js",
    "content": "let chai = require('chai');\nlet expect = chai.expect;\nconst fs = require('fs-extra')\nconst path = require('path')\nconst nock = require('nock')\nconst LU = require('./../../../src/parser/lu/lu')\n\nconst compareLuFiles =  function(file1, file2) {\n  let result = file1.toString().replace(/\\r\\n/g, \"\\n\")\n  let fixtureFile = file2.toString().replace(/\\r\\n/g, \"\\n\")\n  expect(result).to.deep.equal(fixtureFile)\n}\n\n\ndescribe('LU instance', function() {\n    const response = require('./../../fixtures/translation/serviceresponses/intentsAndutterances.json')\n  \n    before(function(){\n      nock('https://api.cognitive.microsofttranslator.com')\n      .post(/.*/)\n      .reply(200, response)\n  \n    })\n    it('Transalte LU instance content', async () => {\n        let luContent = await fs.readFile(path.join(__dirname, './../../fixtures/translation/files/intentsAndUtterances.lu'))\n        let result = await fs.readFile(path.join(__dirname, './../../fixtures/translation/translatedfiles/intentsAndUtterances.lu'))\n        const luInstance = new LU(luContent.toString())\n        await luInstance.translate('xxxxxxx', 'fr', true, false)\n        compareLuFiles(luInstance.content, result)\n    });\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lubuild/lubuild.test.js",
    "content": "const assert = require('chai').assert\nconst nock = require('nock')\nconst path = require('path')\nconst NEWLINE = require('os').EOL\nconst Builder = require('../../../src/parser/lubuild/builder').Builder\nconst luObject = require('../../../src/parser/lu/lu')\nconst luOptions = require('../../../src/parser/lu/luOptions')\nconst txtfile = require('../../../src/parser/lufile/read-text-file');\n\nconst rootDir = path.join(__dirname, './../../fixtures/testcases/import-resolver/lu-import-resolver')\n\ndescribe('builder: getActiveVersionIds function return version id sucessfully', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, [{\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5'\n      }, {\n        name: 'app2',\n        id: 'f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      }\n      ])\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, {\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n        activeVersion: 0.1\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, {\n        name: 'app2',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n        activeVersion: 0.2\n      })\n  })\n\n  it('should get active version ids successfully', async () => {\n    const builder = new Builder()\n    const appNameVersioIdMap = await builder.getActiveVersionIds(['app1', 'app2'], 'f8c64e2a-3333-3a09-8f78-39d7adc76ec5', 'westus')\n    assert.equal(appNameVersioIdMap.get('app1'), '0.1')\n    assert.equal(appNameVersioIdMap.get('app2'), '0.2')\n  })\n})\n\ndescribe('builder: getActiveVersionIds function return version id sucessfully with retry for rate limit issue', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, [{\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5'\n      }, {\n        name: 'app2',\n        id: 'f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      }\n      ])\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, {\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n        activeVersion: 0.1\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, {\n        name: 'app2',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n        activeVersion: 0.2\n      })\n  })\n\n  it('should get active version ids successfully with retry', async () => {\n    const builder = new Builder()\n    const appNameVersioIdMap = await builder.getActiveVersionIds(['app1', 'app2'], 'f8c64e2a-3333-3a09-8f78-39d7adc76ec5', 'westus', 3, 1000)\n    assert.equal(appNameVersioIdMap.get('app1'), '0.1')\n    assert.equal(appNameVersioIdMap.get('app2'), '0.2')\n  })\n})\n\ndescribe('builder: getActiveVersionIds function return version id failed with maximum retry count for rate limit issue', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, [{\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5'\n      }, {\n        name: 'app2',\n        id: 'f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      }\n      ])\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, {\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n        activeVersion: 0.1\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n  })\n\n  it('should get active version ids failed', async () => {\n    const builder = new Builder()\n    try {\n      await builder.getActiveVersionIds(['app1', 'app2'], 'f8c64e2a-3333-3a09-8f78-39d7adc76ec5', 'westus', 3, 1000)\n      assert.fail()\n    } catch (e) {\n      assert.equal(e.message, 'Rate limit is exceeded')\n    }\n  })\n})\n\ndescribe('builder: getActiveVersionIds function return version id failed for non rate limit issue', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, [{\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5'\n      }, {\n        name: 'app2',\n        id: 'f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      }\n      ])\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(200, {\n        name: 'app1',\n        id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n        activeVersion: 0.1\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(429, {\n        error: {\n          message: 'Rate limit is exceeded'\n        }\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('apps'))\n      .reply(401, {\n        error: {\n          message: 'You do not have access'\n        }\n      })\n  })\n\n  it('should get active version ids failed for non rate limit issue', async () => {\n    const builder = new Builder()\n    try {\n      await builder.getActiveVersionIds(['app1', 'app2'], 'f8c64e2a-3333-3a09-8f78-39d7adc76ec5', 'westus', 3, 1000)\n      assert.fail()\n    } catch (e) {\n      assert.equal(e.message, 'You do not have access')\n    }\n  })\n})\n\ndescribe('builder: loadContents function can resolve import files with customized resolver', () => {\n  it('should load contents sucessfully after resolving imports', async () => {\n    let importResolver = async function (srcId, idsToFind) {\n      let luObjects = []\n      let parentFilePath = path.parse(path.resolve(srcId)).dir\n      for (let idx = 0; idx < idsToFind.length; idx++) {\n        let file = idsToFind[idx]\n        if (!path.isAbsolute(file.filePath)) {\n          file.filePath = path.resolve(parentFilePath, file.filePath)\n        }\n\n        if (file.filePath.endsWith(\".lu\")) {\n          file.filePath = file.filePath.slice(0, file.filePath.length - 2) + \"en-us.lu\"\n          luObjects.push(new luObject(txtfile.readSync(file.filePath), new luOptions(file.filePath, file.includeInCollate)))\n        }\n      }\n      return luObjects\n    };\n\n    const builder = new Builder(() => { })\n    const result = await builder.loadContents(\n      [`${path.join(rootDir, \"common.en-us.lu\")}`],\n      \"en-us\",\n      \"dev\",\n      \"westus\",\n      undefined,\n      importResolver)\n\n    assert.equal(result.luContents.length, 1)\n    assert.isTrue(result.luContents[0].content.includes(\n      `help${NEWLINE}- could you help${NEWLINE}- can you help me${NEWLINE}${NEWLINE}${NEWLINE}## cancel${NEWLINE}- cancel that${NEWLINE}- cancel the task${NEWLINE}- stop that${NEWLINE}${NEWLINE}${NEWLINE}## welcome${NEWLINE}- welcome here`\n    ))\n  })\n})"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/appKbMetaData.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents');\nconst luis = require('./../../../src/parser/luis/luis');\nconst tokTest = require('./../../fixtures/testcases/testTokenizerVersion.json');\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('App/ Kb meta data information', function () {\n    it ('tokenizerVersion information is persisted in LU content', function() {\n        let luisObj = new luis(tokTest);\n        let luContent = luisObj.parseToLuContent();\n        assert.isTrue(luContent.includes(\"@app.tokenizerVersion = 1.0.2\"));\n    })\n    it ('application meta data information in lu file is parsed correctly', function(done) {\n        let testLU = `> !# @app.name = all345\n        > !# @app.desc = this is a test\n        > !#  @app.culture = en-us\n        > !# @app.versionId = 0.4\n        > !# @app.luis_schema_version = 3.2.0\n        \n        # test \n        - greeting`;\n\n        parseFile.parseFile(testLU)\n                .then(res => {\n                        assert.equal(res.LUISJsonStructure.name, 'all345');\n                        assert.equal(res.LUISJsonStructure.desc, 'this is a test');\n                        assert.equal(res.LUISJsonStructure.culture, 'en-us');\n                        assert.equal(res.LUISJsonStructure.versionId, '0.4');\n                        assert.equal(res.LUISJsonStructure.luis_schema_version, '3.2.0')\n                        done();\n                })\n                .catch(err => done(err))\n    });\n\n    it ('kb meta data information in lu file is parsed correctly', function(done) {\n            let testLU = `> !# @kb.name = my test kb\n            # ? hi\n            \\`\\`\\`markdown\n            hello\n            \\`\\`\\``;\n\n            parseFile.parseFile(testLU)\n                    .then(res => {\n                            assert.equal(res.qnaJsonStructure.name, 'my test kb');\n                            done();\n                    })\n                    .catch(err => done(err))\n    })\n\n    it ('LUIS and QnA meta data information in lu file is parsed correctly', function(done){\n            let testLU = `> !# @kb.name = my test kb\n            # ? hi\n            \\`\\`\\`markdown\n            hello\n            \\`\\`\\`\n            \n            > !# @app.versionId = 0.6\n            > !# @app.name = orange tomato\n            \n            # test\n            - greeting`;\n            \n            parseFile.parseFile(testLU) \n                    .then(res => {\n                            assert.equal(res.qnaJsonStructure.name, 'my test kb');\n                            assert.equal(res.LUISJsonStructure.name, 'orange tomato');\n                            assert.equal(res.LUISJsonStructure.versionId, '0.6');\n                            done();\n                    })\n                    .catch(err => done(err))\n    })\n\n    it ('Multi line app meta data definition throws correctly', function(done){\n            let testLU = `> !# @kb.name = foo bar\n            test\n            \n            # ? test q`;\n\n            parseFile.parseFile(testLU)\n                    .then(res => done(`Did not throw when expected`))\n                    .catch(err => done())\n    })\n\n    it ('Settings information is parsed correctly', function(done){\n        let testLU = `\n> !# @app.settings.NormalizeDiacritics = true\n> !# @app.settings.NormalizePunctuation = false\n> !# @app.settings.UseAllTrainingData = true\n\n# test\n- one`;\n\n        parseFile.parseFile(testLU)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.settings.length, 3);\n                    assert.equal(res.LUISJsonStructure.settings[1].name, \"NormalizePunctuation\")\n                    assert.equal(res.LUISJsonStructure.settings[1].value, false)\n                    done();\n                })\n                .catch(err => done(err))\n    })\n\n    it ('Settings information is correctly converted back to LU', function(done){\n        let testLU = `\n> !# @app.settings.NormalizeDiacritics = true\n> !# @app.settings.NormalizePunctuation = false\n> !# @app.settings.UseAllTrainingData = true\n\n# test\n- one`;\n\n        parseFile.parseFile(testLU)\n            .then(res => {\n                let parsedLuis = new luis(res.LUISJsonStructure);\n                assert(parsedLuis.parseToLuContent().includes(\"!# @app.settings.NormalizeDiacritics = true\"));\n                done();\n            })\n            .catch(err => done(err))\n    })\n\n\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/classes/classes.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst exception = require('./../../../../src/parser/utils/exception');\nconst QnA = require('./../../../../src/parser/qna/qnamaker/kb');\nconst QnAList = require('./../../../../src/parser/qna/qnamaker/qnaList');\nconst QnAMetadata = require('./../../../../src/parser/qna/qnamaker/qnaMetaData');\nconst hClasses = require('./../../../../src/parser/lufile/classes/hclasses');\nconst qnaContext = require('./../../../../src/parser/qna/qnamaker/qnaContext');\n\ndescribe('Testing all classes', function() {\n    describe('Exception class', function() {\n        it('can create a new instance from a valid object', function() {\n            let testData = {\n                text: 'foo',\n                errCode: 21\n            };\n            assert.equal(new exception(testData).text, testData.text);\n        });\n        it('can create a new instance from an invalid object', function() {\n            let testData = {\n                text1: 'foo',\n                errCode1: 21\n            };\n            assert.equal(new exception(testData).text, '');\n        });\n        it('can create a new instance from explicit values passed in as args', function() {\n            let testData = {\n                text: 'foo',\n                errCode: 21\n            };\n            assert.equal(new exception(21, 'foo').text, testData.text);\n        });\n        it('can create a new instance from an empty object', function() {\n            let testData = {};\n            assert.equal(new exception(testData).text, '');\n        });\n        it('can create a new instance from no values passed in as args', function() {\n            assert.equal(new exception().text, '');\n        });\n    });\n\n    describe('QnA class', function() {\n        it('can create a new instance with explicit values as args', function() {\n            let qnatList = {test:123};\n            let qna = new QnA()\n            qna.qnaList = qnatList\n            assert.deepEqual(qna.qnaList, qnatList)\n        });\n\n        it('can create a new instance with no values passed in', function() {\n            assert.deepEqual(new QnA().qnaList, []);\n        });\n    });\n\n    describe('QnA List class', function() {\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new QnAList(0, 'test', '1', ['2'], {}), {id: 0, answer: 'test', source: '1', questions: ['2'], metadata: {}, context : new qnaContext()});\n        });\n\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new QnAList().id, 0);\n        });\n    });\n\n    describe('QnA Metadata class', function() {\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new QnAMetadata('1', '2'), {name: '1', value: '2'});\n        });\n\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new QnAMetadata().name, '');\n        });\n    });\n\n    describe('readerObj class', function(){\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new hClasses.readerObject('1', '2'), {sourceFile: '1', model: '2'});\n        });\n\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.readerObject().sourceFile, '');\n        });\n    });\n\n    describe('entity class', function() {\n        it('can create a new instance with mix of values passed in', function() {\n            assert.equal(new hClasses.entity(null, '123', null, null).value, '123');\n        });\n    });\n\n    describe('intent class', function(){\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new hClasses.intent('1', '2'), {intent: '1', utterances: '2'});\n        });\n\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.intent().intent, '');\n        });\n    });\n\n    describe('uttereances class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.uttereances().text, '');\n        });\n    });\n\n    describe('pattern class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.pattern().pattern, '');\n        });\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new hClasses.pattern('1', '2'), {pattern: '1', intent: '2'});\n        });\n    });\n\n    describe('subList class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.subList().canonicalForm, '');\n        });\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new hClasses.subList('1', '2'), {canonicalForm: '1', list: '2'});\n        });\n    });\n\n    describe('closedLists class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.closedLists().name , '');\n        });\n        it('can create a new instance with explicit values as args', function() {\n            assert.deepEqual(new hClasses.closedLists('1', '2', '3'), {name: '1', subLists: '2', roles: '3'});\n        });\n    });\n\n    describe('modelObj class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.modelObj().name, '');\n        });\n    });\n\n    describe('regex entity class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.regExEntity().name, '');\n        });\n    });\n\n    describe('composite entity class', function() {\n        it('can create a new instance with no values passed in', function() {\n            assert.equal(new hClasses.compositeEntity().name, '');\n        });\n    });\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/helpers.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst helpers = require('./../../../src/parser/utils/helpers');\nconst path = require('path');\n\nconst LUDOWN_ROOT = path.join(__dirname, './../../fixtures/');\nfunction resolvePath(relativePath) {\n    return path.join(LUDOWN_ROOT, relativePath);\n}\n\ndescribe('With helper functions', function() {\n    it('findLUFiles should recursively find subfolders', function(done) {\n        let rootPath = resolvePath('examples');\n        let findFilesIncludingSubfolders = helpers.findLUFiles(rootPath, true);\n        let findFilesInRootFolder = helpers.findLUFiles(rootPath, false);\n        try {\n            assert.notEqual(findFilesIncludingSubfolders.length, findFilesInRootFolder.length);\n            done();\n        } catch (err) {\n            done(err);\n        }\n    });\n\n    it('parseLinkURI throws when invalid link definition is found', function(done){\n        let testLu = `[test](https://botframework.com`;\n        helpers.parseLinkURI(testLu)\n            .then(res => {\n                done('Test failed: splitFileBySections did not throw!');\n            }).catch(err => done());\n    });\n\n    it('parseLinkURI throws when invalid link definition is found', function(done){\n        let testLu = `[test](https://botframework.com)`;\n        helpers.parseLinkURI(testLu)\n            .then(res => {\n                done('Test failed: splitFileBySections did not throw!');\n            }).catch(err => done());\n    });\n\n    it('parseLinkURI throws when invalid link definition is found', function(done){\n        let testLu = `[test](./1.lu)`;\n        helpers.parseLinkURI(testLu)\n            .then(res => {\n                done('Test failed: splitFileBySections did not throw!');\n            }).catch(err => done());\n    });\n\n    it('parseLinkURI throws when invalid link definition is found', function(done){\n        let testLu = `[test](./1.lu/*)`;\n        helpers.parseLinkURI(testLu)\n            .then(res => {\n                done('Test failed: splitFileBySections did not throw!');\n            }).catch(err => done());\n    });\n\n    it('parseLinkURI throws when invalid link definition is found', function(done){\n        let testLu = `[test](./1.lu/!)`;\n        helpers.parseLinkURI(testLu)\n            .then(res => {\n                done('Test failed: splitFileBySections did not throw!');\n            }).catch(err => done());\n    });\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/luQnAFileReference.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst luMerger = require('./../../../src/parser/lu/luMerger');\nconst luObj = require('../../../src/parser/lu/lu');\nconst luOptions = require('../../../src/parser/lu/luOptions');\nconst luisBuilder = require('./../../../src/parser/luis/luisBuilder');\ndescribe('Deep reference tests', function() {\n    it('Ability to pull in all answers from a qna', function(done) {\n        let luContent = `\n> pull in all answers from .qna file. Note: The trailing '?' is required.\n> - [all.qna](./all.qna#*answers*?)\n# intent1\n- [all answers](qna1#*answers*?)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 2);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"answer1\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[1].text, \"answer2\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Ability to pull all variations from a specific question in .qna', function(done) {\n        let luContent = `\n> pull in all variations from a specific question. Note: The trailing '?' is required.\n> [all.qna](qna2#?-book-flight?)\n# intent1\n- [all.qna](qna2#?-book-flight?)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 4);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"book flight\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[3].text, \"I'm looking to fly\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Ability to pull all alterations from qna content', function(done) {\n        let luContent = `\n> pull in all variations from a specific question. Note: The trailing '?' is required.\n> [all.qna](qna3.qna#*alterations*?)\n# intent1\n- [all.qna](qna3#*alterations*?)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 3);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"botframework\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[2].text, \"Microsoft bot framework\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Ability to pull in specific named alterations from qna content', function(done) {\n        let luContent = `\n> pull in speicific named alteration from qna content. Note: Alterations must be $ListName notation. The trailing '?' is required. \n> - [all.qna](./all.qna#$myListName1?)\n# intent1\n- [all.qna](qna4#$myListName1?)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 2);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"myListName1\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[1].text, \"test list\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Ability to pull in all utterances and patterns from given lu content', function(done) {\n        let luContent = `\n# intent1\n- [all.lu](lu1#*utterancesandpatterns*)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 4);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"one\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[2].text, \"three\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.patterns.length, 1);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.patterns[0].pattern, \"pattern {one}\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Ability to pull in all utterances only', function(done) {\n        let luContent = `\n# intent1\n- [all.lu](lu1#*utterances*)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 4);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"one\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[2].text, \"three\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.patterns.length, 0);\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Ability to pull in all patterns only', function(done) {\n        let luContent = `\n# intent1\n- [all.lu](lu1#*patterns*)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 0);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.patterns.length, 1);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.patterns[0].pattern, \"pattern {one}\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.patterns[0].intent, \"intent1\");\n\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('Recursively resolve references', function(done) {\n        let luContent = `\n# intent1\n- [lu10](lu10#*)\n- [ref2](ref1#*)\n- [qna1](qna1#?)\n        `;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => {\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances.length, 3);\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[0].text, \"result\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[1].text, \"q1\");\n                assert.equal(res.LUISContent[0].LUISJsonStructure.utterances[2].text, \"q2\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n\n    it('failure to find ref throws', function(done) {\n        let luContent = `\n# foo\n- [tom](tom#*)`;\n        luMerger.Build([new luObj(luContent)], false, undefined, findLuFiles)\n            .then(res => done(res))\n            .catch(err => {\n                assert.isTrue(err.text.includes('Cannot find reference'))\n                done()\n            })\n    })\n\n    it('Circular references throws', function(done) {\n        let luContent = `\n# intent1\n- [refl1](refl1#*)`\n        luMerger.Build([new luObj(luContent, new luOptions('tloop', true))], false, undefined, findLuFiles)\n            .then(res => done(res))\n            .catch(err => {\n                assert.isTrue(err.text.includes('Loop detected'))\n                done()\n            })\n    })\n\n    it('Fix for BF-CLI #797 - deep references to phrase lists are handled correctly', function(done) {\n        let luContent = `\n@ phraselist pl_1(interchangeable) =\n    - pl 1\n    - pl 1 1\n    \n## l_Test\n- [l_Test](./Test.lu#Test.Weather)\n`;\n\n        luMerger.Build([new luObj(luContent, new luOptions('main.lu', true))], false, undefined, findLuFiles)\n        .then(res => done())\n        .catch(err => done(err))\n    })\n\n    it('NDepth entities with incompatible types throw', function(done) {\n        let luContent = `\n@ ml AddToName r1 =\n    - @ personName personName usesFeature f1\n    - @ ml l2 = \n        - @ personName p1\n\n@ ml f1\n@ prebuilt personName\n\n[import](./3nDepth.lu)`;\n        luisBuilder.fromLUAsync([new luObj(luContent, new luOptions('main.lu', true))], findLuFiles)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n\n    it('NDepth entities are correctly merged via reference', function(done) {\n        let luContent = `\n@ ml AddToName r1 =\n    - @ personName personName usesFeature f1\n    - @ ml l2 = \n        - @ personName p1\n\n@ ml f1\n@ prebuilt personName\n\n[import](./2nDepth.lu)`;\n        luisBuilder.fromLUAsync([new luObj(luContent, new luOptions('main.lu', true))], findLuFiles)\n        .then(res => {\n            let entitiesJson = `{\"entities\": [\n                {\n                  \"name\": \"AddToName\",\n                  \"roles\": [\n                    \"r1\",\n                    \"r2\"\n                  ],\n                  \"children\": [\n                    {\n                      \"name\": \"personName\",\n                      \"children\": [],\n                      \"features\": [\n                        {\n                          \"modelName\": \"f1\",\n                          \"isRequired\": false\n                        },\n                        {\n                          \"modelName\": \"personName\",\n                          \"isRequired\": true\n                        },\n                        {\n                          \"modelName\": \"f2\",\n                          \"isRequired\": false\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"l2\",\n                      \"children\": [\n                        {\n                          \"name\": \"p1\",\n                          \"children\": [],\n                          \"features\": [\n                            {\n                              \"modelName\": \"personName\",\n                              \"isRequired\": true\n                            }\n                          ]\n                        },\n                        {\n                          \"name\": \"f2l2\",\n                          \"children\": [],\n                          \"features\": [\n                            {\n                              \"modelName\": \"f2\",\n                              \"isRequired\": true\n                            }\n                          ]\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"NameEntity\",\n                      \"children\": [],\n                      \"features\": [\n                        {\n                          \"modelName\": \"NameEntity\",\n                          \"isRequired\": true\n                        }\n                      ]\n                    },\n                    {\n                      \"name\": \"l3\",\n                      \"children\": [\n                        {\n                          \"name\": \"N2\",\n                          \"children\": [],\n                          \"features\": [\n                            {\n                              \"modelName\": \"NameEntity\",\n                              \"isRequired\": true\n                            }\n                          ]\n                        }\n                      ]\n                    }\n                  ]\n                },\n                {\n                  \"name\": \"f1\",\n                  \"roles\": []\n                },\n                {\n                  \"name\": \"f2\",\n                  \"roles\": []\n                },\n                {\n                  \"name\": \"NameEntity\",\n                  \"roles\": []\n                }\n              ]}`;\n\n            let entityParsed = JSON.parse(entitiesJson);\n            assert.deepEqual(res.entities, entityParsed.entities);\n            assert.equal(res.prebuiltEntities[0].name, 'personName');\n            done()\n        })\n        .catch(err => done(err))\n    })\n})\n    \nconst findLuFiles = async function(srcId, idsToFind){\n    let retPayload = [];\n    idsToFind.forEach(ask => {\n        switch(ask.filePath) {\n            case './3nDepth.lu':\n                retPayload.push(new luObj(`\n@ ml AddToName r2 =\n- @ f3 personName usesFeature f2\n\n@ ml f2\n@ ml f3`, new luOptions(ask.filePath)));\n            case './2nDepth.lu':\n                retPayload.push(new luObj(`\n@ ml AddToName r2 =\n- @ personName personName usesFeature f2\n- @ NameEntity NameEntity\n- @ ml l3\n    - @ NameEntity N2\n- @ ml l2\n    - @ f2 f2l2\n            \n@ prebuilt personName\n@ ml f2\n@ ml NameEntity`, new luOptions(ask.filePath)));\n                break;\n            case './Test.lu': \n                retPayload.push(new luObj(`\n[Phrase list definitions](./phrases.lumodule)\n\n> # Intent definitions\n## Test.Weather\n- what is the weather`, new luOptions(ask.filePath, false)));\n                retPayload.push(new luObj(`\n@ phraselist pl_2(interchangeable) =\n- pl 2\n- pl 2 2`, new luOptions(`phrases.lumodule`, true)))\n                break;\n            case 'qna1': \n                retPayload.push(new luObj(`\n# ? q1\n\\`\\`\\`\nanswer1\n\\`\\`\\`\n\n# ? q2\n\\`\\`\\`\nanswer2\n\\`\\`\\`\n`, new luOptions(ask.filePath, false)));\n                break;\n            case 'qna2':\n                retPayload.push(new luObj(`\n# ? book flight\n- please book a flight\n- I need a flight\n- I'm looking to fly\n\\`\\`\\`\nSure, happpy to help\n\\`\\`\\`\n`, new luOptions(ask.filePath, false)));\n                break;\n            case 'qna3':\n                retPayload.push(new luObj(`\n# ? book flight\n- please book a flight\n- I need a flight\n- I'm looking to fly\n\\`\\`\\`\nSure, happpy to help\n\\`\\`\\`\n\n$botframework : qna-alterations=\n- bot framework\n- Microsoft bot framework\n`, new luOptions(ask.filePath, false)));\n                break;\n\n            case 'qna4':\n                retPayload.push(new luObj(`\n# ? book flight\n- please book a flight\n- I need a flight\n- I'm looking to fly\n\\`\\`\\`\nSure, happpy to help\n\\`\\`\\`\n\n$botframework : qna-alterations=\n- bot framework\n- Microsoft bot framework\n\n$myListName1 : qna-alterations=\n- test list\n`, new luOptions(ask.filePath, false)));\n                break;\n\n            case 'lu1':\n                retPayload.push(new luObj(`\n# i1\n- one\n- two\n\n# i2\n- three\n\n# i4\n- four\n- pattern {one}\n`, new luOptions(ask.filePath, false)));\n                break;\n            case 'refl1':\n                retPayload.push(new luObj(`\n# test\n- one\n\n# test2\n- [refl2](refl2#*)\n`, new luOptions(ask.filePath, false)));\n                retPayload.push(new luObj(`\n# all\n- two\n- [tloop](tloop#*)\n`, new luOptions(`refl2`, false)));\n            case 'lu10': \n                retPayload.push(new luObj(`\n# intent-ref1\n- [ref1](ref1#*)\n`, new luOptions(ask.filePath, false)));\n                retPayload.push(new luObj(`\n# final\n- result\n`, new luOptions('ref1', false)))\n                retPayload.push(new luObj(`\n# ? q1\n\\`\\`\\`\nanswer1\n\\`\\`\\`\n\n# ? q2\n\\`\\`\\`\nanswer2\n\\`\\`\\`\n`, new luOptions(ask.filePath, false)));\n        }\n    })\n    return retPayload;\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/luis.boundary.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nvar chai = require('chai');\nvar assert = chai.assert;\nconst luMerger = require('./../../../src/parser/lu/luMerger');\nconst luObj = require('../../../src/parser/lu/lu');\nconst retCode = require('./../../../src/parser/utils/enums/CLI-errors');\nconst POSSIBLE_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 \";\nconst LuisBuilder = require('./../../../src/parser/luis/luisBuilder');\n\ndescribe('Validations for LU content (based on LUIS boundaries)', function () {\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_INTENTS} intents in LU content`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxIntentTestData())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_INTENTS);\n                assert(err.text.includes(\"501 intents found in application\"));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_UTTERANCES} utterances in LU content`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxUtteranceTestData())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_UTTERANCES);\n                assert(err.text.includes(\"15001 utterances found in application\"));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_PATTERNANY_ENTITIES} pattern.any entities in LU content`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPatternAnyEntities())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_PATTERNANYENTITY);\n                assert(err.text.includes(\"pattern.any entities found in application.\"));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_CHAR_IN_UTTERANCE} characters in any utterance`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxUtteranceCharLimit(), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_UTTERANCE_CHAR_LENGTH);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_CHAR_IN_UTTERANCE} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_PATTERNS} patterns in LU content`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPatterns(), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_PATTERNS);\n                assert(err.text.includes(`patterns found in application. At most ${retCode.boundaryLimits.MAX_NUM_PATTERNS} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_CHAR_IN_PATTERNS} characters in any pattern`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPatternCharLimit(), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_PATTERN_CHAR_LIMIT);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_CHAR_IN_PATTERNS} characters are allowed in any pattern.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES} regex entities`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxRegeExEntityDefinition(retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_REGEX_ENTITY);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_CHAR_REGEX_ENTITY_PATTERN} characters in regex entity pattern`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxRegeExEntityDefinition(1, retCode.boundaryLimits.MAX_CHAR_REGEX_ENTITY_PATTERN), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_REGEX_CHAR_LIMIT);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_CHAR_REGEX_ENTITY_PATTERN} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_LIST_ENTITY_SYNONYMS} synonyms under any parent for a list entity`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getListEntity(0, retCode.boundaryLimits.MAX_LIST_ENTITY_SYNONYMS), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_SYNONYMS_LENGTH);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_LIST_ENTITY_SYNONYMS} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_PHRASE_LISTS} phrase lists`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPhraseLists(), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_PHRASE_LIST_LIMIT);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_PHRASE_LISTS} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_INTERCHANGEABLE_PHRASES} phrases across all interchangeable phrase lists`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPhraseLists(0, retCode.boundaryLimits.MAX_INTERCHANGEABLE_PHRASES, true), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_INTC_PHRASES_LIMIT);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_INTERCHANGEABLE_PHRASES} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NON_INTERCHANGEABLE_PHRASES} phrases across all non-interchangeable phrase lists`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPhraseLists(0, retCode.boundaryLimits.MAX_NON_INTERCHANGEABLE_PHRASES), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_NINTC_PHRASES_LIMIT);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NON_INTERCHANGEABLE_PHRASES} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_ROLES_PER_ENTITY} roles per entity`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getEntityWithRoles())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_ROLES_PER_ENTITY);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_ROLES_PER_ENTITY} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_ROLES} roles across all entities per LU content`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getEntityWithRoles(51, 6))))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_TOTAL_ROLES);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_ROLES} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_DESCRIPTORS_PER_MODEL} descriptors per model`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getEntityWithFeatures())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_FEATURE_PER_MODEL);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_DESCRIPTORS_PER_MODEL} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_PARENT_ENTITIES} parent nodes in an ML entitiy`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMLEntity())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_PARENT_ENTITY_LIMIT);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_PARENT_ENTITIES} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_TOTAL_ENTITES_AND_ROLES} total entities and roles in given LU content`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxEntityAndRoles())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_TOTAL_ENTITIES_AND_ROLES);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_TOTAL_ENTITES_AND_ROLES} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_CLOSED_LISTS} list entities`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxListEntity())))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_TOTAL_CLOSED_LISTS);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_CLOSED_LISTS} is allowed.`));\n                done();\n            })\n    })\n\n    it (`At most ${retCode.boundaryLimits.MAX_NUM_PHRASES_IN_ALL_PHRASE_LIST} phrases across all phrase lists`, function(done) {\n        LuisBuilder.fromLUAsync(new Array(new luObj(getMaxPhraseLists(0, retCode.boundaryLimits.MAX_NUM_PHRASES_IN_ALL_PHRASE_LIST), 'stdin', true)))\n            .then(res => done(res))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.errorCode.BOUNDARY_TOTAL_PHRASES);\n                assert(err.text.includes(`At most ${retCode.boundaryLimits.MAX_NUM_PHRASES_IN_ALL_PHRASE_LIST} is allowed.`));\n                done();\n            })\n    })\n\n})\n\nconst getMaxListEntity = function() {\n    let fc = '';\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_CLOSED_LISTS; i++) {\n        fc += `\n@ list entity${i}`;\n    }\n    return fc;\n}\nconst getMaxEntityAndRoles = function() {\n    let fc = '';\n    for (var i = 0; i < retCode.boundaryLimits.MAX_NUM_ROLES; i++) {\n        fc += `\n@ ml entityBase${i} hasRoles role${i}`;\n    }\n    for (var j = retCode.boundaryLimits.MAX_NUM_ROLES; j <= retCode.boundaryLimits.MAX_TOTAL_ENTITES_AND_ROLES; j++) {\n        fc += `\n@ ml entityFillUp${j}`\n    }\n    return fc;\n}\nconst getMLEntity = function() {\n    let fc = '';\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_PARENT_ENTITIES; i++) {\n        fc += `\n@ ml parentEntity${i} = \n    - @ ml childEntity${i}`;\n    }\n    return fc;\n}\nconst getEntityWithFeatures = function() {\n    let fc = '';\n    let descriptorsList = [];\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_DESCRIPTORS_PER_MODEL; i++) {\n        let newEntityName = `entity${i}`;\n        descriptorsList.push(newEntityName);\n        fc += `\n@ ml ${newEntityName}`;\n    }\n    fc += `\n@ ml testEntity usesFeatures ${descriptorsList.join(',')}\n`;\n    return fc;\n}\nconst getEntityWithRoles = function(numEntities = 1, rolesPerEntity = retCode.boundaryLimits.MAX_ROLES_PER_ENTITY) {\n    let fc = '';\n    let roleCounter = 1;\n    for (var i = 1; i <= numEntities; i++) {\n        fc += `\n@ ml entity${i} hasRoles `;\n        for (var j = 1; j <= rolesPerEntity; j++) {\n            fc += `role${roleCounter++},`;\n        }\n        fc += `role${roleCounter++}`;\n    }\n    return fc;\n}\nconst getMaxPhraseLists = function(numPhraseLists = retCode.boundaryLimits.MAX_NUM_PHRASE_LISTS, numPhrases = null, intc = null) {\n    let fc = '';\n    for (var i = 0; i <= numPhraseLists; i++) {\n        fc += `\n@ phraselist PL${i}`;\n        if (intc) fc += '(interchangeable)'\n        if (numPhrases) {\n            fc += ` =\n    - `;\n            for (var j = 0; j < numPhrases; j++) {\n                fc += `phrase${j},`\n            }\n            fc += `phrase-last\n`;\n        }\n    }\n    return fc;\n}\nconst getListEntity = function (numParents = retCode.boundaryLimits.MAX_LIST_ENTITY_CANONICAL_FORM, numSynonyms = 0) {\n    let fc = `\n@ list entity1 = \n`;\n    for (var i = 0; i <= numParents; i++) {\n        fc += `\n    - parent${i} :\n        - `;\n\n        for (var j = 0; j < numSynonyms; j++) {\n            fc += `synonym${i}.${j}.${POSSIBLE_CHARS.charAt(Math.floor(Math.random() * POSSIBLE_CHARS.length))},`\n        }\n        fc += `synonym.last\n`;\n    }\n    return fc;\n}\nconst getMaxRegeExEntityDefinition = function(entityNum = retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES, charLimit = retCode.boundaryLimits.MAX_NUM_REGEX_ENTITIES) {\n    let fc = '';\n    for (var i = 0; i <= entityNum; i++) {\n        fc += `\n@ regex entity${i} = /`;\n        for (var j = 0; j <= charLimit; j++) {\n            fc += POSSIBLE_CHARS.charAt(Math.floor(Math.random() * POSSIBLE_CHARS.length));\n        }\n        fc += '/'\n    }\n    return fc;\n}\nconst getMaxPatternCharLimit = function() {\n    let fc = `\n# testIntent\n- this {pattern} is invalid`;\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_CHAR_IN_PATTERNS + 100; i++) {\n        fc += POSSIBLE_CHARS.charAt(Math.floor(Math.random() * POSSIBLE_CHARS.length));\n    }\n    return fc;\n}\nconst getMaxPatterns = function() {\n    let fc = `\n    # testIntent`;\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_PATTERNS; i++) {\n        fc += `\n- utterance${i} is actually a {pattern}`;\n    }\n    return fc;\n}\nconst getMaxIntentTestData = function() {\n    let fc = '';\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_INTENTS; i++) {\n        fc += `\n# Intent${i}\n- utterance${i}\n\n`;\n    }\n    return fc;\n}\n\nconst getMaxUtteranceTestData = function() {\n    let fc = `\n# intent1`;\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_UTTERANCES; i++) {\n        fc += `\n- utterance${i}`;\n    }\n    return fc;\n}\n\nconst getMaxPatternAnyEntities = function() {\n    let fc = '';\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_NUM_PATTERNANY_ENTITIES; i++) {\n        fc += `\n@ patternany entity${i}`;\n    }\n    return fc;\n}\n\nconst getMaxUtteranceCharLimit = function() {\n    let fc = `\n# testIntent\n- `;\n    for (var i = 0; i <= retCode.boundaryLimits.MAX_CHAR_IN_UTTERANCE + 100; i++) {\n        fc += POSSIBLE_CHARS.charAt(Math.floor(Math.random() * POSSIBLE_CHARS.length));\n    }\n    return fc;\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/lutranslator.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nvar chai = require('chai');\nvar assert = chai.assert;\nconst testData = require('./../../fixtures/testcases/translate-testcase-data');\nconst translate = require('./../../../src/parser/lufile/translate-helpers');\nconst retCode = require('./../../../src/parser/utils/enums/CLI-errors');\nconst helpers = require('./../../../src/parser/utils/helpers');\nconst NEWLINE = require('os').EOL;\nconst TRANSLATE_KEY = 'd825d5ac21d643f89761de3679fd0fb3';\n\ndescribe('With the parseAndTranslate method', function() {\n    it('Translating comments can be skipped', function(done) {\n        translate.parseAndTranslate(`> This is a comment`, TRANSLATE_KEY, testData.tests.intentsAndUtterancesNC.langCode, '', false, false, false)\n            .then(function(res) {\n                assert.equal(helpers.sanitizeNewLines(res), helpers.sanitizeNewLines(`> This is a comment\\n`));\n                done();\n            })\n            .catch(err => done(err));\n    });\n\n    it('Bad lu file input throws', function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        translate.parseAndTranslate(testData.tests.badLu.luFile, TRANSLATE_KEY, testData.tests.badLu.langCode, '', false, false, false)\n            .then(res => done(res)) \n            .catch(function(err) {\n                assert.equal(err.errCode, retCode.errorCode.INVALID_INPUT_FILE);\n                done();\n            })\n    });\n\n    xit('References can be skipped from being translated', async function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        await translate.parseAndTranslate(testData.tests.fileRef.luFile, TRANSLATE_KEY, testData.tests.fileRef.langCode, '', false, false, false)\n            .then(function(res) {\n                assert.equal(helpers.sanitizeNewLines(res), helpers.sanitizeNewLines(testData.tests.fileRef.luFile + NEWLINE));\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    xit('Invalid key throws', async function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        try {\n            await translate.parseAndTranslate(`# Greeting\n            -hi\n            `, TRANSLATE_KEY + '2', testData.tests.badLu.langCode, '', false, false, false)\n        } catch (err) {\n            assert.equal(err.errCode, retCode.errorCode.TRANSLATE_SERVICE_FAIL);\n            done(err);\n        }\n        done();\n    }); \n\n    xit('Invalid key with comments throws', async function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        await translate.parseAndTranslate(`> test comment\n`, TRANSLATE_KEY + '2', testData.tests.badLu.langCode, '', true, false, false)\n            .then(function(res) {\n                done(res);\n            }) \n            .catch(function(err) {\n                assert.equal(err.errCode, retCode.errorCode.TRANSLATE_SERVICE_FAIL);\n                done(err);\n            })\n    });\n\n    xit('Nested entity references throws', function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        translate.parseAndTranslate(`# Greeting\n        - hi {userName = foo {firstName = bar}}\n`, TRANSLATE_KEY, testData.tests.badLu.langCode, '', false, false, true)\n            .then(function(res) {\n                done(res);\n            }) \n            .catch(function(err) {\n                assert.equal(err.errCode, retCode.errorCode.INVALID_INPUT);\n                done(err);\n            })\n    });\n    \n    xit('Invalid key with QnA throws', function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        translate.parseAndTranslate(`# ? Greeting\n        - hi\n`, TRANSLATE_KEY + '2', testData.tests.badLu.langCode, '', false, false, false)\n            .then(function(res) {\n                done(res);\n            }) \n            .catch(function(err) {\n                assert.equal(err.errCode, retCode.errorCode.TRANSLATE_SERVICE_FAIL);\n                done(err);\n            })\n    });\n\n    it('Intent only is handled correctly', function(done) {\n        if (!TRANSLATE_KEY) {\n            this.skip();\n        }\n        translate.parseAndTranslate(`# Greeting\n`, TRANSLATE_KEY, testData.tests.badLu.langCode, '', false, false, true)\n            .then(function() {\n                done();\n            }) \n            .catch(function() {\n                done('Test Fail! Threw when not expected');\n            })\n    });\n})\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/newEntityDefinitionWithSpaces.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('../../../src/parser/lufile/parseFileContents');\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('V2 Entity definitions using @ notation', function () {\n    describe('ML entity definition', function(){\n        it('Entity names can have spaces', function (done) {\n            let luFile = `\n                @ml \"foo bar\"\n                @ml 'a b'\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 2);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.entities[1].name, 'a b');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n    })\n    \n    describe('other entity definitions', function() {\n        it('regex entity names can have spaces', function (done) {\n            let luFile = `\n                @regex \"foo bar\"\n                @regex 'a b'\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 2);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.regex_entities[1].name, 'a b');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('pattern.any entity names can have spaces', function (done) {\n            let luFile = `\n                @patternany \"foo bar\"\n                @patternany 'a b'\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 2);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[1].name, 'a b');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Entity names can have spaces', function (done) {\n            let luFile = `\n                @list \"foo bar\"\n                @list 'a b'\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 2);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.closedLists[1].name, 'a b');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    })\n    \n    describe('Composite entities', function() {\n        it('Entity names can have spaces', function (done) {\n            let luFile = `\n                @composite \"foo bar\"\n                @composite 'a b'\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 2);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.composites[1].name, 'a b');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    })\n    \n    describe('Phrase lists', function() {\n        it('Entity names can have spaces', function (done) {\n            let luFile = `\n                @phraselist \"foo bar\"\n                @phraselist 'a b'\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 2);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.model_features[1].name, 'a b');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    })\n})"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.NewEntityDefinition.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('../../../src/parser/lufile/parseFileContents');\nconst luObj = require('./../../../src/parser/lu/lu');\nconst luBuilder = require('./../../../src/parser/luis/luisBuilder');\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('V2 Entity definitions using @ notation', function () {\n    describe('Simple entity definition', function(){\n        it('Basic definition is handled correctly', function (done) {\n            let luFile = `\n                @ ml fooBar\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic definition (without space) is handled correctly', function (done) {\n            let luFile = `\n                @ml fooBar\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Entity with role definition', function(done){\n            let luFile = `\n                @ml \"foo bar\" r1\n                @ml 'a b' r2, r3\n                @ml xyz hasRole r4\n                @ml 123 hasRoles r5,r6\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 4);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.entities[1].name, 'a b');\n                    assert.equal(res.LUISJsonStructure.entities[2].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.entities[3].name, '123');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[1].roles.length, 2);\n                    assert.equal(res.LUISJsonStructure.entities[2].roles.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[3].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    assert.deepEqual(res.LUISJsonStructure.entities[1].roles, ['r2','r3']);\n                    assert.deepEqual(res.LUISJsonStructure.entities[2].roles, ['r4']);\n                    assert.deepEqual(res.LUISJsonStructure.entities[3].roles, ['r5','r6']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Role definitions are de-duped', function(done){\n            let luFile = `\n                @ml s1 r1, r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Duplicate entity definitions is not allowed', function(done) {\n            let luFile = `\n                @ml a1 r1\n                @regex a1 r2\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Role names cannot be the same as entity name', function(done) {\n            let luFile = `\n                @ml a1 r1\n                @regex re1 a1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Pattern any entities are removed correctly', function(done){\n            let luFile = `\n                # test\n                - this is a {foodType:r2}\n\n                @ ml foodType r1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'foodType');\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1','r2']);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Entity name cannot be the same as entity type', function(done){\n            let luFile = `\n                @ml ml\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        })\n\n        it('Entity definition can be split across lines', function(done){\n            let luFile = `\n                @ml entity1\n                @entity1 r1\n\n                @ml entity2\n                @entity2 hasRole r2\n\n                @ml entity3\n                @entity3 hasRoles r3\n\n                @ml entity4\n                @entity4 hasRoles r4,r5\n                @entity4 r6\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 4);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'entity1');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.entities[1].name, 'entity2');\n                    assert.equal(res.LUISJsonStructure.entities[1].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[1].roles, ['r2']);\n                    assert.equal(res.LUISJsonStructure.entities[2].name, 'entity3');\n                    assert.equal(res.LUISJsonStructure.entities[2].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[2].roles, ['r3']);\n                    assert.equal(res.LUISJsonStructure.entities[3].name, 'entity4');\n                    assert.equal(res.LUISJsonStructure.entities[3].roles.length, 3);\n                    assert.deepEqual(res.LUISJsonStructure.entities[3].roles, ['r4', 'r5', 'r6']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Entity definition without a type throws', function(done){\n            let luFile = `\n                @entity1 r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Roles are unique', function(done) {\n            let luFile = `\n                @ml entity1 r1\n                @ml entity2 r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Simple entities in labelled utterance is handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is a {value:r1 = test}\n\n                @ml value r2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'value');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r2', 'r1']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    });\n\n    describe('RegEx entity definition', function() {\n        it('Basic definition is handled correctly', function (done) {\n            let luFile = `\n                @ regex fooBar\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'fooBar');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n        \n        \n\n        it('Basic definition (without space) is handled correctly', function (done) {\n            let luFile = `\n                @regex fooBar\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'fooBar');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Entity with role definition', function(done){\n            let luFile = `\n                @regex \"foo bar\" r1\n                @regex 'a b' r2, r3\n                @regex xyz hasRole r4\n                @regex 123 hasRoles r5,r6\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 4);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'foo bar');\n                    assert.equal(res.LUISJsonStructure.regex_entities[1].name, 'a b');\n                    assert.equal(res.LUISJsonStructure.regex_entities[2].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.regex_entities[3].name, '123');\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].roles.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[1].roles.length, 2);\n                    assert.equal(res.LUISJsonStructure.regex_entities[2].roles.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[3].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[0].roles, ['r1']);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[1].roles, ['r2','r3']);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[2].roles, ['r4']);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[3].roles, ['r5','r6']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Pattern any entities are removed correctly', function(done){\n            let luFile = `\n                # test\n                - this is a {foodType:r2}\n\n                @ regex foodType r1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'foodType');\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[0].roles, ['r1','r2']);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Entity name cannot be the same as entity type', function(done){\n            let luFile = `\n                @regex regex\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        })\n\n        it('Entity definition can be split across lines', function(done){\n            let luFile = `\n                @regex entity1\n                @entity1 r1\n\n                @regex entity2\n                @entity2 hasRole r2\n\n                @regex entity3\n                @entity3 hasRoles r3\n\n                @regex entity4\n                @entity4 hasRoles r4,r5\n                @entity4 r6\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 4);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'entity1');\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.regex_entities[1].name, 'entity2');\n                    assert.equal(res.LUISJsonStructure.regex_entities[1].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[1].roles, ['r2']);\n                    assert.equal(res.LUISJsonStructure.regex_entities[2].name, 'entity3');\n                    assert.equal(res.LUISJsonStructure.regex_entities[2].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[2].roles, ['r3']);\n                    assert.equal(res.LUISJsonStructure.regex_entities[3].name, 'entity4');\n                    assert.equal(res.LUISJsonStructure.regex_entities[3].roles.length, 3);\n                    assert.deepEqual(res.LUISJsonStructure.regex_entities[3].roles, ['r4', 'r5', 'r6']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Roles are unique', function(done) {\n            let luFile = `\n                @regex entity1 r1\n                @regex entity2 r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Regex entity can have inline definition', function(done) {\n            let luFile = `\n                @regex r1 = /[0-9]{6}/\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'r1');\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].regexPattern, '[0-9]{6}');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Duplicate definitions throws', function(done) {\n            let luFile = `\n                @regex r1 = /[0-9]{6}/\n                @r1 = /[0-9]{7}/\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Regex definition can be delayed', function(done) {\n            let luFile = `\n                @regex r1\n                @r1 = /[0-9]{6}/\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'r1');\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].regexPattern, '[0-9]{6}');\n                    done(); \n                })\n                .catch(err => done(err))\n        });\n\n        it('Regex role definition can be delayed', function(done) {\n            let luFile = `\n                @regex r1\n                @r1 = /[0-9]{6}/\n                @r1 role1\n                @r1 hasRole role2\n                @r1 hasRoles role3, role4\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'r1');\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].regexPattern, '[0-9]{6}');\n                    // assert.equal(res.LUISJsonStructure.regex_entities[0].roles.length, 4);\n                    // assert.deepEqual(res.LUISJsonStructure.regex_entities[0].roles, ['role1', 'role2', 'role3', 'role4']);\n                    done(); \n                })\n                .catch(err => done(err))\n        })\n\n        it('Regex definition can pushed to next line', function(done) {\n            let luFile = `\n                @regex r1 =\n                    - /[0-9]{6}/\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'r1');\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].regexPattern, '[0-9]{6}');\n                    done(); \n                })\n                .catch(err => done(err))\n        });\n\n        it('Empty regex definition throws', function(done){\n            let luFile = `\n                @regex foo = //\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n    });\n\n    describe('Phrase lists are handled correctly', function(done){\n        it('Phrase lists can be marked as disabled inline', function(done){\n            let luFile = `\n                @ phraselist city disabled\n                @ city =\n                    - Seattle\n                    - SEATAC\n                    - SEA\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.model_features[0].activated, false);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase lists can be marked as disabled in a separate line', function(done){\n            let luFile = `\n                @ phraselist city\n                @ city =\n                    - Seattle\n                    - SEATAC\n                    - SEA\n                @ city disabled\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.model_features[0].activated, false);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase lists can be marked as enabled for all models in a separate line', function(done){\n            let luFile = `\n                > phrase list as feature to intent (also applicable to entities)\n                @ intent getUserProfileIntent usesFeature city\n                \n                # getUserProfileIntent\n                - test\n                \n                @ phraselist city\n                @ city =\n                    - Seattle\n                    - SEATAC\n                    - SEA\n                \n                @ city enabledForAllModels\n                @ city disabled\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].activated, false);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase lists can be marked as enabled for all models inline', function(done){\n            let luFile = `\n                > phrase list as feature to intent (also applicable to entities)\n                @ intent getUserProfileIntent usesFeature city\n                \n                # getUserProfileIntent\n                - test\n                \n                @ phraselist city disabled, enabledForAllModels = \n                    - Seattle\n                    - SEATAC\n                    - SEA\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].activated, false);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic phrase list definition is handled correctly', function(done) {\n            let luFile = `\n                @phraselist xyz\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Inline phrase list definition throws', function(done) {\n            let luFile = `\n                @phraselist xyz = abc\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(err))\n                .catch(err => done())\n        });\n\n        it('Phrase list modelled as interchangeable is handled correctly', function(done) {\n            let luFile = `\n                @phraselist xyz(interchangeable)\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, true);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase list with list of values is handled correctly', function(done) {\n            let luFile = `\n                @phraselist xyz = \n                    - one\n                    - two\n                    - three\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase list with list of values is handled correctly with interchangeable', function(done) {\n            let luFile = `\n                @phraselist xyz(interchangeable) = \n                    - one\n                    - two\n                    - three\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, true);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase lists cannot have roles', function(done) {\n            let luFile = `\n                @phraselist xyz(interchangeable) hasRoles r1 = \n                    - one\n                    - two\n                    - three\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Phrase lists cannot have roles', function(done) {\n            let luFile = `\n                @phraselist xyz(interchangeable)\n                @xyz hasRoles r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Phrase list with comma separated values is handled correctly', function(done) {\n            let luFile = `\n                @phraselist xyz = \n                    - one, two\n                    - three, four\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three,four');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase list values can be segregated', function(done) {\n            let luFile = `\n                @phraselist xyz = \n                    - one, two\n                @phraselist xyz = \n                    - three, four\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three,four');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase list with semi-colon separated values is handled correctly', function(done) {\n            let luFile = `\n                @phraselist xyz = \n                    - one;two\n                    - three, four\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three,four');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase list definition can be separated', function(done) {\n            let luFile = `\n                @phraselist xyz\n                @xyz =\n                    - one;two\n                @xyz =\n                    - three, four\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three,four');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Interchangeable phrase list definition can be separated', function(done) {\n            let luFile = `\n                @phraselist xyz(interchangeable)\n                @xyz =\n                    - one;two\n                @xyz =\n                    - three, four\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, true);\n                    assert.equal(res.LUISJsonStructure.model_features[0].words, 'one,two,three,four');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('missing entity name for phrase list throws', function(done) {\n            let luFile = `\n                @xyz = \n                    - one, two\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n    });\n\n    describe('Prebuilt entity types', function(done) {\n        it('Basic prebuilt entity definition works', function(done){\n            let luFile = `\n                @prebuilt number\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, 'number');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Basic prebuilt entity definition with roles works', function(done){\n            let luFile = `\n                @prebuilt number age\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, 'number');\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.prebuiltEntities[0].roles, ['age']);\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Basic prebuilt entity definition with roles works', function(done){\n            let luFile = `\n                @prebuilt number\n                @number hasRole age\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, 'number');\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.prebuiltEntities[0].roles, ['age']);\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Basic prebuilt entity definition with roles works', function(done){\n            let luFile = `\n                @prebuilt number\n                @number hasRole age\n                @number hasRoles r1, r2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, 'number');\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 3);\n                    assert.deepEqual(res.LUISJsonStructure.prebuiltEntities[0].roles, ['age', 'r1', 'r2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Prebuilt explicitly labelled in an utterance throws', function(done){\n            let luFile = `\n                # test\n                - this is a {number=one}\n\n                @prebuilt number\n                @number hasRole age\n                @number hasRoles r1, r2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Invalid prebuilt entity throws', function(done){\n            let luFile = `\n                @prebuilt xyz\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Valid prebuilt entity not available for a specific locale throws', function(done){\n            let luFile = `\n                @prebuilt personName\n            `;\n\n            parseFile.parseFile(luFile, false, 'de-de')\n                .then(res => done(res))\n                .catch(err => done())\n        });\n    });\n\n    describe('Composite entity definitions', function(){\n        it('Basic definition is handled correctly', function(done) {\n            let luFile = `\n                @composite name\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic definition with roles is handled correctly', function(done) {\n            let luFile = `\n                @composite name hasRoles r1, r2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    assert.equal(res.LUISJsonStructure.composites[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].roles, ['r1', 'r2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic inline child definition with roles is handled correctly', function(done) {\n            let luFile = `\n                @composite name hasRoles r1, r2 = [child1, child2]\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    assert.equal(res.LUISJsonStructure.composites[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.composites[0].children.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['child1', 'child2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic list child definition with roles is handled correctly [variation 1]', function(done) {\n            let luFile = `\n                @composite name hasRoles r1, r2 = \n                    - [child1, child2]\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    assert.equal(res.LUISJsonStructure.composites[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.composites[0].children.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['child1', 'child2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic list child definition with roles is handled correctly [variation 2]', function(done) {\n            let luFile = `\n                @composite name hasRoles r1, r2 = \n                    - child1;child2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    assert.equal(res.LUISJsonStructure.composites[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.composites[0].children.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['child1', 'child2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Basic list child definition with roles is handled correctly [variation 3]', function(done) {\n            let luFile = `\n                @composite name hasRoles r1, r2 = \n                    - child1\n                    - child2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    assert.equal(res.LUISJsonStructure.composites[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.composites[0].children.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['child1', 'child2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Definition can be split up in various ways', function(done) {\n            let luFile = `\n                @composite name\n                @name r1\n                @name r2\n                @name = \n                    - child1\n                    - child2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'name');\n                    assert.equal(res.LUISJsonStructure.composites[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.composites[0].children.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['child1', 'child2']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Duplicate composite entity definition throws', function(done){\n            let luFile = `\n                @composite x1 = [s1, number]\n                @ml s1\n                @prebuilt number\n                @composite x1 = [s1, age]\n                @prebuilt age\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        })\n    });\n\n    describe('Closed list definitions', function() {\n        it('Simple defintion is handled correctly', function(done) {\n            let luFile = `\n                @list x1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'x1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n        \n        it('definition with roles is handled correctly', function(done){\n            let luFile = `\n                @list x1 r1, r2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'x1');\n                    assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].roles, ['r1', 'r2']);\n                    done();\n                })\n                .catch(err => done(err))     \n        });\n\n        it('definition with roles and list is handled correctly', function(done){\n            let luFile = `\n                @list x1 r1, r2 = \n                    - a1:\n                        - one\n                        - two\n                    - a2:\n                        -three\n                        -four\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'x1');\n                    assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists.length, 2);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, 'a1');\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].subLists[0].list, ['one', 'two']);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists[1].canonicalForm, 'a2');\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].subLists[1].list, ['three', 'four']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('definition can be separated', function(done){\n            let luFile = `\n                @list x1\n                @x1 r1\n                @ x1 r2\n                @ x1 =  \n                    - a1:\n                        - one\n                @ x1 = \n                    - a1:\n                        - one\n                        - two\n                @x1 =\n                    - a2:\n                        -three, four\n                @ x1 = \n                    - a2:\n                        - three; four\n                @x1 hasRoles a1, a2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'x1');\n                    assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 4);\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].roles, ['r1', 'r2', 'a1', 'a2']);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists.length, 2);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, 'a1');\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].subLists[0].list, ['one', 'two']);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists[1].canonicalForm, 'a2');\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].subLists[1].list, ['three', 'four']);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Invalid list definition throws', function(done){\n            let luFile = `\n                @list x1 = \n                    - red\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Explicitly labelled list entity in an utterance throws', function(done){\n            let luFile = `\n                # test\n                - this is a {x1 = test}\n                @list x1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('BF CLI #653 - closed list definition', function(done){\n            let luFile = `\n            @ list blah=\n                - something:\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, \"blah\");\n                    assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, \"something\");\n                    done()\n                })\n                .catch(err => done(err))\n        })\n    });\n\n    describe('Pattern.Any entity definition', function(){\n        it('basic definition', function(done){\n            let luFile = `\n                @patternany p1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'p1');\n                    done();\n                })\n                .catch(err => done(err));\n        });\n\n        it('basic definition with roles', function(done){\n            let luFile = `\n                @patternany p1 hasRoles r1, r2\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'p1');\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.patternAnyEntities[0].roles, ['r1', 'r2']);\n                    done();\n                })\n                .catch(err => done(err));\n        })\n\n        it('Phrase list definition with spaces in them are handled correctly when added as features', function(done){\n            let luFile = `\n@ phraselist LeaveModifiers(interchangeable) = \n\t- Change,cancel,replace,edit,remove,modify,delete,alter,change,drop\n\n@ phraselist Durations(interchangeable) = \n\t- days,day,month,months,weeks,week\n\n@ phraselist \"Months of the Year\"(interchangeable) = \n- January,Jan,Feburary,Feb,March,Mar,April,Apr,May,June,Jun,July,Jul,August,Aug,September,Sep,Sept,October,Oct,November,Nov,December,Dec\n\n@ ml Leave\n    - @ ml LeaveType\n    - @ ml LeaveDate\n        - @ ml \"Start Date\" usesFeatures \"Months of the Year\"`;\n        \n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.phraselists.length, 3);\n                    assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].name, 'Start Date');\n                    assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].features[0].featureName, 'Months of the Year');\n                    done();\n                })\n                .catch(err => done(err));\n        })\n    })\n\n    describe('multi-content', function(){\n        it('BF-CLI #652 - multi entity definition across docs is merged correctly', function(done){\n            let luContent1 = new luObj(`@ list blah=\n            - something:\n            \n            @ composite foo = [blah]\n            `);\n            let luContent2 = new luObj(`# utterances\n            - @{foo= something}`);\n            luBuilder.fromLUAsync([luContent1, luContent2])\n                .then(res => {\n                    assert.isTrue(res.entities.length === 0);\n                    assert.equal(res.composites[0].name, \"foo\");\n                    done()\n                })\n                .catch(err => done(err))\n        })\n    })\n\n    describe('phrase lists with enabledForAllModels', function(){\n        it('BF-CLI #789 - phrase lists with enabledForAllModels parse correctly', function(done){\n            let luContent1 = new luObj(`@ phraselist Iam_gpl(interchangeable) enabledForAllModels =\n            - I\n            - I'm\n            - I am\n            - I be\n        \n        @ phraselist my_gpl(interchangeable) enabledForAllModels =\n            - my\n            - mine\n            - me\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.isTrue(res.model_features.length === 2);\n                    done()\n                })\n                .catch(err => done(err))\n        })\n    })\n\n    describe('ml entity at both root and child level', function() {\n        it('[1] Verify ml entity both at root as well as child level is handled correctly', function(done) {\n            let luContent1 = new luObj(`\n            @ ml name\n    \n    @ ml userName\n        - @ ml name\n    \n    # userProfile\n    - {@userName = {@name = vishwac}}\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.entities.length, 2);\n                    assert.equal(res.utterances[0].entities[0].entity, \"userName\");\n                    assert.equal(res.utterances[0].entities[0].children[0].entity, \"name\");\n                    done()\n                })\n                .catch(err => done(err))\n        })\n    \n        it('[2] Verify ml entity both at root as well as child level is handled correctly', function(done) {\n            let luContent1 = new luObj(`\n            @ ml name\n    \n    @ ml userName\n        - @ ml name\n    \n    # userProfile\n    - {@userName = {@name = vishwac}}\n    - {@name = something}\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.utterances.length, 2);\n                    assert.equal(res.entities.length, 2);\n                    done()\n                })\n                .catch(err => done(res))\n        })\n    \n        it('[3] Verify ml entity both at root as well as child level is handled correctly', function(done) {\n            let luContent1 = new luObj(`\n            @ ml name\n    \n    @ ml userName\n        - @ name name\n    \n    # userProfile\n    - {@userName = {@name = vishwac}}\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.entities.length, 2);\n                    assert.equal(res.utterances[0].entities[0].entity, \"userName\");\n                    assert.equal(res.utterances[0].entities[0].children[0].entity, \"name\");\n                    assert.equal(res.entities[1].children[0].features[0].modelName, \"name\");\n                    assert.equal(res.entities[1].children[0].features[0].isRequired, true);\n                    done()\n                })\n                .catch(err => done(err))\n        })\n    \n        it('[4] Verify ml entity both at root as well as child level is handled correctly', function(done) {\n            let luContent1 = new luObj(`\n            @ ml userName\n        - @ ml name\n    \n    # userProfile\n    - {@userName = {@name = vishwac}}\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.entities.length, 1);\n                    assert.equal(res.utterances[0].entities[0].entity, \"userName\");\n                    assert.equal(res.utterances[0].entities[0].children[0].entity, \"name\");\n                    done()\n                })\n                .catch(err => done(err))\n        })\n\n        it ('[BF CLI #555] Correctly handles multiple nDepth entity labels (leading and trailing chars)', function(done) {\n            let luContent1 = new luObj(`\n            ## SampleINtent\n      - 7. foo {@PAR = before {@ENT1 = bar} and after that} is {@PAR = some other {@ENT2 = bar} and some other text} followed by some more text\n      \n      @ ml PAR\n          - @ ml ENT1\n          - @ ml ENT2\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.utterances.length, 1);\n                    assert.equal(res.utterances[0].entities.length, 2);\n                    assert.equal(res.utterances[0].text, \"7. foo before bar and after that is some other bar and some other text followed by some more text\")\n                    assert.deepEqual(res.utterances[0].entities[0].entity, \"PAR\");\n                    assert.deepEqual(res.utterances[0].entities[0].startPos, 7);\n                    assert.deepEqual(res.utterances[0].entities[0].endPos, 31);\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].entity, \"ENT1\");\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].startPos, 14);\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].endPos, 16);\n                    assert.deepEqual(res.utterances[0].entities[1].entity, \"PAR\");\n                    assert.deepEqual(res.utterances[0].entities[1].startPos, 36);\n                    assert.deepEqual(res.utterances[0].entities[1].endPos, 69);\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].entity, \"ENT2\");\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].startPos, 47);\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].endPos, 49);\n        \n                    done()\n              })\n              .catch(err => done(err))\n          })\n\n          it ('[BF CLI #555] Correctly handles multiple nDepth entity labels (no spaces)', function(done) {\n            let luContent1 = new luObj(`\n            ## SampleINtent\n      - 2. foo {@PAR={@ENT1=bar}}{@PAR={@ENT2=bar}}\n      \n      @ ml PAR\n          - @ ml ENT1\n          - @ ml ENT2\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.utterances.length, 1);\n                    assert.equal(res.utterances[0].entities.length, 2);\n                    assert.equal(res.utterances[0].text, \"2. foo barbar\")\n                    assert.deepEqual(res.utterances[0].entities[0].entity, \"PAR\");\n                    assert.deepEqual(res.utterances[0].entities[0].startPos, 7);\n                    assert.deepEqual(res.utterances[0].entities[0].endPos, 9);\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].entity, \"ENT1\");\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].startPos, 7);\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].endPos, 9);\n                    assert.deepEqual(res.utterances[0].entities[1].entity, \"PAR\");\n                    assert.deepEqual(res.utterances[0].entities[1].startPos, 10);\n                    assert.deepEqual(res.utterances[0].entities[1].endPos, 12);\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].entity, \"ENT2\");\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].startPos, 10);\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].endPos, 12);\n                    done()\n              })\n              .catch(err => done(err))\n          })\n\n          it ('[BF CLI #555] Correctly handles multiple nDepth entity labels', function(done) {\n            let luContent1 = new luObj(`\n            ## SampleINtent\n      - 1. foo {@PAR={@ENT1=bar}} is {@PAR={@ENT2=bar}}\n      \n      @ ml PAR\n          - @ ml ENT1\n          - @ ml ENT2\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => {\n                    assert.equal(res.utterances.length, 1);\n                    assert.equal(res.utterances[0].entities.length, 2);\n                    assert.equal(res.utterances[0].text, \"1. foo bar is bar\")\n                    assert.deepEqual(res.utterances[0].entities[0].entity, \"PAR\");\n                    assert.deepEqual(res.utterances[0].entities[0].startPos, 7);\n                    assert.deepEqual(res.utterances[0].entities[0].endPos, 9);\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].entity, \"ENT1\");\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].startPos, 7);\n                    assert.deepEqual(res.utterances[0].entities[0].children[0].endPos, 9);\n                    assert.deepEqual(res.utterances[0].entities[1].entity, \"PAR\");\n                    assert.deepEqual(res.utterances[0].entities[1].startPos, 14);\n                    assert.deepEqual(res.utterances[0].entities[1].endPos, 16);\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].entity, \"ENT2\");\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].startPos, 14);\n                    assert.deepEqual(res.utterances[0].entities[1].children[0].endPos, 16);\n                    \n                    done()\n              })\n              .catch(err => done(err))\n          })\n\n          it('[level 1 child] Every child must have its parent labelled in an utterance', function(done) {\n            let luContent1 = new luObj(`\n            # test\n            - my name is vishwac\n                - my name is {@userName = vishwac}\n    \n            @ ml userProfile = \n                - @ personName userName\n                - @ age userAge\n    \n            @ prebuilt personName\n            @ prebuilt age\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => done(res))\n                .catch(err => done())\n        })\n    \n        it('[level 2 child] Every child must have its parent labelled in an utterance', function(done) {\n            let luContent1 = new luObj(`\n            # test\n            - my name is vishwac\n                - my name is {@firstName = vishwac}\n    \n            @ ml userProfile = \n                - @ ml userName\n                    - @ personName firstName\n                - @ age userAge\n    \n            @ prebuilt personName\n            @ prebuilt age\n            `);\n            luBuilder.fromLUAsync([luContent1])\n                .then(res => done(res))\n                .catch(err => done())\n        })\n         \n    })\n    \n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.comments.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nvar chai = require('chai');\nvar assert = chai.assert;\nconst parseFileContents = require('./../../../src/parser/lufile/parseFileContents');\nvar inputFileContent = `> Definition for greeting intent\n        >\n        > @ ml city\n        # Greeting\n        - Hi\n        - Hello\n        > users might say these\n        - Good morning \n        - Good evening`;\nvar outputBlob =\n{\n    \"intents\": [\n        {\n            \"name\": \"Greeting\"\n        }\n    ],\n    \"entities\": [],\n    \"composites\": [],\n    \"closedLists\": [],\n    \"regex_entities\": [],\n    \"model_features\": [],\n    \"regex_features\": [],\n    \"utterances\": [\n        {\n            \"text\": \"Hi\",\n            \"intent\": \"Greeting\",\n            \"entities\": []\n        },\n        {\n            \"text\": \"Hello\",\n            \"intent\": \"Greeting\",\n            \"entities\": []\n        },\n        {\n            \"text\": \"Good morning\",\n            \"intent\": \"Greeting\",\n            \"entities\": []\n        },\n        {\n            \"text\": \"Good evening\",\n            \"intent\": \"Greeting\",\n            \"entities\": []\n        }\n    ],\n    \"patterns\": [],\n    \"patternAnyEntities\": [],\n    \"prebuiltEntities\": [],\n    \"luis_schema_version\": \"3.2.0\",\n    \"versionId\": \"0.1\",\n    \"name\": \"\",\n    \"desc\": \"\",\n    \"culture\": \"en-us\"\n};\n\ndescribe('Comment blocks in .lu files', function() {\n    it('should be parsed correctly with 1 intent and comments specified', function(done) {\n        parseFileContents.parseFile(inputFileContent, false, 'en-us')\n            .then(function(parsedContent){\n                assert.deepEqual(parsedContent.LUISJsonStructure, outputBlob);\n                done();\n            })\n            .catch(err => done(err))\n    });\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.composeEntity.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents').parseFile;\nconst hClasses = require('./../../../src/parser/lufile/classes/hclasses');\nconst luisBuilder = require('./../../../src/parser/luis/luisBuilder')\nconst collate = require('./../../../src/parser/luis/luisCollate').collate\nconst LUFromLUISJson = require('./../../../src/parser/luis/luConverter')\nconst lu = require('./../../../src/parser/lu/lu')\nconst validateLUISModel = require('./../../../src/parser/luis/luisValidator')\nconst bf627 = require('./../../fixtures/testcases/bf-627.json')\n\ndescribe('Composite entities in .lu files', function() {\n    it('Parser throws an excption on invalid composite entity definition - incorrect square brackets', function(done){\n        let luFileContent = `$deviceTemperature : [`;\n        parseFile(luFileContent, false)\n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('Parser throws an excption when no children defined for a composite entity', function(done){\n        let luFileContent = `$deviceTemperature : []`;\n        parseFile(luFileContent, false)\n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('Parser throws an excption when multiple composite entity definitions with inconsistent children are found', function(done){\n        let luFileContent = `$deviceTemperature : [bar]\n$deviceTemperature : [foo]`;\n        parseFile(luFileContent, false)\n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('Parser correctly parses composite entity definition with comma delimiter', function(done){\n        let luFileContent = `$deviceTemperature : [child1, child2]`;\n        let testCompositeEntity = new hClasses.compositeEntity('deviceTemperature', ['child1', 'child2']);\n        parseFile(luFileContent, false)\n            .then(res => {\n                assert.deepEqual(res.LUISJsonStructure.composites[0], testCompositeEntity);\n                done();\n            })\n            .catch(err => done(`Test failed - ${err}`))\n    });\n\n    it('Parser correctly parses composite entity definition with semicolon delimiter', function(done){\n        let luFileContent = `$deviceTemperature : [child1; child2]`;\n        let testCompositeEntity = new hClasses.compositeEntity('deviceTemperature', ['child1', 'child2']);\n        parseFile(luFileContent, false)\n            .then(res => {\n                assert.deepEqual(res.LUISJsonStructure.composites[0], testCompositeEntity);\n                done();\n            })\n            .catch(err => done(`Test failed - ${err}`))\n    });\n\n    it('Parser throws when a composite entity has a pattern.any entity as a child', function(done){\n        let luFileContent = `$deviceTemperature : [p1; child2]\n# testIntent\n- I'm {p1}`;\n        parseFile(luFileContent, false)\n          .then(res => {\n            try{\n              validateLUISModel(res.LUISJsonStructure)\n              done(`Test fail! Did not throw when expected`)\n            }catch(err){\n              done()\n            }\n          })\n          .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it('Parser throws when a composite entity name collides with another entity name', function(done){\n        let luFileContent = `$deviceTemperature : [p1; child2]\n$deviceTemperature:simple`;\n        parseFile(luFileContent, false)\n            .then(res => {\n              try {\n                validateLUISModel(res.LUISJsonStructure)\n                done(`Test fail! Did not throw when expected`)\n              } catch (error) {\n                done()\n              }\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it('Parser throws when a composite entity includes a child without an explicit child entity definition', function(done){\n        let luFileContent = `$deviceTemperature : [p1; child2]`;\n        parseFile(luFileContent, false)\n            .then(res => {\n              try {\n                validateLUISModel(res.LUISJsonStructure)\n                done(`Test fail! Did not throw when expected`)\n              } catch (error) {\n                done()\n              }\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it('Parser throws and correctly identifies a child without an explicit or implicit child entity definition', function(done){\n        let luFileContent = `$deviceTemperature : [p1; child2]\n                            # test\n                            - this is a test with {p1=vishwac}`;\n        parseFile(luFileContent, false)\n            .then(res => {\n              try {\n                validateLUISModel(res.LUISJsonStructure)\n                done(`Test fail! Did not throw when expected`)\n              } catch (error) {\n                done()\n              }\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it('Merge composite entity definition split across .lu files', function(done){\n        let luFile1Content = `@ ml userDOB\n        @ composite fooBar = [userDOB]`;\n        let luFile2Content = `@ ml username\n        @ composite fooBar = [username]`;\n        parseFile(luFile1Content, false)\n            .then(res1 => {\n                parseFile(luFile2Content, false) \n                    .then(res2 => {\n                      try {\n                        let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                        let finalContent = collate(luisList)\n                        assert.equal(finalContent.composites.length, 1)\n                        assert.equal(finalContent.composites[0].children.length, 2)\n                        done()        \n                      } catch (error) {\n                        done(error)\n                      }\n                    })\n                    .catch(err => done(`Test failed - ${err}`))\n            })\n            .catch(err => done(`Test failed - ${err}`))\n    });\n\n    it('composite entity definition can be split across .lu files', function(done) {\n      let luFile1Content = `@ ml username`;\n        let luFile2Content = `@ composite fooBar = [username]`;\n        parseFile(luFile1Content, false)\n            .then(res1 => {\n                parseFile(luFile2Content, false) \n                    .then(res2 => {\n                      try {\n                        let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                        let finalConten = collate(luisList)\n                        assert.equal(finalConten.composites.length, 1)\n                        assert.equal(finalConten.composites[0].children.length, 1)\n                        done()        \n                      } catch (error) {\n                        done(error)\n                      }\n                    })\n                    .catch(err => done(`Test failed - ${err}`))\n            })\n            .catch(err => done(`Test failed - ${err}`))\n    })\n\n    it('Parser throws and correctly identifies a child without an explicit or implicit child entity definition [across .lu files]', function(done){\n        let luFile1Content = `$deviceTemperature : [p1; child2]`;\n        let luFile2Content = `# test\n        - this is a test with {p1=vishwac}`;\n        parseFile(luFile1Content, false)\n            .then(res1 => {\n              parseFile(luFile2Content, false) \n                .then(res2 => {\n                  try {\n                    let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                    let luisObj = collate(luisList)\n                    luisObj.validate()\n                    done(`Test fail! Did not throw when expected`)\n                  } catch (error) {\n                    done()\n                  }\n                })\n                .catch(err => done(`Test failed 2- ${err}`))\n            })\n            .catch(err => done(`Test failed 1- ${err}`))\n    });\n\n    it('Parser correctly collates composite child entity type definition [across .lu files]', function(done){\n        let luFile1Content = `$deviceTemperature : [p1; child2]`;\n        let luFile2Content = `# test\n        - this is a test with {p1=vishwac}\n        $child2:foo=\n            - bar`;\n        parseFile(luFile1Content, false)\n            .then(res1 => {\n                parseFile(luFile2Content, false) \n                    .then(res2 => {\n                          try {\n                            let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                            let luisObj = collate(luisList)\n                            validateLUISModel(luisObj)\n                            done()\n                          } catch (error) {\n                            done(`Test failed 3- ${JSON.stringify(error)}`)\n                          }\n                    })\n                    .catch(err => done(`Test failed 2- ${JSON.stringify(err)}`))\n            })\n            .catch(err => done(`Test failed 1- ${JSON.stringify(err)}`))\n    });\n\n    it('Refresh correctly generates LU file content for composite entities', function(done){\n        let inputLUISJSON = `{\n            \"intents\": [],\n            \"entities\": [\n              {\n                \"name\": \"p1\",\n                \"roles\": []\n              },\n              {\n                \"name\": \"child2\",\n                \"roles\": []\n              }\n            ],\n            \"composites\": [\n              {\n                \"name\": \"deviceTemperature\",\n                \"children\": [\n                  \"p1\",\n                  \"child2\"\n                ],\n                \"roles\": []\n              }\n            ],\n            \"closedLists\": [],\n            \"regex_entities\": [],\n            \"model_features\": [],\n            \"regex_features\": [],\n            \"utterances\": [],\n            \"patterns\": [],\n            \"patternAnyEntities\": [],\n            \"prebuiltEntities\": [],\n            \"luis_schema_version\": \"3.2.0\",\n            \"versionId\": \"0.1\",\n            \"name\": \"compositeEntities\",\n            \"desc\": \"\",\n            \"culture\": \"en-us\"\n          }`\n          try {\n            let res = LUFromLUISJson(JSON.parse(inputLUISJSON))\n            assert(res.includes(`@ composite deviceTemperature = [p1, child2]`));\n            done()\n          } catch (error) {\n            done(`Test failed - ${JSON.stringify(error)}`)\n          }\n    })\n\n    it('Utterances with composite entity labels are handled correctly with ludown refresh', function(done) {\n        let inputLUISJSON = `{\n            \"luis_schema_version\": \"3.2.0\",\n            \"versionId\": \"0.1\",\n            \"name\": \"composites\",\n            \"desc\": \"\",\n            \"culture\": \"en-us\",\n            \"tokenizerVersion\": \"1.0.0\",\n            \"intents\": [\n              {\n                \"name\": \"None\"\n              },\n              {\n                \"name\": \"test\"\n              }\n            ],\n            \"entities\": [\n              {\n                \"name\": \"simple1\",\n                \"roles\": []\n              }\n            ],\n            \"composites\": [\n              {\n                \"name\": \"c1\",\n                \"children\": [\n                  \"number\",\n                  \"temperature\",\n                  \"simple1\"\n                ],\n                \"roles\": []\n              }\n            ],\n            \"closedLists\": [],\n            \"patternAnyEntities\": [],\n            \"regex_entities\": [],\n            \"prebuiltEntities\": [\n              {\n                \"name\": \"number\",\n                \"roles\": []\n              },\n              {\n                \"name\": \"temperature\",\n                \"roles\": []\n              }\n            ],\n            \"model_features\": [],\n            \"regex_features\": [],\n            \"patterns\": [],\n            \"utterances\": [\n              {\n                \"text\": \"this is a test\",\n                \"intent\": \"test\",\n                \"entities\": []\n              },\n              {\n                \"text\": \"this is another test\",\n                \"intent\": \"test\",\n                \"entities\": [\n                  {\n                    \"entity\": \"simple1\",\n                    \"startPos\": 16,\n                    \"endPos\": 19\n                  },\n                  {\n                    \"entity\": \"c1\",\n                    \"startPos\": 16,\n                    \"endPos\": 19\n                  }\n                ]\n              },\n              {\n                \"text\": \"this is five degrees\",\n                \"intent\": \"test\",\n                \"entities\": [\n                  {\n                    \"entity\": \"c1\",\n                    \"startPos\": 8,\n                    \"endPos\": 19\n                  }\n                ]\n              },\n              {\n                \"text\": \"this is one\",\n                \"intent\": \"test\",\n                \"entities\": [\n                  {\n                    \"entity\": \"c1\",\n                    \"startPos\": 0,\n                    \"endPos\": 10\n                  }\n                ]\n              },\n              {\n                \"text\": \"this is one and five degrees\",\n                \"intent\": \"test\",\n                \"entities\": [\n                  {\n                    \"entity\": \"c1\",\n                    \"startPos\": 8,\n                    \"endPos\": 27\n                  },\n                  {\n                    \"entity\": \"simple1\",\n                    \"startPos\": 12,\n                    \"endPos\": 14\n                  }\n                ]\n              }\n            ],\n            \"settings\": []\n          }`;\n          try {\n            let res = LUFromLUISJson(JSON.parse(inputLUISJSON))\n            assert(res.includes(`- this is another {@c1={@simple1=test}}`));\n            assert(res.includes(`- this is {@c1=five degrees}`));\n            assert(res.includes(`- this is {@c1=one {@simple1=and} five degrees}`));\n            assert(res.includes(`- {@c1=this is one}`));\n            done();\n          } catch (error) {\n            done(`Test failed - ${JSON.stringify(error)}`)\n          }\n    })\n\n    it ('composite entities defined in an utterance is parsed correctly', function(done){\n      let testLUFile = `\n      $device : thermostat=\n          - Thermostat\n          - Heater\n          - AC\n          - Air conditioner\n      \n      $device : refrigerator=\n          - Fridge\n          - Cooler\n      \n      $customDevice : simple\n      \n      $PREBUILT : temperature\n      \n      $deviceTemperature: [device, customDevice, temperature]\n      \n      # setThermostat\n          - Please set {deviceTemperature = thermostat to 72}\n          - Set {deviceTemperature = {customDevice = owen} to 72}`;\n\n      parseFile(testLUFile, false)\n        .then(res => {\n          assert.equal(res.LUISJsonStructure.entities.length, 1);\n          assert.equal(res.LUISJsonStructure.composites.length, 1);\n          assert.equal(res.LUISJsonStructure.composites[0].name, 'deviceTemperature');\n          assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['device', 'customDevice', 'temperature']);\n          assert.equal(res.LUISJsonStructure.utterances.length, 2);\n          assert.equal(res.LUISJsonStructure.utterances[1].text, 'Set owen to 72');\n          assert.equal(res.LUISJsonStructure.utterances[1].entities.length, 2);\n          done();\n        })\n        .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    }) \n\n    it ('composite entities defined in an utterance is parsed correctly (composite definition after reference to composite in utterance)', function(done){\n      let testLUFile = `\n      $device : thermostat=\n          - Thermostat\n          - Heater\n          - AC\n          - Air conditioner\n      \n      $device : refrigerator=\n          - Fridge\n          - Cooler\n      \n      $customDevice : simple\n      $PREBUILT : temperature\n\n      # setThermostat\n          - Please set {deviceTemperature = thermostat to 72}\n          - Set {deviceTemperature = {customDevice = owen} to 72}\n      \n      $deviceTemperature: [device, customDevice, temperature]`;\n\n      parseFile(testLUFile, false)\n        .then(res => {\n          assert.equal(res.LUISJsonStructure.entities.length, 1);\n          assert.equal(res.LUISJsonStructure.composites.length, 1);\n          assert.equal(res.LUISJsonStructure.composites[0].name, 'deviceTemperature');\n          assert.deepEqual(res.LUISJsonStructure.composites[0].children, ['device', 'customDevice', 'temperature']);\n          assert.equal(res.LUISJsonStructure.utterances.length, 2);\n          assert.equal(res.LUISJsonStructure.utterances[1].text, 'Set owen to 72');\n          assert.equal(res.LUISJsonStructure.utterances[1].entities.length, 2);\n          done();\n        })\n        .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it ('composites cannot include pattern.any entity', function(done) {\n      let luFile = `# Test\n      - {p = {q}}`;\n      parseFile(luFile, false)\n        .then(res => done(`Test failed - did not throw when expected. ${res}`))\n        .catch(err => done())\n    });\n    \n    it ('Correctly parses composites with text in between labels', function(done){\n      let luFile = `# Test\n      - zero {foo = one {one = two} three} four\n      \n      $ foo : [one]`;\n      parseFile(luFile, false) \n        .then(res => {\n          assert.equal(res.LUISJsonStructure.composites.length, 1);\n          assert.equal(res.LUISJsonStructure.utterances.length, 1);\n          assert.equal(res.LUISJsonStructure.utterances[0].text, \"zero one two three four\");\n          assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n          assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 9);\n          assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 11);\n          assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 5);\n          assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 17);\n          done();\n        })\n        .catch(err => done(err))\n    })\n\n\n    it('BF CLI #627 - nested ml entity indices is calculated correctly', async () => {\n      let luContent = `\n  ## Repros\n  - when I use the {@outer=same {@inner=text} twice in nested ML entity text}\n  \n  @ ml outer \n      - @ ml inner`;\n        let parsedLUContent = await luisBuilder.fromLUAsync(new lu(luContent))\n        assert.deepEqual(parsedLUContent.utterances[0].entities.length, 1);\n        assert.deepEqual(parsedLUContent.utterances[0].entities[0].entity, \"outer\");\n        assert.deepEqual(parsedLUContent.utterances[0].entities[0].startPos, 15);\n        assert.deepEqual(parsedLUContent.utterances[0].entities[0].endPos, 54);\n        assert.deepEqual(parsedLUContent.utterances[0].entities[0].children[0].entity, \"inner\");\n        assert.deepEqual(parsedLUContent.utterances[0].entities[0].children[0].startPos, 20);\n        assert.deepEqual(parsedLUContent.utterances[0].entities[0].children[0].endPos, 23);\n        \n    })\n\n    it('Nested entity references convert correctly back to LU', async () => {\n      let luisApp = luisBuilder.fromJson(bf627);\n      let luisAppInLu = luisApp.parseToLuContent()\n      assert.isTrue(luisAppInLu.includes(`- when I use the {@outer=same {@inner=text} twice in nested ML entity text}`))\n    })\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.featureToModels.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents');\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('Model as feature definitions', function () {\n    describe('Features to intent', function(){\n        it('Intent cannot add itself as a feature', function(done) {\n            let luFile = `\n                # test\n                - one \n                @ intent test usesFeature test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        })\n        it('Feature to an intent must be defined', function (done) {\n            let luFile = `\n                @ intent xyz usesFeature abc\n\n                # xyz \n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Intent can be added as a feature to another intent', function (done) {\n            let luFile = `\n                @ intent xyz usesFeature abc\n\n                # xyz \n                - test\n\n                # abc\n                - foo\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 2);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'xyz');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, 'abc');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Simple entity can be added as a feature to an intent', function(done) {\n            let luFile = `\n                @ intent abc usesFeature simple1\n                @ ml simple1\n                # abc \n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, 'simple1');\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'simple1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Prebuilt entity can be added as a feature to an intent', function(done) {\n            let luFile = `\n                @ intent abc usesFeature number\n                @ prebuilt number\n                # abc \n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, 'number');\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, 'number');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('list entity can be added as a feature to an intent', function(done) {\n            let luFile = `\n                @ intent abc usesFeature number\n                @ list number\n                # abc \n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, 'number');\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'number');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Composite entity can be added as a feature to an intent', function(done) {\n            let luFile = `\n                @ intent abc usesFeature number\n                @ composite number\n                # abc \n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, 'number');\n                    assert.equal(res.LUISJsonStructure.composites.length, 1);\n                    assert.equal(res.LUISJsonStructure.composites[0].name, 'number');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Regex entity can be added as a feature to an intent', function(done) {\n            let luFile = `\n                @ intent abc usesFeature number\n                @ regex number\n                # abc \n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, 'number');\n                    assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, 'number');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('multiple features can be assigned to an intent', function(done) {\n            let luFile = `\n                # test\n                - one\n\n                @ ml simple1\n                @ intent test usesFeature simple1\n                \n                @ regex regex1\n                @ intent test usesFeature regex1\n\n                @ list list1\n                @ intent test usesFeature list1\n\n                @ composite c1\n                @ intent test usesFeature c1\n\n                @ prebuilt number\n                @ prebuilt age\n                @ intent test usesFeatures number, age\n\n                @ phraselist pl1 = \n                    - one\n                    - two\n                @ intent test usesFeatures pl1, test2\n                # test2\n                - abc\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 2);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 8);\n                    assert.equal(res.LUISJsonStructure.intents[0].features.filter(item => item.modelName).length, 7);\n                    assert.equal(res.LUISJsonStructure.intents[0].features.filter(item => item.featureName).length, 1);\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Duplicates are handled correctly', function(done) {\n            let luFile = `\n                # test\n                - one\n\n                @ ml simple1\n                @ intent test usesFeature simple1\n                \n                @ regex regex1\n                @ intent test usesFeature regex1\n\n                @ list list1\n                @ intent test usesFeature list1\n\n                @ composite c1\n                @ intent test usesFeature c1\n\n                @ prebuilt number\n                @ prebuilt age\n                @ intent test usesFeatures number, age\n\n                @ phraselist pl1 = \n                    - one\n                    - two\n                @ intent test usesFeature pl1, number, age, c1, list1, regex1,simple1, test2\n\n                # test2\n                - abc\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents.length, 2);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 8);\n                    assert.equal(res.LUISJsonStructure.intents[0].features.filter(item => item.modelName).length, 7);\n                    assert.equal(res.LUISJsonStructure.intents[0].features.filter(item => item.featureName).length, 1);\n                    done();\n                })\n                .catch(err => done(err))\n        });\n        \n    });\n\n    describe('Entity as feature to entity', function() {\n        it('Entity cannot add itself as a feature', function(done) {\n            let luFile = `\n                @ ml s1\n                @ s1 usesFeature s1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        })\n        it('Simple entity can be added as a feature to a simple', function(done) {\n            let luFile = `\n                @ ml abc usesFeature simple1\n                @ ml simple1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 2);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.entities[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'simple1');\n                    assert.equal(res.LUISJsonStructure.entities[1].name, 'simple1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Simple entity can be added as a feature to a regex entity', function(done) {\n            let luFile = `\n                @ ml abc usesFeature simple1\n                @ regex simple1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.entities[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'simple1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Simple entity can be added as a feature to a list entity', function(done) {\n            let luFile = `\n                @ ml abc usesFeature simple1\n                @ list simple1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.entities[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'simple1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Simple entity can be added as a feature to a composite entity', function(done) {\n            let luFile = `\n                @ ml abc usesFeature simple1\n                @ composite simple1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.entities[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'simple1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Simple entity can be added as a feature to a prebuilt entity', function(done) {\n            let luFile = `\n                @ ml abc usesFeature number\n                @ prebuilt number\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'abc');\n                    assert.equal(res.LUISJsonStructure.entities[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'number');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    });\n    it('Circular dependency for usesFeature is not allowed - simple case', function(done) {\n        let luFile = `\n            @ list l1 usesFeature s2\n            @ ml s2 usesFeature l1\n        `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Circular dependency for usesFeature is not allowed - complex case', function(done) {\n        let luFile = `\n            # test\n            - abc\n            \n            # test1\n            - xyz\n            \n            # test2\n            - 123\n            \n            > test::test test -> test1 -> test2 -> s1 -> test\n            @ intent test usesFeature test1\n            \n            > test1::test test1 -> test2 -> s1 -> test\n            @ intent test1 usesFeature test2\n            \n            > test2::test test2 -> s1 -> test\n            @ intent test2 usesFeature s1\n            \n            > s1::test s1 -> test\n            @ ml s1\n            @ s1 usesFeature test\n        `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.modelAsFeature.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst luisBuilder = require('../../../src/parser/luis/luisBuilder');\nconst parseFile = require('../../../src/parser/lufile/parseFileContents');\nconst luconvert = require('../../../src/parser/luis/luConverter');\nconst entityNameWithSpaceAndFeature = require('../../fixtures/testcases/entityNameWithSpaceAndFeature.json');\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('Model as feature definitions', function () {\n    describe('Features to intent', function(){\n        it('Intent can only have features and nothing else - roles throws', function (done) {\n            let luFile = `\n                @ intent xyz hasRoles r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n        \n        it('Intent can have empty uses feature assignment line', function (done) {\n            let luFile = `\n            ## None\n            - all of them\n            - i want them all\n            - i want to all of them\n            \n            @ intent None\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done())\n                .catch(err => done(err))\n        });\n\n        it('Intent must be defined before a feature can be added to it.', function(done) {\n            let luFile = `\n                @ intent getUserProfileIntent usesFeature city\n                \n                @ phraselist city(interchangeable) = \n                    - seattle\n                    - space needle\n                    - SEATAC\n                    - SEA\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        })\n\n        it('Features must be defined before they can be added.', function(done) {\n            let luFile = `\n                > phrase list as feature to intent (also applicable to entities)\n                @ intent getUserProfileIntent usesFeature city\n                \n                # getUserProfileIntent\n                - test\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('Phrase list can be added as a feature to an intent', function(done) {\n            let luFile = `\n                > phrase list as feature to intent (also applicable to entities)\n                @ intent getUserProfileIntent usesFeature city\n                \n                # getUserProfileIntent\n                - test\n                \n                @ phraselist city(interchangeable)\n                @ city =\n                    - Seattle\n                    - SEATAC\n                    - SEA\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].mode, true);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'getUserProfileIntent');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].featureName, 'city');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Phrase lists marked as disabled for all models is handled correctly', function(done) {\n            let luFile = `\n@ phraselist pl1(interchangeable) \n@ pl1 disabled, disabledForAllModels\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, 'pl1');\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, true);\n                    assert.equal(res.LUISJsonStructure.model_features[0].activated, false);\n                    assert.equal(res.LUISJsonStructure.model_features[0].enabledForAllModels, false);\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Phrase list marked as interchangeable can be added as a feature to an intent', function(done) {\n            let luFile = `\n                > phrase list as feature to intent (also applicable to entities)\n                @ intent getUserProfileIntent usesFeature city\n                \n                # getUserProfileIntent\n                - test\n                \n                @ phraselist city\n                @ city =\n                    - Seattle\n                    - SEATAC\n                    - SEA\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'getUserProfileIntent');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].featureName, 'city');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Multiple phrase lists with different interchangeable definitions can be added as a feature to an intent', function(done) {\n            let luFile = `\n                > phrase list as feature to intent (also applicable to entities)\n                @ intent getUserProfileIntent usesFeature city, city2\n                \n                # getUserProfileIntent\n                - test\n                \n                @ phraselist city\n                @ city =\n                    - Seattle\n                    - SEATAC\n                    - SEA\n                @ phraselist city2(interchangeable)\n                @ city2 =\n                    - portland\n                    - PDX\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                    assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                    assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                    assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                    assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                    assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                    assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                    assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, false);\n                    assert.equal(res.LUISJsonStructure.intents.length, 1);\n                    assert.equal(res.LUISJsonStructure.intents[0].name, 'getUserProfileIntent');\n                    assert.equal(res.LUISJsonStructure.intents[0].features.length, 2);\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].featureName, 'city');\n                    assert.equal(res.LUISJsonStructure.intents[0].features[1].featureName, 'city2');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    });\n\n    describe('Features to entity', function() {\n        describe('Simple entity', function() {\n            it('Features must be defined before they can be added.', function(done) {\n                let luFile = `\n                    @ ml x1\n                    @ x1 usesFeature city3\n                `;\n                luisBuilder.fromContentAsync(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            });\n    \n            it('Entity must be defined before a feature can be assigned to it', function(done) {\n                let luFile = `\n                    @ x1 usesFeature city3\n                `;\n    \n                parseFile.parseFile(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            })\n    \n            it('Feature can be added to a simple entity', function(done) {\n                let luFile = `\n                    @ phraselist city\n                    @ city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                    @ phraselist city2(interchangeable)\n                    @ city2 =\n                        - portland\n                        - PDX\n                    \n                    @ ml x1\n                    @ x1 usesFeature city\n                `;\n    \n                parseFile.parseFile(luFile) \n                    .then(res => {\n                        assert.equal(res.LUISJsonStructure.entities.length, 1);\n                        assert.equal(res.LUISJsonStructure.entities[0].name, 'x1');\n                        assert.equal(res.LUISJsonStructure.entities[0].features.length, 2);\n                        assert.equal(res.LUISJsonStructure.entities[0].features[0].featureName, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, true);\n                        done();\n                    })\n                    .catch(err => done(err))\n            })\n    \n            it('Multiple features can be added to a simple entity', function(done) {\n                let luFile = `\n                    @ phraselist city\n                    @ city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                    @ phraselist city2(interchangeable)\n                    @ city2 =\n                        - portland\n                        - PDX\n                    \n                    @ ml x1\n                    @ x1 usesFeature city, city2\n                `;\n    \n                parseFile.parseFile(luFile) \n                    .then(res => {\n                        assert.equal(res.LUISJsonStructure.entities.length, 1);\n                        assert.equal(res.LUISJsonStructure.entities[0].name, 'x1');\n                        assert.equal(res.LUISJsonStructure.entities[0].features.length, 2);\n                        assert.equal(res.LUISJsonStructure.entities[0].features[0].featureName, 'city');\n                        assert.equal(res.LUISJsonStructure.entities[0].features[1].featureName, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, false);\n                        done();\n                    })\n                    .catch(err => done(err))\n            });\n\n            it('Feature, roles can be defined in the same line can be added to a prebuilt entity', function(done) {\n                let luFile = `\n                    @ phraselist city\n                    @ city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                    @ phraselist city2(interchangeable)\n                    @ city2 =\n                        - portland\n                        - PDX\n                    \n                    @ ml number hasRoles r1 usesFeature city \n                    @ number usesFeature city\n                `;\n    \n                parseFile.parseFile(luFile) \n                    .then(res => {\n                        assert.equal(res.LUISJsonStructure.entities.length, 1);\n                        assert.equal(res.LUISJsonStructure.entities[0].name, 'number');\n                        assert.equal(res.LUISJsonStructure.entities[0].features.length, 2);\n                        assert.equal(res.LUISJsonStructure.entities[0].features[0].featureName, 'city');\n                        assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                        assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                        assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, true);\n                        done();\n                    })\n                    .catch(err => done(err))\n            });\n\n            it('Multiple features, roles can be defined in the same line can be added to a prebuilt entity', function(done) {\n                let luFile = `\n                    @ phraselist city\n                    @ city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                    @ phraselist city2(interchangeable)\n                    @ city2 =\n                        - portland\n                        - PDX\n                    \n                    @ ml number hasRoles r1, r2 usesFeatures city, city2 \n                    @ number usesFeature city\n                `;\n    \n                parseFile.parseFile(luFile) \n                    .then(res => {\n                        assert.equal(res.LUISJsonStructure.entities.length, 1);\n                        assert.equal(res.LUISJsonStructure.entities[0].name, 'number');\n                        assert.equal(res.LUISJsonStructure.entities[0].features.length, 2);\n                        assert.equal(res.LUISJsonStructure.entities[0].features[0].featureName, 'city');\n                        assert.equal(res.LUISJsonStructure.entities[0].features[1].featureName, 'city2');\n                        assert.equal(res.LUISJsonStructure.entities[0].roles.length, 2);\n                        assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1', 'r2']);\n                        assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, false);\n                        done();\n                    })\n                    .catch(err => done(err))\n            });\n\n\n        });\n\n        describe('Prebuilt, list, pattern.any, regex entities cannot have phrase list as feature', function() {\n            it('prebuilt entity cannot have a phrase list as a feature', function(done) {\n                let luFile = `\n                    @ prebuilt number usesFeature city\n                    @ phraselist city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                `;\n\n                parseFile.parseFile(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            });\n            \n            it('list entity cannot have a phrase list as a feature', function(done) {\n                let luFile = `\n                    @ list number usesFeature city\n                    @ phraselist city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                `;\n\n                parseFile.parseFile(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            });\n\n            it('pattern.any entity cannot have a phrase list as a feature', function(done) {\n                let luFile = `\n                    @ patternany number usesFeature city\n                    @ phraselist city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                `;\n\n                parseFile.parseFile(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            });\n            \n\n            it('regex entity cannot have a phrase list as a feature', function(done) {\n                let luFile = `\n                    @ regex number usesFeature city = /[0-9]{7}/\n                    @ phraselist city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                `;\n\n                parseFile.parseFile(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            });\n        });\n\n        describe('Composite entity', function() {\n            it('Features must be defined before they can be added.', function(done) {\n                let luFile = `\n                    @ composite x1\n                    @ x1 usesFeature city3\n                `;\n                luisBuilder.fromContentAsync(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            });\n    \n            it('Entity must be defined before a feature can be assigned to it', function(done) {\n                let luFile = `\n                    @ x1 usesFeature city3\n                `;\n    \n                parseFile.parseFile(luFile)\n                    .then(res => done(res))\n                    .catch(err => done())\n            })\n    \n            it('Feature can be added to a composite entity', function(done) {\n                let luFile = `\n                    @ phraselist city\n                    @ city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                    @ phraselist city2(interchangeable)\n                    @ city2 =\n                        - portland\n                        - PDX\n                    \n                    @ composite x1 = [s1, number]\n                    @ x1 usesFeature city\n                    @ ml s1\n                    @ prebuilt number\n                `;\n    \n                parseFile.parseFile(luFile) \n                    .then(res => {\n                        assert.equal(res.LUISJsonStructure.composites.length, 1);\n                        assert.equal(res.LUISJsonStructure.composites[0].name, 'x1');\n                        assert.equal(res.LUISJsonStructure.composites[0].features.length, 1);\n                        assert.equal(res.LUISJsonStructure.composites[0].features[0].featureName, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, true);\n                        done();\n                    })\n                    .catch(err => done(err))\n            })\n    \n            it('Multiple features can be added to a composite entity', function(done) {\n                let luFile = `\n                    @ phraselist city\n                    @ city =\n                        - Seattle\n                        - SEATAC\n                        - SEA\n                    @ phraselist city2(interchangeable)\n                    @ city2 =\n                        - portland\n                        - PDX\n                    \n                    @ composite x1 = [s1, number]\n                    @ x1 usesFeatures city, city2\n                    @ ml s1\n                    @ prebuilt number\n                `;\n    \n                parseFile.parseFile(luFile) \n                    .then(res => {\n                        assert.equal(res.LUISJsonStructure.composites.length, 1);\n                        assert.equal(res.LUISJsonStructure.composites[0].name, 'x1');\n                        assert.equal(res.LUISJsonStructure.composites[0].features.length, 2);\n                        assert.equal(res.LUISJsonStructure.composites[0].features[0].featureName, 'city');\n                        assert.equal(res.LUISJsonStructure.composites[0].features[1].featureName, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].name, 'city');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].mode, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].words, 'Seattle,SEATAC,SEA');\n                        assert.equal(res.LUISJsonStructure.phraselists[0].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[0].enabledForAllModels, false);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].name, 'city2');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].mode, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].words, 'portland,PDX');\n                        assert.equal(res.LUISJsonStructure.phraselists[1].activated, true);\n                        assert.equal(res.LUISJsonStructure.phraselists[1].enabledForAllModels, false);\n                        done();\n                    })\n                    .catch(err => done(err))\n            });\n        });\n\n        it('phrase lists cannot be added as a feature to other phrase lists', function(done) {\n            let luFile = `\n                @phraselist xyz =\n                    - a\n                    - b\n                    - c\n                @phraselist abc usesFeature xyz = \n                    - 1\n                    - 2\n                    - 3\n            `;\n\n            parseFile.parseFile(luFile) \n                .then(res => done(res))\n                .catch(err => done())\n        })\n        \n    });\n\n    describe('Negative tests', function(done) {\n        it('Intent cannot use patternany as a feature', function(done) {\n            let luFile = `\n                @ patternany p1\n                # test\n                - one\n                @ intent test usesFeature p1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('simple entity cannot use patternany as a feature', function(done) {\n            let luFile = `\n                @ patternany p1\n                @ ml s1 usesFeature p1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('composite entity cannot use patternany as a feature', function(done) {\n            let luFile = `\n                @ patternany p1\n                @ composite c1 usesFeature p1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n\n        });\n\n        it('phrase lists cannot have any features', function(done) {\n            let luFile = `\n                @ ml c1\n                @ phraselist p1 usesFeature c1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n        });\n\n        it('regex entity cannot have any features', function(done) {\n            let luFile = `\n                @ ml s1\n                @ regex r1 usesFeature s1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n\n        })\n\n        it('list entity cannot have any features', function(done) {\n            let luFile = `\n                @ ml s1\n                @ list r1 usesFeature s1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n\n        })\n\n        it('prebuilt entity cannot have any features', function(done) {\n            let luFile = `\n                @ ml s1\n                @ prebuilt number usesFeature s1\n            `;\n            parseFile.parseFile(luFile)\n                .then(res => done(res))\n                .catch(err => done())\n\n        })\n\n        \n\n    });\n    it('Intent, simple entity, composite entity can use anything as a feature except for patternany', function(done) {\n        let luFile = `\n            @ ml s1\n            @ list l1\n            @ composite c1\n            @ prebuilt number\n            @ regex r1\n            @ phraselist PL1\n            # test\n            - one\n            @ intent test usesFeatures s1, l1, c1, number, r1, PL1\n            # test2\n            - one\n            @ s1 usesFeature test2, l1, c1, number, r1, PL1\n            @ c1 usesFeature test2, l1, number, r1, PL1, s1\n        `;\n\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.intents[0].features.length, 6);\n                assert.equal(res.LUISJsonStructure.intents[0].features.filter(item => item.modelName).length, 5);\n                assert.equal(res.LUISJsonStructure.intents[0].features.filter(item => item.featureName).length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].features.length, 6);\n                assert.equal(res.LUISJsonStructure.entities[0].features.filter(item => item.modelName).length, 5);\n                assert.equal(res.LUISJsonStructure.entities[0].features.filter(item => item.featureName).length, 1);\n                assert.equal(res.LUISJsonStructure.composites[0].features.length, 6);\n                assert.equal(res.LUISJsonStructure.composites[0].features.filter(item => item.modelName).length, 5);\n                assert.equal(res.LUISJsonStructure.composites[0].features.filter(item => item.featureName).length, 1);\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    describe(\"[BF CLI #472 - entities can have spaces in the name\", function() {\n        it ('Phrase list can be added to ml entity with spaces in its name', function(done) {\n            let lufile = `\n    ## Demo\n    - demo\n    \n    @ ml \"phone number entity\" usesFeature phonePL\n    \n    @ phraselist phonePL(interchangeable) = \n        - phone,phone number,telephone,cellphone\n            `;\n\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, \"phone number entity\");\n                    assert.equal(res.LUISJsonStructure.entities[0].features[0].featureName, \"phonePL\");\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it ('ml entity names with spaces are converted correctly to lu', function(done) {\n            let luContent = luconvert(entityNameWithSpaceAndFeature);\n            assert.equal(luContent.includes(`@ ml \"phone number entity\"`), true);\n            done()\n        })\n\n        it ('phrase list names can have spaces in it', function(done) {\n            let lufile = `\n@ phraselist \"phone pl\"(interchangeable) = \n    - phone,phone number,telephone,cellphone\n`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.model_features[0].name, \"phone pl\");\n                    assert.equal(res.LUISJsonStructure.model_features[0].mode, true);\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it ('phrase list names with spaces in them convert correctly to lu format', function(done){\n            let luContent = luconvert(entityNameWithSpaceAndFeature);\n            assert.equal(luContent.includes(`@ phraselist \"phone pl\"(interchangeable)`), true);\n            done()\n        })\n\n        it ('list entity names can have spaces in it', function(done) {\n            let lufile = `\n@ list \"my city\"\n`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, \"my city\");\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it ('list entity names with spaces in them convert correctly to lu format', function(done){\n            let luContent = luconvert(entityNameWithSpaceAndFeature);\n            assert.equal(luContent.includes(`@ list \"my city\"`), true);\n            done()\n        })\n\n        it ('composite entity names can have spaces in it', function(done) {\n            let lufile = `\n@ composite \"test composite\"\n`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.composites[0].name, \"test composite\");\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it ('composite entity names with spaces in them convert correctly to lu format', function(done){\n            let luContent = luconvert(entityNameWithSpaceAndFeature);\n            assert.equal(luContent.includes(`@ composite \"test composite\"`), true);\n            done()\n        })\n\n        it ('regex entity names can have spaces in it', function(done) {\n            let lufile = `\n@ regex \"test regex\"\n`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.regex_entities[0].name, \"test regex\");\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it ('regex entity names with spaces in them convert correctly to lu format', function(done){\n            let luContent = luconvert(entityNameWithSpaceAndFeature);\n            assert.equal(luContent.includes(`@ regex \"test regex\"`), true);\n            done()\n        })\n\n        it ('pattern.any entity names can have spaces in it', function(done) {\n            let lufile = `\n@ patternany \"test pa\"\n`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, \"test pa\");\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it ('uses feature supports spaces for all features', function(done) {\n            let lufile = `\n# test intent\n- foo\n\n@ ml \"test ml entity\"\n\n@ phraselist \"test pl\"\n\n@ ml \"another entity\" usesFeatures \"test intent\", \"test ml entity\", \"test pl\"`;\n\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities[1].features.length, 3);\n                    assert.equal(res.LUISJsonStructure.entities[1].features[0].modelName, \"test intent\");\n                    assert.equal(res.LUISJsonStructure.entities[1].features[1].modelName, \"test ml entity\");\n                    assert.equal(res.LUISJsonStructure.entities[1].features[2].featureName, \"test pl\");\n                    done();\n                })\n        });\n\n        it ('intent with spaces in it can be assigned features', function(done) {\n            let lufile = `\n# test intent\n- foo\n\n@ ml bar\n\n@ intent \"test intent\" usesFeature bar`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.intents[0].features[0].modelName, \"bar\");\n                    done()\n                })\n                .catch(err => done(err))\n        });\n\n        it ('ml entity with spaces in it can be lablled', function(done) {\n            let lufile = `\n# test intent\n- I want {@food type = tomato}\n\n@ ml 'food type'`;\n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, \"food type\")\n                    done()\n                })\n                .catch(err => done(err))\n        });\n\n        it ('roles can have spaces in them', function(done) {\n            let lufile = `\n@ ml \"entity 1\" hasRoles \"role 1\", \"role 2\"\n`   \n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, [\"role 1\", \"role 2\"]);\n                    done()\n                })\n                .catch(err => done(err))\n        })\n\n        it ('roles with spaces can be lablled in an utterance', function(done) {\n            let lufile = `\n@ ml \"entity 1\" hasRoles \"role 1\", \"role 2\"\n\n# test intent\n- I want {@role 1 = something}\n`   \n            parseFile.parseFile(lufile)\n                .then(res => {\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, [\"role 1\", \"role 2\"]);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, \"entity 1\");\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].role, \"role 1\");\n                    done()\n                })\n                .catch(err => done(err))\n        });\n\n        it ('entity definitions with roles (with spaces in them) and features (with spaces in them) convert back correctly back to lu' , function(done) {\n            let luContent = luconvert(entityNameWithSpaceAndFeature);\n            assert.equal(luContent.includes(`@ ml \"phone number entity\" hasRole \"role 1\" usesFeature \"phone pl\"`), true)\n            assert.equal(luContent.includes(`@ regex \"test regex\" hasRole \"role 4\"`), true);\n            done()\n        })\n        \n    })\n});\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.nDepthEntity.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents');\nvar chai = require('chai');\nvar assert = chai.assert;\nvar helperclasses = require('./../../../src/parser/lufile/classes/hclasses');\ndescribe('V2 NDepth definitions using @ notation', function () {\n    it('Basic definition is handled correctly', function (done) {\n        let luFile = `\n            @ ml fooBar\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Entity name can have spaces in them', function (done) {\n        let luFile = `\n            @ ml 'foo Bar'\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'foo Bar');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('inline roles definitions is handled correctly', function (done) {\n        let luFile = `\n            @ ml fooBar r1\n            @ ml fooBar2 2r1, 2r2\n            @ ml fooBar3 hasRole 3r1\n            @ ml fooBar4 hasRoles 4r1, 4r2\n            @ ml fooBar5\n            @ fooBar5 5r1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 5);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                assert.equal(res.LUISJsonStructure.entities[1].name, 'fooBar2');\n                assert.equal(res.LUISJsonStructure.entities[1].roles.length, 2);\n                assert.deepEqual(res.LUISJsonStructure.entities[1].roles, ['2r1', '2r2']);\n                assert.equal(res.LUISJsonStructure.entities[2].name, 'fooBar3');\n                assert.equal(res.LUISJsonStructure.entities[2].roles.length, 1);\n                assert.deepEqual(res.LUISJsonStructure.entities[2].roles, ['3r1']);\n                assert.equal(res.LUISJsonStructure.entities[3].name, 'fooBar4');\n                assert.equal(res.LUISJsonStructure.entities[3].roles.length, 2);\n                assert.deepEqual(res.LUISJsonStructure.entities[3].roles, ['4r1', '4r2']);\n                assert.equal(res.LUISJsonStructure.entities[4].name, 'fooBar5');\n                assert.equal(res.LUISJsonStructure.entities[4].roles.length, 1);\n                assert.deepEqual(res.LUISJsonStructure.entities[4].roles, ['5r1']);\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Roles need to be unique', function (done) {\n        let luFile = `\n            @ ml fooBar r1\n            @ ml fooBar2 fooBar\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('intent can be assigned as a feature', function (done) {\n        let luFile = `\n            @ ml fooBar\n            # intent1\n            - test\n            @fooBar usesFeature intent1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'intent1');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('intent can be assigned as a feature', function (done) {\n        let luFile = `\n            @ ml fooBar\n            # intent1\n            - test\n            @fooBar usesFeature intent1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                assert.equal(res.LUISJsonStructure.entities[0].features[0].modelName, 'intent1');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('all entity types can be assigned as a feature', function (done) {\n        let luFile = `\n            @ ml fooBar\n            @ ml x1\n            @ prebuilt number\n            @ list l1\n            @ composite c1\n            @ regex r1\n            @fooBar usesFeatures x1, number, l1, c1, r1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                assert.equal(res.LUISJsonStructure.entities[0].features.length, 5);\n                done();\n            })\n            .catch(err => done(err))\n    });\n    \n    it('Phrase list can be assigned as a feature', function (done) {\n        let luFile = `\n            @ ml fooBar\n            @ phraselist p1\n            @fooBar usesFeatures p1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'fooBar');\n                assert.equal(res.LUISJsonStructure.entities[0].features.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].features[0].featureName, 'p1');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Pattern.any cannot be used as a feature', function (done) {\n        let luFile = `\n            @ ml fooBar r1\n            @ patternany p1\n            @ fooBar usesFeature p1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Invalid child definition throws (missing @)', function (done) {\n        let luFile = `\n            @ml xyz = \n                - @ ml x1\n                - @ ml abc =\n                    - number p1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Invalid child definition throws (missing type or name)', function (done) {\n        let luFile = `\n            @ml xyz = \n                - @ ml x1\n                - @ ml abc =\n                   - @number\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Invalid child definition throws (mis-spelled usesFeature)', function (done) {\n        let luFile = `\n            @ml xyz = \n                - @ ml x1\n                - @ ml abc =\n                   - @ number r1 usesFeaturex p1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Entity names must be unique', function (done) {\n        let luFile = `\n            @list xyz\n            @ml xyz = \n                - @ ml x1\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Simple child entity is handled correctly', function (done) {\n        let luFile = `\n            @ml xyz1 = \n                - @ ml xyz\n\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"xyz\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Child entity name can have spaces in them', function (done) {\n        let luFile = `\n            @ml xyz1 = \n                - @ ml 'x y z'\n\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"x y z\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Non ML entities cannot have children', function (done) {\n        let luFile = `\n        @regex r1\n        @ml xyz1 = \n        - @r1 xyz\n            - @ml xyz2\n\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('Multiple children at level 1 is handled correctly', function (done) {\n        let luFile = `\n            @ml xyz1 = \n                - @ ml xyz\n                - @ ml xyz2\n\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"xyz\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].name, \"xyz2\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Instance of a type is handled correctly', function (done) {\n        let luFile = `\n        @prebuilt number\n        @ml xyz1 = \n        - @ ml xyz\n        - @ number abc\n\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"xyz\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].name, \"abc\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].features[0].modelName, \"number\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Arbitrary depth entities are handled correctly', function (done) {\n        let luFile = `\n        @ list list1\n@ list list2\n@ list list3\n@ list list4\n@ regex regex1\n@ regex regex2\n@ prebuilt number\n@ml 1 = \n    - @ ml s1\n    - @ ml 2 =\n        - @ number n2\n        - @ml 3 =\n            - @ list1 l3\n            - @ml 4 =\n                - @ regex1 r4\n                - @ ml 5 =\n                    - @ regex2 r5\n                    - @ list2 l5\n                    - @ number n5\n                    - @ ml s5\n                - @ list3 l4\n                - @ number n4\n                - @ ml s4\n            - @ number n3\n            - @ ml s3\n        - @ ml s2\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"s1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].name, \"2\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children.length, 3);\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].name, \"n2\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].name, \"3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children.length, \"4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[0].name, \"l3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[0].features[0].modelName, \"list1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].name, \"4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children.length, \"5\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[0].name, \"r4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[0].features[0].modelName, \"regex1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[1].name, \"5\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[2].name, \"l4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[2].features[0].modelName, \"list3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[3].name, \"n4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[3].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[4].name, \"s4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[2].name, \"n3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[2].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[3].name, \"s3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[2].name, \"s2\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Arbitrary depth entities are handled correctly (Start tab stop agnostic)', function (done) {\n        let luFile = `\n@ list list1\n@ list list2\n@ list list3\n@ list list4\n@ regex regex1\n@ regex regex2\n@ prebuilt number\n@ml 1 = \n    - @ ml s1\n    - @ ml 2 =\n        - @ number n2\n        - @ml 3 =\n            - @ list1 l3\n            - @ml 4 =\n                - @ regex1 r4\n                - @ ml 5 =\n                    - @ regex2 r5\n                    - @ list2 l5\n                    - @ number n5\n                    - @ ml s5\n                - @ list3 l4\n                - @ number n4\n                - @ ml s4\n            - @ number n3\n            - @ ml s3\n        - @ ml s2`;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"s1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].name, \"2\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children.length, \"3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].name, \"n2\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].name, \"3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children.length, \"4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[0].name, \"l3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[0].features[0].modelName, \"list1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].name, \"4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children.length, \"5\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[0].name, \"r4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[0].features[0].modelName, \"regex1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[1].name, \"5\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[2].name, \"l4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[2].features[0].modelName, \"list3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[3].name, \"n4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[3].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[4].name, \"s4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[2].name, \"n3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[2].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[3].name, \"s3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[2].name, \"s2\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Arbitrary depth entities are handled correctly (Spaces instead of tab stops)', function (done) {\n        let luFile = `\n@ list list1\n@ list list2\n@ list list3\n@ list list4\n@ regex regex1\n@ regex regex2\n@ prebuilt number\n@ml 1 = \n    - @ ml s1\n    - @ ml 2 =\n        - @ number n2\n        - @ml 3 =\n            - @ list1 l3\n            - @ml 4 =\n                - @ regex1 r4\n                - @ ml 5 =\n                    - @ regex2 r5\n                    - @ list2 l5\n                    - @ number n5\n                    - @ ml s5\n                - @ list3 l4\n                - @ number n4\n                - @ ml s4\n            - @ number n3\n            - @ ml s3\n        - @ ml s2`;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"s1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].name, \"2\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children.length, \"3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].name, \"n2\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[0].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].name, \"3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children.length, \"4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[0].name, \"l3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[0].features[0].modelName, \"list1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].name, \"4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children.length, \"5\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[0].name, \"r4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[0].features[0].modelName, \"regex1\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[1].name, \"5\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[2].name, \"l4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[2].features[0].modelName, \"list3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[3].name, \"n4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[3].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[1].children[4].name, \"s4\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[2].name, \"n3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[2].features[0].modelName, \"number\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[1].children[3].name, \"s3\");\n                assert.equal(res.LUISJsonStructure.entities[0].children[1].children[2].name, \"s2\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Child can include one feature', function(done) {\n        let luFile = `\n    @ml 1 = \n        - @ ml s1 usesFeature x1\n    @regex x1\n        \n    `;\n    parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"s1\");\n                assert.deepEqual(res.LUISJsonStructure.entities[0].children[0].features, [new helperclasses.entityFeature('x1', false)]);\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Child can include one or more features', function(done) {\n        let luFile = `\n    @ml 1 = \n        - @ ml s1 usesFeature x1, x2\n    @regex x1\n    @regex x2\n    `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"s1\");\n                assert.deepEqual(res.LUISJsonStructure.entities[0].children[0].features, [new helperclasses.entityFeature('x1', false), new helperclasses.entityFeature('x2', false)]);\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('instanceOf must be defined', function(done) {\n        let luFile = `\n        @ml 1 = \n        - @ list1 l1\n        `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    });\n\n    it('instanceOf must be defined immaterial of child depth', function(done) {\n        let luFile = `\n        @ list list1\n        @ml 1 = \n        - @ list1 l1\n        - @ ml \n        `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n    \n    it('instanceOf cannot be to a phrase list', function(done) {\n        let luFile = `\n@ ml fooBar\n    - @ pl1 x1\n@ phraselist pl1`;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n\n    it('instanceOf cannot be to a pattern.any', function(done) {\n        let luFile = `\n@ ml fooBar\n    - @ pa1 x1\n@ patternany pa1`;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n\n    it('instanceOf cannot be to a role', function(done) {\n        let luFile = `\n@ ml fooBar\n    - @ r1 x1\n@ ml pl1 r1\n    `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n\n    it('usesFeature cannot be to a pattern.any entity', function(done) {\n        let luFile = `\n@ ml fooBar\n    - @ ml x1 usesFeature pa1\n@ patternany pa1\n    `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n\n    it('Features must be defined before they can be added to a child.', function(done) {\n        let luFile = `\n@ ml fooBar\n- @ ml x1 usesFeature pa1\n    `;\n\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n    \n    it('Child can include intent as a feature', function(done) {\n        let luFile = `\n    @ ml fooBar\n        - @ ml x1 usesFeature pa1\n    # pa1\n    - one  \n    `;\n    parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"x1\");\n                assert.deepEqual(res.LUISJsonStructure.entities[0].children[0].features[0].modelName, 'pa1');\n                assert.equal(res.LUISJsonStructure.intents.length, 1);\n                assert.equal(res.LUISJsonStructure.intents[0].name, 'pa1');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Child can include phrase list as a feature', function(done) {\n        let luFile = `\n    @ ml fooBar\n        - @ ml x1 usesFeature pl1\n    @ phraselist pl1\n    `;\n    parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"x1\");\n                assert.deepEqual(res.LUISJsonStructure.entities[0].children[0].features, [new helperclasses.plFeature(\"pl1\", false)]);\n                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                assert.equal(res.LUISJsonStructure.phraselists[0].name, 'pl1');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('Child can include multiple, valid features', function(done) {\n        let luFile = `\n    @ ml fooBar\n        - @ ml x1 usesFeature pl1, s1, number\n    @ phraselist pl1\n    @ ml s1\n    @ prebuilt number\n    `;\n    parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 2);\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].children[0].name, \"x1\");\n                assert.deepEqual(res.LUISJsonStructure.entities[0].children[0].features, [new helperclasses.plFeature(\"pl1\", false), new helperclasses.entityFeature('s1', false), new helperclasses.entityFeature('number', false)]);\n                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                assert.equal(res.LUISJsonStructure.phraselists[0].name, 'pl1');\n                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, \"number\");\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('interchangeable phrase list can be added as a feature', function(done){\n        let luFile = `\n## None\n## intent1\n@ ml nDepth usesFeatures intent1,phraselist1\n    - @ age nDepth_child1\n    - @ ml nDepth_child2 usesFeatures intent1,phraselist1\n        - @ ml nDepth_child2.1\n@ prebuilt age\n@ phraselist phraselist1(interchangeable) = \n    - who,why,where,what\n        `;\n\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].features[1].featureName, 'phraselist1');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('ml entity definition can be delayed', function(done){\n        let luFile = `\n@ml 1\n@prebuilt number\n@list list1\n@1 =\n- @ number from\n- @ list1 myList\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, '1');\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                done();\n            })\n            .catch(err => done(err))\n        \n\n    });\n\n    it('labelled children in utterances are removed correctly', function(done) {\n        let luFile = `\n        # test\n        - my name is vishwac\n            - my {@userProfile = name is vishwac}\n            - my name is {@userName = vishwac}\n        - I'm 36\n            - I'm {@userProfile = {@userAge = 36}}\n\n        @ ml userProfile = \n            - @ personName userName\n            - @ age userAge\n\n        @ prebuilt personName\n        @ prebuilt age`;\n        \n        parseFile.parseFile(luFile)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'userProfile');\n                assert.equal(res.LUISJsonStructure.entities[0].children.length, 2);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 2);\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    \n    it('prebuilt child entity type can be labelled in an utterance', function(done) {\n        let luFile = `\n        @ ml userProfile\n    - @ number number\n    - @ personName name\n\n@ prebuilt number\n@ prebuilt personName\n\n# userProfile\n- I'm {@userProfile = {@number = 36}} years old\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done())\n            .catch(err => done(err))\n    })\n\n    it('list child entity type can be labelled in an utterance', function(done) {\n        let luFile = `\n        # test\n- {@AddToQuantity={@PROPERTYName=Quantity} is {@number=99}}\n\n@ml AddToQuantity = \n    - @number number\n    - @PROPERTYName PROPERTYName\n\n@ list PROPERTYName\n    - Quantity:\n\t\t- property\n\n@ prebuilt number\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done())\n            .catch(err => done(err))\n    })\n\n    it('[1] At least one immediate parent of a child entity must be labelled', function(done) {\n        let luFile = `\n        # test\n- add {@AddToQuantity={@number=1000}}\n\n@ml AddToQuantity = \n    - @number number\n    - @PROPERTYName PROPERTYName\n@ml RemoveFromQuantity = \n    - @number number\n    - @PROPERTYName PROPERTYName\n\n@ list PROPERTYName\n    - Quantity:\n\t\t- property\n\n@ prebuilt number\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done())\n            .catch(err => done(err))\n    })\n\n    it('At least one immediate parent of a child entity must be labelled', function(done) {\n        let luFile = `\n        # test\n- remove {@RemoveFromQuantity={@number=99}}\n\n@ml AddToQuantity = \n    - @number number\n    - @PROPERTYName PROPERTYName\n@ml RemoveFromQuantity = \n    - @number number\n    - @PROPERTYName PROPERTYName\n\n@ prebuilt number hasRole Quantity\n@ list PROPERTYName\n    - Quantity:\n\t\t- property\n\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done())\n            .catch(err => done(err))\n    })\n\n    it('Invalid utterance definition throws with good error message', function(done) {\n        let luFile = `\n        # test\n- add {{@AddToSauces={@SaucesEntity=yellow}}, {{@AddToSauces={@SaucesEntity=mustard}} and {{@AddToSauces={@SaucesEntity=yellow}}\n- add {{@AddToSauces={@SaucesEntity=mustard}}, {{@AddToSauces={@SaucesEntity=mustard}} and {{@AddToSauces={@SaucesEntity=dijon mustard}}\n- add {{@AddToSauces={@SaucesEntity=mustard}}, {{@AddToSauces={@SaucesEntity=yellow}} and {{@AddToSauces={@SaucesEntity=pepper}}\n\n@ml AddToSauces = \n    - @ml SaucesEntity\n        `;\n        parseFile.parseFile(luFile)\n            .then(res => done(res))\n            .catch(err => done())\n    })\n    \n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.newEntityInUtterance.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('../../../src/parser/lufile/parseFileContents');\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('V2 Entity definitions in utterances', function () {\n    describe('@entityName in labelled utterance', function(){\n        it('direct entity reference is handled correctly', function(done) {\n            let luFile = `\n                @ ml test\n                # test\n                - this is a {@test = one}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'test');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('direct role reference is handled correctly', function(done) {\n            let luFile = `\n                @ ml test r1\n                # test\n                - this is another one {@r1 = one}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'test');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].role, 'r1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Explicit role definition continues to work', function(done) {\n            let luFile = `\n                @ml test r1, r2\n                # test\n                - this is another {test:r1 = one}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'test');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].role, 'r1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Roles can be added on the fly', function(done) {\n            let luFile = `\n                @ml test r1\n                # test\n                - this is another {test:r2 = one}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 2);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1', 'r2']);\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'test');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].role, 'r2');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Without prior definition, @xxx in utterance is treated as simple entity definition', function(done) {\n            let luFile = `\n                # test\n                - this is another {@test = one}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'test');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Multiple labels are handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is another {@from = one} from {@to = tokyo}\n                \n                @ ml x1 from, to\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'x1');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 2);\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'x1');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].role, 'from');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[1].entity, 'x1');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[1].role, 'to');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n\n        it('Without prior definition, @xxx:yyy in utterance is treated as simple entity definition with a role', function(done) {\n            let luFile = `\n                # test\n                - this is another {@test:x1 = one}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['x1']);\n                    assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, 'test');\n                    assert.equal(res.LUISJsonStructure.utterances[0].entities[0].role, 'x1');\n                    done();\n                })\n                .catch(err => done(err))\n        });\n    });\n\n    describe('Patterns with new @entity notation', function() {\n        it('Basic pattern definition is handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is a {@pattern}\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'pattern');\n                    assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                    assert.equal(res.LUISJsonStructure.patterns[0].pattern, 'this is a {pattern}');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Role reference is handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is a {@r1}\n                \n                @patternany test r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.patternAnyEntities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.patternAnyEntities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                    assert.equal(res.LUISJsonStructure.patterns[0].pattern, 'this is a {test:r1}');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Role reference is handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is a {@r1}\n                \n                @ml test r1\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                    assert.equal(res.LUISJsonStructure.patterns[0].pattern, 'this is a {test:r1}');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n\n        it('Multiple entities with Role reference is handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is a {@r1} from {@list1}\n                \n                @ml test r1\n                @list list1 r2 =\n                    - one:\n                        - uno\n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'list1');\n                    assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].roles, ['r2']);\n                    assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                    assert.equal(res.LUISJsonStructure.patterns[0].pattern, 'this is a {test:r1} from {list1}');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n        \n        it('Multiple entities with Role reference is handled correctly', function(done) {\n            let luFile = `\n                # test\n                - this is a {@r1} from {@r2}\n                \n                @ml test r1\n                @list list1 r2 =\n                    - one:\n                        - uno\n                \n            `;\n\n            parseFile.parseFile(luFile)\n                .then(res => {\n                    assert.equal(res.LUISJsonStructure.entities.length, 1);\n                    assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                    assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['r1']);\n                    assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                    assert.equal(res.LUISJsonStructure.closedLists[0].name, 'list1');\n                    assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 1);\n                    assert.deepEqual(res.LUISJsonStructure.closedLists[0].roles, ['r2']);\n                    assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                    assert.equal(res.LUISJsonStructure.patterns[0].pattern, 'this is a {test:r1} from {list1:r2}');\n                    done();\n                })\n                .catch(err => done(err))\n        })\n    })\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.parseFile.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents');\nconst validateLUISBlob = require('./../../../src/parser/luis/luisValidator')\nvar chai = require('chai');\nvar assert = chai.assert;\ndescribe('With helper functions', function () {\n        it('Parsefile correctly handles non nDepth entity references in patterns', function(done) {\n                let luFile = `@ list foo=\n                @ ml operation=\n                    - @foo foo\n                \n                # Test\n                - Pattern {foo}`;\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patterns.length, 1)\n                                assert.equal(res.LUISJsonStructure.patterns[0].pattern, \"Pattern {foo}\");\n                                done()\n                        })\n        })\n\n        it('parseFile includes defaults for LUIS app', function(done) {\n                let luFile = `@ simple entity1`;\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.luis_schema_version, \"3.2.0\")\n                                assert.equal(res.LUISJsonStructure.versionId, \"0.1\")\n                                assert.equal(res.LUISJsonStructure.name, \"\")\n                                assert.equal(res.LUISJsonStructure.desc, \"\")\n                                assert.equal(res.LUISJsonStructure.culture, \"en-us\")\n                                done()\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('tokenizerVersion can be specified in LU file', function(done) {\n                let luFile = `> !# @app.tokenizerVersion = 1.0.2\n\n# testIntent\n- one\n- two`;\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.tokenizerVersion, \"1.0.2\")\n                                done()\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('validateLUISBlob throw when duplicate entity definitions are found', function (done) {\n                let luFile = `# Greeting\n- hi {commPreference=test call}\n\n$commPreference:simple\n$commPreference:call=\n- phone call`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(function (parsedContent) {\n                                validateLUISBlob(parsedContent.LUISJsonStructure)\n                                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                                        .catch(() => done())\n                        })\n                        .catch(() => done())\n        });\n\n        it('validateLUISBlob does not throw when phrase list names collide with other entity names', function (done) {\n                let luFile = `# Greeting\n- hi {commPreference}\n$commPreference:simple\n$commPreference:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(function (parsedContent) {\n                                try {\n                                        validateLUISBlob(parsedContent.LUISJsonStructure)\n                                        done()         \n                                } catch (error) {\n                                        done('Test fail. validateLUISBlob did not throw when expected!' + error)\n                                }\n                        })\n                        .catch((err) => done('Test fail. validateLUISBlob did not throw when expected!' + err))\n        });\n\n        it('parseFile throws on invalid file refs', function (done) {\n                let luFile = `[test]()`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile throws if a QnA maker question does not have a list decoration', function (done) {\n                let luFile = `# ? q1\nquestion 2\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile throws if a QnA maker filter section does not have list decoration', function (done) {\n                let luFile = `# ? q1\n**Filters:**\nlocation = seattle\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile throws if a QnA maker filter section does not have valid key = value pair', function (done) {\n                let luFile = `# ? q1\n**Filters:**\n- location\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile parses multi-line answer correctly', function (done) {\n                let luFile = `# ? q1\n\\`\\`\\`markdown\ntest\n123\n\\`\\`\\`\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done())\n                        .catch(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n        });\n\n        it('parseFile throws on conflicting phraseList definitions', function (done) {\n                let luFile = `$p1:phraseList\n        - m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n        $p1:phraseList interchangeable\n        - m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile throws if phraseList value does not have list decoration', function (done) {\n                let luFile = `$p1:phraseList\nm&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile throws if List synonyms do not have list decoration', function (done) {\n                let luFile = `$p1:t1=\nm&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(() => done('Test fail. validateLUISBlob did not throw when expected!'))\n                        .catch(() => done())\n        });\n\n        it('parseFile correctly de-dupes patterns', function (done) {\n                let luFile = `# test\n        - this is {one}\n        - this is {one}\n`;\n                parseFile.parseFile(luFile, false, 'en-us')\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                                done();\n                        })\n                        .catch(() => done('Test fail. parseFile threw when it was not expected!'))\n        });\n        it('parseFile correctly parses normalized list entity values with : in them', function (done) {\n                let luFile = `$three : test :: a =\n        - foo\n        - bar\n    `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                                assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, 'test :: a');\n                                done();\n                        })\n                        .catch((err) => done(err))\n        });\n\n        it('parseFile correctly parses normalized list entity values with = in them', function (done) {\n                let luFile = `$three : test = a =\n    - foo\n    - bar\n`;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                                assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, 'test = a');\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('parseFile correctly parses normalized list entity values with : in them and inline role definition', function (done) {\n                let luFile = `$three : test :: a = Roles=[from,to]\n            - foo\n            - bar\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                                assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, 'test :: a');\n                                assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 2);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('phraseList entity does not overrite simple entity definition. Both can have same name', function (done) {\n                let luFile = `$product : simple\n\n            $product : phraseList\n                - one\n                - two\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('phraseList entity does not overrite simple entity definition. Both can have same name', function (done) {\n                let luFile = `\n\n            $product : phraseList\n                - one\n                - two\n\n                $product : simple\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Labelled simple entity in an utterance that conflicts with a phrase list name is valid', function (done) {\n                let luFile = `\n\n            $product : phraseList\n                - one\n                - two\n\n                # test\n                - this is {product = one}\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.entities[0].name, 'product');\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Labelled composite entity in an utterance that conflicts with a phrase list name is valid', function (done) {\n                let luFile = `\n\n            $product : phraseList\n                - one\n                - two\n\n                # test\n                - this is {product = {type=sandwich}}\n\n                $product : [type]\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.entities[0].name, 'type');\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, 'product');\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Labelled prebuilt entity in an utterance that conflicts with a phrase list name is valid', function(done) {\n                let luFile = `\n\n                $number : phraseList\n                    - one\n                    - two\n\n                    # test\n                    - this is {number:first = one}\n\n                    $PREBUILT : number\n            `;\n    \n            parseFile.parseFile(luFile) \n                    .then(res => {\n                            \n                            assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                            assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                            assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                            done();\n                    })\n                    .catch((err) => done(err))\n\n        });\n\n        it('Labelled closed list entity in an utterance that conflicts with a phrase list name is valid', function(done) {\n                let luFile = `\n\n                $number : phraseList\n                    - one\n                    - two\n\n                    # test\n                    - this is {number:first = one}\n\n                    $number : test=\n                    - one\n                    - two\n            `;\n    \n            parseFile.parseFile(luFile) \n                    .then(res => {\n                            \n                            assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                            assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                            assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 1);\n                            done();\n                    })\n                    .catch((err) => done(err))\n\n        });\n\n        it('Labelled regex entity in an utterance that conflicts with a phrase list name is valid', function(done) {\n                let luFile = `\n\n                $number : phraseList\n                    - one\n                    - two\n\n                    # test\n                    - this is {number:first = one}\n\n                    $number : /one/\n            `;\n    \n            parseFile.parseFile(luFile) \n                    .then(res => {\n                            \n                            assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                            assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                            assert.equal(res.LUISJsonStructure.regex_entities[0].roles.length, 1);\n                            done();\n                    })\n                    .catch((err) => done(err))\n\n        });\n\n\n        it('Test for #1137', function(done) {\n                let luFile = `\n\n            $product : simple\n            \n            $PREBUILT : number\n\n            $drinks:phraseList\n                    - tea, latte, milk\n            \n            $product:phraseList\n                    - a, b, c\n            $EspressoType:Blonde ::201=\n                    - blonde\n                    - blond\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.entities[0].name, 'product');\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 2);\n                                assert.equal(res.LUISJsonStructure.phraselists[0].name, 'drinks');\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Test for #1151', function (done) {\n                let luFile = `\n\n            $project : simple\n            \n            $project:phraseList\n                    - a, b, c\n\n            # Test\n            - this is a test {project=foo} utterance\n        `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.entities[0].name, 'project');\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                                assert.equal(res.LUISJsonStructure.phraselists[0].name, 'project');\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Test for #1164', function (done) {\n                let luFile = `# Test\n        - one {product:from=something}\n        \n        $product:test=\n        - test`;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                                assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 1);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Test for #1164 (with roles)', function (done) {\n                let luFile = `## None\n                - here's an utterance {aListEntity:ThisIsARole=avalue} with a role in it\n                \n                $aListEntity:some value= Roles=ThisIsARole\n                - avalue\n                `;\n\n                parseFile.parseFile(luFile)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                                assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 1);\n                                done();\n                        })\n                        .catch((err) => done(err))\n\n        });\n\n        it('Test for #1165 (with roles)', function(done) {\n                let luFile = `## None\n                - here's an utterance avalue with a role in it\n                \n                $aListEntity:some value= Roles=ThisIsARole\n                - avalue\n                \n                $MyComposite:[aListEntity:ThisIsARole]\n                `;\n    \n            parseFile.parseFile(luFile) \n                    .then(res => {\n                            assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                            assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 1);\n                            assert.equal(res.LUISJsonStructure.composites.length, 1);\n                            done();\n                    })\n                    .catch((err) => done(err))\n\n        });\n\n        it('Test for #1166 ', function(done) {\n                let luFile = `$Country|Office:Argentina|ar::chc=\n                - Chaco\n                - chaco\n                `;\n    \n            parseFile.parseFile(luFile) \n                    .then(res => {\n                            assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                            assert.equal(res.LUISJsonStructure.closedLists[0].name, 'Country|Office');\n                            assert.equal(res.LUISJsonStructure.closedLists[0].subLists[0].canonicalForm, 'Argentina|ar::chc');\n                            done();\n                    })\n                    .catch((err) => done(err))\n\n        });\n});\n\n\ndescribe('parseFile correctly parses utterances', function () {\n        it('correctly parses an utterance with no entities', function (done) {\n                let testLUFile = `# test\n                - hello`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"hello\");\n                                done();\n                        })\n                        .catch(err => done(err))\n        });\n\n        it('correctly parses an utterance with one labelled entity', function (done) {\n                let testLUFile = `# test\n                - I want a {foodType = tomato}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want a tomato\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 9);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 14);\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses an utterance with one labelled entity', function (done) {\n                let testLUFile = `# test\n                - I want a {foodType=tomato}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want a tomato\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 9);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 14);\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses a pattern with pattern.any entity', function (done) {\n                let testLUFile = `# test\n                - I want {foodType}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                                assert.equal(res.LUISJsonStructure.patterns[0].pattern, \"I want {foodType}\");\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, \"foodType\");\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses an utterance with multiple labelled entities', function (done) {\n                let testLUFile = `# test\n                - I want a {foodType = tomato} and {foodType = orange}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want a tomato and orange\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 20);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 25);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 9);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 14);\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses an utterance with multiple labelled entities', function (done) {\n                let testLUFile = `# test\n                - I want a {foodType =tomato} and {foodType =orange}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want a tomato and orange\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 20);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 25);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 9);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 14);\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses a pattern with multiple pattern.any entities', function (done) {\n                let testLUFile = `# test\n                - I want {foodType} and {foodType}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                                assert.equal(res.LUISJsonStructure.patterns[0].pattern, \"I want {foodType} and {foodType}\");\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, \"foodType\");\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses an utterance with only labelled entity', function (done) {\n                let testLUFile = `# test\n                - {userName=vishwac}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"vishwac\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 0);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 6);\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses an utterance with only labelled entity', function (done) {\n                let testLUFile = `# test\n                - {userName= vishwac}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"vishwac\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 0);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 6);\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses an utterance with single curly bracket', function (done) {\n                let testLUFile = `# test\n                - {userName= vishwac\n                - userName= vishwac}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"{userName= vishwac\");\n                                assert.equal(res.LUISJsonStructure.utterances[1].text, \"userName= vishwac}\");\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses pattern with only pattern.any entity in it.', function (done) {\n                let testLUFile = `# test\n                - {userName}`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                                assert.equal(res.LUISJsonStructure.patterns[0].pattern, \"{userName}\");\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, \"userName\");\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses utterance with composite entities', function (done) {\n                let testLUFile = `# test\n                - {p = x {q = y}}\n                \n                $ p : [q]`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"x y\");\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, 'p');\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\"q\"]);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 2);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses utterance with composite entities with one child label', function (done) {\n                let testLUFile = `# test\n                - I want to {productOrder = buy a {product = shirt}} please\n                \n                $ productOrder : [product]`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want to buy a shirt please\");\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, 'productOrder');\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\"product\"]);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 16);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 20);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 10);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 20);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses utterance with composite entities with multiple children', function (done) {\n                let testLUFile = `# test\n                - I want {productOrder = another {product = shirt} and {product = pant} please}\n                \n                $ productOrder : [product]`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want another shirt and pant please\");\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, 'productOrder');\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\"product\"]);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 3);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 25);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 28);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 15);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 19);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[2].startPos, 7);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[2].endPos, 35);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses utterance with composite entities', function (done) {\n                let testLUFile = `# test\n                - I want {p = x {q = y} and {r = a} with} {foodType=tomato} and {foodType=orange}\n                \n                $ p : [q, r]`;\n                parseFile.parseFile(testLUFile, false)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"I want x y and a with tomato and orange\");\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, 'p');\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\"q\", \"r\"]);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 5);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 9);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 9);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 15);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 15);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[2].startPos, 7);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[2].endPos, 20);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[3].startPos, 22);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[3].endPos, 27);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[4].startPos, 33);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[4].endPos, 38);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it('correctly parses nested simple entities', function(done) {\n                let testLU = `# test\n                - 1 {a = {b = {c = 2}}}`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 3);\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, '1 2');\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 3);\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[0], {\n                                        \"entity\": \"c\",\n                                        \"startPos\": 2,\n                                        \"endPos\": 2\n                                      });\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[1], {\n                                        \"entity\": \"b\",\n                                        \"startPos\": 2,\n                                        \"endPos\": 2\n                                      })\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[2], {\n                                        \"entity\": \"a\",\n                                        \"startPos\": 2,\n                                        \"endPos\": 2\n                                      })\n                                done();\n                        })\n                        .catch(err => done(err));\n        })\n\n        it('correctly parses composites with nested simple entities', function(done) {\n                let testLU = `# test\n                - 1 {a = {b = {c = 2}}}\n                $a:[b]`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, '1 2');\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 3);\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[0], {\n                                        \"entity\": \"c\",\n                                        \"startPos\": 2,\n                                        \"endPos\": 2\n                                      });\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[1], {\n                                        \"entity\": \"b\",\n                                        \"startPos\": 2,\n                                        \"endPos\": 2\n                                      })\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[2], {\n                                        \"entity\": \"a\",\n                                        \"startPos\": 2,\n                                        \"endPos\": 2\n                                      })\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\"b\"]);\n                                done();\n                        })\n                        .catch(err => done(err));\n        });\n\n        it ('Roles specified in composite nested simple child entities are parsed correcly', function(done){\n                let testLU = `## None\n                - {MyComposite:c1=here's an {Entity2:t1=utterance {Entity1:t2=avalue}}} with a composite in it\n                > here's an utterance avalue with a composite in it\n                > MyComposite:0,25; Entity2:10,25, Entity1:20,25\n                $Entity1:simple\n                \n                $Entity2:simple\n               \n                $MyComposite:[Entity1, Entity2]`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"here's an utterance avalue with a composite in it\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 3);\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[0], {\n                                        \"entity\": \"Entity1\",\n                                        \"startPos\": 20,\n                                        \"endPos\": 25,\n                                        \"role\": \"t2\"\n                                      });\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[1], {\n                                        \"entity\": \"Entity2\",\n                                        \"startPos\": 10,\n                                        \"endPos\": 25,\n                                        \"role\": \"t1\"\n                                      })\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[2], {\n                                        \"entity\": \"MyComposite\",\n                                        \"startPos\": 0,\n                                        \"endPos\": 25,\n                                        \"role\": \"c1\"\n                                      })\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\n                                        \"Entity1\",\n                                        \"Entity2\"\n                                      ]);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, \"MyComposite\")\n                                done();\n                        })\n                        .catch(err => done(err))\n\n        });\n\n        it ('test for #1167', function(done){\n                let testLU = `## None\n                - {MyComposite=here's an {Entity2=utterance {Entity1=avalue}}} with a composite in it\n                > here's an utterance avalue with a composite in it\n                > MyComposite:0,25; Entity2:10,25, Entity1:20,25\n                $Entity1:simple\n                \n                $Entity2:simple\n               \n                $MyComposite:[Entity1, Entity2]`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"here's an utterance avalue with a composite in it\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 3);\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[0], {\n                                        \"entity\": \"Entity1\",\n                                        \"startPos\": 20,\n                                        \"endPos\": 25\n                                      });\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[1], {\n                                        \"entity\": \"Entity2\",\n                                        \"startPos\": 10,\n                                        \"endPos\": 25\n                                      })\n                                assert.deepEqual(res.LUISJsonStructure.utterances[0].entities[2], {\n                                        \"entity\": \"MyComposite\",\n                                        \"startPos\": 0,\n                                        \"endPos\": 25\n                                      })\n                                assert.equal(res.LUISJsonStructure.composites.length, 1);\n                                assert.deepEqual(res.LUISJsonStructure.composites[0].children, [\n                                        \"Entity1\",\n                                        \"Entity2\"\n                                      ]);\n                                assert.equal(res.LUISJsonStructure.composites[0].name, \"MyComposite\")\n                                done();\n                        })\n                        .catch(err => done(err))\n\n        })\n\n        it ('Test for 1151, phrase list can have same name as labelled simple entity', function(done){\n                let testLu = `## RequestItem\n                - i need more {Item=water}\n                \n                $Item:simple\n                \n                $Item:phraseList interchangeable\n                - water,coffee`;\n                parseFile.parseFile(testLu)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                                assert.equal(res.LUISJsonStructure.entities[0].name, 'Item');\n                                assert.equal(res.LUISJsonStructure.phraselists.length, 1);\n                                assert.equal(res.LUISJsonStructure.phraselists[0].name, 'Item');\n                                done();\n                        })\n                        .catch(err => done(err))\n\n        });\n\n\n        it ('Test for BF CLI #122', function(done){\n                let testLU = `# intent1\n                - [[this]is] a new form (a | b)`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patterns.length, 1);\n                                assert.equal(res.LUISJsonStructure.patterns[0].pattern, '[[this]is] a new form (a | b)');\n                                done();\n                        })\n                        .catch(err => done('Fail!'))\n        });\n\n        it ('Multiple utterance sections with individual label definitions are handled correctly', function(done) {\n                let testLU = `# test\n                - one {protein = cheese} sandwich\n                    - one cheese sandwich\n                - tomato orange \n                - one cheese {foodType = sandwich}\n                `;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                done();\n                        })\n                        .catch(err => done('Fail!'))\n        })\n\n        it ('patterns are handled correctly', function(done){\n                let testLU = `# intent1\n                - this is a {number}\n                \n                $ prebuilt : number`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                                done();\n                        })\n                        .catch(err => done('Fail!'))\n        })\n\n        it ('patterns are handled correctly (with roles)', function(done){\n                let testLU = `# intent1\n                - this is a {number:one}\n                \n                $ prebuilt : number`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                                done();\n                        })\n                        .catch(err => done('Fail!'))\n\n        })\n\n        it ('excape characters are handled correctly', function(done){\n                let testLU = `# intent1\n                - this is a \\\\{test\\\\}\n                - this ia a test \\\\n`;\n\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                                assert.equal(res.LUISJsonStructure.entities.length, 0);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, 'this is a \\\\{test\\\\}');\n                                assert.equal(res.LUISJsonStructure.utterances[1].text, 'this ia a test \\\\n');\n                                done();\n                        })\n                        .catch(err => done('Fail!'))\n\n        })\n\n        it ('duplicate utterances with entity labels are handled correctly', function(done){\n                let testLU = `\n# test\n- no, i already have meeting {FromTime=3pm} {FromDate=tomorrow} afternoon\n- no, i already have meeting {FromTime=3pm} {FromDate=tomorrow} afternoon\n`;\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"no, i already have meeting 3pm tomorrow afternoon\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, \"FromTime\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 27);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 29);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].entity, \"FromDate\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 31);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 38);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n\n        it ('duplicate utterances with entity labels are handled correctly (partial)', function(done){\n                let testLU = `\n# test\n- no, i already have meeting {FromTime=3pm} tomorrow afternoon\n- no, i already have meeting {FromTime=3pm} {FromDate=tomorrow} afternoon\n`;\n                parseFile.parseFile(testLU)\n                        .then(res => {\n                                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                                assert.equal(res.LUISJsonStructure.utterances[0].text, \"no, i already have meeting 3pm tomorrow afternoon\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities.length, 2);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].entity, \"FromTime\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].startPos, 27);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[0].endPos, 29);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].entity, \"FromDate\");\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].startPos, 31);\n                                assert.equal(res.LUISJsonStructure.utterances[0].entities[1].endPos, 38);\n                                done();\n                        })\n                        .catch(err => done(err))\n        })\n})\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.qnafile.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents').parseFile;\nconst retCode = require('./../../../src/parser/utils/enums/CLI-errors').errorCode;\nconst collate = require('./../../../src/parser/qna/qnamaker/kbCollate').collate\n\ndescribe('With parse file function', function() {\n    it('Throws when input lu file has invalid URIs', function(done){\n        let fileContent = `[InvalidPDF](https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN2.pdf)`;\n        parseFile(fileContent, false, null)\n            .then(res => done('Test fail! did not throw when expected'))\n            .catch(err => {\n                assert.equal(err.errCode, retCode.INVALID_URI);\n                done()\n            })\n    });\n\n    it('correctly parses files available for ingestion in parse toqna', function(done){\n        let fileContent = `[Valid PDF](https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf)`;\n        parseFile(fileContent, false, null)\n            .then(res => {\n                assert.equal(res.qnaJsonStructure.files[0].fileUri, 'https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('correctly collates multiple file references in parse toqna', async function() {\n        let fileContent = `[Valid PDF](https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf)`;\n        let Blob1 = await parseFile(fileContent, false, null);\n        let Blob2 = await parseFile(fileContent, false, null);\n        let qnaList = [Blob1.qnaJsonStructure, Blob2.qnaJsonStructure]\n        let qna = collate(qnaList)\n        assert.equal(qna.files[0].fileUri, 'https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf');\n    })\n\n    it('filters can appear before answer', function(done){\n        let fileContent = `\n# ?hello\n\n**Filters:**\n- a=b\n\n\\`\\`\\`markdown\nhi there\n\\`\\`\\`\n`;\n        parseFile(fileContent)\n            .then(res => {\n                assert.equal(res.qnaJsonStructure.qnaList[0].metadata.length, 1);\n                assert.equal(res.qnaJsonStructure.qnaList[0].metadata[0].name, \"a\");\n                assert.equal(res.qnaJsonStructure.qnaList[0].metadata[0].value, \"b\");\n                done();\n            })\n            .catch(err => done(err))\n    })\n\n    it('filters can appear after answer', function(done){\n        let fileContent = `\n# ?hello\n\n\\`\\`\\`markdown\nhi there\n\\`\\`\\`\n\n**Filters:**\n- a=b\n`;\n        parseFile(fileContent)\n            .then(res => {\n                assert.equal(res.qnaJsonStructure.qnaList[0].metadata.length, 1);\n                assert.equal(res.qnaJsonStructure.qnaList[0].metadata[0].name, \"a\");\n                assert.equal(res.qnaJsonStructure.qnaList[0].metadata[0].value, \"b\");\n                done();\n            })\n            .catch(err => done(err))\n    })\n\n    it('answer can be specified with markdown prefix', function(done){\n        let fileContent = `\n# ?hello\n\n\\`\\`\\`markdown\nhi there\n\\`\\`\\`\n\n**Filters:**\n- a=b\n`;\n        parseFile(fileContent)\n            .then(res => {\n                assert.equal(res.qnaJsonStructure.qnaList[0].answer, \"hi there\");\n                done();\n            })\n            .catch(err => done(err))\n    })\n\n    it('answer can be specified WITHOUT markdown prefix', function(done){\n        let fileContent = `\n# ?hello\n\n\\`\\`\\`\nhi there\n\\`\\`\\`\n\n**Filters:**\n- a=b\n`;\n        parseFile(fileContent)\n            .then(res => {\n                assert.equal(res.qnaJsonStructure.qnaList[0].answer, \"hi there\");\n                done();\n            })\n            .catch(err => done(err))\n    })\n    \n\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.regexEntity.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents').parseFile;\nconst hClasses = require('./../../../src/parser/lufile/classes/hclasses');\nconst collate = require('./../../../src/parser/luis/luisCollate').collate\nconst translateHelpers = require('./../../../src/parser/lufile/translate-helpers');\nconst TRANSLATE_KEY = process.env.TRANSLATOR_KEY;\n\ndescribe('Regex entities in .lu files', function() {\n    it('are parsed correctly when a valid regex pattern is provided', function(done){\n        let luFileContent = `$HRF-number:/hrf-[0-9]{6}/`;\n        let regexEntity = new hClasses.regExEntity('HRF-number', 'hrf-[0-9]{6}');\n        parseFile(luFileContent, false)\n            .then(res => {\n                assert.deepEqual(res.LUISJsonStructure.regex_entities[0], regexEntity);\n                done();\n            })\n            .catch(err => done(`Test failed - ${err}`))\n    });\n\n    it('are parsed correctly when a valid regex pattern containing slash followed by colon is provided', function(done){\n        let luFileContent = `$slash-colon:/[/:]/`;\n        let regexEntity = new hClasses.regExEntity('slash-colon', '[/:]');\n        parseFile(luFileContent, false)\n            .then(res => {\n                const actualRegexEntity = res.LUISJsonStructure.regex_entities[0];\n                assert.deepEqual(actualRegexEntity, regexEntity, `Expected: ${JSON.stringify(regexEntity)} Actual: ${JSON.stringify(actualRegexEntity)}`);\n                done();\n            })\n            .catch(err => done(`Test failed - ${err} - ${JSON.stringify(err)}`))\n    });\n\n    it('are parsed correctly when a valid regex pattern containing only slash followed by colon is provided', function(done){\n        let luFileContent = `$slash-colon://:/`;\n        let regexEntity = new hClasses.regExEntity('slash-colon', '/:');\n        parseFile(luFileContent, false)\n            .then(res => {\n                const actualRegexEntity = res.LUISJsonStructure.regex_entities[0];\n                assert.deepEqual(actualRegexEntity, regexEntity, `Expected: ${JSON.stringify(regexEntity)} Actual: ${JSON.stringify(actualRegexEntity)}`);\n                done();\n            })\n            .catch(err => done(`Test failed - ${err} - ${JSON.stringify(err)}`))\n    });\n\n    it('throws correctly when an empty regex pattern is specified', function(done){\n        let luFileContent = `$test://`;\n        parseFile(luFileContent, false) \n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('throws correctly when an invalid regex pattern is specified', function(done){\n        let luFileContent = `$test:/hrf-[0-9]{6}`;\n        parseFile(luFileContent, false) \n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('throws correctly when multiple regex patterns have the same entity name', function(done){\n        let luFileContent = `$test:/hrf-[0-9]{6}\n$test:/udf-[0-9]{6}/`;\n        parseFile(luFileContent, false) \n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('throws correctly when regex entity name is not unique', function(done){\n        let luFileContent = `$test:/hrf-[0-9]{6}\n# test\n- this is a {test=one} utterance`;\n        parseFile(luFileContent, false) \n            .then(res => done(`Test fail! Did not throw when expected`))\n            .catch(err => done())\n    });\n\n    it('correctly de-dupes when multiple regex entities with same name and pattern are defined in a lu file', function(done){\n        let luFileContent = `$test:/hrf-[0-9]{6}/\n$test:/hrf-[0-9]{6}/`;\n        let regexEntity = new hClasses.regExEntity('test', 'hrf-[0-9]{6}');\n        parseFile(luFileContent, false) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                assert.deepEqual(res.LUISJsonStructure.regex_entities[0], regexEntity);\n                done();\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err, null, 2)}`))\n    });\n\n    it('corectly collates multiple regex entities defined across different lu files', function(done) {\n        let luFile1 = `$test:/hrf-[0-9]{6}/`;\n        let luFile2 = `$test2:/udf-[0-9]{10}/`;\n        let regexEntity1 = new hClasses.regExEntity('test', 'hrf-[0-9]{6}');\n        let regexEntity2 = new hClasses.regExEntity('test2', 'udf-[0-9]{10}');\n        parseFile(luFile1, false) \n            .then(res1 => {\n                parseFile(luFile2, false)\n                    .then(res2 => {\n                            try {\n                                let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                                let luisObj = collate(luisList)\n                                assert.equal(luisObj.regex_entities.length, 2);\n                                assert.deepEqual(luisObj.regex_entities[0], regexEntity1);\n                                assert.deepEqual(luisObj.regex_entities[1], regexEntity2);\n                                done();\n                            } catch (err) {\n                                done(`Test failed 3- ${err, null, 2}`)\n                            }\n                    })\n                    .catch(err => done(`Test failed 2- ${(err)}`))                \n            })\n            .catch(err => done(`Test failed 1- ${JSON.stringify(err, null, 2)}`))\n    });\n\n    it('throws when duplicate regex entities with different patterns are found across lu files', function(done) {\n        let luFile1 = `$test:/hrf-[0-9]{6}/`;\n        let luFile2 = `$test:/udf-[0-9]{10}/`;\n        parseFile(luFile1, false) \n            .then(res1 => {\n                parseFile(luFile2, false)\n                    .then(res2 => {\n                        try {\n                            let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                            collate(luisList)\n                            done(`Test failed - did not throw when expected`);\n                        } catch(err) {\n                            done()\n                        }\n                    })\n                    .catch(err => done())                \n            })\n            .catch(err => done())\n    });\n\n    it('throws when duplicate regex entities with different patterns are found across lu files', function(done) {\n        let luFile1 = `$test:/hrf-[0-9]{6}/`;\n        let luFile2 = `$test:/bpg-[0-9]{5}/`;\n        parseFile(luFile1, false) \n            .then(res1 => {\n                parseFile(luFile2, false)\n                    .then(res2 => {\n                        try {\n                            let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                            let luisObj = collate(luisList)\n                            luisObj.validate()\n                            done(`Test failed - did not throw when expected`);\n                        } catch(err) {\n                            done()\n                        }\n                    })\n                    .catch(err => done())                \n            })\n            .catch(err => done())\n    });\n\n    it('correctly parses regex entity used in a pattern', function(done) {\n        let luFile = `# test\n- what is the email id for {hrf-number}\n\n$hrf-number:/hrf-[0-9]{6}/`;\n        let testPattern = new hClasses.pattern('what is the email id for {hrf-number}', 'test');\n        let regexEntity = new hClasses.regExEntity('hrf-number', 'hrf-[0-9]{6}');\n        parseFile(luFile, false)\n            .then(res => {\n                assert.deepEqual(res.LUISJsonStructure.regex_entities[0], regexEntity);\n                assert.deepEqual(res.LUISJsonStructure.patterns[0], testPattern);\n                assert.equal(res.LUISJsonStructure.intents[0].name, 'test');\n                done();\n            })\n            .catch(err => done(err))\n    });\n\n    it('correctly parses regex entity used in a pattern', function(done) {\n        let luFile = `# test\n- update {hrf-number:from} to {hrf-number:to}\n\n$hrf-number:/hrf-[0-9]{6}/`;\n        let testPattern = new hClasses.pattern('update {hrf-number:from} to {hrf-number:to}', 'test');\n        let regexEntity = new hClasses.regExEntity('hrf-number', 'hrf-[0-9]{6}', ['from', 'to']);\n        parseFile(luFile, false)\n            .then(res => {\n                assert.deepEqual(res.LUISJsonStructure.regex_entities[0], regexEntity);\n                assert.deepEqual(res.LUISJsonStructure.patterns[0], testPattern);\n                assert.equal(res.LUISJsonStructure.intents[0].name, 'test');\n                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                done();\n            })\n            .catch(err => done(err))\n    });\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.roleTest.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents').parseFile\nconst toLU = require('./../../../src/parser/luis/luConverter')\nconst luis = require('./../../../src/parser/luis/luis')\nconst collate = require('./../../../src/parser/luis/luisCollate').collate\ndescribe('Roles in LU files', function() {\n    it('In new entity notation, prebuilt types do not need to be defined to add roles', function(done) {\n        let fileContent = `@ age userAge`;\n        parseFile(fileContent, false, null) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, \"age\");\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles[0], \"userAge\");\n                done()\n            })\n            .catch(err => done(err))\n    })\n    it('Correctly parses prebuilt entity with roles defined via labelled utterance', function(done) {\n        let fileContent = `> # Intent definitions\n        ## Book flight\n        - book flight from {geographyV2:fromCity=london} to {geographyV2:toCity=paris} on {datetimeV2:date=feb 14th}\n        \n        > # Entity definitions\n        $PREBUILT:datetimeV2\n        $PREBUILT:geographyV2`;\n        parseFile(fileContent, false, null) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 2);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[1].roles.length, 2);\n                assert.equal(res.LUISJsonStructure.entities.length, 0);\n                done();\n            })\n            .catch(err => done(err));\n    })\n\n    it('Correctly parses list entity with roles defined via labelled utterance', function(done) {\n        let fileContent = `> # Intent definitions\n        ## Book flight\n        - book flight from {city:fromCity=london} to {city:toCity=paris} on {datetimeV2:date=feb 14th}\n        \n        > # Entity definitions\n        $PREBUILT:datetimeV2\n        $city:london=\n        - london\n        - big apple\n        \n        $city:paris=\n        - paris`;\n        parseFile(fileContent, false, null) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                assert.equal(res.LUISJsonStructure.closedLists.length, 1);\n                assert.equal(res.LUISJsonStructure.closedLists[0].roles.length, 2)\n                assert.equal(res.LUISJsonStructure.entities.length, 0);\n                done();\n            })\n            .catch(err => done(err));\n    })\n\n    it('Correctly parses regex entity with roles defined via labelled utterance', function(done) {\n        let fileContent = `> # Intent definitions\n        ## Book flight\n        - book flight from {city:fromCity=london} to {city:toCity=paris} on {datetimeV2:date=feb 14th}\n        \n        > # Entity definitions\n        $PREBUILT:datetimeV2\n        $city:/[a-A][0-9]/`;\n        parseFile(fileContent, false, null) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.prebuiltEntities.length, 1);\n                assert.equal(res.LUISJsonStructure.prebuiltEntities[0].roles.length, 1);\n                assert.equal(res.LUISJsonStructure.regex_entities.length, 1);\n                assert.equal(res.LUISJsonStructure.regex_entities[0].roles.length, 2)\n                assert.equal(res.LUISJsonStructure.entities.length, 0);\n                done();\n            })\n            .catch(err => done(err));\n    })\n\n    it('Correctly throws on prebuilt entity (without roles) defined via labelled utterance', function(done) {\n        let fileContent = `> # Intent definitions\n        ## Book flight\n        - book flight from {geographyV2=london} to {geographyV2=paris} on {datetimeV2:date=feb 14th}\n        \n        > # Entity definitions\n        $PREBUILT:datetimeV2\n        $PREBUILT:geographyV2`;\n        parseFile(fileContent, false, null) \n            .then(res => done(`Did not throw when expected - ${res}`))\n            .catch(err => done());\n    })\n\n    it('Correctly throws on list entity (without roles) defined via labelled utterance', function(done) {\n        let fileContent = `> # Intent definitions\n        ## Book flight\n        - book flight from {city=london} to {city=paris} on {datetimeV2:date=feb 14th}\n        \n        > # Entity definitions\n        $PREBUILT:datetimeV2\n        $city:london=\n        - london\n        - big apple\n        \n        $city:paris=\n        - paris`;\n        parseFile(fileContent, false, null) \n            .then(res => done(`Did not throw when expected - ${res}`))\n            .catch(err => done());\n    })\n\n    it('Correctly thows with regex entity (without roles) in labelled utterance', function(done) {\n        let fileContent = `> # Intent definitions\n        ## Book flight\n        - book flight from {city=london} to {city=paris} on {datetimeV2:date=feb 14th}\n        \n        > # Entity definitions\n        $PREBUILT:datetimeV2\n        $city:/[a-A][0-9]/`;\n        parseFile(fileContent, false, null) \n            .then(res => done(`Did not throw when expected - ${res}`))\n            .catch(err => done());\n    })\n\n    it('Corretly parses simple roles in LU files', function(done){\n        let fileContent = `# getUserName\n        - call me {name:userName}`;\n        parseFile(fileContent, false, null)\n            .then(res => {\n                assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'name');\n                assert.deepEqual(res.LUISJsonStructure.patternAnyEntities[0].roles, ['userName']);\n                done();\n            })\n            .catch(err => done(err));\n    });\n\n    it('colon usage in utterance text outside of roles is parsed correctly', function (done) {\n        let fileContent = `# testIntent\n        - this is a : test intent {userName=vishwac}`;\n        parseFile(fileContent, false, null) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'userName');\n                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                assert.equal(res.LUISJsonStructure.utterances[0].text, \"this is a : test intent vishwac\");\n                done();\n            })\n            .catch(err => done(err));\n    });\n\n    it('equal usage in utterance text outside of roles is parsed correctly', function (done) {\n        let fileContent = `# testIntent\n        - this is a = test intent {userName=vishwac}`;\n        parseFile(fileContent, false, null) \n            .then(res => {\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'userName');\n                assert.equal(res.LUISJsonStructure.utterances.length, 1);\n                assert.equal(res.LUISJsonStructure.utterances[0].text, \"this is a = test intent vishwac\");\n                done();\n            })\n            .catch(err => done(err));\n    })\n    it('Correctly parses roles with explict type definition in LU files', function(done) {\n        let fileContent = `# getUserName\n        - call me {name:userName}\n        \n        $name: simple`;\n        parseFile(fileContent, false, null)\n        .then(res => {\n            assert.equal(res.LUISJsonStructure.entities[0].name, 'name');\n            assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['userName']);\n            done();\n        })\n        .catch(err => done(err));\n    });\n\n    it('Correctly parses multiple role definitions in LU files correctly', function(done) {\n        let fileContent = `> You can use roles in patterns using the entityName:role notation.\n        # getUserName\n        - call me {name:userName}\n        - I'm {name:userName}\n        - my name is {name:userName}\n        \n        # getUserFirstName\n        > this is another role for the same 'name' entity\n        - [[my] first name is] {name:userFirstName}\n        \n        # BookFlight\n        > roles can be specified for list entity types as well - in this case fromCity and toCity are added as roles to the 'city' list entity defined further below\n        - book flight from {city:fromCity} to {city:toCity}\n        - [can you] get me a flight from {city:fromCity} to {city:toCity}\n        - get me a flight to {city:toCity}\n        - I need to fly from {city:fromCity}\n        \n        $city:Seattle=\n        - Seattle\n        - Tacoma\n        - SeaTac\n        - SEA\n        \n        $city:Portland=\n        - Portland\n        - PDX\n        \n        # setAlarm\n        > prebuilt entitities can have roles as well.\n        - create alarm for {datetimeV2:startTime}\n        \n        # deleteAlarm\n        - remove the {datetimeV2:deleteTime} alarm\n        \n        > This is just defining datetimeV2 as a prebuilt entity type. If an explicit type is not specified, by default entities in patterns will be set to pattern.any entity type\n        $PREBUILT:datetimeV2\n        \n        # randomTestIntent\n        - test {entity:foo}\n        \n        $entity: simple\n\n        `;\n        parseFile(fileContent, false, null)\n        .then(res => {\n            assert.equal(res.LUISJsonStructure.entities[0].name, 'entity');\n            assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['foo']);\n            assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'name');\n            assert.deepEqual(res.LUISJsonStructure.patternAnyEntities[0].roles, ['userName', 'userFirstName']);\n            assert.equal(res.LUISJsonStructure.prebuiltEntities[0].name, 'datetimeV2');\n            assert.deepEqual(res.LUISJsonStructure.prebuiltEntities[0].roles, ['startTime', 'deleteTime']);\n            done();\n        })\n        .catch(err => done(err));\n    });\n\n    it ('prebuilt entities cannot be explicitly labelled in utterances', function(done){\n        let testLU = `\n        $PREBUILT:datetimeV2\n        \n        # testIntent\n        - set alartm at {datetimeV2=7AM}`;\n\n        parseFile(testLU, false, null) \n            .then (res => done (`Test failed - ${JSON.stringify(res)}`))\n            .catch (err => done())\n    }); \n\n    it ('List entities cannot be explicitly labelled in utterances', function(done){\n        let testLU = `\n        $location:redmond=\n        - redmond\n        \n        # testIntent\n        - book a flight to {location=redmond}`;\n\n        parseFile(testLU, false, null) \n            .then (res => done (`Test failed - ${JSON.stringify(res)}`))\n            .catch (err => done())\n    }); \n\n    it ('Pattern.Any entities when labelled are automatically converted to simple entities', function(done){\n        let testLU = `\n        # test1\n        - book a flight to {location}\n        \n        # testIntent\n        - book a flight to {location=redmond}`;\n\n        parseFile(testLU, false, null) \n            .then (res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                done ();\n            })\n            .catch (err => done(err))\n    }); \n\n    it ('RegEx entities cannot be explicitly labelled in utterances', function(done){\n        let testLU = `\n        $HRF-number:/hrf-[0-9]{6}/\n        \n        # testIntent\n        - book a flight to {HRF-number=redmond}`;\n\n        parseFile(testLU, false, null) \n            .then (res => done (`Test failed - ${JSON.stringify(res)}`))\n            .catch (err => done())\n    }); \n\n    it ('composite entity with role definition in labelled utterances is parsed correctly', function(done){\n        let testLU = `\n        $flightBooking : [From, To]\n        $From:simple\n        $To:simple\n        \n        # test\n        - book a flight {flightBooking:fromCity={From=london}}`;\n        parseFile(testLU, false, null) \n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.entities.length, 2);\n                assert.equal(LUISJSon.composites.length, 1);\n                assert.equal(LUISJSon.composites[0].roles.length, 1);\n                assert.equal(LUISJSon.utterances.length, 1);\n                assert.equal(LUISJSon.utterances[0].entities[1].role, 'fromCity');\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it ('labelled simple entities in uttearnces with role definition are parsed correcly', function(done){\n        let testLU = `\n        # test\n        - this is a {test:role1=test} utterance`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJson = res.LUISJsonStructure;\n                assert.equal(LUISJson.entities[0].name, 'test');\n                assert.equal(LUISJson.entities[0].roles[0], 'role1');\n                assert.equal(LUISJson.utterances[0].text, 'this is a test utterance');\n                assert.equal(LUISJson.utterances[0].entities[0].role, 'role1');\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it ('implicit pattern any entity type definition after adding it implicitly via a labelled value is handled correctly', function(done){\n        let testLU = `# test 2\n        - this is a {test}\n\n        # test\n        - this is a test of {test:fromTime = 7AM}\n        \n        `;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 0);\n                assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                done ();\n            })\n            .catch (err => done (err))\n    });\n\n    it ('It should come back with one entity (taskcontent) and one pattern.any entity (taskcontent.any)', function(done){\n        let testLU = `# foo\n        - this is {taskcontent = bar}\n        - this is a {taskcontent.any}\n        - this is {taskcontent = orange}     \n        `;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.patternAnyEntities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'taskcontent');\n                assert.equal(res.LUISJsonStructure.patternAnyEntities[0].name, 'taskcontent.any');\n                done ();\n            })\n            .catch (err => done (err))\n    });\n\n    it ('explicit phrase list entity type definition after adding it implicitly via a labelled value in an utterance throws correctly', function(done){\n        let testLU = `# test\n        - this is a test of {test:fromTime = 7AM}\n        \n        $test:phraseList\n- m&m,mars,mints,spearmings,payday,jelly,kit kat,kitkat,twix`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                // This is fix for # 1151. LUIS allows phrase list names to be the same name as other entities in the model. \n                assert.equal(res.LUISJsonStructure.entities.length, 1);\n                assert.equal(res.LUISJsonStructure.entities[0].name, 'test');\n                assert.equal(res.LUISJsonStructure.entities[0].roles.length, 1);\n                assert.deepEqual(res.LUISJsonStructure.entities[0].roles, ['fromTime']);\n                assert.equal(res.LUISJsonStructure.model_features.length, 1);\n                assert.equal(res.LUISJsonStructure.model_features[0].name, 'test');\n                done();\n            })\n            .catch (err => done ())\n    })\n\n    it ('explicit composite entity type definition after adding it implicitly via a labelled value in an utterance is parsed correctly', function(done){\n        let testLU = `# test\n        - this is a test of {test:role1 = {fromTime = 7AM}}\n        \n$test:[fromTime]`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJson = res.LUISJsonStructure;\n                assert.equal(LUISJson.composites.length, 1);\n                assert.equal(LUISJson.composites[0].roles.length, 1);\n                assert.equal(LUISJson.composites[0].roles[0], 'role1');\n                assert.equal(LUISJson.entities.length, 1);\n                assert.equal(LUISJson.utterances.length, 1);\n                assert.equal(LUISJson.utterances[0].entities.length, 2);\n                assert.equal(LUISJson.utterances[0].entities[1].role, 'role1');\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it ('simple entity definitions with roles are parsed correctly', function(done) {\n        let testLU = `$name:simple roles=[firstname, lastname]\n        `;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.entities.length, 1);\n                assert.equal(LUISJSon.entities[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.entities[0].roles, [\"firstname\", \"lastname\"]);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n    it ('simple entity definitions with roles are collated correctly', function(done) {\n        let testLU = `$name:simple roles=[firstname, lastname]\n        \n        # test \n        - my middle name is {name:middlename=sena}`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.entities.length, 1);\n                assert.equal(LUISJSon.entities[0].roles.length, 3);\n                assert.deepEqual(LUISJSon.entities[0].roles, [\"firstname\",\"lastname\",\"middlename\"]);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n    it ('simple entity definitions with roles are collated correctly', function(done) {\n        let testLU = `\n        \n        # test \n        - my middle name is {name:middlename=sena}\n        \n        $name:simple roles=[firstname, lastname]`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.entities.length, 1);\n                assert.equal(LUISJSon.entities[0].roles.length, 3);\n                assert.deepEqual(LUISJSon.entities[0].roles, [\"firstname\",\"lastname\",\"middlename\"]);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n    it ('prebuilt entity definitions with roles are parsed correctly', function(done) {\n        let testLU = `$PREBUILT:datetimeV2 roles=[fromDate, toDate]\n        `;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.prebuiltEntities.length, 1);\n                assert.equal(LUISJSon.prebuiltEntities[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.prebuiltEntities[0].roles, ['fromDate', 'toDate']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n    it ('pre-built entity definitions with roles are collated correctly', function(done) {\n        let testLU = `$PREBUILT:datetimeV2 roles=[fromDate, toDate]\n        \n        # test \n        - my first name is vishwac\n        \n        $PREBUILT:datetimeV2 roles=[tempDate]`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.prebuiltEntities.length, 1);\n                assert.equal(LUISJSon.prebuiltEntities[0].roles.length, 3);\n                assert.deepEqual(LUISJSon.prebuiltEntities[0].roles, ['fromDate', 'toDate', 'tempDate']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n    it ('simple entity definitions with roles are collated correctly', function(done) {\n        let testLU = `$PREBUILT:datetimeV2 roles=[fromDate, toDate]\n        \n        # test \n        - my first name is vishwac\n        \n        $PREBUILT:number roles=[start, end]`;\n\n        parseFile(testLU, false, null)\n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.prebuiltEntities.length, 2);\n                assert.equal(LUISJSon.prebuiltEntities[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.prebuiltEntities[0].roles, ['fromDate', 'toDate']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it ('List entities with explicit role definitions are parsed correctly', function(done) {\n        let testLU = `\n        $location:seattle= roles=[fromCity,toCity]\n            - seattle`;\n        \n        parseFile(testLU, false, null)\n            .then(res => {\n                let LUISJson = res.LUISJsonStructure;\n                assert.equal(LUISJson.closedLists.length, 1);\n                assert.equal(LUISJson.closedLists[0].subLists.length, 1);\n                assert.equal(LUISJson.closedLists[0].subLists[0].canonicalForm, 'seattle');\n                assert.deepEqual(LUISJson.closedLists[0].subLists[0].list, ['seattle']);\n                assert.equal(LUISJson.closedLists[0].roles.length, 2);\n                assert.deepEqual(LUISJson.closedLists[0].roles, ['fromCity', 'toCity']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n    it ('List entities with explicit role definitions are collated correctly', function(done) {\n        let testLU = `\n        $location:seattle= roles=[fromCity]\n            - seattle\n        \n        # test\n        - test intent\n        \n        $location:new york= roles=[toCity]`;\n        \n        parseFile(testLU, false, null)\n            .then(res => {\n                let LUISJson = res.LUISJsonStructure;\n                assert.equal(LUISJson.closedLists.length, 1);\n                assert.equal(LUISJson.closedLists[0].subLists.length, 2);\n                assert.equal(LUISJson.closedLists[0].subLists[0].canonicalForm, 'seattle');\n                assert.deepEqual(LUISJson.closedLists[0].subLists[0].list, ['seattle']);\n                assert.equal(LUISJson.closedLists[0].roles.length, 2);\n                assert.deepEqual(LUISJson.closedLists[0].roles, ['fromCity', 'toCity']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    });\n\n    it ('RegEx entities with explicit role definitions are parsed correctly', function(done) {\n        let testLU = `$HRF-number:/hrf-[0-9]{6}/ roles=fromNumber,toNumber`;\n        \n        parseFile(testLU, false, null)\n            .then(res => {\n                let LUISJson = res.LUISJsonStructure;\n                assert.equal(LUISJson.regex_entities.length, 1);\n                assert.equal(LUISJson.regex_entities[0].name, 'HRF-number');\n                assert.equal(LUISJson.regex_entities[0].roles.length, 2);\n                assert.deepEqual(LUISJson.regex_entities[0].roles, ['fromNumber', 'toNumber']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    });\n\n    it ('RegEx entities with explicit role definitions are collated correctly', function(done) {\n        let testLU = `$HRF-number:/hrf-[0-9]{6}/ roles=fromNumber\n        $HRF-number:/hrf-[0-9]{6}/ roles=toNumber`;\n        \n        parseFile(testLU, false, null)\n            .then(res => {\n                let LUISJson = res.LUISJsonStructure;\n                assert.equal(LUISJson.regex_entities.length, 1);\n                assert.equal(LUISJson.regex_entities[0].name, 'HRF-number');\n                assert.equal(LUISJson.regex_entities[0].roles.length, 2);\n                assert.deepEqual(LUISJson.regex_entities[0].roles, ['fromNumber', 'toNumber']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n    it ('composite entities with explicit role definition are parsed correctly', function(done) {\n        let testLU = `$temperatureUnit : [device, temperature] roles=from, to\n        $device : simple\n        $PREBUILT : temperature`;\n\n        parseFile(testLU, false, null) \n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.composites.length, 1);\n                assert.equal(LUISJSon.composites[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.composites[0].roles, ['from', 'to']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n    it ('composite entities with explicit role definition are collated correctly', function(done) {\n        let testLU = `$temperatureUnit : [device, temperature] roles=from\n        $device : simple\n        $PREBUILT : temperature\n        $temperatureUnit : [device, temperature] roles=to`;\n\n        parseFile(testLU, false, null) \n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert.equal(LUISJSon.composites.length, 1);\n                assert.equal(LUISJSon.composites[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.composites[0].roles, ['from', 'to']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n    it ('parser correctly throws for Pharse lists with explicit role definition', function(done) {\n        let testLU = `$Want:PhraseList roles=[foo,bar]\n        - require, need, desire, know`;\n\n        parseFile(testLU, false, null) \n            .then (res => done(`Test failed. Did not throw when expected- ${JSON.stringify(err)}`))\n            .catch (err => done())\n    });\n\n    it ('Roles for simple entities defined across lu files are collated correctly', function(done) {\n        let testLU1 = `$userName:simple role=firstName`;\n        let testLU2 = `$userName:simple role=lastName`;\n\n        parseFile(testLU1, false)\n            .then(res1 => {\n                parseFile(testLU2, false) \n                    .then(res2 => {\n                            try {\n                                let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                                let luisObj = collate(luisList)\n                                assert.equal(luisObj.entities.length, 1);\n                                assert.equal(luisObj.entities[0].roles.length, 2);\n                                assert.deepEqual(luisObj.entities[0].roles, ['firstName', 'lastName']);\n                                done();\n                            } catch(err) { \n                                done(`Test failed - ${err}`)\n                            }\n                    })\n                    .catch(err => done(`Test failed - ${err}`))\n            })\n            .catch(err => done(`Test failed - ${err}`))\n    })\n\n    it ('Roles for prebuilt entities defined across lu files are collated correctly', function(done) {\n        let testLU1 = `$PREBUILT:datetimeV2 role=fromDate`;\n        let testLU2 = `$PREBUILT:datetimeV2 role=toDate`;\n\n        parseFile(testLU1, false)\n            .then(res1 => {\n                parseFile(testLU2, false) \n                    .then(res2 => {\n                        try {\n                            let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                            let luisObj = collate(luisList)\n                            assert.equal(luisObj.prebuiltEntities.length, 1);\n                            assert.equal(luisObj.prebuiltEntities[0].roles.length, 2);\n                            assert.deepEqual(luisObj.prebuiltEntities[0].roles, ['fromDate', 'toDate']);\n                            done();\n                        } catch(err) {\n                            done(`Test failed - ${err}`)\n                        }\n                    })\n                    .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n    it ('Roles for list entities defined across lu files are collated correctly', function(done) {\n        let testLU1 = `$location:seattle= role=fromCity\n        - seattle`;\n        let testLU2 = `$location:new york= role=toCity\n        - new york`;\n\n        parseFile(testLU1, false)\n            .then(res1 => {\n                parseFile(testLU2, false) \n                    .then(res2 => {\n                            try {\n                                let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                                let luisObj = collate(luisList)\n                                assert.equal(luisObj.closedLists.length, 1);\n                                assert.equal(luisObj.closedLists[0].roles.length, 2);\n                                assert.deepEqual(luisObj.closedLists[0].roles, ['fromCity', 'toCity']);\n                                done();\n                            } catch (err) {\n                                done(`Test failed - ${err}`)\n                            }\n                    })\n                    .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n\n\n    it ('Roles for regex entities defined across lu files are collated correctly', function(done) {\n        let testLU1 = `$HRF-number:/hrf-[0-9]{6}/ roles=fromNumber`;\n        let testLU2 = `$HRF-number:/hrf-[0-9]{6}/ roles=toNumber`;\n\n        parseFile(testLU1, false)\n            .then(res1 => {\n                parseFile(testLU2, false) \n                    .then(res2 => {\n                        try {\n                            let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                            let luisObj = collate(luisList)\n                            assert.equal(luisObj.regex_entities.length, 1);\n                            assert.equal(luisObj.regex_entities[0].roles.length, 2);\n                            assert.deepEqual(luisObj.regex_entities[0].roles, ['fromNumber', 'toNumber']);\n                            done();\n                        } catch(err) {\n                            done(`Test failed - ${err}`)\n                        }\n                    })\n                    .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    })\n    \n    it ('Roles for composite entities defined across lu files are collated correctly', function(done) {\n        let testLU1 = `$temperatureUnit : [device, temperature] roles=from`;\n        let testLU2 = `$temperatureUnit : [device, temperature] roles=to`;\n\n        parseFile(testLU1, false)\n            .then(res1 => {\n                parseFile(testLU2, false) \n                    .then(res2 => {\n                            try {\n                                let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                                let luisObj = collate(luisList)\n                                assert.equal(luisObj.composites.length, 1);\n                                assert.equal(luisObj.composites[0].roles.length, 2);\n                                assert.deepEqual(luisObj.composites[0].roles, ['from', 'to']);\n                                done();\n                            } catch(err) {\n                                done(`Test failed - ${JSON.stringify(err)}`)\n                            }\n                    })\n                    .catch(err => done(`Test failed 2- ${JSON.stringify(err)}`))\n            })\n            .catch(err => done(`Test failed 3- ${JSON.stringify(err)}`))\n    })\n\n    it ('Roles for Pattern.Any entities defined across lu files are collated correctly', function(done) {\n        let testLU1 = `# test\n        - set alarm for {time:fromTime}`;\n        let testLU2 = `# test\n        - set alarm for {time:toTime}`;\n\n        parseFile(testLU1, false)\n            .then(res1 => {\n                parseFile(testLU2, false) \n                    .then(res2 => {\n                        try {\n                            let luisList = [res1.LUISJsonStructure, res2.LUISJsonStructure]\n                            let luisObj = collate(luisList)\n                            assert.equal(luisObj.patternAnyEntities.length, 1);\n                            assert.equal(luisObj.patternAnyEntities[0].roles.length, 2);\n                            assert.deepEqual(luisObj.patternAnyEntities[0].roles, ['fromTime', 'toTime']);\n                            done();\n                        } catch(err) {\n                            done(`Test failed - ${err}`)\n                        }\n                    })\n                    .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n            })\n            .catch(err => done(`Test failed - ${JSON.stringify(err)}`))\n    });\n\n    it ('Ludown refresh successfully converts a luis model with role definition into a .lu file', function(done){\n        let testModel = `{\n            \"intents\": [\n              {\n                \"name\": \"getName\"\n              },\n              {\n                \"name\": \"BookFlight\"\n              }\n            ],\n            \"entities\": [\n              {\n                \"name\": \"userName\",\n                \"roles\": [\n                  \"firstName\"\n                ]\n              },\n              {\n                \"name\": \"name\",\n                \"roles\": [\n                  \"lastName\"\n                ]\n              }\n            ],\n            \"composites\": [\n              {\n                \"name\": \"location\",\n                \"children\": [\n                  \"city\"\n                ],\n                \"roles\": [\n                  \"fromCity\",\n                  \"toCity\"\n                ]\n              }\n            ],\n            \"closedLists\": [\n              {\n                \"name\": \"city\",\n                \"subLists\": [\n                  {\n                    \"canonicalForm\": \"seattle\",\n                    \"list\": [\n                      \"seattle\",\n                      \"SEA\",\n                      \"SeaTac\"\n                    ]\n                  },\n                  {\n                    \"canonicalForm\": \"new york\",\n                    \"list\": [\n                      \"new york\",\n                      \"JFK\",\n                      \"EWR\"\n                    ]\n                  }\n                ],\n                \"roles\": []\n              }\n            ],\n            \"regex_entities\": [],\n            \"model_features\": [],\n            \"regex_features\": [],\n            \"utterances\": [\n              {\n                \"text\": \"my name is vishwac\",\n                \"intent\": \"getName\",\n                \"entities\": [\n                  {\n                    \"entity\": \"userName\",\n                    \"startPos\": 11,\n                    \"endPos\": 17,\n                    \"role\": \"firstName\"\n                  }\n                ]\n              },\n              {\n                \"text\": \"my first name is vishwac\",\n                \"intent\": \"getName\",\n                \"entities\": [\n                  {\n                    \"entity\": \"userName\",\n                    \"startPos\": 17,\n                    \"endPos\": 23,\n                    \"role\": \"firstName\"\n                  }\n                ]\n              },\n              {\n                \"text\": \"my name is vishwac sena and last name is kannan\",\n                \"intent\": \"getName\",\n                \"entities\": [\n                  {\n                    \"entity\": \"userName\",\n                    \"startPos\": 11,\n                    \"endPos\": 22,\n                    \"role\": \"firstName\"\n                  },\n                  {\n                    \"entity\": \"name\",\n                    \"startPos\": 41,\n                    \"endPos\": 46,\n                    \"role\": \"lastName\"\n                  }\n                ]\n              },\n              {\n                \"text\": \"book a flight from seattle\",\n                \"intent\": \"BookFlight\",\n                \"entities\": [\n                  {\n                    \"entity\": \"location\",\n                    \"startPos\": 19,\n                    \"endPos\": 25,\n                    \"role\": \"fromCity\"\n                  }\n                ]\n              },\n              {\n                \"text\": \"book a flight to london\",\n                \"intent\": \"BookFlight\",\n                \"entities\": [\n                  {\n                    \"entity\": \"location\",\n                    \"startPos\": 17,\n                    \"endPos\": 22,\n                    \"role\": \"toCity\"\n                  }\n                ]\n              }\n            ],\n            \"patterns\": [],\n            \"patternAnyEntities\": [],\n            \"prebuiltEntities\": [],\n            \"luis_schema_version\": \"3.2.0\",\n            \"versionId\": \"0.1\",\n            \"name\": \"1\",\n            \"desc\": \"\",\n            \"culture\": \"en-us\"\n          }`;\n          try {\n            let res = toLU(JSON.parse(testModel))\n            assert.isTrue(res.includes(`- my name is {@firstName=vishwac}`));\n            assert.isTrue(res.includes(`- book a flight to {@toCity=london}`));\n            assert.isTrue(res.includes(`@ ml userName hasRole firstName`));\n            assert.isTrue(res.includes(`@ composite location hasRoles fromCity,toCity = [city]`));\n            done();\n          } catch (error) {\n            done(`Test failed - ${JSON.stringify(error)}`)\n          }\n    })\n\n    it ('prebuilt entities with inline as well as explicit role definition is handled correctly', function(done){\n        let testLU = `> # Intent definitions\n\n        ## Intent\n        - holiday request to {datetimeV2:to=next day}\n        - holiday request vacation from {datetimeV2:from=today}\n        - i want vacation from {datetimeV2:from} until {datetimeV2:to}\n        \n        > # Entity definitions\n        \n        > # PREBUILT Entity definitions\n        \n        $PREBUILT:datetimeV2 Roles=to, from`;\n        parseFile(testLU, false, null) \n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert(LUISJSon.prebuiltEntities.length, 1);\n                assert(LUISJSon.prebuiltEntities[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.prebuiltEntities[0].roles, ['to', 'from']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n    it ('regex entities with inline as well as explicit role definition is handled correctly', function(done){\n        let testLU = `> # Intent definitions\n\n        ## Intent\n        - holiday request to {regex1:to=32}\n        - holiday request vacation from {regex1:from=today}\n        - i want vacation from {regex1:from} until {regex1:to}\n        \n        > # Entity definitions\n        \n        > # PREBUILT Entity definitions\n        \n        $regex1:/[0-9]/ Roles=to, from`;\n        parseFile(testLU, false, null) \n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert(LUISJSon.regex_entities.length, 1);\n                assert(LUISJSon.regex_entities[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.regex_entities[0].roles, ['to', 'from']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n    it ('closed list entities with inline as well as explicit role definition is handled correctly', function(done){\n        let testLU = `> # Intent definitions\n\n        ## Intent\n        - holiday request to {list1:to=32}\n        - holiday request vacation from {list1:from=today}\n        - i want vacation from {list1:from} until {list1:to}\n        \n        > # Entity definitions\n        \n        > # PREBUILT Entity definitions\n        \n        $list1: a = Roles = to, from\n            - 32\n        `;\n        parseFile(testLU, false, null) \n            .then (res => {\n                let LUISJSon = res.LUISJsonStructure;\n                assert(LUISJSon.closedLists.length, 1);\n                assert(LUISJSon.closedLists[0].roles.length, 2);\n                assert.deepEqual(LUISJSon.closedLists[0].roles, ['to', 'from']);\n                done();\n            })\n            .catch (err => done(`Test failed - ${JSON.stringify(err)}`))\n\n    })\n\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/qnaMultiTurnAndReferences.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst luMerger = require('./../../../src/parser/lu/luMerger');\nconst luObj = require('../../../src/parser/lu/lu');\nconst luOptions = require('./../../../src/parser/lu/luOptions')\nconst parseFile = require('./../../../src/parser/lufile/parseFileContents').parseFile;\ndescribe('QnA document', function() {\n    describe('Negative tests', function() {\n        it('QnA deep reference cannot pull in patterns.', function(done) {\n            let qnaContent = `# ? [test](lu1#intent1)\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            `;\n            luMerger.Build([new luObj(qnaContent)], false, undefined, findLuFiles)\n                .then(res => done(res))\n                .catch(err => {\n                    assert(err.text.includes(\"References cannot pull in patterns.\"))\n                    done()\n                })\n        })\n\n        it('Missing deep reference throws', function(done) {\n            let qnaContent = `# ? [test](lu2#intent1)\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            `;\n            luMerger.Build([new luObj(qnaContent, new luOptions('stdin'))], false, undefined, findLuFiles)\n                .then(res => done(res))\n                .catch(err => {\n                    assert(err.text.includes(\"Cannot find reference.\") || err.text.includes(\"Sorry unable to open\"))\n                    done()\n                })\n        })\n\n        it('Invalid QnAId throws', function(done) {\n            let qnaContent = `\n            <a id=\"123\">\n            # ? question\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            `;\n            luMerger.Build([new luObj(qnaContent, new luOptions('stdin'))], false, undefined, findLuFiles)\n                .then(res => done(res))\n                .catch(err => {\n                    assert(err.text.includes(\"line 2:12 - line 2:13\"))\n                    done()\n                })\n        })\n\n        it('Prompts must be valid links', function(done) {\n            let qnaContent = `\n            # ? question\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            **Prompts:**\n            [test](#?-test\n\n            # ? test\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            `;\n            luMerger.Build([new luObj(qnaContent, new luOptions('stdin'))], false, undefined, findLuFiles)\n                .then(res => done(res))\n                .catch(err => {\n                    assert(err.text.includes(\"line 9:12 - line 9:15\"))\n                    done()\n                })\n        })\n\n        it('Filters must be a list', function(done) {\n            let qnaContent = `\n            # ? question\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            **Filters:**\n            a = b\n            `;\n            luMerger.Build([new luObj(qnaContent, new luOptions('stdin'))], false, undefined, findLuFiles)\n                .then(res => done(res))\n                .catch(err => {\n                    assert(err.text.includes(\"line 7:0 - line 8:12: Invalid QnA filter line\"))\n                    done()\n                })\n        })\n\n        it('\\'markdown\\' is optional for answer', function(done) {\n            let qnaContent1 = `\n            # ? question\n            \\`\\`\\`\n            answer\n            \\`\\`\\`\n            `;\n\n            let qnaContent2 = `\n            # ? question\n            \\`\\`\\`markdown\n            answer\n            \\`\\`\\`\n            `;\n            luMerger.Build([new luObj(qnaContent1, new luOptions('stdin'))], false, undefined, findLuFiles)\n                .then(res => {\n                    luMerger.Build([new luObj(qnaContent2, new luOptions('stdin'))], false, undefined, findLuFiles)\n                        .then(res1 => {\n                            assert.deepEqual(res1, res)\n                            done();\n                        })\n                        .catch(err => done(err))\n                })\n                .catch(err => done(err))\n        })\n    })\n    \n})\n\nconst findLuFiles = async function(srcId, idsToFind){\n    let retPayload = [];\n    idsToFind.forEach(ask => {\n        switch(ask.filePath) {\n            case 'lu1': \n                retPayload.push(new luObj(`\n# intent1\n- this is an {utterance}\n`, new luOptions(ask.filePath, false)));\n                break;\n            \n        }\n    })\n    return retPayload;\n}"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/sectionapi.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst luparser = require('./../../../src/parser/lufile/luParser');\nconst SectionOperator = require('./../../../src/parser/lufile/sectionOperator');\nconst LUSectionTypes = require('./../../../src/parser/utils/enums/lusectiontypes');\nconst NEWLINE = require('os').EOL;\n\ndescribe('Section CRUD tests for intent', () => {\n    let luresource = undefined;\n    \n    it('init section test', () => {\n        let fileContent = \n        `# Greeting\n        - hi\n        - hello`;\n\n        luresource = luparser.parse(fileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 1);\n        assert.equal(luresource.Sections[0].Errors.length, 0);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[0].Name, 'Greeting');\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap.length, 2);\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap[0].utterance, 'hi');\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap[1].utterance, 'hello');\n    });\n\n    it('add simpleIntentSection test', () => {\n        let newFileConent = \n        `# CheckEmail\n        - check my email\n        - show my emails\n        \n        > this is comment when adding simpleIntentSection`;\n\n        luresource = new SectionOperator(luresource).addSection(newFileConent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[1].Errors.length, 0);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'CheckEmail');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap.length, 2);\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[0].utterance, 'check my email');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[1].utterance, 'show my emails');\n    });\n\n    it('update section test', () => {\n\n        let newFileConent = \n        `# CheckEmail\n        - check my email\n        - show my emails\n        - check my mail box please\n        \n        > this is comment when updating simpleIntentSection`;\n\n        let sectionId = luresource.Sections[1].Id;\n        luresource = new SectionOperator(luresource).updateSection(luresource.Sections[1].Id, newFileConent);\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[1].Errors.length, 0);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'CheckEmail');\n        assert.equal(luresource.Sections[1].Id, sectionId);\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap.length, 3);\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[0].utterance, 'check my email');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[1].utterance, 'show my emails');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[2].utterance, 'check my mail box please');\n        assert.isTrue(luresource.Sections[1].Body.includes('> this is comment when updating simpleIntentSection'));\n        assert.isFalse(luresource.Sections[1].Body.includes('> this is comment when adding simpleIntentSection'));\n    });\n\n    it('delete section test', () => {\n        luresource = new SectionOperator(luresource).deleteSection(luresource.Sections[1].Id);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 1);\n        assert.equal(luresource.Sections[0].Errors.length, 0);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[0].Name, 'Greeting');\n        assert.isFalse(luresource.Sections[0].Body.includes('> this is comment when adding simpleIntentSection'));\n        assert.isFalse(luresource.Sections[0].Body.includes('> this is comment when updating simpleIntentSection'));\n    });\n\n    it('add nestedIntentSection test with enableSections flag unset', () => {\n        let newFileConent = \n        `# CheckEmail\n         ## CheckUnreadEmail\n         - check my unread email\n         - show my unread emails\n         \n         @ simple emailTitle\n\n         ## CheckDeletedEmail\n         - check my deleted email\n         - show my deleted emails\n         \n         @ simple emailSubject`;\n\n        luresource = new SectionOperator(luresource).addSection(newFileConent);\n        assert.equal(luresource.Errors.length, 1);\n        assert.equal(luresource.Sections.length, 4);\n        assert.equal(luresource.Sections[1].Errors.length, 0);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'CheckEmail');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap.length, 0);\n        \n        assert.equal(luresource.Sections[2].Errors.length, 0);\n        assert.equal(luresource.Sections[2].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[2].Name, 'CheckUnreadEmail');\n        assert.equal(luresource.Sections[2].UtteranceAndEntitiesMap.length, 2);\n        assert.equal(luresource.Sections[2].UtteranceAndEntitiesMap[0].utterance, 'check my unread email');\n        assert.equal(luresource.Sections[2].UtteranceAndEntitiesMap[1].utterance, 'show my unread emails');\n        assert.equal(luresource.Sections[2].Entities.length, 1);\n        assert.equal(luresource.Sections[2].Entities[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[2].Entities[0].Name, 'emailTitle');\n        assert.equal(luresource.Sections[2].Entities[0].Type, 'simple');\n\n        assert.equal(luresource.Sections[3].Errors.length, 0);\n        assert.equal(luresource.Sections[3].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[3].Name, 'CheckDeletedEmail');\n        assert.equal(luresource.Sections[3].UtteranceAndEntitiesMap.length, 2);\n        assert.equal(luresource.Sections[3].UtteranceAndEntitiesMap[0].utterance, 'check my deleted email');\n        assert.equal(luresource.Sections[3].UtteranceAndEntitiesMap[1].utterance, 'show my deleted emails');\n        assert.equal(luresource.Sections[3].Entities[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[3].Entities[0].Name, 'emailSubject');\n        assert.equal(luresource.Sections[3].Entities[0].Type, 'simple');\n    });\n\n    it('add nestedIntentSection test with enableSections flag set', () => {\n        let newFileConent = `# CheckTodo${NEWLINE}## CheckUnreadTodo${NEWLINE}- check my unread todo${NEWLINE}- show my unread todos${NEWLINE}${NEWLINE}@ simple todoTitle${NEWLINE}${NEWLINE}## CheckDeletedTodo${NEWLINE}- check my deleted todo${NEWLINE}- show my deleted todos${NEWLINE}${NEWLINE}@ simple todoSubject`;\n        luresource = luparser.parse(luresource.Content + NEWLINE + '> !# @enableSections = true');\n        luresource = new SectionOperator(luresource).addSection(newFileConent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 4);\n        assert.equal(luresource.Sections[1].Errors.length, 0);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.NESTEDINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'CheckEmail');\n        assert.equal(luresource.Sections[1].SimpleIntentSections.length, 2);\n        assert.equal(luresource.Sections[1].SimpleIntentSections[0].Name, 'CheckUnreadEmail');\n        assert.equal(luresource.Sections[1].SimpleIntentSections[0].Entities[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[1].SimpleIntentSections[0].Entities[0].Name, 'emailTitle');\n        assert.equal(luresource.Sections[1].SimpleIntentSections[0].Entities[0].Type, 'simple');\n        assert.equal(luresource.Sections[1].SimpleIntentSections[0].UtteranceAndEntitiesMap[1].utterance, 'show my unread emails');\n\n        assert.equal(luresource.Sections[1].SimpleIntentSections[1].Name, 'CheckDeletedEmail');\n        assert.equal(luresource.Sections[1].SimpleIntentSections[1].Entities[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[1].SimpleIntentSections[1].Entities[0].Name, 'emailSubject');\n        assert.equal(luresource.Sections[1].SimpleIntentSections[1].Entities[0].Type, 'simple');\n        assert.equal(luresource.Sections[1].SimpleIntentSections[1].UtteranceAndEntitiesMap[0].utterance, 'check my deleted email');\n\n        assert.equal(luresource.Sections[3].Errors.length, 0);\n        assert.equal(luresource.Sections[3].SectionType, LUSectionTypes.NESTEDINTENTSECTION);\n        assert.equal(luresource.Sections[3].Name, 'CheckTodo');\n        assert.equal(luresource.Sections[3].Body, `## CheckUnreadTodo${NEWLINE}- check my unread todo${NEWLINE}- show my unread todos${NEWLINE}${NEWLINE}@ simple todoTitle${NEWLINE}${NEWLINE}## CheckDeletedTodo${NEWLINE}- check my deleted todo${NEWLINE}- show my deleted todos${NEWLINE}${NEWLINE}@ simple todoSubject`);\n        assert.equal(luresource.Sections[3].SimpleIntentSections.length, 2);\n        assert.equal(luresource.Sections[3].SimpleIntentSections[0].Name, 'CheckUnreadTodo');\n        assert.equal(luresource.Sections[3].SimpleIntentSections[0].Body, `- check my unread todo${NEWLINE}- show my unread todos${NEWLINE}${NEWLINE}@ simple todoTitle${NEWLINE}`);\n        assert.equal(luresource.Sections[3].SimpleIntentSections[0].Entities[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[3].SimpleIntentSections[0].Entities[0].Name, 'todoTitle');\n        assert.equal(luresource.Sections[3].SimpleIntentSections[0].Entities[0].Type, 'simple');\n        assert.equal(luresource.Sections[3].SimpleIntentSections[0].UtteranceAndEntitiesMap[1].utterance, 'show my unread todos');\n\n        assert.equal(luresource.Sections[3].SimpleIntentSections[1].Name, 'CheckDeletedTodo');\n        assert.equal(luresource.Sections[3].SimpleIntentSections[1].Entities[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[3].SimpleIntentSections[1].Entities[0].Name, 'todoSubject');\n        assert.equal(luresource.Sections[3].SimpleIntentSections[1].Entities[0].Type, 'simple');\n        assert.equal(luresource.Sections[3].SimpleIntentSections[1].UtteranceAndEntitiesMap[0].utterance, 'check my deleted todo');\n    });\n\n    it('update section test for invalid content', () => {\n        // missing '-' before utterance hello\n        let newFileConent = `# Greeting${NEWLINE}> comment1${NEWLINE}- hi${NEWLINE}hello${NEWLINE}$${NEWLINE}@${NEWLINE}> comment2`;\n\n        let sectionId = luresource.Sections[0].Id;\n        luresource = new SectionOperator(luresource).updateSection(luresource.Sections[0].Id, newFileConent);\n        \n        assert.equal(luresource.Errors.length, 4);\n        assert.equal(luresource.Sections.length, 4);\n        assert.equal(luresource.Sections[0].Errors.length, 4);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[0].Name, 'Greeting');\n        assert.equal(luresource.Sections[0].Id, sectionId);\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap.length, 1);\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap[0].utterance, 'hi');\n        assert.equal(luresource.Sections[0].Body, `> comment1${NEWLINE}- hi${NEWLINE}hello${NEWLINE}$${NEWLINE}@${NEWLINE}> comment2`);\n    });\n\n    it('update section test for invalid content2', () => {\n        // missing entity type after '$a', here 'a' is entity name\n        let newFileConent = `# Greeting${NEWLINE}> comment1${NEWLINE}- hi${NEWLINE}$a${NEWLINE}> comment2`;\n\n        let sectionId = luresource.Sections[0].Id;\n        luresource = new SectionOperator(luresource).updateSection(luresource.Sections[0].Id, newFileConent);\n        assert.equal(luresource.Errors.length, 1);\n        assert.equal(luresource.Sections.length, 4);\n        assert.equal(luresource.Sections[0].Errors.length, 1);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[0].Name, 'Greeting');\n        assert.equal(luresource.Sections[0].Id, sectionId);\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap.length, 1);\n        assert.equal(luresource.Sections[0].UtteranceAndEntitiesMap[0].utterance, 'hi');\n        assert.equal(luresource.Sections[0].Body, `> comment1${NEWLINE}- hi${NEWLINE}$a${NEWLINE}> comment2`);\n    });\n\n    it('add section test for nested section content with comments', () => {\n        let simpleIntentBody1 = `- hello${NEWLINE}- hi${NEWLINE}> this is comment 1${NEWLINE}@${NEWLINE}> this is comment 2${NEWLINE}`\n        let simpleIntentBody2 = `- bye${NEWLINE}$${NEWLINE}> this is comment 3${NEWLINE}${NEWLINE}> this is comment 4${NEWLINE}${NEWLINE}`\n        let nestedIntentBody = `## greeting${NEWLINE}${simpleIntentBody1}${NEWLINE}## goodbye${NEWLINE}${simpleIntentBody2}`\n        let newFileConent = `# nestedIntentWithComments${NEWLINE}${nestedIntentBody}${NEWLINE}[xxx](b.lu)`\n\n        luresource = new SectionOperator(luresource).addSection(newFileConent);\n\n        assert.equal(luresource.Errors.length, 4);\n        assert.equal(luresource.Sections.length, 6);\n        assert.equal(luresource.Sections[4].Errors.length, 3);\n        assert.equal(luresource.Sections[4].SectionType, LUSectionTypes.NESTEDINTENTSECTION);\n        assert.equal(luresource.Sections[4].Name, 'nestedIntentWithComments');\n        assert.equal(luresource.Sections[4].SimpleIntentSections[0].Body, simpleIntentBody1);\n        assert.equal(luresource.Sections[4].SimpleIntentSections[1].Body, simpleIntentBody2);\n        assert.equal(luresource.Sections[4].Body, nestedIntentBody);\n    });\n});\n\ndescribe('Section CRUD tests for entity', () => {\n    let luresource = undefined;\n    \n    it('init section test', () => {\n        let fileContent = \n`@ list BreadEntity =\n    - multiGrainWheat:\n        - multi\n    - rye:\n        - rye\n\n# Greeting\n- hi`;\n\n        luresource = luparser.parse(fileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[0].Name, 'BreadEntity');\n        assert.equal(luresource.Sections[0].Type, 'list');\n        assert.equal(luresource.Sections[0].ListBody.length, 4);\n        assert.equal(luresource.Sections[0].ListBody[0], '    - multiGrainWheat:');\n        assert.equal(luresource.Sections[0].ListBody[1], '        - multi');\n        assert.equal(luresource.Sections[0].ListBody[2], '    - rye:');\n        assert.equal(luresource.Sections[0].ListBody[3], '        - rye');\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'Greeting');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap.length, 1);\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[0].utterance, 'hi');\n    });\n\n    it('update entity section test', () => {\n        let newFileConent =\n`@ list BreadEntity =\n    - multiGrainWheat:\n        - multi grain\n    - white:\n        - white`;\n\n        luresource = new SectionOperator(luresource).updateSection(luresource.Sections[0].Id, newFileConent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.NEWENTITYSECTION);\n        assert.equal(luresource.Sections[0].Name, 'BreadEntity');\n        assert.equal(luresource.Sections[0].Type, 'list');\n        assert.equal(luresource.Sections[0].ListBody.length, 4);\n        assert.equal(luresource.Sections[0].ListBody[0], '    - multiGrainWheat:');\n        assert.equal(luresource.Sections[0].ListBody[1], '        - multi grain');\n        assert.equal(luresource.Sections[0].ListBody[2], '    - white:');\n        assert.equal(luresource.Sections[0].ListBody[3], '        - white');\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'Greeting');\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap.length, 1);\n        assert.equal(luresource.Sections[1].UtteranceAndEntitiesMap[0].utterance, 'hi');\n    });\n});\n\ndescribe('Section CRUD tests for error import in utterances', () => {\n    let luresource = undefined;\n    \n    it('init section test', () => {\n        let fileContent = \n`# Greeting\n- hi\n[]\n[\n]\n> @ ml city\n# Cancel\n- cancel that`;\n\n        luresource = luparser.parse(fileContent);\n        assert.equal(luresource.Errors.length, 1);\n        assert.equal(luresource.Errors[0].Message, 'Invalid intent body line, did you miss \\'-\\' at line begin')\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[0].Body, `- hi${NEWLINE}[]${NEWLINE}[${NEWLINE}]${NEWLINE}> @ ml city`);\n        assert.equal(luresource.Sections[1].Name, 'Cancel')\n        assert.equal(luresource.Sections[1].Body, '- cancel that')\n    });\n});\n\ndescribe('Section CRUD tests for qna', () => {\n    let luresource = undefined;\n\n    let fileContent = \n`# ? who is CEO of Microsoft\n- Microsoft CEO\n\n\\`\\`\\`\nSatya Nadella\n\\`\\`\\``;\n\n    let addedFileContent = \n`# ? what about the weather of Seattle\n- how about the weather of Seattle\n\n\\`\\`\\`\nwarm and rainy\n\\`\\`\\``\n    \n    let updatedFileConent = \n`# ? who is CEO of Facebook\n- Facebook CEO\n\n\\`\\`\\`\nMark Zuckerberg\n\\`\\`\\``;\n\n    let insertFileContent =\n`# ? how to greet\n\n\\`\\`\\`\nhello\n\\`\\`\\``\n\n    it('add qna section test', () => {\n        luresource = luparser.parse(fileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 1);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[0].Body.replace(/\\r\\n/g,\"\\n\"), fileContent);\n        \n        luresource = new SectionOperator(luresource).addSection(addedFileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[1].Body.replace(/\\r\\n/g,\"\\n\"), addedFileContent);\n    });\n\n    it('update qna section test', () => {\n        luresource = new SectionOperator(luresource).updateSection(luresource.Sections[0].Id, updatedFileConent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[0].Body.replace(/\\r\\n/g,\"\\n\"), updatedFileConent);\n    });\n\n    it('insert qna section at begining test', () => {\n        luresource = new SectionOperator(luresource).insertSection(luresource.Sections[0].Id, insertFileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 3);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[2].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[0].Body.replace(/\\r\\n/g,\"\\n\"), insertFileContent);\n        assert.equal(luresource.Sections[1].Body.replace(/\\r\\n/g,\"\\n\"), updatedFileConent);\n        assert.equal(luresource.Sections[2].Body.replace(/\\r\\n/g,\"\\n\"), addedFileContent);\n    });\n\n    it('delete qna section test', () => {\n        luresource = new SectionOperator(luresource).deleteSection(luresource.Sections[0].Id);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[0].Body.replace(/\\r\\n/g,\"\\n\"), updatedFileConent);\n        assert.equal(luresource.Sections[1].Body.replace(/\\r\\n/g,\"\\n\"), addedFileContent);\n    });\n\n    it('insert qna section at middle test', () => {\n        luresource = new SectionOperator(luresource).insertSection(luresource.Sections[1].Id, insertFileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 3);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[2].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[0].Body.replace(/\\r\\n/g,\"\\n\"), updatedFileConent);\n        assert.equal(luresource.Sections[1].Body.replace(/\\r\\n/g,\"\\n\"), insertFileContent);\n        assert.equal(luresource.Sections[2].Body.replace(/\\r\\n/g,\"\\n\"), addedFileContent);\n    });\n\n    it('insert qna section at empty file', () => {\n        luresource = luparser.parse('');\n        luresource = new SectionOperator(luresource).insertSection(0, insertFileContent);\n\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 1);\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.QNASECTION);\n        assert.equal(luresource.Sections[0].Body.replace(/\\r\\n/g,\"\\n\"), insertFileContent);\n    });\n});\n\ndescribe('Section range tests', () => {    \n    it('simple intent section test', () => {\n        let fileContent =\n`# Cancel\n- cancel it\n\n#    Greeting\n## HelloGreeting\n- hi\n\n@simple e1\n\n## ByeGreeting\n- bye\n\n@ ml e2`;\n\n        let luresource = luparser.parse(fileContent);\n\n        assert.equal(luresource.Errors.length, 1);\n        assert.equal(luresource.Sections.length, 4);\n\n        assert.equal(luresource.Sections[0].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[0].Name, 'Cancel');\n        assert.equal(luresource.Sections[0].Range.Start.Line, 1)\n        assert.equal(luresource.Sections[0].Range.Start.Character, 0)\n        assert.equal(luresource.Sections[0].Range.End.Line, 3)\n        assert.equal(luresource.Sections[0].Range.End.Character, 0)\n\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'Greeting');\n        assert.equal(luresource.Sections[1].Range.Start.Line, 4)\n        assert.equal(luresource.Sections[1].Range.Start.Character, 0)\n        assert.equal(luresource.Sections[1].Range.End.Line, 4)\n        assert.equal(luresource.Sections[1].Range.End.Character, 13)\n\n        assert.equal(luresource.Sections[2].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[2].Name, 'HelloGreeting');\n        assert.equal(luresource.Sections[2].Range.Start.Line, 5)\n        assert.equal(luresource.Sections[2].Range.Start.Character, 0)\n        assert.equal(luresource.Sections[2].Range.End.Line, 9)\n        assert.equal(luresource.Sections[2].Range.End.Character, 0)\n\n        assert.equal(luresource.Sections[3].SectionType, LUSectionTypes.SIMPLEINTENTSECTION);\n        assert.equal(luresource.Sections[3].Name, 'ByeGreeting');\n        assert.equal(luresource.Sections[3].Range.Start.Line, 10)\n        assert.equal(luresource.Sections[3].Range.Start.Character, 0)\n        assert.equal(luresource.Sections[3].Range.End.Line, 13)\n        assert.equal(luresource.Sections[3].Range.End.Character, 7)\n    });\n\n    it('nested intent section test', () => {\n        let fileContent =\n`> !# @enableSections = true\n# Greeting\n## HelloGreeting\n- hi\n\n@simple e1\n\n## ByeGreeting\n- bye\n\n@ ml e2`;\n\n        let luresource = luparser.parse(fileContent);\n        assert.equal(luresource.Errors.length, 0);\n        assert.equal(luresource.Sections.length, 2);\n\n        assert.equal(luresource.Sections[1].SectionType, LUSectionTypes.NESTEDINTENTSECTION);\n        assert.equal(luresource.Sections[1].Name, 'Greeting');\n        assert.equal(luresource.Sections[1].Range.Start.Line, 2)\n        assert.equal(luresource.Sections[1].Range.Start.Character, 0)\n        assert.equal(luresource.Sections[1].Range.End.Line, 11)\n        assert.equal(luresource.Sections[1].Range.End.Character, 7)\n    });\n})"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/lufile/urlReference.test.js",
    "content": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst chai = require('chai');\nconst assert = chai.assert;\nconst luisBuild = require('./../../../src/parser/luis/luisBuilder');\nconst luMerger = require('./../../../src/parser/lu/luMerger');\nconst luObj = require('../../../src/parser/lu/lu');\nconst luOptions = require('./../../../src/parser/lu/luOptions')\nconst nock = require('nock');\n\ndescribe('luis:convert with URL imports', () => {\n    before(function () {\n      nock('https://vkstoragetest.blob.core.windows.net')\n        .head(/.*/)\n        .reply(200, { status: 'OK' })\n      \n      nock('https://vkstoragetest.blob.core.windows.net')\n        .get(/.*/)\n        .reply(200, `## None\n        - {@add=add {@globalCount={@count={@countNumber=two} apples}}}\n        \n        @ ml add\n            - @ globalCount count\n        \n        @ ml globalCount\n            - @ number countNumber\n        \n        @ prebuilt number`)\n      })\n  \n    it('luis:convert [LUIS] with import statements to LU URLs is parsed correctly', (done) => {\n        let luContent = `[import](https://vkstoragetest.blob.core.windows.net/testlu/Expected.lu)`;\n        const expectedOutput = require('./../../fixtures/verified/importUrl.json');\n        luisBuild.fromLUAsync([new luObj(luContent)])\n            .then(res => {\n              assert.deepEqual(res, expectedOutput)\n              done();\n            })\n            .catch(err => done(err))\n    })\n  })\n  \n  describe('luis:convert with URL imports', function() {\n    before(function () {\n      nock('https://vkstoragetest.blob.core.windows.net')\n        .head(/.*/)\n        .reply(200, { status: 'OK' })\n      \n      nock('https://vkstoragetest.blob.core.windows.net')\n        .get(uri => uri.includes('Expected.lu'))\n        .reply(200, `## None\n        - {@add=add {@globalCount={@count={@countNumber=two} apples}}}\n        \n        @ ml add\n            - @ globalCount count\n        \n        @ ml globalCount\n            - @ number countNumber\n        \n        @ prebuilt number`)\n      })\n    it('luis:convert [LUIS] with import statements to LU URLs is parsed correctly', (done) => {\n      let luContent = `\n# test\n- [import](https://vkstoragetest.blob.core.windows.net/testlu/Expected.lu#None)`;\n      const expectedOutput = require('./../../fixtures/verified/referenceUrl.json');\n      luisBuild.fromLUAsync([new luObj(luContent)])\n          .then(res => {\n            assert.deepEqual(res, expectedOutput)\n            done();\n          })\n          .catch(err => done(err))\n    })\n  })\n  \n  describe('luis:convert with URL imports', function() {\n    before(function () {\n      nock('https://vkstoragetest.blob.core.windows.net')\n        .head(/.*/)\n        .reply(200, { status: 'OK' })\n\n      nock('https://vkstoragetest.blob.core.windows.net')\n        .get(uri => uri.includes('Expected.lu'))\n        .reply(200, `## None\n        - {@add=add {@globalCount={@count={@countNumber=two} apples}}}\n        \n        @ ml add\n            - @ globalCount count\n        \n        @ ml globalCount\n            - @ number countNumber\n        \n        @ prebuilt number`)\n  \n        nock('https://vkstoragetest.blob.core.windows.net')\n        .get(uri => uri.includes('Actual.lu'))\n        .reply(200, `\n        ## test\n        - one\n        \n        ## test2\n        - two\n        - another {entity}\n        \n        \n        @ prebuilt number\n        `)\n      })\n      it('luis:convert [LUIS] with import statements to LU URLs is parsed correctly', (done) => {\n        let luContent = `\n# test\n- [import](https://vkstoragetest.blob.core.windows.net/testlu/Expected.lu#None)\n- [import](https://vkstoragetest.blob.core.windows.net/testlu/Actual.lu#*utterancessndpatterns*)`;\n        const expectedOutput = require('./../../fixtures/verified/referenceUrlWithWildCard.json');\n        luisBuild.fromLUAsync([new luObj(luContent)])\n            .then(res => {\n              assert.deepEqual(res, expectedOutput)\n              done();\n            })\n            .catch(err => done(err))\n      })\n  })\n\n\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/luis/luisBuilder.test.js",
    "content": "const LUISBuilder = require('./../../../src/parser/luis/luisBuilder')\nconst LU = require('./../../../src/parser/lu/lu')\nvar chai = require('chai');\nconst luisobjenum = require('../../../src/parser/utils/enums/luisobjenum');\nvar assert = chai.assert;\n\ndescribe('LUISBuilder', function() {\n    it('Build app from LU content', async() => {\n        let luContent1 = `# Greeting\n- hi`;\n\n        const luisObject = await LUISBuilder.fromLUAsync(luContent1)\n        assert.equal(luisObject.intents.length, 1)\n    })\n    it('Validate test', async() => {\n        let luContent = `# Greeting\n        - hi`;\n\nconst luisObject = await LUISBuilder.fromLUAsync(luContent)\nluisObject.intents[0].name = \"testIntent123456789012345678901234567890123\"\nassert.isTrue(luisObject.validate())\n    })\n    it('Build luis app from LU content', async () => {\n        let luFile = `\n        @ ml test\n        # test\n        - this is a {@test = one}\n        `;\n        const luisObject = await LUISBuilder.fromContentAsync(luFile)\n        assert.equal(luisObject.entities.length, 1);\n        assert.equal(luisObject.entities[0].name, 'test');\n        assert.equal(luisObject.utterances.length, 1);\n        assert.equal(luisObject.utterances[0].entities.length, 1);\n        assert.equal(luisObject.utterances[0].entities[0].entity, 'test');   \n    });\n\n    it('Build luis app from LU Object', async () => {\n        let luFile = `\n        @ ml test\n        # test\n        - this is a {@test = one}\n        `;\n        const luObject = new LU(luFile, '')\n        const luisObject = await LUISBuilder.fromLUAsync([luObject])\n        assert.equal(luisObject.entities.length, 1);\n        assert.equal(luisObject.entities[0].name, 'test');\n        assert.equal(luisObject.utterances.length, 1);\n        assert.equal(luisObject.utterances[0].entities.length, 1);\n        assert.equal(luisObject.utterances[0].entities[0].entity, 'test');   \n    });\n\n    it('Build luis app from LU Object List and collate them', async () => {\n        let testLU1 = `$userName:simple role=firstName`;\n        let testLU2 = `$userName:simple role=lastName`;\n        const luObject1 = new LU(testLU1)\n        const luObject2 = new LU(testLU2)\n        const luisObject = await LUISBuilder.fromLUAsync([luObject1, luObject2])\n        assert.equal(luisObject.entities.length, 1);\n        assert.equal(luisObject.entities[0].roles.length, 2);\n        assert.deepEqual(luisObject.entities[0].roles, ['firstName', 'lastName']);\n    });\n\n    it('PL with enabledForAllModels = false is handled correctly', async () => {\n        let testJSON = require('../../fixtures/testcases/plFeatureDisabled.json');\n        const luisObject = LUISBuilder.fromJson(testJSON).parseToLU();\n        assert.equal(luisObject.content.includes('disabledForAllModels'), true);\n    })\n\n    it('Overlapping entities are converted to LU correctly', async () => {\n        let testJSON = require('../../fixtures/testcases/overlappingEntities.json');\n        const luisObject = LUISBuilder.fromJson(testJSON).parseToLU();\n        assert.equal(luisObject.content.includes(`- {@add=add {@globalCount={@count={@countNumber=two} apples}}}`), true);\n    })\n\n    it('Intent name with spaces are handled correctly with feature assignment', async () => {\n        let testJSON = require('../../fixtures/testcases/intentWithSpace.json');\n        const luisObject = LUISBuilder.fromJson(testJSON).parseToLU();\n        assert.equal(luisObject.content.includes(`@ intent \"test intent\" usesFeature bar`), true);\n    })\n\n    \n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/qna/qnaMakerBuilder.test.js",
    "content": "const QnAMakerBuilder = require('./../../../src/parser/qna/qnamaker/qnaMakerBuilder')\nconst QnA = require('./../../../src/parser/lu/qna')\nconst qnaOptions = require('./../../../src/parser/lu/qnaOptions')\nvar chai = require('chai');\nvar assert = chai.assert;\n\ndescribe('QnAMakerBuilder', function() {\n    it('Build QnaMaker app from qna content', async () => {\n        let qnaContent = `> !# @kb.name = my test kb\n        # ? hi\n        \\`\\`\\`markdown\n        hello\n        \\`\\`\\``;\n        const qnaMakerObject = await QnAMakerBuilder.fromContent(qnaContent)\n        assert.equal(qnaMakerObject.kb.name, 'my test kb');\n    });\n\n    it('Build QnaMaker app from qna instance', async () => {\n        let qnaContent = `> !# @kb.name = my test kb\n        # ? hi\n        \\`\\`\\`markdown\n        hello\n        \\`\\`\\``;\n        const qna = new QnA(qnaContent, '')\n        const qnaMakerObject = await QnAMakerBuilder.fromQna([qna])\n        assert.equal(qnaMakerObject.kb.name, 'my test kb');\n    });\n\n    it('Build QnaMaker app from multiple instances that have prompts', async () => {\n        let qnaContent1 =\n        `> !# @qna.pair.source = crosstrained\n        # ? hi\n        \\`\\`\\`markdown\n        hi from crosstrained\n        \\`\\`\\``;\n\n        let qnaContent2 =\n        `# ? greeting\n        \\`\\`\\`markdown\n        how to greeting\n        \\`\\`\\`\n        \n        **Prompts:**\n        - [hi greeting](#hi)`;\n\n        let qnaContent3 =\n        `# ? hi\n        \\`\\`\\`markdown\n        say hi\n        \\`\\`\\``;\n        const qna1 = new QnA(qnaContent1, new qnaOptions())\n        const qna2 = new QnA(qnaContent2, new qnaOptions())\n        const qna3 = new QnA(qnaContent3, new qnaOptions())\n        const qnaMakerObject = await QnAMakerBuilder.fromQna([qna1, qna2, qna3])\n\n        assert.equal(qnaMakerObject.kb.qnaList[0].id, 2);\n        assert.equal(qnaMakerObject.kb.qnaList[1].id, 3);\n        assert.equal(qnaMakerObject.kb.qnaList[2].id, 1);\n        assert.equal(qnaMakerObject.kb.qnaList[1].context.prompts[0].qnaId, 1);\n    });\n\n});"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/parser/qnabuild/qnabuild.test.js",
    "content": "const assert = require('chai').assert\nconst nock = require('nock')\nconst uuidv1 = require('uuid/v1')\nconst path = require('path')\nconst NEWLINE = require('os').EOL\nconst Builder = require('../../../src/parser/qnabuild/builder').Builder\nconst luObject = require('../../../src/parser/lu/lu')\nconst luOptions = require('../../../src/parser/lu/luOptions')\nconst txtfile = require('../../../src/parser/lufile/read-text-file');\n\nconst rootDir = path.join(__dirname, './../../fixtures/testcases/import-resolver/qna-import-resolver')\n\ndescribe('builder: importUrlOrFileReference function return lu content from file sucessfully', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('qnamaker'))\n      .reply(200, {\n        knowledgebases:\n          [{\n            name: 'test.en-us.qna',\n            id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n            hostName: 'https://myqnamakerbot.azurewebsites.net'\n          }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .post(uri => uri.includes('createasync'))\n      .reply(202, {\n        operationId: 'f8c64e2a-aaaa-3a09-8f78-39d7adc76ec5'\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('operations'))\n      .reply(200, {\n        operationState: 'Succeeded',\n        resourceLocation: 'a/b/f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('knowledgebases'))\n      .reply(200, {\n        qnaDocuments: [{\n          id: 1,\n          source: 'SurfaceManual.pdf',\n          questions: ['how many sandwich types do you have'],\n          answer: '25 types',\n          metadata: []\n        }]\n      })\n  })\n\n  nock('https://westus.api.cognitive.microsoft.com')\n    .delete(uri => uri.includes('knowledgebases'))\n    .reply(200)\n\n  it('should return lu content from file successfully', async () => {\n    const builder = new Builder()\n    const luContent = await builder.importFileReference(\n      'SurfaceManual.pdf',\n      'https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf',\n      uuidv1(),\n      'https://westus.api.cognitive.microsoft.com/qnamaker/v4.0',\n      'mytest.en-us.qna')\n    assert.equal(luContent, `> # QnA pairs${NEWLINE}${NEWLINE}` +\n                            `> !# @qna.pair.source = SurfaceManual.pdf${NEWLINE}${NEWLINE}` +\n                            `<a id = \"1\"></a>${NEWLINE}${NEWLINE}` +\n                            `## ? how many sandwich types do you have${NEWLINE}${NEWLINE}` +\n                            `\\`\\`\\`markdown${NEWLINE}` +\n                            `25 types${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}`)\n  })\n})\n\ndescribe('builder: importUrlOrFileReference function return lu content from file sucessfully when updating kb', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('qnamaker'))\n      .reply(200, {\n        knowledgebases:\n          [{\n            name: 'test.en-us.qna',\n            id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n            hostName: 'https://myqnamakerbot.azurewebsites.net'\n          }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .delete(uri => uri.includes('knowledgebases'))\n      .reply(200)\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .post(uri => uri.includes('createasync'))\n      .reply(202, {\n        operationId: 'f8c64e2a-aaaa-3a09-8f78-39d7adc76ec5'\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('operations'))\n      .reply(200, {\n        operationState: 'Succeeded',\n        resourceLocation: 'a/b/f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('knowledgebases'))\n      .reply(200, {\n        qnaDocuments: [{\n          id: 1,\n          source: 'SurfaceManual.pdf',\n          questions: ['how many sandwich types do you have'],\n          answer: '25 types',\n          metadata: []\n        }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .delete(uri => uri.includes('knowledgebases'))\n      .reply(200)\n  })\n\n  it('should return lu content from file successfully when kb exists', async () => {\n    const builder = new Builder()\n    const luContent = await builder.importFileReference(\n      'SurfaceManual.pdf',\n      'https://download.microsoft.com/download/2/9/B/29B20383-302C-4517-A006-B0186F04BE28/surface-pro-4-user-guide-EN.pdf',\n      uuidv1(),\n      'https://westus.api.cognitive.microsoft.com/qnamaker/v4.0',\n      'test.en-us.qna')\n    assert.equal(luContent, `> # QnA pairs${NEWLINE}${NEWLINE}` +\n      `> !# @qna.pair.source = SurfaceManual.pdf${NEWLINE}${NEWLINE}` +\n      `<a id = \"1\"></a>${NEWLINE}${NEWLINE}` +\n      `## ? how many sandwich types do you have${NEWLINE}${NEWLINE}` +\n      `\\`\\`\\`markdown${NEWLINE}` +\n      `25 types${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}`)\n  })\n})\n\ndescribe('builder: importUrlOrFileReference function return lu content from url sucessfully', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('qnamaker'))\n      .reply(200, {\n        knowledgebases:\n          [{\n            name: 'test.en-us.qna',\n            id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n            hostName: 'https://myqnamakerbot.azurewebsites.net'\n          }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .post(uri => uri.includes('createasync'))\n      .reply(202, {\n        operationId: 'f8c64e2a-aaaa-3a09-8f78-39d7adc76ec5'\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('operations'))\n      .reply(200, {\n        operationState: 'Succeeded',\n        resourceLocation: 'a/b/f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      })\n    \n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('knowledgebases'))\n      .reply(200, {\n        qnaDocuments: [{\n          id: 1,\n          source: 'faqs',\n          questions: ['how many sandwich types do you have'],\n          answer: '25 types',\n          metadata: []\n        }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .delete(uri => uri.includes('knowledgebases'))\n      .reply(200)\n  })\n\n  it('should return lu content from url successfully', async () => {\n    const builder = new Builder()\n    const luContent = await builder.importUrlReference(\n      'https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs',\n      uuidv1(),\n      'https://westus.api.cognitive.microsoft.com/qnamaker/v4.0',\n      'mytest.en-us.qna')\n    assert.equal(luContent, `> # QnA pairs${NEWLINE}${NEWLINE}` +\n                            `> !# @qna.pair.source = faqs${NEWLINE}${NEWLINE}` +\n                            `<a id = \"1\"></a>${NEWLINE}${NEWLINE}` +\n                            `## ? how many sandwich types do you have${NEWLINE}${NEWLINE}` +\n                            `\\`\\`\\`markdown${NEWLINE}` +\n                            `25 types${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}`)\n  })\n})\n\ndescribe('builder: importUrlOrFileReference function return lu content from url sucessfully when updating kb', () => {\n  before(function () {\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('qnamaker'))\n      .reply(200, {\n        knowledgebases:\n          [{\n            name: 'test.en-us.qna',\n            id: 'f8c64e2a-1111-3a09-8f78-39d7adc76ec5',\n            hostName: 'https://myqnamakerbot.azurewebsites.net'\n          }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .delete(uri => uri.includes('knowledgebases'))\n      .reply(200)\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .post(uri => uri.includes('createasync'))\n      .reply(202, {\n        operationId: 'f8c64e2a-aaaa-3a09-8f78-39d7adc76ec5'\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('operations'))\n      .reply(200, {\n        operationState: 'Succeeded',\n        resourceLocation: 'a/b/f8c64e2a-2222-3a09-8f78-39d7adc76ec5'\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .get(uri => uri.includes('knowledgebases'))\n      .reply(200, {\n        qnaDocuments: [{\n          id: 1,\n          source: 'faqs',\n          questions: ['how many sandwich types do you have'],\n          answer: '25 types',\n          metadata: []\n        }]\n      })\n\n    nock('https://westus.api.cognitive.microsoft.com')\n      .delete(uri => uri.includes('knowledgebases'))\n      .reply(200)\n  })\n\n  it('should return lu content from url successfully', async () => {\n    const builder = new Builder()\n    const luContent = await builder.importUrlReference(\n      'https://docs.microsoft.com/en-in/azure/cognitive-services/qnamaker/faqs',\n      uuidv1(),\n      'https://westus.api.cognitive.microsoft.com/qnamaker/v4.0',\n      'test.en-us.qna')\n    assert.equal(luContent, `> # QnA pairs${NEWLINE}${NEWLINE}` +\n      `> !# @qna.pair.source = faqs${NEWLINE}${NEWLINE}` +\n      `<a id = \"1\"></a>${NEWLINE}${NEWLINE}` +\n      `## ? how many sandwich types do you have${NEWLINE}${NEWLINE}` +\n      `\\`\\`\\`markdown${NEWLINE}` +\n      `25 types${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}`)\n  })\n})\n\ndescribe('builder: loadContents function can resolve import files with customized resolver', () => {\n  it('should load contents sucessfully after resolving imports', async () => {\n    let importResolver = async function (srcId, idsToFind) {\n      let luObjects = []\n      let parentFilePath = path.parse(path.resolve(srcId)).dir\n      for (let idx = 0; idx < idsToFind.length; idx++) {\n        let file = idsToFind[idx]\n        if (!path.isAbsolute(file.filePath)) {\n          file.filePath = path.resolve(parentFilePath, file.filePath)\n        }\n\n        if (file.filePath.endsWith(\".qna\") && !file.filePath.endsWith(\"en-us.qna\")) {\n          file.filePath = file.filePath.slice(0, file.filePath.length - 3) + \"en-us.qna\"\n        }\n\n        luObjects.push(new luObject(txtfile.readSync(file.filePath), new luOptions(file.filePath, file.includeInCollate)))\n      }\n      return luObjects\n    };\n\n    const builder = new Builder(() => { })\n    const result = await builder.loadContents(\n      [`${path.join(rootDir, \"common.en-us.qna\")}`],\n      \"test\",\n      \"dev\",\n      \"westus\",\n      \"en-us\",\n      undefined,\n      importResolver)\n\n    assert.equal(result.qnaContents.length, 1)\n    assert.isTrue(result.qnaContents[0].content.includes(\n      `!# @qna.pair.source = custom editorial${NEWLINE}${NEWLINE}## ? help${NEWLINE}- could you help${NEWLINE}${NEWLINE}\\`\\`\\`markdown${NEWLINE}help answer${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}> !# @qna.pair.source = custom editorial${NEWLINE}${NEWLINE}## ? welcome${NEWLINE}${NEWLINE}\\`\\`\\`markdown${NEWLINE}welcome here${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}> !# @qna.pair.source = custom editorial${NEWLINE}${NEWLINE}## ? cancel${NEWLINE}${NEWLINE}\\`\\`\\`markdown${NEWLINE}cancel the task${NEWLINE}\\`\\`\\`${NEWLINE}${NEWLINE}> !# @qna.pair.source = custom editorial${NEWLINE}${NEWLINE}## ? stop${NEWLINE}${NEWLINE}\\`\\`\\`markdown${NEWLINE}stop that${NEWLINE}\\`\\`\\``))\n  })\n})"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/tsconfig.json",
    "content": "{\n  \"extends\": \"../tsconfig\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"noImplicitAny\": false\n  },\n  \"references\": [\n    {\"path\": \"..\"}\n  ]\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/test/utils/filehelper.test.js",
    "content": "import {readTextFile} from './../../src/utils/textfilereader'\nconst expect = require('chai').expect;   \nconst assert = require('chai').assert\nconst fileHelper = require('./../../src/utils/filehelper')\nconst luObject = require('./../../src/parser/lu/lu')\nconst luOptions = require('./../../src/parser/lu/luOptions')\nconst path = require('path')\n\ndescribe('utils/filehelper test', () => {\n    it('File helper correctly  builds a luObject list from a file', async function(){\n            let expected = []\n            let pathToFile = path.resolve(path.join(__dirname, './../fixtures/file.lu'))\n            let content = await readTextFile(pathToFile)\n            expected.push(new luObject(content, new luOptions(pathToFile)))\n            let luObjArray = await fileHelper.getLuObjects('', pathToFile)\n            expect(luObjArray).to.deep.equal(expected)\n    })\n\n    it('File helper correctly  builds a luObject list from stdin', async function(){\n            let content = `> Definition for greeting intent\n            # Greeting\n            - Hi\n            - Hello\n            > users might say these\n            - Good morning \n            - Good evening`\n            let luObjArray = await fileHelper.getLuObjects(content, '')\n            let expected = []\n            expected.push(new luObject(content, new luOptions('stdin')))\n            expect(luObjArray).to.deep.equal(expected)\n    })\n\n    it('File helper correctly build cross train config object', function () {\n        const configContent = {\n            \"./main/main.lu\": {\n                \"rootDialog\": true,\n                \"triggers\": {\n                    \"dia1_trigger\": [\"./dia1/dia1.lu\", \"./dia2/dia2.lu\"]\n                }\n            },\n            \"./dia2/dia2.lu\": {\n                \"triggers\": {\n                    \"dia3_trigger\": \"\",\n                    \"\": \"./dia4/dia4.lu\"\n                }\n            },\n            \"./main/main.fr-fr.lu\": {\n                \"rootDialog\": true,\n                \"triggers\": {\n                    \"dia1_trigger\": \"./dia1/dia1.fr-fr.lu\"\n                }\n            }\n        }\n\n        let configObject = fileHelper.getConfigObject({ id: path.join(__dirname, 'config.json'), content: JSON.stringify(configContent) }, '_Interruption', true)\n        assert.equal(configObject.rootIds[0].includes('main.lu'), true)\n        assert.equal(configObject.rootIds[1].includes('main.fr-fr.lu'), true)\n\n        const triggerRuleKeys = [...Object.keys(configObject.triggerRules)]\n        assert.equal(triggerRuleKeys[0].includes('main.lu'), true)\n        assert.equal(triggerRuleKeys[1].includes('dia2.lu'), true)\n        assert.equal(triggerRuleKeys[2].includes('main.fr-fr.lu'), true)\n\n        const triggerRuleValues = [...Object.values(configObject.triggerRules)]\n        assert.equal(triggerRuleValues[0]['dia1_trigger'][0].includes('dia1.lu'), true)\n        assert.equal(triggerRuleValues[0]['dia1_trigger'][1].includes('dia2.lu'), true)\n        assert.equal(triggerRuleValues[1]['dia3_trigger'][0], '')\n        assert.equal(triggerRuleValues[1][''][0].includes('dia4.lu'), true)\n        assert.equal(triggerRuleValues[2]['dia1_trigger'][0].includes('dia1.fr-fr.lu'), true)\n\n        assert.equal(configObject.intentName, '_Interruption')\n\n        assert.equal(configObject.verbose, true)\n    })\n})"
  },
  {
    "path": "parsers/LU/JS/packages/lu/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"importHelpers\": true,\n    \"module\": \"commonjs\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\",\n    \"strict\": true,\n    \"target\": \"es2017\"\n  },\n  \"include\": [\n    \"src/**/*\"\n  ]\n}\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/tslint.json",
    "content": "{\n  \"linterOptions\": {\n    \"exclude\": [\n        \"src/parser/**/**.js\"\n    ]\n  },\n  \"rules\": {\n    \"ordered-imports\": [false],\n    \"object-literal-sort-keys\": [false],\n    \"file-header\": [\n      true,\n      {\n        \"match\": \"Copyright \\\\(c\\\\) Microsoft Corporation\\\\.*\",\n        \"allow-single-line-comments\": false,\n        \"default\": \"Copyright (c) Microsoft Corporation. All rights reserved.\\nLicensed under the MIT License.\",\n        \"enforce-trailing-newline\": false\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "parsers/LU/JS/rush.json",
    "content": "{\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json\",\n  \"rushVersion\": \"5.19.1\",\n  \"pnpmVersion\": \"4.8.0\",\n  \"pnpmOptions\": {},\n  \"nodeSupportedVersionRange\": \">=10.13.0 <13.0.0\",\n  \"projects\": [\n    {\n      \"packageName\": \"@microsoft/bf-cli-command\",\n      \"projectFolder\": \"packages/command\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-chatdown\",\n      \"projectFolder\": \"packages/chatdown\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-cli-config\",\n      \"projectFolder\": \"packages/config\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-dialog\",\n      \"projectFolder\": \"packages/dialog\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-lu\",\n      \"projectFolder\": \"packages/lu\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-lg-cli\",\n      \"projectFolder\": \"packages/lg\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-luis-cli\",\n      \"projectFolder\": \"packages/luis\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-qnamaker\",\n      \"projectFolder\": \"packages/qnamaker\"\n    },\n    {\n      \"packageName\": \"@microsoft/bf-cli-plugins\",\n      \"projectFolder\": \"packages/plugins\"\n    },\n    {\n      \"packageName\": \"@microsoft/botframework-cli\",\n      \"projectFolder\": \"packages/cli\"\n    }\n  ]\n}"
  },
  {
    "path": "parsers/LU/JS/scripts/fixurls.js",
    "content": "const path = require('path')\nconst fs = require('fs-extra')\n\nconst updateUrls = async () => {\n  let plugins = ['config', 'chatdown', 'dialog', 'qnamaker', 'luis', 'plugins', 'lg', 'cli']\n  for (let i = 0; i < plugins.length; i++) {\n      await cleanUrls(plugins[i])\n  }\n}\n\nconst cleanUrls = async function(plugin) {\n  let readmePath = path.join(__dirname, `./../packages/${plugin}/README.md`)\n  let fileContent = await fs.readFile(readmePath)\n  fileContent = fileContent.toString().replace(/\\/blob\\/v1\\.0\\.0/g, \"\").replace(/\\\\/g, \"/\")\n  await fs.writeFile(readmePath, fileContent)\n}\n\nconst run = async () => {\n  await updateUrls()\n  process.exit(0)\n}\n\nrun()"
  },
  {
    "path": "schemas/component/component.schema",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$id\": \"https://raw.githubusercontent.com/microsoft/botframework-sdk/master/schemas/component/component.schema\",\n    \"title\": \"JSON Schema definition for Bot Framework dialog schemas.\",\n    \"description\": \"In order to create a component for Bot Framework .dialog files you need to create a schema file describing your configuration that meets this definition.  This extends http://json-schema.org/draft-07/schema#.\",\n    \"allOf\": [\n        {\n            \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n        },\n        {\n            \"properties\": {\n                \"$policies\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"interactive\": {\n                            \"title\": \"Interactive\",\n                            \"description\": \"Dialog will wait for input.\",\n                            \"type\": \"boolean\",\n                            \"default\": false\n                        },\n                        \"nonInteractive\": {\n                            \"title\": \"Non-interactive\",\n                            \"description\": \"No child dialogs can wait for input.\",\n                            \"type\": \"boolean\",\n                            \"default\": false\n                        },\n                        \"lastAction\": {\n                            \"title\": \"Last Action\",\n                            \"description\": \"Dialog must be the last action in a list of actions.\",\n                            \"type\": \"boolean\",\n                            \"default\": false\n                        },\n                        \"requiresKind\": {\n                            \"title\": \"Requires Kind\",\n                            \"description\": \"There must be a child dialog of one of the included kinds or an extension of those kinds.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"type\": \"string\"\n                            },\n                            \"default\": []\n                        }\n                    }\n                },\n                \"$role\": {\n                    \"title\": \"$role\",\n                    \"description\": \"Defines the roles played in the dialog schema one of [expression|interface|implements($kind)|extends($kind)].\",\n                    \"oneOf\": [\n                        {\n                            \"$ref\": \"#/definitions/role\"\n                        },\n                        {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"$ref\": \"#/definitions/role\"\n                            }\n                        }\n                    ]\n                },\n                \"$kind\": {\n                    \"title\": \"$kind\",\n                    \"description\": \"Defines the valid properties for the component you are configuring (from a dialog .schema file)\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-zA-Z][a-zA-Z0-9.]*$\"\n                }\n            }\n        }\n    ],\n    \"definitions\": {\n        \"role\": {\n            \"title\": \"$role\",\n            \"description\": \"Defines the role played in the dialog schema from [expression|interface|implements($kind)|extends($kind)].\",\n            \"type\": \"string\",\n            \"pattern\": \"^((expression)|(interface)|(implements\\\\([a-zA-Z][a-zA-Z0-9.]*\\\\))|(extends\\\\([a-zA-Z][a-zA-Z0-9.]*\\\\)))$\"\n        },\n        \"component\": {\n            \"properties\": {\n                \"$kind\": {\n                    \"title\": \"Kind of dialog object\",\n                    \"description\": \"Defines the valid properties for the component you are configuring (from a dialog .schema file)\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-zA-Z][a-zA-Z0-9.]*$\"\n                },\n                \"$designer\": {\n                    \"title\": \"Designer information\",\n                    \"type\": \"object\",\n                    \"description\": \"Extra information for the Bot Framework Composer.\"\n                }\n            },\n            \"required\": [\n                \"$kind\"\n            ],\n            \"additionalProperties\": false,\n            \"patternProperties\": {\n                \"^\\\\$\": {\n                    \"title\": \"Tooling property\",\n                    \"description\": \"Open ended property for tooling.\"\n                }\n            }\n        },\n        \"expression\": {\n            \"$role\": \"expression\",\n            \"type\": \"string\",\n            \"title\": \"Expression\",\n            \"description\": \"Expression to evaluate.\",\n            \"pattern\": \"^.*\\\\S.*\",\n            \"examples\": [\n                \"user.age > 13\"\n            ]\n        },\n        \"equalsExpression\": {\n            \"$role\": \"expression\",\n            \"type\": \"string\",\n            \"title\": \"Expression\",\n            \"description\": \"Expression starting with =.\",\n            \"pattern\": \"^=.*\\\\S.*\",\n            \"examples\": [\n                \"=user.name\"\n            ]\n        },\n        \"condition\": {\n            \"$role\": \"expression\",\n            \"title\": \"Boolean condition\",\n            \"description\": \"Boolean constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"$ref\": \"#/definitions/expression\"\n                },\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"description\": \"Boolean value.\",\n                    \"default\": true,\n                    \"examples\": [\n                        false\n                    ]\n                }\n            ]\n        },\n        \"booleanExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Boolean or expression\",\n            \"description\": \"Boolean constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"description\": \"Boolean constant.\",\n                    \"default\": false,\n                    \"examples\": [\n                        false\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=user.isVip\"\n                    ]\n                }\n            ]\n        },\n        \"numberExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Number or expression\",\n            \"description\": \"Number constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"number\",\n                    \"title\": \"Number\",\n                    \"description\": \"Number constant.\",\n                    \"default\": 0,\n                    \"examples\": [\n                        15.5\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=dialog.quantity\"\n                    ]\n                }\n            ]\n        },\n        \"integerExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Integer or expression\",\n            \"description\": \"Integer constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"integer\",\n                    \"title\": \"Integer\",\n                    \"description\": \"Integer constant.\",\n                    \"default\": 0,\n                    \"examples\": [\n                        15\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=user.age\"\n                    ]\n                }\n            ]\n        },\n        \"stringExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"String or expression\",\n            \"description\": \"Interpolated string or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"string\",\n                    \"title\": \"String\",\n                    \"description\": \"Interpolated string\",\n                    \"pattern\": \"^(?!(=)).*\",\n                    \"examples\": [\n                        \"Hello ${user.name}\"\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=concat('x','y','z')\"\n                    ]\n                }\n            ]\n        },\n        \"arrayExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Array or expression\",\n            \"description\": \"Array or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"array\",\n                    \"title\": \"Array\",\n                    \"description\": \"Array constant.\"\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\"\n                }\n            ]\n        },\n        \"objectExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Object or expression\",\n            \"description\": \"Object or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"object\",\n                    \"title\": \"Object\",\n                    \"description\": \"Object constant.\"\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\"\n                }\n            ]\n        },\n        \"valueExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Any or expression\",\n            \"description\": \"Any constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"object\",\n                    \"title\": \"Object\",\n                    \"description\": \"Object constant.\"\n                },\n                {\n                    \"type\": \"array\",\n                    \"title\": \"Array\",\n                    \"description\": \"Array constant.\"\n                },\n                {\n                    \"type\": \"string\",\n                    \"title\": \"String\",\n                    \"description\": \"Interpolated string.\",\n                    \"pattern\": \"^(?!(=)).*\",\n                    \"examples\": [\n                        \"Hello ${user.name}\"\n                    ]\n                },\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"description\": \"Boolean constant\",\n                    \"examples\": [\n                        false\n                    ]\n                },\n                {\n                    \"type\": \"number\",\n                    \"title\": \"Number\",\n                    \"description\": \"Number constant.\",\n                    \"examples\": [\n                        15.5\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=...\"\n                    ]\n                }\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/component/definitions.schema",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$id\": \"https://raw.githubusercontent.com/microsoft/botframework-sdk/master/schemas/component/definitions.schema\",\n    \"title\": \"JSON Schema definition for dialog schemas.\",\n    \"description\": \"In order to create a component for Bot Framework .dialog files you need to create a schema file describing your configuration that meets this definition.  This extends http://json-schema.org/draft-07/schema#.\",\n    \"definitions\": {\n        \"component\": {\n            \"$comment\": \"This is the base dialog component definition.\",\n            \"properties\": {\n                \"$id\": {\n                    \"title\": \"Unique id for inline definition\",\n                    \"description\": \"Inline id for reuse of an inline definition\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^([a-zA-Z][a-zA-Z0-9.]*)$\"\n                },\n                \"$copy\": {\n                    \"title\": \"Component to use for default properties\",\n                    \"description\": \"Copy the definition by id from a .dialog file.\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^(([a-zA-Z][a-zA-Z0-9.]*)?(#[a-zA-Z][a-zA-Z0-9.]*)?)$\"\n                },\n                \"$kind\": {\n                    \"title\": \"Kind of dialog object\",\n                    \"description\": \"Defines the valid properties for the component you are configuring (from a dialog .schema file)\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-zA-Z][a-zA-Z0-9.]*$\"\n                },\n                \"$designer\": {\n                    \"title\": \"Designer information\",\n                    \"type\": \"object\",\n                    \"description\": \"Extra information for the Bot Framework Composer.\"\n                }\n            }\n        },\n        \"expression\": {\n            \"$role\": \"expression\",\n            \"type\": \"string\",\n            \"title\": \"Expression\",\n            \"pattern\": \"^.*\\\\S.*\",\n            \"examples\":[\n                \"user.age > 13\"\n            ]\n        },\n        \"equalsExpression\": {\n            \"$role\": \"expression\",\n            \"type\": \"string\",\n            \"title\": \"Expression\",\n            \"pattern\": \"^=.*\\\\S.*\",\n             \"examples\":[\n                \"=user.name\"\n            ]\n        },\n        \"condition\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"$ref\": \"#/definitions/expression\"\n                },\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"default\": true,\n                    \"examples\": [\n                        false\n                    ]\n                }\n            ]\n        },\n        \"booleanExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"default\": false,\n                    \"examples\": [\n                        false\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=user.isVip\"\n                    ]\n                }\n            ]\n        },\n        \"numberExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"number\",\n                    \"title\": \"Number\",\n                    \"default\": 0,\n                     \"examples\": [\n                        15.5\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=dialog.quantity\"\n                    ]\n                }\n            ]\n        },\n        \"integerExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"integer\",\n                    \"title\": \"Integer\",\n                    \"default\": 0,\n                     \"examples\": [\n                        15\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=user.age\"\n                    ]\n                }\n            ]\n        },\n        \"stringExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"string\",\n                    \"title\": \"String\",\n                    \"pattern\":\"^(?!(=)).*\",\n                     \"examples\": [\n                        \"Hello ${user.name}\"\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",  \n                    \"examples\": [\n                        \"=concat('x','y','z')\"\n                    ]                  \n                }\n            ]\n        },\n        \"arrayExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"array\",\n                    \"title\": \"Array\"\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\"\n                }\n            ]\n        },\n        \"objectExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"object\",\n                    \"title\": \"Object\"\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\"\n                }\n            ]\n        },\n        \"valueExpression\": {\n            \"$role\": \"expression\",\n            \"oneOf\": [\n                {\n                    \"type\": \"object\",\n                    \"title\": \"Object\"\n                },\n                {\n                    \"type\": \"array\",\n                    \"title\": \"Array\"\n                },\n                {\n                    \"type\": \"string\",\n                    \"title\": \"String\",\n                    \"pattern\":\"^(?!(=)).*\",\n                     \"examples\": [\n                        \"Hello ${user.name}\"\n                    ]\n                },\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                     \"examples\": [\n                        false\n                    ]\n                },\n                {\n                    \"type\": \"number\",\n                    \"title\": \"Number\",\n                     \"examples\": [\n                        15.5\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",  \n                    \"examples\": [\n                        \"=...\"\n                    ]                  \n                }\n            ]\n        }\n    }\n}"
  },
  {
    "path": "schemas/component/readme.md",
    "content": "# Component Schema\nThe component schema defines extensions to JsonSchema for supporting\nBot Framework declarative component definitions (via .schema files which describe the shape of .dialog files).\n\nThe extensions are in baseComponent.schema and bf dialog:merge -u will \nmerge baseComponent.schema + json.schema => component.schema\n\n## Published location\n\nThe component JSON schemas are published at:\n\n`https://schemas.botframework.com/schemas/component/v{version}/component.schema`\n\nExample:\n\n`https://schemas.botframework.com/schemas/component/v1.0/component.schema`\n\nYou should use the published version when referencing this schema.\n\n## Legacy versions\n\nThe `component.schema` and `definitions.schema` files are left in the root folder for backwards compatibility purposes, and should not be used. Use the `\\v{version}\\component.schema` version instead.\n"
  },
  {
    "path": "schemas/component/v1.0/component.schema",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$id\": \"https://schemas.botframework.com/schemas/component/v1.0/component.schema\",\n    \"title\": \"JSON Schema definition for Bot Framework dialog schemas.\",\n    \"description\": \"In order to create a component for Bot Framework .dialog files you need to create a schema file describing your configuration that meets this definition.  This extends http://json-schema.org/draft-07/schema#.\",\n    \"allOf\": [\n        {\n            \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n        },\n        {\n            \"properties\": {\n                \"$policies\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"interactive\": {\n                            \"title\": \"Interactive\",\n                            \"description\": \"Dialog will wait for input.\",\n                            \"type\": \"boolean\",\n                            \"default\": false\n                        },\n                        \"nonInteractive\": {\n                            \"title\": \"Non-interactive\",\n                            \"description\": \"No child dialogs can wait for input.\",\n                            \"type\": \"boolean\",\n                            \"default\": false\n                        },\n                        \"lastAction\": {\n                            \"title\": \"Last Action\",\n                            \"description\": \"Dialog must be the last action in a list of actions.\",\n                            \"type\": \"boolean\",\n                            \"default\": false\n                        },\n                        \"requiresKind\": {\n                            \"title\": \"Requires Kind\",\n                            \"description\": \"There must be a child dialog of one of the included kinds or an extension of those kinds.\",\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"type\": \"string\"\n                            },\n                            \"default\": []\n                        }\n                    }\n                },\n                \"$role\": {\n                    \"title\": \"$role\",\n                    \"description\": \"Defines the roles played in the dialog schema one of [expression|interface|implements($kind)|extends($kind)].\",\n                    \"oneOf\": [\n                        {\n                            \"$ref\": \"#/definitions/role\"\n                        },\n                        {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"$ref\": \"#/definitions/role\"\n                            }\n                        }\n                    ]\n                },\n                \"$kind\": {\n                    \"title\": \"$kind\",\n                    \"description\": \"Defines the valid properties for the component you are configuring (from a dialog .schema file)\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-zA-Z][a-zA-Z0-9.]*$\"\n                }\n            }\n        }\n    ],\n    \"definitions\": {\n        \"role\": {\n            \"title\": \"$role\",\n            \"description\": \"Defines the role played in the dialog schema from [expression|interface|implements($kind)|extends($kind)].\",\n            \"type\": \"string\",\n            \"pattern\": \"^((expression)|(interface)|(implements\\\\([a-zA-Z][a-zA-Z0-9.]*\\\\))|(extends\\\\([a-zA-Z][a-zA-Z0-9.]*\\\\)))$\"\n        },\n        \"component\": {\n            \"properties\": {\n                \"$kind\": {\n                    \"title\": \"Kind of dialog object\",\n                    \"description\": \"Defines the valid properties for the component you are configuring (from a dialog .schema file)\",\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-zA-Z][a-zA-Z0-9.]*$\"\n                },\n                \"$designer\": {\n                    \"title\": \"Designer information\",\n                    \"type\": \"object\",\n                    \"description\": \"Extra information for the Bot Framework Composer.\"\n                }\n            },\n            \"required\": [\n                \"$kind\"\n            ],\n            \"additionalProperties\": false,\n            \"patternProperties\": {\n                \"^\\\\$\": {\n                    \"title\": \"Tooling property\",\n                    \"description\": \"Open ended property for tooling.\"\n                }\n            }\n        },\n        \"expression\": {\n            \"$role\": \"expression\",\n            \"type\": \"string\",\n            \"title\": \"Expression\",\n            \"description\": \"Expression to evaluate.\",\n            \"pattern\": \"^.*\\\\S.*\",\n            \"examples\": [\n                \"user.age > 13\"\n            ]\n        },\n        \"equalsExpression\": {\n            \"$role\": \"expression\",\n            \"type\": \"string\",\n            \"title\": \"Expression\",\n            \"description\": \"Expression starting with =.\",\n            \"pattern\": \"^=.*\\\\S.*\",\n            \"examples\": [\n                \"=user.name\"\n            ]\n        },\n        \"condition\": {\n            \"$role\": \"expression\",\n            \"title\": \"Boolean condition\",\n            \"description\": \"Boolean constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"$ref\": \"#/definitions/expression\"\n                },\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"description\": \"Boolean value.\",\n                    \"default\": true,\n                    \"examples\": [\n                        false\n                    ]\n                }\n            ]\n        },\n        \"booleanExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Boolean or expression\",\n            \"description\": \"Boolean constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"description\": \"Boolean constant.\",\n                    \"default\": false,\n                    \"examples\": [\n                        false\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=user.isVip\"\n                    ]\n                }\n            ]\n        },\n        \"numberExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Number or expression\",\n            \"description\": \"Number constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"number\",\n                    \"title\": \"Number\",\n                    \"description\": \"Number constant.\",\n                    \"default\": 0,\n                    \"examples\": [\n                        15.5\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=dialog.quantity\"\n                    ]\n                }\n            ]\n        },\n        \"integerExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Integer or expression\",\n            \"description\": \"Integer constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"integer\",\n                    \"title\": \"Integer\",\n                    \"description\": \"Integer constant.\",\n                    \"default\": 0,\n                    \"examples\": [\n                        15\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=user.age\"\n                    ]\n                }\n            ]\n        },\n        \"stringExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"String or expression\",\n            \"description\": \"Interpolated string or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"string\",\n                    \"title\": \"String\",\n                    \"description\": \"Interpolated string\",\n                    \"pattern\": \"^(?!(=)).*\",\n                    \"examples\": [\n                        \"Hello ${user.name}\"\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=concat('x','y','z')\"\n                    ]\n                }\n            ]\n        },\n        \"arrayExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Array or expression\",\n            \"description\": \"Array or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"array\",\n                    \"title\": \"Array\",\n                    \"description\": \"Array constant.\"\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\"\n                }\n            ]\n        },\n        \"objectExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Object or expression\",\n            \"description\": \"Object or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"object\",\n                    \"title\": \"Object\",\n                    \"description\": \"Object constant.\"\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\"\n                }\n            ]\n        },\n        \"valueExpression\": {\n            \"$role\": \"expression\",\n            \"title\": \"Any or expression\",\n            \"description\": \"Any constant or expression to evaluate.\",\n            \"oneOf\": [\n                {\n                    \"type\": \"object\",\n                    \"title\": \"Object\",\n                    \"description\": \"Object constant.\"\n                },\n                {\n                    \"type\": \"array\",\n                    \"title\": \"Array\",\n                    \"description\": \"Array constant.\"\n                },\n                {\n                    \"type\": \"string\",\n                    \"title\": \"String\",\n                    \"description\": \"Interpolated string.\",\n                    \"pattern\": \"^(?!(=)).*\",\n                    \"examples\": [\n                        \"Hello ${user.name}\"\n                    ]\n                },\n                {\n                    \"type\": \"boolean\",\n                    \"title\": \"Boolean\",\n                    \"description\": \"Boolean constant\",\n                    \"examples\": [\n                        false\n                    ]\n                },\n                {\n                    \"type\": \"number\",\n                    \"title\": \"Number\",\n                    \"description\": \"Number constant.\",\n                    \"examples\": [\n                        15.5\n                    ]\n                },\n                {\n                    \"$ref\": \"#/definitions/equalsExpression\",\n                    \"examples\": [\n                        \"=...\"\n                    ]\n                }\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/protocol/botframework.json",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"definitions\": {\n        \"AttachmentView\": {\n            \"description\": \"Attachment View name and size\",\n            \"title\": \"AttachmentView\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"viewId\": {\n                    \"description\": \"Content type of the attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"viewId\"\n                },\n                \"size\": {\n                    \"description\": \"Name of the attachment\",\n                    \"type\": \"number\",\n                    \"title\": \"size\"\n                }\n            },\n            \"required\": [\n                \"size\",\n                \"viewId\"\n            ]\n        },\n        \"AttachmentInfo\": {\n            \"description\": \"Metadata for an attachment\",\n            \"title\": \"AttachmentInfo\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"name\": {\n                    \"description\": \"Name of the attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                },\n                \"type\": {\n                    \"description\": \"ContentType of the attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"views\": {\n                    \"description\": \"attachment views\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/AttachmentView\"\n                    },\n                    \"title\": \"views\"\n                }\n            },\n            \"required\": [\n                \"name\",\n                \"type\",\n                \"views\"\n            ]\n        },\n        \"InnerHttpError\": {\n            \"description\": \"Object representing inner http error\",\n            \"title\": \"InnerHttpError\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"statusCode\": {\n                    \"description\": \"HttpStatusCode from failed request\",\n                    \"type\": \"number\",\n                    \"title\": \"statusCode\"\n                },\n                \"body\": {\n                    \"description\": \"Body from failed request\",\n                    \"title\": \"body\"\n                }\n            },\n            \"required\": [\n                \"body\",\n                \"statusCode\"\n            ]\n        },\n        \"ErrorModel\": {\n            \"description\": \"Object representing error information\",\n            \"title\": \"ErrorModel\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"description\": \"Error code\",\n                    \"type\": \"string\",\n                    \"title\": \"code\"\n                },\n                \"message\": {\n                    \"description\": \"Error message\",\n                    \"type\": \"string\",\n                    \"title\": \"message\"\n                },\n                \"innerHttpError\": {\n                    \"$ref\": \"#/definitions/InnerHttpError\",\n                    \"description\": \"Error from inner http call\",\n                    \"title\": \"innerHttpError\"\n                }\n            },\n            \"required\": [\n                \"code\",\n                \"innerHttpError\",\n                \"message\"\n            ]\n        },\n        \"ErrorResponse\": {\n            \"description\": \"An HTTP API response\",\n            \"title\": \"ErrorResponse\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"error\": {\n                    \"$ref\": \"#/definitions/ErrorModel\",\n                    \"description\": \"Error message\",\n                    \"title\": \"error\"\n                }\n            },\n            \"required\": [\n                \"error\"\n            ]\n        },\n        \"ChannelAccount\": {\n            \"description\": \"Channel account information needed to route a message\",\n            \"title\": \"ChannelAccount\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or\\n123456)\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"name\": {\n                    \"description\": \"Display friendly name\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                },\n                \"aadObjectId\": {\n                    \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n                    \"type\": \"string\",\n                    \"title\": \"aadObjectId\"\n                },\n                \"role\": {\n                    \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.). Possible values include:\\n'user', 'bot'\",\n                    \"type\": \"string\",\n                    \"title\": \"role\"\n                }\n            },\n            \"required\": [\n                \"id\",\n                \"name\"\n            ]\n        },\n        \"ConversationAccount\": {\n            \"description\": \"Channel account information for a conversation\",\n            \"title\": \"ConversationAccount\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"isGroup\": {\n                    \"description\": \"Indicates whether the conversation contains more than two participants at the time the\\nactivity was generated\",\n                    \"type\": \"boolean\",\n                    \"title\": \"isGroup\"\n                },\n                \"conversationType\": {\n                    \"description\": \"Indicates the type of the conversation in channels that distinguish between conversation types\",\n                    \"type\": \"string\",\n                    \"title\": \"conversationType\"\n                },\n                \"id\": {\n                    \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or\\n123456)\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"name\": {\n                    \"description\": \"Display friendly name\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                },\n                \"aadObjectId\": {\n                    \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n                    \"type\": \"string\",\n                    \"title\": \"aadObjectId\"\n                },\n                \"role\": {\n                    \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.). Possible values include:\\n'user', 'bot'\",\n                    \"enum\": [\n                        \"bot\",\n                        \"user\"\n                    ],\n                    \"type\": \"string\",\n                    \"title\": \"role\"\n                }\n            },\n            \"required\": [\n                \"id\"\n            ]\n        },\n        \"MessageReaction\": {\n            \"description\": \"Message reaction object\",\n            \"title\": \"MessageReaction\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"type\": {\n                    \"description\": \"Message reaction type. Possible values include: 'like', 'plusOne'\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                }\n            },\n            \"required\": [\n                \"type\"\n            ]\n        },\n        \"CardAction\": {\n            \"description\": \"A clickable action\",\n            \"title\": \"CardAction\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"type\": {\n                    \"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'\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"title\": {\n                    \"description\": \"Text description which appears on the button\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"image\": {\n                    \"description\": \"Image URL which will appear on the button, next to text label\",\n                    \"type\": \"string\",\n                    \"title\": \"image\"\n                },\n                \"text\": {\n                    \"description\": \"Text for this action\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"displayText\": {\n                    \"description\": \"(Optional) text to display in the chat feed if the button is clicked\",\n                    \"type\": \"string\",\n                    \"title\": \"displayText\"\n                },\n                \"value\": {\n                    \"description\": \"Supplementary parameter for action. Content of this property depends on the ActionType\",\n                    \"title\": \"value\"\n                },\n                \"channelData\": {\n                    \"description\": \"Channel-specific data associated with this action\",\n                    \"title\": \"channelData\"\n                }\n            },\n            \"required\": [\n                \"title\",\n                \"type\",\n                \"value\"\n            ]\n        },\n        \"SuggestedActions\": {\n            \"description\": \"SuggestedActions that can be performed\",\n            \"title\": \"SuggestedActions\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"to\": {\n                    \"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\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"title\": \"Id\",\n                        \"description\": \"Id of recipient.\",\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"to\"\n                },\n                \"actions\": {\n                    \"description\": \"Actions that can be shown to the user\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"actions\"\n                }\n            },\n            \"required\": [\n                \"actions\",\n                \"to\"\n            ]\n        },\n        \"Attachment\": {\n            \"description\": \"An attachment within an activity\",\n            \"title\": \"Attachment\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"contentType\": {\n                    \"description\": \"mimetype/Contenttype for the file\",\n                    \"type\": \"string\",\n                    \"title\": \"contentType\"\n                },\n                \"contentUrl\": {\n                    \"description\": \"Content Url\",\n                    \"type\": \"string\",\n                    \"title\": \"contentUrl\"\n                },\n                \"content\": {\n                    \"type\": \"object\",\n                    \"description\": \"Embedded content\",\n                    \"title\": \"content\"\n                },\n                \"name\": {\n                    \"description\": \"(OPTIONAL) The name of the attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                },\n                \"thumbnailUrl\": {\n                    \"description\": \"(OPTIONAL) Thumbnail associated with attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"thumbnailUrl\"\n                }\n            },\n            \"required\": [\n                \"contentType\"\n            ]\n        },\n        \"Entity\": {\n            \"description\": \"Metadata object pertaining to an activity\",\n            \"title\": \"Entity\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"type\": {\n                    \"description\": \"Type of this entity (RFC 3987 IRI)\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                }\n            },\n            \"required\": [\n                \"type\"\n            ]\n        },\n        \"ConversationReference\": {\n            \"description\": \"An object relating to a particular point in a conversation\",\n            \"title\": \"ConversationReference\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"activityId\": {\n                    \"description\": \"(Optional) ID of the activity to refer to\",\n                    \"type\": \"string\",\n                    \"title\": \"activityId\"\n                },\n                \"user\": {\n                    \"description\": \"(Optional) User participating in this conversation\",\n                    \"$ref\": \"#/definitions/ChannelAccount\",\n                    \"title\": \"user\"\n                },\n                \"bot\": {\n                    \"$ref\": \"#/definitions/ChannelAccount\",\n                    \"description\": \"Bot participating in this conversation\",\n                    \"title\": \"bot\"\n                },\n                \"conversation\": {\n                    \"$ref\": \"#/definitions/ConversationAccount\",\n                    \"description\": \"Conversation reference\",\n                    \"title\": \"conversation\"\n                },\n                \"channelId\": {\n                    \"description\": \"Channel ID\",\n                    \"type\": \"string\",\n                    \"title\": \"channelId\"\n                },\n                \"serviceUrl\": {\n                    \"description\": \"Service endpoint where operations concerning the referenced conversation may be performed\",\n                    \"type\": \"string\",\n                    \"title\": \"serviceUrl\"\n                }\n            },\n            \"required\": [\n                \"bot\",\n                \"channelId\",\n                \"conversation\",\n                \"serviceUrl\"\n            ]\n        },\n        \"TextHighlight\": {\n            \"description\": \"Refers to a substring of content within another field\",\n            \"title\": \"TextHighlight\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"text\": {\n                    \"description\": \"Defines the snippet of text to highlight\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"occurrence\": {\n                    \"description\": \"Occurrence of the text field within the referenced text, if multiple exist.\",\n                    \"type\": \"number\",\n                    \"title\": \"occurrence\"\n                }\n            },\n            \"required\": [\n                \"occurrence\",\n                \"text\"\n            ]\n        },\n        \"SemanticAction\": {\n            \"description\": \"Represents a reference to a programmatic action\",\n            \"title\": \"SemanticAction\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"ID of this action\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"entities\": {\n                    \"description\": \"Entities associated with this action\",\n                    \"type\": \"object\",\n                    \"additionalProperties\": {\n                        \"$ref\": \"#/definitions/Entity\"\n                    },\n                    \"title\": \"entities\"\n                }\n            },\n            \"required\": [\n                \"entities\",\n                \"id\"\n            ]\n        },\n        \"Activity\": {\n            \"description\": \"An Activity is the basic communication type for the Bot Framework 3.0 protocol.\",\n            \"title\": \"Activity\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"type\": {\n                    \"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'\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"id\": {\n                    \"description\": \"Contains an ID that uniquely identifies the activity on the channel.\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"timestamp\": {\n                    \"description\": \"Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.\",\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"title\": \"timestamp\"\n                },\n                \"localTimestamp\": {\n                    \"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.\",\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"title\": \"localTimestamp\"\n                },\n                \"localTimezone\": {\n                    \"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.\",\n                    \"type\": \"string\",\n                    \"title\": \"localTimezone\"\n                },\n                \"serviceUrl\": {\n                    \"description\": \"Contains the URL that specifies the channel's service endpoint. Set by the channel.\",\n                    \"type\": \"string\",\n                    \"title\": \"serviceUrl\"\n                },\n                \"channelId\": {\n                    \"description\": \"Contains an ID that uniquely identifies the channel. Set by the channel.\",\n                    \"type\": \"string\",\n                    \"title\": \"channelId\"\n                },\n                \"from\": {\n                    \"$ref\": \"#/definitions/ChannelAccount\",\n                    \"description\": \"Identifies the sender of the message.\",\n                    \"title\": \"from\"\n                },\n                \"conversation\": {\n                    \"$ref\": \"#/definitions/ConversationAccount\",\n                    \"description\": \"Identifies the conversation to which the activity belongs.\",\n                    \"title\": \"conversation\"\n                },\n                \"recipient\": {\n                    \"$ref\": \"#/definitions/ChannelAccount\",\n                    \"description\": \"Identifies the recipient of the message.\",\n                    \"title\": \"recipient\"\n                },\n                \"textFormat\": {\n                    \"description\": \"Format of text fields Default:markdown. Possible values include: 'markdown', 'plain', 'xml'\",\n                    \"type\": \"string\",\n                    \"title\": \"textFormat\"\n                },\n                \"attachmentLayout\": {\n                    \"description\": \"The layout hint for multiple attachments. Default: list. Possible values include: 'list',\\n'carousel'\",\n                    \"type\": \"string\",\n                    \"title\": \"attachmentLayout\"\n                },\n                \"membersAdded\": {\n                    \"description\": \"The collection of members added to the conversation.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ChannelAccount\"\n                    },\n                    \"title\": \"membersAdded\"\n                },\n                \"membersRemoved\": {\n                    \"description\": \"The collection of members removed from the conversation.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ChannelAccount\"\n                    },\n                    \"title\": \"membersRemoved\"\n                },\n                \"reactionsAdded\": {\n                    \"description\": \"The collection of reactions added to the conversation.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/MessageReaction\"\n                    },\n                    \"title\": \"reactionsAdded\"\n                },\n                \"reactionsRemoved\": {\n                    \"description\": \"The collection of reactions removed from the conversation.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/MessageReaction\"\n                    },\n                    \"title\": \"reactionsRemoved\"\n                },\n                \"topicName\": {\n                    \"description\": \"The updated topic name of the conversation.\",\n                    \"type\": \"string\",\n                    \"title\": \"topicName\"\n                },\n                \"historyDisclosed\": {\n                    \"description\": \"Indicates whether the prior history of the channel is disclosed.\",\n                    \"type\": \"boolean\",\n                    \"title\": \"historyDisclosed\"\n                },\n                \"locale\": {\n                    \"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.\",\n                    \"type\": \"string\",\n                    \"title\": \"locale\"\n                },\n                \"text\": {\n                    \"description\": \"The text content of the message.\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"speak\": {\n                    \"description\": \"The text to speak.\",\n                    \"type\": \"string\",\n                    \"title\": \"speak\"\n                },\n                \"inputHint\": {\n                    \"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'\",\n                    \"type\": \"string\",\n                    \"title\": \"inputHint\"\n                },\n                \"summary\": {\n                    \"description\": \"The text to display if the channel cannot render cards.\",\n                    \"type\": \"string\",\n                    \"title\": \"summary\"\n                },\n                \"suggestedActions\": {\n                    \"description\": \"The suggested actions for the activity.\",\n                    \"$ref\": \"#/definitions/SuggestedActions\",\n                    \"title\": \"suggestedActions\"\n                },\n                \"attachments\": {\n                    \"description\": \"Attachments\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/Attachment\"\n                    },\n                    \"title\": \"attachments\"\n                },\n                \"entities\": {\n                    \"description\": \"Represents the entities that were mentioned in the message.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/Entity\"\n                    },\n                    \"title\": \"entities\"\n                },\n                \"channelData\": {\n                    \"description\": \"Contains channel-specific content.\",\n                    \"title\": \"channelData\"\n                },\n                \"action\": {\n                    \"description\": \"Indicates whether the recipient of a contactRelationUpdate was added or removed from the\\nsender's contact list.\",\n                    \"type\": \"string\",\n                    \"title\": \"action\"\n                },\n                \"replyToId\": {\n                    \"description\": \"Contains the ID of the message to which this message is a reply.\",\n                    \"type\": \"string\",\n                    \"title\": \"replyToId\"\n                },\n                \"label\": {\n                    \"description\": \"A descriptive label for the activity.\",\n                    \"type\": \"string\",\n                    \"title\": \"label\"\n                },\n                \"valueType\": {\n                    \"description\": \"The type of the activity's value object.\",\n                    \"type\": \"string\",\n                    \"title\": \"valueType\"\n                },\n                \"value\": {\n                    \"description\": \"A value that is associated with the activity.\",\n                    \"title\": \"value\"\n                },\n                \"name\": {\n                    \"description\": \"The name of the operation associated with an invoke or event activity.\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                },\n                \"relatesTo\": {\n                    \"description\": \"A reference to another conversation or activity.\",\n                    \"$ref\": \"#/definitions/ConversationReference\",\n                    \"title\": \"relatesTo\"\n                },\n                \"code\": {\n                    \"description\": \"The a code for endOfConversation activities that indicates why the conversation ended.\\nPossible values include: 'unknown', 'completedSuccessfully', 'userCancelled', 'botTimedOut',\\n'botIssuedInvalidMessage', 'channelFailed'\",\n                    \"type\": \"string\",\n                    \"title\": \"code\"\n                },\n                \"expiration\": {\n                    \"description\": \"The time at which the activity should be considered to be \\\"expired\\\" and should not be\\npresented to the recipient.\",\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"title\": \"expiration\"\n                },\n                \"importance\": {\n                    \"description\": \"The importance of the activity. Possible values include: 'low', 'normal', 'high'\",\n                    \"type\": \"string\",\n                    \"title\": \"importance\"\n                },\n                \"deliveryMode\": {\n                    \"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'\",\n                    \"type\": \"string\",\n                    \"title\": \"deliveryMode\"\n                },\n                \"listenFor\": {\n                    \"description\": \"List of phrases and references that speech and language priming systems should listen for\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\",\n                        \"title\": \"Phrase\",\n                        \"description\": \"Phrase to listen for.\"\n                    },\n                    \"title\": \"listenFor\"\n                },\n                \"textHighlights\": {\n                    \"description\": \"The collection of text fragments to highlight when the activity contains a ReplyToId value.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/TextHighlight\"\n                    },\n                    \"title\": \"textHighlights\"\n                },\n                \"semanticAction\": {\n                    \"$ref\": \"#/definitions/SemanticAction\",\n                    \"description\": \"An optional programmatic action accompanying this request\",\n                    \"title\": \"semanticAction\"\n                }\n            },\n            \"required\": [\n                \"channelId\",\n                \"conversation\",\n                \"type\"\n            ]\n        },\n        \"ConversationParameters\": {\n            \"description\": \"Parameters for creating a new conversation\",\n            \"title\": \"ConversationParameters\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"isGroup\": {\n                    \"description\": \"IsGroup\",\n                    \"type\": \"boolean\",\n                    \"title\": \"isGroup\"\n                },\n                \"bot\": {\n                    \"$ref\": \"#/definitions/ChannelAccount\",\n                    \"description\": \"The bot address for this conversation\",\n                    \"title\": \"bot\"\n                },\n                \"members\": {\n                    \"description\": \"Members to add to the conversation\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ChannelAccount\"\n                    },\n                    \"title\": \"members\"\n                },\n                \"topicName\": {\n                    \"description\": \"(Optional) Topic of the conversation (if supported by the channel)\",\n                    \"type\": \"string\",\n                    \"title\": \"topicName\"\n                },\n                \"activity\": {\n                    \"$ref\": \"#/definitions/Activity\",\n                    \"description\": \"(Optional) When creating a new conversation, use this activity as the initial message to the\\nconversation\",\n                    \"title\": \"activity\"\n                },\n                \"channelData\": {\n                    \"description\": \"Channel specific payload for creating the conversation\",\n                    \"title\": \"channelData\"\n                }\n            },\n            \"required\": [\n                \"activity\",\n                \"bot\",\n                \"channelData\",\n                \"isGroup\"\n            ]\n        },\n        \"ConversationResourceResponse\": {\n            \"description\": \"A response containing a resource\",\n            \"title\": \"ConversationResourceResponse\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"activityId\": {\n                    \"description\": \"ID of the Activity (if sent)\",\n                    \"type\": \"string\",\n                    \"title\": \"activityId\"\n                },\n                \"serviceUrl\": {\n                    \"description\": \"Service endpoint where operations concerning the conversation may be performed\",\n                    \"type\": \"string\",\n                    \"title\": \"serviceUrl\"\n                },\n                \"id\": {\n                    \"description\": \"Id of the resource\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                }\n            },\n            \"required\": [\n                \"activityId\",\n                \"id\",\n                \"serviceUrl\"\n            ]\n        },\n        \"ConversationMembers\": {\n            \"description\": \"Conversation and its members\",\n            \"title\": \"ConversationMembers\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"Conversation ID\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"members\": {\n                    \"description\": \"List of members in this conversation\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ChannelAccount\"\n                    },\n                    \"title\": \"members\"\n                }\n            },\n            \"required\": [\n                \"id\",\n                \"members\"\n            ]\n        },\n        \"ConversationsResult\": {\n            \"description\": \"Conversations result\",\n            \"title\": \"ConversationsResult\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"continuationToken\": {\n                    \"description\": \"Paging token\",\n                    \"type\": \"string\",\n                    \"title\": \"continuationToken\"\n                },\n                \"conversations\": {\n                    \"description\": \"List of conversations\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ConversationMembers\"\n                    },\n                    \"title\": \"conversations\"\n                }\n            },\n            \"required\": [\n                \"continuationToken\",\n                \"conversations\"\n            ]\n        },\n        \"ResourceResponse\": {\n            \"description\": \"A response containing a resource ID\",\n            \"title\": \"ResourceResponse\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"Id of the resource\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                }\n            },\n            \"required\": [\n                \"id\"\n            ]\n        },\n        \"Transcript\": {\n            \"description\": \"Transcript\",\n            \"title\": \"Transcript\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"activities\": {\n                    \"description\": \"A collection of Activities that conforms to the Transcript schema.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/Activity\"\n                    },\n                    \"title\": \"activities\"\n                }\n            },\n            \"required\": [\n                \"activities\"\n            ]\n        },\n        \"PagedMembersResult\": {\n            \"description\": \"Page of members.\",\n            \"title\": \"PagedMembersResult\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"continuationToken\": {\n                    \"description\": \"Paging token\",\n                    \"type\": \"string\",\n                    \"title\": \"continuationToken\"\n                },\n                \"members\": {\n                    \"description\": \"The Channel Accounts.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ChannelAccount\"\n                    },\n                    \"title\": \"members\"\n                }\n            },\n            \"required\": [\n                \"continuationToken\",\n                \"members\"\n            ]\n        },\n        \"AttachmentData\": {\n            \"description\": \"Attachment data\",\n            \"title\": \"AttachmentData\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"type\": {\n                    \"description\": \"Content-Type of the attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"name\": {\n                    \"description\": \"Name of the attachment\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                },\n                \"originalBase64\": {\n                    \"description\": \"Attachment content\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"number\"\n                    },\n                    \"title\": \"originalBase64\"\n                },\n                \"thumbnailBase64\": {\n                    \"description\": \"Attachment thumbnail\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"number\"\n                    },\n                    \"title\": \"thumbnailBase64\"\n                }\n            },\n            \"required\": [\n                \"name\",\n                \"originalBase64\",\n                \"thumbnailBase64\",\n                \"type\"\n            ]\n        },\n        \"CardImage\": {\n            \"description\": \"An image on a card\",\n            \"title\": \"CardImage\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"url\": {\n                    \"description\": \"URL thumbnail image for major content property\",\n                    \"type\": \"string\",\n                    \"title\": \"url\"\n                },\n                \"alt\": {\n                    \"description\": \"Image description intended for screen readers\",\n                    \"type\": \"string\",\n                    \"title\": \"alt\"\n                },\n                \"tap\": {\n                    \"description\": \"Action assigned to specific Attachment\",\n                    \"$ref\": \"#/definitions/CardAction\",\n                    \"title\": \"tap\"\n                }\n            },\n            \"required\": [\n                \"url\"\n            ]\n        },\n        \"HeroCard\": {\n            \"description\": \"A Hero card (card with a single, large image)\",\n            \"title\": \"HeroCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text for the card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"images\": {\n                    \"description\": \"Array of images for the card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardImage\"\n                    },\n                    \"title\": \"images\"\n                },\n                \"buttons\": {\n                    \"description\": \"Set of actions applicable to the current card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"tap\": {\n                    \"$ref\": \"#/definitions/CardAction\",\n                    \"description\": \"This action will be activated when user taps on the card itself\",\n                    \"title\": \"tap\"\n                }\n            },\n            \"required\": [\n                \"buttons\",\n                \"images\",\n                \"subtitle\",\n                \"tap\",\n                \"text\",\n                \"title\"\n            ]\n        },\n        \"ThumbnailUrl\": {\n            \"description\": \"Thumbnail URL\",\n            \"title\": \"ThumbnailUrl\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"url\": {\n                    \"description\": \"URL pointing to the thumbnail to use for media content\",\n                    \"type\": \"string\",\n                    \"title\": \"url\"\n                },\n                \"alt\": {\n                    \"description\": \"HTML alt text to include on this thumbnail image\",\n                    \"type\": \"string\",\n                    \"title\": \"alt\"\n                }\n            },\n            \"required\": [\n                \"alt\",\n                \"url\"\n            ]\n        },\n        \"MediaUrl\": {\n            \"description\": \"Media URL\",\n            \"title\": \"MediaUrl\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"url\": {\n                    \"description\": \"Url for the media\",\n                    \"type\": \"string\",\n                    \"title\": \"url\"\n                },\n                \"profile\": {\n                    \"description\": \"Optional profile hint to the client to differentiate multiple MediaUrl objects from each other\",\n                    \"type\": \"string\",\n                    \"title\": \"profile\"\n                }\n            },\n            \"required\": [\n                \"url\"\n            ]\n        },\n        \"AnimationCard\": {\n            \"description\": \"An animation card (Ex: gif or short video clip)\",\n            \"title\": \"AnimationCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"image\": {\n                    \"$ref\": \"#/definitions/ThumbnailUrl\",\n                    \"description\": \"Thumbnail placeholder\",\n                    \"title\": \"image\"\n                },\n                \"media\": {\n                    \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an\\nalternative format of the same content.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/MediaUrl\"\n                    },\n                    \"title\": \"media\"\n                },\n                \"buttons\": {\n                    \"description\": \"Actions on this card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"shareable\": {\n                    \"description\": \"This content may be shared with others (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"shareable\"\n                },\n                \"autoloop\": {\n                    \"description\": \"Should the client loop playback at end of content (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autoloop\"\n                },\n                \"autostart\": {\n                    \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autostart\"\n                },\n                \"aspect\": {\n                    \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n                    \"type\": \"string\",\n                    \"title\": \"aspect\"\n                },\n                \"duration\": {\n                    \"description\": \"Describes the length of the media content without requiring a receiver to open the content.\\nFormatted as an ISO 8601 Duration field.\",\n                    \"type\": \"string\",\n                    \"title\": \"duration\"\n                },\n                \"value\": {\n                    \"description\": \"Supplementary parameter for this card\",\n                    \"title\": \"value\"\n                }\n            },\n            \"required\": [\n                \"aspect\",\n                \"autoloop\",\n                \"autostart\",\n                \"buttons\",\n                \"duration\",\n                \"image\",\n                \"media\",\n                \"shareable\",\n                \"subtitle\",\n                \"text\",\n                \"title\",\n                \"value\"\n            ]\n        },\n        \"AudioCard\": {\n            \"description\": \"Audio card\",\n            \"title\": \"AudioCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"image\": {\n                    \"$ref\": \"#/definitions/ThumbnailUrl\",\n                    \"description\": \"Thumbnail placeholder\",\n                    \"title\": \"image\"\n                },\n                \"media\": {\n                    \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an\\nalternative format of the same content.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/MediaUrl\"\n                    },\n                    \"title\": \"media\"\n                },\n                \"buttons\": {\n                    \"description\": \"Actions on this card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"shareable\": {\n                    \"description\": \"This content may be shared with others (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"shareable\"\n                },\n                \"autoloop\": {\n                    \"description\": \"Should the client loop playback at end of content (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autoloop\"\n                },\n                \"autostart\": {\n                    \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autostart\"\n                },\n                \"aspect\": {\n                    \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n                    \"type\": \"string\",\n                    \"title\": \"aspect\"\n                },\n                \"duration\": {\n                    \"description\": \"Describes the length of the media content without requiring a receiver to open the content.\\nFormatted as an ISO 8601 Duration field.\",\n                    \"type\": \"string\",\n                    \"title\": \"duration\"\n                },\n                \"value\": {\n                    \"description\": \"Supplementary parameter for this card\",\n                    \"title\": \"value\"\n                }\n            },\n            \"required\": [\n                \"aspect\",\n                \"autoloop\",\n                \"autostart\",\n                \"buttons\",\n                \"duration\",\n                \"image\",\n                \"media\",\n                \"shareable\",\n                \"subtitle\",\n                \"text\",\n                \"title\",\n                \"value\"\n            ]\n        },\n        \"BasicCard\": {\n            \"description\": \"A basic card\",\n            \"title\": \"BasicCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text for the card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"images\": {\n                    \"description\": \"Array of images for the card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardImage\"\n                    },\n                    \"title\": \"images\"\n                },\n                \"buttons\": {\n                    \"description\": \"Set of actions applicable to the current card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"tap\": {\n                    \"$ref\": \"#/definitions/CardAction\",\n                    \"description\": \"This action will be activated when user taps on the card itself\",\n                    \"title\": \"tap\"\n                }\n            },\n            \"required\": [\n                \"buttons\",\n                \"images\",\n                \"subtitle\",\n                \"tap\",\n                \"text\",\n                \"title\"\n            ]\n        },\n        \"MediaCard\": {\n            \"description\": \"Media card\",\n            \"title\": \"MediaCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"image\": {\n                    \"$ref\": \"#/definitions/ThumbnailUrl\",\n                    \"description\": \"Thumbnail placeholder\",\n                    \"title\": \"image\"\n                },\n                \"media\": {\n                    \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an\\nalternative format of the same content.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/MediaUrl\"\n                    },\n                    \"title\": \"media\"\n                },\n                \"buttons\": {\n                    \"description\": \"Actions on this card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"shareable\": {\n                    \"description\": \"This content may be shared with others (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"shareable\"\n                },\n                \"autoloop\": {\n                    \"description\": \"Should the client loop playback at end of content (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autoloop\"\n                },\n                \"autostart\": {\n                    \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autostart\"\n                },\n                \"aspect\": {\n                    \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n                    \"type\": \"string\",\n                    \"title\": \"aspect\"\n                },\n                \"duration\": {\n                    \"description\": \"Describes the length of the media content without requiring a receiver to open the content.\\nFormatted as an ISO 8601 Duration field.\",\n                    \"type\": \"string\",\n                    \"title\": \"duration\"\n                },\n                \"value\": {\n                    \"description\": \"Supplementary parameter for this card\",\n                    \"title\": \"value\"\n                }\n            },\n            \"required\": [\n                \"aspect\",\n                \"autoloop\",\n                \"autostart\",\n                \"buttons\",\n                \"duration\",\n                \"image\",\n                \"media\",\n                \"shareable\",\n                \"subtitle\",\n                \"text\",\n                \"title\",\n                \"value\"\n            ]\n        },\n        \"Fact\": {\n            \"description\": \"Set of key-value pairs. Advantage of this section is that key and value properties will be\\nrendered with default style information with some delimiter between them. So there is no need\\nfor developer to specify style information.\",\n            \"title\": \"Fact\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"key\": {\n                    \"description\": \"The key for this Fact\",\n                    \"type\": \"string\",\n                    \"title\": \"key\"\n                },\n                \"value\": {\n                    \"description\": \"The value for this Fact\",\n                    \"type\": \"string\",\n                    \"title\": \"value\"\n                }\n            },\n            \"required\": [\n                \"key\",\n                \"value\"\n            ]\n        },\n        \"ReceiptItem\": {\n            \"description\": \"An item on a receipt card\",\n            \"title\": \"ReceiptItem\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of the Card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle appears just below Title field, differs from Title in font styling only\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text field appears just below subtitle, differs from Subtitle in font styling only\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"image\": {\n                    \"$ref\": \"#/definitions/CardImage\",\n                    \"description\": \"Image\",\n                    \"title\": \"image\"\n                },\n                \"price\": {\n                    \"description\": \"Amount with currency\",\n                    \"type\": \"string\",\n                    \"title\": \"price\"\n                },\n                \"quantity\": {\n                    \"description\": \"Number of items of given kind\",\n                    \"type\": \"string\",\n                    \"title\": \"quantity\"\n                },\n                \"tap\": {\n                    \"$ref\": \"#/definitions/CardAction\",\n                    \"description\": \"This action will be activated when user taps on the Item bubble.\",\n                    \"title\": \"tap\"\n                }\n            },\n            \"required\": [\n                \"image\",\n                \"price\",\n                \"quantity\",\n                \"subtitle\",\n                \"tap\",\n                \"text\",\n                \"title\"\n            ]\n        },\n        \"ReceiptCard\": {\n            \"description\": \"A receipt card\",\n            \"title\": \"ReceiptCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"facts\": {\n                    \"description\": \"Array of Fact objects\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/Fact\"\n                    },\n                    \"title\": \"facts\"\n                },\n                \"items\": {\n                    \"description\": \"Array of Receipt Items\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/ReceiptItem\"\n                    },\n                    \"title\": \"items\"\n                },\n                \"tap\": {\n                    \"$ref\": \"#/definitions/CardAction\",\n                    \"description\": \"This action will be activated when user taps on the card\",\n                    \"title\": \"tap\"\n                },\n                \"total\": {\n                    \"description\": \"Total amount of money paid (or to be paid)\",\n                    \"type\": \"string\",\n                    \"title\": \"total\"\n                },\n                \"tax\": {\n                    \"description\": \"Total amount of tax paid (or to be paid)\",\n                    \"type\": \"string\",\n                    \"title\": \"tax\"\n                },\n                \"vat\": {\n                    \"description\": \"Total amount of VAT paid (or to be paid)\",\n                    \"type\": \"string\",\n                    \"title\": \"vat\"\n                },\n                \"buttons\": {\n                    \"description\": \"Set of actions applicable to the current card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                }\n            },\n            \"required\": [\n                \"buttons\",\n                \"facts\",\n                \"items\",\n                \"tap\",\n                \"tax\",\n                \"title\",\n                \"total\",\n                \"vat\"\n            ]\n        },\n        \"SigninCard\": {\n            \"description\": \"A card representing a request to sign in\",\n            \"title\": \"SigninCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"text\": {\n                    \"description\": \"Text for signin request\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"buttons\": {\n                    \"description\": \"Action to use to perform signin\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                }\n            },\n            \"required\": [\n                \"buttons\"\n            ]\n        },\n        \"OAuthCard\": {\n            \"description\": \"A card representing a request to perform a sign in via OAuth\",\n            \"title\": \"OAuthCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"text\": {\n                    \"description\": \"Text for signin request\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"connectionName\": {\n                    \"description\": \"The name of the registered connection\",\n                    \"type\": \"string\",\n                    \"title\": \"connectionName\"\n                },\n                \"buttons\": {\n                    \"description\": \"Action to use to perform signin\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                }\n            },\n            \"required\": [\n                \"buttons\",\n                \"connectionName\",\n                \"text\"\n            ]\n        },\n        \"ThumbnailCard\": {\n            \"description\": \"A thumbnail card (card with a single, small thumbnail image)\",\n            \"title\": \"ThumbnailCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of the card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text for the card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"images\": {\n                    \"description\": \"Array of images for the card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardImage\"\n                    },\n                    \"title\": \"images\"\n                },\n                \"buttons\": {\n                    \"description\": \"Set of actions applicable to the current card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"tap\": {\n                    \"$ref\": \"#/definitions/CardAction\",\n                    \"description\": \"This action will be activated when user taps on the card itself\",\n                    \"title\": \"tap\"\n                }\n            },\n            \"required\": [\n                \"buttons\",\n                \"images\",\n                \"subtitle\",\n                \"tap\",\n                \"text\",\n                \"title\"\n            ]\n        },\n        \"VideoCard\": {\n            \"description\": \"Video card\",\n            \"title\": \"VideoCard\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"title\": {\n                    \"description\": \"Title of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"title\"\n                },\n                \"subtitle\": {\n                    \"description\": \"Subtitle of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"subtitle\"\n                },\n                \"text\": {\n                    \"description\": \"Text of this card\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"image\": {\n                    \"$ref\": \"#/definitions/ThumbnailUrl\",\n                    \"description\": \"Thumbnail placeholder\",\n                    \"title\": \"image\"\n                },\n                \"media\": {\n                    \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an\\nalternative format of the same content.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/MediaUrl\"\n                    },\n                    \"title\": \"media\"\n                },\n                \"buttons\": {\n                    \"description\": \"Actions on this card\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/CardAction\"\n                    },\n                    \"title\": \"buttons\"\n                },\n                \"shareable\": {\n                    \"description\": \"This content may be shared with others (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"shareable\"\n                },\n                \"autoloop\": {\n                    \"description\": \"Should the client loop playback at end of content (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autoloop\"\n                },\n                \"autostart\": {\n                    \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n                    \"type\": \"boolean\",\n                    \"title\": \"autostart\"\n                },\n                \"aspect\": {\n                    \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n                    \"type\": \"string\",\n                    \"title\": \"aspect\"\n                },\n                \"duration\": {\n                    \"description\": \"Describes the length of the media content without requiring a receiver to open the content.\\nFormatted as an ISO 8601 Duration field.\",\n                    \"type\": \"string\",\n                    \"title\": \"duration\"\n                },\n                \"value\": {\n                    \"description\": \"Supplementary parameter for this card\",\n                    \"title\": \"value\"\n                }\n            },\n            \"required\": [\n                \"aspect\",\n                \"autoloop\",\n                \"autostart\",\n                \"buttons\",\n                \"duration\",\n                \"image\",\n                \"media\",\n                \"shareable\",\n                \"subtitle\",\n                \"text\",\n                \"title\",\n                \"value\"\n            ]\n        },\n        \"GeoCoordinates\": {\n            \"description\": \"GeoCoordinates (entity type: \\\"https://schema.org/GeoCoordinates\\\")\",\n            \"title\": \"GeoCoordinates\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"elevation\": {\n                    \"description\": \"Elevation of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n                    \"type\": \"number\",\n                    \"title\": \"elevation\"\n                },\n                \"latitude\": {\n                    \"description\": \"Latitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n                    \"type\": \"number\",\n                    \"title\": \"latitude\"\n                },\n                \"longitude\": {\n                    \"description\": \"Longitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n                    \"type\": \"number\",\n                    \"title\": \"longitude\"\n                },\n                \"type\": {\n                    \"description\": \"The type of the thing\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"name\": {\n                    \"description\": \"The name of the thing\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                }\n            },\n            \"required\": [\n                \"elevation\",\n                \"latitude\",\n                \"longitude\",\n                \"name\",\n                \"type\"\n            ]\n        },\n        \"Mention\": {\n            \"description\": \"Mention information (entity type: \\\"mention\\\")\",\n            \"title\": \"Mention\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"mentioned\": {\n                    \"$ref\": \"#/definitions/ChannelAccount\",\n                    \"description\": \"The mentioned user\",\n                    \"title\": \"mentioned\"\n                },\n                \"text\": {\n                    \"description\": \"Sub Text which represents the mention (can be null or empty)\",\n                    \"type\": \"string\",\n                    \"title\": \"text\"\n                },\n                \"type\": {\n                    \"description\": \"Type of this entity (RFC 3987 IRI)\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                }\n            },\n            \"required\": [\n                \"mentioned\",\n                \"text\",\n                \"type\"\n            ]\n        },\n        \"Place\": {\n            \"description\": \"Place (entity type: \\\"https://schema.org/Place\\\")\",\n            \"title\": \"Place\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"address\": {\n                    \"description\": \"Address of the place (may be `string` or complex object of type `PostalAddress`)\",\n                    \"title\": \"address\"\n                },\n                \"geo\": {\n                    \"description\": \"Geo coordinates of the place (may be complex object of type `GeoCoordinates` or `GeoShape`)\",\n                    \"title\": \"geo\"\n                },\n                \"hasMap\": {\n                    \"description\": \"Map to the place (may be `string` (URL) or complex object of type `Map`)\",\n                    \"title\": \"hasMap\"\n                },\n                \"type\": {\n                    \"description\": \"The type of the thing\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"name\": {\n                    \"description\": \"The name of the thing\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                }\n            },\n            \"required\": [\n                \"address\",\n                \"geo\",\n                \"hasMap\",\n                \"name\",\n                \"type\"\n            ]\n        },\n        \"Thing\": {\n            \"description\": \"Thing (entity type: \\\"https://schema.org/Thing\\\")\",\n            \"title\": \"Thing\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"type\": {\n                    \"description\": \"The type of the thing\",\n                    \"type\": \"string\",\n                    \"title\": \"type\"\n                },\n                \"name\": {\n                    \"description\": \"The name of the thing\",\n                    \"type\": \"string\",\n                    \"title\": \"name\"\n                }\n            },\n            \"required\": [\n                \"name\",\n                \"type\"\n            ]\n        },\n        \"MediaEventValue\": {\n            \"description\": \"Supplementary parameter for media events\",\n            \"title\": \"MediaEventValue\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"cardValue\": {\n                    \"description\": \"Callback parameter specified in the Value field of the MediaCard that originated this event\",\n                    \"title\": \"cardValue\"\n                }\n            },\n            \"required\": [\n                \"cardValue\"\n            ]\n        },\n        \"TokenRequest\": {\n            \"description\": \"A request to receive a user token\",\n            \"title\": \"TokenRequest\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"provider\": {\n                    \"description\": \"The provider to request a user token from\",\n                    \"type\": \"string\",\n                    \"title\": \"provider\"\n                },\n                \"settings\": {\n                    \"description\": \"A collection of settings for the specific provider for this request\",\n                    \"type\": \"object\",\n                    \"additionalProperties\": {},\n                    \"title\": \"settings\"\n                }\n            },\n            \"required\": [\n                \"provider\",\n                \"settings\"\n            ]\n        },\n        \"TokenResponse\": {\n            \"description\": \"A response that includes a user token\",\n            \"title\": \"TokenResponse\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"connectionName\": {\n                    \"description\": \"The connection name\",\n                    \"type\": \"string\",\n                    \"title\": \"connectionName\"\n                },\n                \"token\": {\n                    \"description\": \"The user token\",\n                    \"type\": \"string\",\n                    \"title\": \"token\"\n                },\n                \"expiration\": {\n                    \"description\": \"Expiration for the token, in ISO 8601 format (e.g. \\\"2007-04-05T14:30Z\\\")\",\n                    \"type\": \"string\",\n                    \"title\": \"expiration\"\n                }\n            },\n            \"required\": [\n                \"connectionName\",\n                \"expiration\",\n                \"token\"\n            ]\n        },\n        \"MicrosoftPayMethodData\": {\n            \"description\": \"W3C Payment Method Data for Microsoft Pay\",\n            \"title\": \"MicrosoftPayMethodData\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"merchantId\": {\n                    \"description\": \"Microsoft Pay Merchant ID\",\n                    \"type\": \"string\",\n                    \"title\": \"merchantId\"\n                },\n                \"supportedNetworks\": {\n                    \"description\": \"Supported payment networks (e.g., \\\"visa\\\" and \\\"mastercard\\\")\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"supportedNetworks\"\n                },\n                \"supportedTypes\": {\n                    \"description\": \"Supported payment types (e.g., \\\"credit\\\")\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"supportedTypes\"\n                }\n            },\n            \"required\": [\n                \"merchantId\",\n                \"supportedNetworks\",\n                \"supportedTypes\"\n            ]\n        },\n        \"PaymentAddress\": {\n            \"description\": \"Address within a Payment Request\",\n            \"title\": \"PaymentAddress\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"country\": {\n                    \"description\": \"This is the CLDR (Common Locale Data Repository) region code. For example, US, GB, CN, or JP\",\n                    \"type\": \"string\",\n                    \"title\": \"country\"\n                },\n                \"addressLine\": {\n                    \"description\": \"This is the most specific part of the address. It can include, for example, a street name, a\\nhouse number, apartment number, a rural delivery route, descriptive instructions, or a post\\noffice box number.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"addressLine\"\n                },\n                \"region\": {\n                    \"description\": \"This is the top level administrative subdivision of the country. For example, this can be a\\nstate, a province, an oblast, or a prefecture.\",\n                    \"type\": \"string\",\n                    \"title\": \"region\"\n                },\n                \"city\": {\n                    \"description\": \"This is the city/town portion of the address.\",\n                    \"type\": \"string\",\n                    \"title\": \"city\"\n                },\n                \"dependentLocality\": {\n                    \"description\": \"This is the dependent locality or sublocality within a city. For example, used for\\nneighborhoods, boroughs, districts, or UK dependent localities.\",\n                    \"type\": \"string\",\n                    \"title\": \"dependentLocality\"\n                },\n                \"postalCode\": {\n                    \"description\": \"This is the postal code or ZIP code, also known as PIN code in India.\",\n                    \"type\": \"string\",\n                    \"title\": \"postalCode\"\n                },\n                \"sortingCode\": {\n                    \"description\": \"This is the sorting code as used in, for example, France.\",\n                    \"type\": \"string\",\n                    \"title\": \"sortingCode\"\n                },\n                \"languageCode\": {\n                    \"description\": \"This is the BCP-47 language code for the address. It's used to determine the field separators\\nand the order of fields when formatting the address for display.\",\n                    \"type\": \"string\",\n                    \"title\": \"languageCode\"\n                },\n                \"organization\": {\n                    \"description\": \"This is the organization, firm, company, or institution at this address.\",\n                    \"type\": \"string\",\n                    \"title\": \"organization\"\n                },\n                \"recipient\": {\n                    \"description\": \"This is the name of the recipient or contact person.\",\n                    \"type\": \"string\",\n                    \"title\": \"recipient\"\n                },\n                \"phone\": {\n                    \"description\": \"This is the phone number of the recipient or contact person.\",\n                    \"type\": \"string\",\n                    \"title\": \"phone\"\n                }\n            },\n            \"required\": [\n                \"addressLine\",\n                \"city\",\n                \"country\",\n                \"dependentLocality\",\n                \"languageCode\",\n                \"organization\",\n                \"phone\",\n                \"postalCode\",\n                \"recipient\",\n                \"region\",\n                \"sortingCode\"\n            ]\n        },\n        \"PaymentCurrencyAmount\": {\n            \"description\": \"Supplies monetary amounts\",\n            \"title\": \"PaymentCurrencyAmount\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"currency\": {\n                    \"description\": \"A currency identifier\",\n                    \"type\": \"string\",\n                    \"title\": \"currency\"\n                },\n                \"value\": {\n                    \"description\": \"Decimal monetary value\",\n                    \"type\": \"string\",\n                    \"title\": \"value\"\n                },\n                \"currencySystem\": {\n                    \"description\": \"Currency system\",\n                    \"type\": \"string\",\n                    \"title\": \"currencySystem\"\n                }\n            },\n            \"required\": [\n                \"currency\",\n                \"currencySystem\",\n                \"value\"\n            ]\n        },\n        \"PaymentItem\": {\n            \"description\": \"Indicates what the payment request is for and the value asked for\",\n            \"title\": \"PaymentItem\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"label\": {\n                    \"description\": \"Human-readable description of the item\",\n                    \"type\": \"string\",\n                    \"title\": \"label\"\n                },\n                \"amount\": {\n                    \"$ref\": \"#/definitions/PaymentCurrencyAmount\",\n                    \"description\": \"Monetary amount for the item\",\n                    \"title\": \"amount\"\n                },\n                \"pending\": {\n                    \"description\": \"When set to true this flag means that the amount field is not final.\",\n                    \"type\": \"boolean\",\n                    \"title\": \"pending\"\n                }\n            },\n            \"required\": [\n                \"amount\",\n                \"label\",\n                \"pending\"\n            ]\n        },\n        \"PaymentShippingOption\": {\n            \"description\": \"Describes a shipping option\",\n            \"title\": \"PaymentShippingOption\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"String identifier used to reference this PaymentShippingOption\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"label\": {\n                    \"description\": \"Human-readable description of the item\",\n                    \"type\": \"string\",\n                    \"title\": \"label\"\n                },\n                \"amount\": {\n                    \"$ref\": \"#/definitions/PaymentCurrencyAmount\",\n                    \"description\": \"Contains the monetary amount for the item\",\n                    \"title\": \"amount\"\n                },\n                \"selected\": {\n                    \"description\": \"Indicates whether this is the default selected PaymentShippingOption\",\n                    \"type\": \"boolean\",\n                    \"title\": \"selected\"\n                }\n            },\n            \"required\": [\n                \"amount\",\n                \"id\",\n                \"label\",\n                \"selected\"\n            ]\n        },\n        \"PaymentDetailsModifier\": {\n            \"description\": \"Provides details that modify the PaymentDetails based on payment method identifier\",\n            \"title\": \"PaymentDetailsModifier\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"supportedMethods\": {\n                    \"description\": \"Contains a sequence of payment method identifiers\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"supportedMethods\"\n                },\n                \"total\": {\n                    \"$ref\": \"#/definitions/PaymentItem\",\n                    \"description\": \"This value overrides the total field in the PaymentDetails dictionary for the payment method\\nidentifiers in the supportedMethods field\",\n                    \"title\": \"total\"\n                },\n                \"additionalDisplayItems\": {\n                    \"description\": \"Provides additional display items that are appended to the displayItems field in the\\nPaymentDetails dictionary for the payment method identifiers in the supportedMethods field\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/PaymentItem\"\n                    },\n                    \"title\": \"additionalDisplayItems\"\n                },\n                \"data\": {\n                    \"description\": \"A JSON-serializable object that provides optional information that might be needed by the\\nsupported payment methods\",\n                    \"title\": \"data\"\n                }\n            },\n            \"required\": [\n                \"additionalDisplayItems\",\n                \"data\",\n                \"supportedMethods\",\n                \"total\"\n            ]\n        },\n        \"PaymentDetails\": {\n            \"description\": \"Provides information about the requested transaction\",\n            \"title\": \"PaymentDetails\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"total\": {\n                    \"$ref\": \"#/definitions/PaymentItem\",\n                    \"description\": \"Contains the total amount of the payment request\",\n                    \"title\": \"total\"\n                },\n                \"displayItems\": {\n                    \"description\": \"Contains line items for the payment request that the user agent may display\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/PaymentItem\"\n                    },\n                    \"title\": \"displayItems\"\n                },\n                \"shippingOptions\": {\n                    \"description\": \"A sequence containing the different shipping options for the user to choose from\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/PaymentShippingOption\"\n                    },\n                    \"title\": \"shippingOptions\"\n                },\n                \"modifiers\": {\n                    \"description\": \"Contains modifiers for particular payment method identifiers\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/PaymentDetailsModifier\"\n                    },\n                    \"title\": \"modifiers\"\n                },\n                \"error\": {\n                    \"description\": \"Error description\",\n                    \"type\": \"string\",\n                    \"title\": \"error\"\n                }\n            },\n            \"required\": [\n                \"displayItems\",\n                \"error\",\n                \"modifiers\",\n                \"shippingOptions\",\n                \"total\"\n            ]\n        },\n        \"PaymentMethodData\": {\n            \"description\": \"Indicates a set of supported payment methods and any associated payment method specific data for\\nthose methods\",\n            \"title\": \"PaymentMethodData\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"supportedMethods\": {\n                    \"description\": \"Required sequence of strings containing payment method identifiers for payment methods that\\nthe merchant web site accepts\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"supportedMethods\"\n                },\n                \"data\": {\n                    \"description\": \"A JSON-serializable object that provides optional information that might be needed by the\\nsupported payment methods\",\n                    \"title\": \"data\"\n                }\n            },\n            \"required\": [\n                \"data\",\n                \"supportedMethods\"\n            ]\n        },\n        \"PaymentOptions\": {\n            \"description\": \"Provides information about the options desired for the payment request\",\n            \"title\": \"PaymentOptions\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"requestPayerName\": {\n                    \"description\": \"Indicates whether the user agent should collect and return the payer's name as part of the\\npayment request\",\n                    \"type\": \"boolean\",\n                    \"title\": \"requestPayerName\"\n                },\n                \"requestPayerEmail\": {\n                    \"description\": \"Indicates whether the user agent should collect and return the payer's email address as part\\nof the payment request\",\n                    \"type\": \"boolean\",\n                    \"title\": \"requestPayerEmail\"\n                },\n                \"requestPayerPhone\": {\n                    \"description\": \"Indicates whether the user agent should collect and return the payer's phone number as part of\\nthe payment request\",\n                    \"type\": \"boolean\",\n                    \"title\": \"requestPayerPhone\"\n                },\n                \"requestShipping\": {\n                    \"description\": \"Indicates whether the user agent should collect and return a shipping address as part of the\\npayment request\",\n                    \"type\": \"boolean\",\n                    \"title\": \"requestShipping\"\n                },\n                \"shippingType\": {\n                    \"description\": \"If requestShipping is set to true, then the shippingType field may be used to influence the\\nway the user agent presents the user interface for gathering the shipping address\",\n                    \"type\": \"string\",\n                    \"title\": \"shippingType\"\n                }\n            },\n            \"required\": [\n                \"requestPayerEmail\",\n                \"requestPayerName\",\n                \"requestPayerPhone\",\n                \"requestShipping\",\n                \"shippingType\"\n            ]\n        },\n        \"PaymentRequest\": {\n            \"description\": \"A request to make a payment\",\n            \"title\": \"PaymentRequest\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"ID of this payment request\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"methodData\": {\n                    \"description\": \"Allowed payment methods for this request\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/PaymentMethodData\"\n                    },\n                    \"title\": \"methodData\"\n                },\n                \"details\": {\n                    \"$ref\": \"#/definitions/PaymentDetails\",\n                    \"description\": \"Details for this request\",\n                    \"title\": \"details\"\n                },\n                \"options\": {\n                    \"$ref\": \"#/definitions/PaymentOptions\",\n                    \"description\": \"Provides information about the options desired for the payment request\",\n                    \"title\": \"options\"\n                },\n                \"expires\": {\n                    \"description\": \"Expiration for this request, in ISO 8601 duration format (e.g., 'P1D')\",\n                    \"type\": \"string\",\n                    \"title\": \"expires\"\n                }\n            },\n            \"required\": [\n                \"details\",\n                \"expires\",\n                \"id\",\n                \"methodData\",\n                \"options\"\n            ]\n        },\n        \"PaymentResponse\": {\n            \"description\": \"A PaymentResponse is returned when a user has selected a payment method and approved a payment\\nrequest\",\n            \"title\": \"PaymentResponse\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"methodName\": {\n                    \"description\": \"The payment method identifier for the payment method that the user selected to fulfil the\\ntransaction\",\n                    \"type\": \"string\",\n                    \"title\": \"methodName\"\n                },\n                \"details\": {\n                    \"description\": \"A JSON-serializable object that provides a payment method specific message used by the\\nmerchant to process the transaction and determine successful fund transfer\",\n                    \"title\": \"details\"\n                },\n                \"shippingAddress\": {\n                    \"$ref\": \"#/definitions/PaymentAddress\",\n                    \"description\": \"If the requestShipping flag was set to true in the PaymentOptions passed to the PaymentRequest\\nconstructor, then shippingAddress will be the full and final shipping address chosen by the\\nuser\",\n                    \"title\": \"shippingAddress\"\n                },\n                \"shippingOption\": {\n                    \"description\": \"If the requestShipping flag was set to true in the PaymentOptions passed to the PaymentRequest\\nconstructor, then shippingOption will be the id attribute of the selected shipping option\",\n                    \"type\": \"string\",\n                    \"title\": \"shippingOption\"\n                },\n                \"payerEmail\": {\n                    \"description\": \"If the requestPayerEmail flag was set to true in the PaymentOptions passed to the\\nPaymentRequest constructor, then payerEmail will be the email address chosen by the user\",\n                    \"type\": \"string\",\n                    \"title\": \"payerEmail\"\n                },\n                \"payerPhone\": {\n                    \"description\": \"If the requestPayerPhone flag was set to true in the PaymentOptions passed to the\\nPaymentRequest constructor, then payerPhone will be the phone number chosen by the user\",\n                    \"type\": \"string\",\n                    \"title\": \"payerPhone\"\n                }\n            },\n            \"required\": [\n                \"details\",\n                \"methodName\",\n                \"payerEmail\",\n                \"payerPhone\",\n                \"shippingAddress\",\n                \"shippingOption\"\n            ]\n        },\n        \"PaymentRequestComplete\": {\n            \"description\": \"Payload delivered when completing a payment request\",\n            \"title\": \"PaymentRequestComplete\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"Payment request ID\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"paymentRequest\": {\n                    \"$ref\": \"#/definitions/PaymentRequest\",\n                    \"description\": \"Initial payment request\",\n                    \"title\": \"paymentRequest\"\n                },\n                \"paymentResponse\": {\n                    \"$ref\": \"#/definitions/PaymentResponse\",\n                    \"description\": \"Corresponding payment response\",\n                    \"title\": \"paymentResponse\"\n                }\n            },\n            \"required\": [\n                \"id\",\n                \"paymentRequest\",\n                \"paymentResponse\"\n            ]\n        },\n        \"PaymentRequestCompleteResult\": {\n            \"description\": \"Result from a completed payment request\",\n            \"title\": \"PaymentRequestCompleteResult\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"result\": {\n                    \"description\": \"Result of the payment request completion\",\n                    \"type\": \"string\",\n                    \"title\": \"result\"\n                }\n            },\n            \"required\": [\n                \"result\"\n            ]\n        },\n        \"PaymentRequestUpdate\": {\n            \"description\": \"An update to a payment request\",\n            \"title\": \"PaymentRequestUpdate\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"id\": {\n                    \"description\": \"ID for the payment request to update\",\n                    \"type\": \"string\",\n                    \"title\": \"id\"\n                },\n                \"details\": {\n                    \"$ref\": \"#/definitions/PaymentDetails\",\n                    \"description\": \"Update payment details\",\n                    \"title\": \"details\"\n                },\n                \"shippingAddress\": {\n                    \"$ref\": \"#/definitions/PaymentAddress\",\n                    \"description\": \"Updated shipping address\",\n                    \"title\": \"shippingAddress\"\n                },\n                \"shippingOption\": {\n                    \"description\": \"Updated shipping options\",\n                    \"type\": \"string\",\n                    \"title\": \"shippingOption\"\n                }\n            },\n            \"required\": [\n                \"details\",\n                \"id\",\n                \"shippingAddress\",\n                \"shippingOption\"\n            ]\n        },\n        \"PaymentRequestUpdateResult\": {\n            \"description\": \"A result object from a Payment Request Update invoke operation\",\n            \"title\": \"PaymentRequestUpdateResult\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"details\": {\n                    \"$ref\": \"#/definitions/PaymentDetails\",\n                    \"description\": \"Update payment details\",\n                    \"title\": \"details\"\n                }\n            },\n            \"required\": [\n                \"details\"\n            ]\n        },\n        \"RoleTypes\": {\n            \"description\": \"Defines values for RoleTypes.\\nPossible values include: 'user', 'bot'\",\n            \"enum\": [\n                \"bot\",\n                \"user\"\n            ],\n            \"type\": \"string\"\n        },\n        \"ActivityTypes\": {\n            \"description\": \"Defines values for ActivityTypes.\\nPossible values include: 'message', 'contactRelationUpdate', 'conversationUpdate', 'typing',\\n'endOfConversation', 'event', 'invoke', 'deleteUserData', 'messageUpdate', 'messageDelete',\\n'installationUpdate', 'messageReaction', 'suggestion', 'trace', 'handoff'\",\n            \"enum\": [\n                \"contactRelationUpdate\",\n                \"conversationUpdate\",\n                \"deleteUserData\",\n                \"endOfConversation\",\n                \"event\",\n                \"handoff\",\n                \"installationUpdate\",\n                \"invoke\",\n                \"message\",\n                \"messageDelete\",\n                \"messageReaction\",\n                \"messageUpdate\",\n                \"suggestion\",\n                \"trace\",\n                \"typing\"\n            ],\n            \"type\": \"string\"\n        },\n        \"TextFormatTypes\": {\n            \"description\": \"Defines values for TextFormatTypes.\\nPossible values include: 'markdown', 'plain', 'xml'\",\n            \"enum\": [\n                \"markdown\",\n                \"plain\",\n                \"xml\"\n            ],\n            \"type\": \"string\"\n        },\n        \"AttachmentLayoutTypes\": {\n            \"description\": \"Defines values for AttachmentLayoutTypes.\\nPossible values include: 'list', 'carousel'\",\n            \"enum\": [\n                \"carousel\",\n                \"list\"\n            ],\n            \"type\": \"string\"\n        },\n        \"MessageReactionTypes\": {\n            \"description\": \"Defines values for MessageReactionTypes.\\nPossible values include: 'like', 'plusOne'\",\n            \"enum\": [\n                \"like\",\n                \"plusOne\"\n            ],\n            \"type\": \"string\"\n        },\n        \"InputHints\": {\n            \"description\": \"Defines values for InputHints.\\nPossible values include: 'acceptingInput', 'ignoringInput', 'expectingInput'\",\n            \"enum\": [\n                \"acceptingInput\",\n                \"expectingInput\",\n                \"ignoringInput\"\n            ],\n            \"type\": \"string\"\n        },\n        \"ActionTypes\": {\n            \"description\": \"Defines values for ActionTypes.\\nPossible values include: 'openUrl', 'imBack', 'postBack', 'playAudio', 'playVideo', 'showImage',\\n'downloadFile', 'signin', 'call', 'payment', 'messageBack'\",\n            \"enum\": [\n                \"call\",\n                \"downloadFile\",\n                \"imBack\",\n                \"messageBack\",\n                \"openUrl\",\n                \"payment\",\n                \"playAudio\",\n                \"playVideo\",\n                \"postBack\",\n                \"showImage\",\n                \"signin\"\n            ],\n            \"type\": \"string\"\n        },\n        \"EndOfConversationCodes\": {\n            \"description\": \"Defines values for EndOfConversationCodes.\\nPossible values include: 'unknown', 'completedSuccessfully', 'userCancelled', 'botTimedOut',\\n'botIssuedInvalidMessage', 'channelFailed'\",\n            \"enum\": [\n                \"botIssuedInvalidMessage\",\n                \"botTimedOut\",\n                \"channelFailed\",\n                \"completedSuccessfully\",\n                \"unknown\",\n                \"userCancelled\"\n            ],\n            \"type\": \"string\"\n        },\n        \"ActivityImportance\": {\n            \"description\": \"Defines values for ActivityImportance.\\nPossible values include: 'low', 'normal', 'high'\",\n            \"enum\": [\n                \"high\",\n                \"low\",\n                \"normal\"\n            ],\n            \"type\": \"string\"\n        },\n        \"DeliveryModes\": {\n            \"description\": \"Defines values for DeliveryModes.\\nPossible values include: 'normal', 'notification'\",\n            \"enum\": [\n                \"normal\",\n                \"notification\"\n            ],\n            \"type\": \"string\"\n        },\n        \"ContactRelationUpdateActionTypes\": {\n            \"description\": \"Defines values for ContactRelationUpdateActionTypes.\\nPossible values include: 'add', 'remove'\",\n            \"enum\": [\n                \"add\",\n                \"remove\"\n            ],\n            \"type\": \"string\"\n        },\n        \"InstallationUpdateActionTypes\": {\n            \"description\": \"Defines values for InstallationUpdateActionTypes.\\nPossible values include: 'add', 'remove'\",\n            \"enum\": [\n                \"add\",\n                \"remove\"\n            ],\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/readme.md",
    "content": "# JSON Schema\n\nThis folder contains Json Schemas and samples for the bot framework SDK.\n"
  },
  {
    "path": "schemas/skills/SchemaManifestTests/SchemaManifestTests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.10.0\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Threading\" Version=\"16.10.56\" />\n    <PackageReference Include=\"Newtonsoft.Json.Schema\" Version=\"3.0.14\" />\n    <PackageReference Include=\"NJsonSchema\" Version=\"10.4.4\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.1\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.3\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"coverlet.collector\" Version=\"3.0.3\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "schemas/skills/SchemaManifestTests/SchemaManifestTests.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.31409.214\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SchemaManifestTests\", \"SchemaManifestTests.csproj\", \"{53609E6C-0C2C-4DB2-864C-628BE29495E4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{53609E6C-0C2C-4DB2-864C-628BE29495E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{53609E6C-0C2C-4DB2-864C-628BE29495E4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{53609E6C-0C2C-4DB2-864C-628BE29495E4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{53609E6C-0C2C-4DB2-864C-628BE29495E4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {DB082524-0CE2-4C94-BA0E-A9FFDBE8EE42}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "schemas/skills/SchemaManifestTests/ValidateSchemaTests.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Threading.Tasks;\nusing Newtonsoft.Json.Linq;\nusing Newtonsoft.Json.Schema;\nusing NJsonSchema;\nusing NJsonSchema.Generation;\nusing Xunit;\nusing JsonSchema = NJsonSchema.JsonSchema;\nusing JsonSchemaResolver = NJsonSchema.Generation.JsonSchemaResolver;\n\nnamespace SchemaManifestTests\n{\n    /// <summary>\n    /// Validates sample manifests against schemas.\n    /// </summary>\n    /// <remarks>\n    /// There are some differences on the validation provided by Newtonsoft and NJsonSchema so we use both libraries in the tests\n    /// to ensure better compatibility.\n    /// </remarks>\n    public class ValidateSchemaTests\n    {\n        // List of schema version folders to test.\n        private static readonly List<string> _schemaVersionFolders = new List<string>\n        {\n            \"v2.0\",\n            \"v2.1\",\n            \"v2.2\"\n        };\n\n        // Path to the folder containing the schema files and samples (relative to where the test is executing).\n        private static readonly string _schemasRootFolder = Path.Combine(Directory.GetCurrentDirectory(), \"../../../../\");\n\n        /// <summary>\n        /// Builds the list of manifest schemas and samples to validate from the file system.\n        /// </summary>\n        public static TheoryData<string, string> GetManifestAndSamples()\n        {\n            var manifestAndSamples = new TheoryData<string, string>();\n\n            foreach (var schemaVersion in _schemaVersionFolders)\n            {\n                var schemaFolder = Path.Combine(_schemasRootFolder, schemaVersion);\n                var samplesFolder = Path.Combine(schemaFolder, \"Samples\");\n                var sampleManifestFiles = Directory.GetFileSystemEntries(samplesFolder, \"*.json\", SearchOption.AllDirectories);\n                foreach (var manifestFile in sampleManifestFiles)\n                {\n                    var manifestRelativePath = Path.GetRelativePath(schemaFolder, manifestFile);\n                    manifestAndSamples.Add(schemaVersion, manifestRelativePath);\n                }\n            }\n\n            return manifestAndSamples;\n        }\n\n        [Theory]\n        [MemberData(nameof(GetManifestAndSamples))]\n        public async Task ValidateManifestSamplesAgainstSchemasUsingNJsonSchemaAsync(string schemaVersion, string sampleManifest)\n        {\n            // Arrange\n            var manifestSchemaPath = Path.Combine(_schemasRootFolder, schemaVersion, \"skill-manifest.json\");\n            var manifestSchema = await GetSchemaAsync(manifestSchemaPath);\n\n            var sampleManifestPath = Path.Combine(_schemasRootFolder, schemaVersion, sampleManifest);\n            var sampleManifestText = await File.ReadAllTextAsync(sampleManifestPath);\n\n            // Act\n            var validationErrors = manifestSchema.Validate(sampleManifestText);\n\n            // Assert\n            Assert.Empty(validationErrors);\n        }\n\n        [Theory]\n        [MemberData(nameof(GetManifestAndSamples))]\n        public async Task ValidateManifestSamplesAgainstSchemasUsingNewtonsoftSchemaAsync(string schemaVersion, string sampleManifest)\n        {\n            // Note: you can use https://www.jsonschemavalidator.net/ for an interactive version.\n\n            // Arrange\n            var manifestSchemaPath = Path.Combine(_schemasRootFolder, schemaVersion, \"skill-manifest.json\");\n            var manifestSchema = JSchema.Parse(await File.ReadAllTextAsync(manifestSchemaPath), new JSchemaUrlResolver());\n\n            var sampleManifestPath = Path.Combine(_schemasRootFolder, schemaVersion, sampleManifest);\n            var json = JToken.Parse(await File.ReadAllTextAsync(sampleManifestPath));\n\n            // Act\n            json.IsValid(manifestSchema, out IList<ValidationError> validationErrors);\n\n            // Assert\n            Assert.Empty(validationErrors);\n        }\n\n        private static async Task<JsonSchema> GetSchemaAsync(string schemaPath)\n        {\n            var rawSchemaText = await File.ReadAllTextAsync(schemaPath);\n\n            return await JsonSchema.FromJsonAsync(rawSchemaText, null, x =>\n            {\n                var schemaResolver = new JsonSchemaResolver(x, new JsonSchemaGeneratorSettings());\n                var referenceResolver = new JsonReferenceResolver(schemaResolver);\n                referenceResolver.AddDocumentReference(\"http://json-schema.org/draft-07/schema\", JsonSchema.CreateAnySchema());\n\n                return referenceResolver;\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/skills/readme.md",
    "content": "# Skill manifest JSON schema\n\nThis contains the current and previous versions of the JSON Schema that defines your skill manifest. For additional information on skills, skill consumers, and skill manifests see the [skills documentation](https://docs.microsoft.com/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0).\n\n## Published location\n\nThe skill manifest JSON schema is published at:\n\n`https://schemas.botframework.com/schemas/skills/v{version}/skill-manifest.json`\n\nExample:\n\n`https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json`\n\nYou should use the published version when referencing this schema.\n\n## Legacy versions\n\nWith the release of the 2.1 version of the manifest, a different approach was taken to versioning. The `skill-manifest-2.0.0.json` and `skill-manifest-2.1.preview-1.json` files are left here for backwards compatibility purposes, and should not be used. Use the `\\v{version}\\skill-manifest.json` versions instead.\n"
  },
  {
    "path": "schemas/skills/skill-manifest-2.0.0.json",
    "content": "{\n    \"$id\": \"https://schemas.botframework.com/schemas/skills/skill-manifest-2.0.0.json\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"title\": \"Skill Manifest Schema\",\n    \"description\": \"A schema for Bot Framework skill manifests\",\n    \"type\": \"object\",\n    \"required\": [\n        \"$id\",\n        \"$schema\",\n        \"name\",\n        \"version\",\n        \"publisherName\",\n        \"endpoints\"\n    ],\n    \"additionalProperties\": false,\n    \"properties\": {\n        \"$schema\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The schema to verify this skill manifest against\"\n        },\n        \"$id\": {\n            \"type\": \"string\",\n            \"description\": \"The identifier for the skill manifest\"\n        },\n        \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Name of the skill\"\n        },\n        \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Skill version\"\n        },\n        \"description\": {\n            \"type\": \"string\",\n            \"description\": \"A human readable description for the skill\"\n        },\n        \"publisherName\": {\n            \"type\": \"string\",\n            \"description\": \"The name of the skill publisher\"\n        },\n        \"privacyUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The URL with the privacy description for the skill\"\n        },\n        \"copyright\": {\n            \"type\": \"string\",\n            \"description\": \"The copyright for the skill\"\n        },\n        \"license\": {\n            \"type\": \"string\",\n            \"description\": \"The license agreement for the skill\"\n        },\n        \"iconUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"Optional icon to be shown for the skill\"\n        },\n        \"tags\": {\n            \"type\": \"array\",\n            \"uniqueItems\": true,\n            \"description\": \"An array of strings with tags for the skill\"\n        },\n        \"endpoints\": {\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"uniqueItems\": true,\n            \"description\": \"List of endpoints supported by the skill\",\n            \"items\": {\n                \"$ref\": \"#/definitions/endpoint\"\n            }\n        },\n        \"activities\": {\n            \"type\": \"object\",\n            \"description\": \"Definition for the activities accepted by the skill\",\n            \"additionalProperties\": {\n                \"anyOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/invokeActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    }\n                ]\n            }\n        },\n        \"definitions\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of the structure of object payloads\",\n            \"additionalProperties\": {\n                \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n            }\n        }\n    },\n    \"definitions\": {\n        \"endpoint\": {\n            \"type\": \"object\",\n            \"description\": \"Skill endpoint definition\",\n            \"additionalProperties\": false,\n            \"required\": [\n                \"name\",\n                \"endpointUrl\",\n                \"msAppId\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Unique name for the endpoint\",\n                    \"default\": \"default\"\n                },\n                \"protocol\": {\n                    \"type\": \"string\",\n                    \"description\": \"Supported protocol\",\n                    \"default\": \"BotFrameworkV3\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description of the endpoint\",\n                    \"examples\": [\n                        \"Production bot\"\n                    ]\n                },\n                \"endpointUrl\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint Url\",\n                    \"format\": \"uri\",\n                    \"description\": \"Endpoint for the skill\",\n                    \"examples\": [\n                        \"http://contoso.com/api/messaages\"\n                    ]\n                },\n                \"msAppId\": {\n                    \"type\": \"string\",\n                    \"title\": \"Microsoft App Id\",\n                    \"pattern\": \"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\",\n                    \"description\": \"The Microsoft AppId for the skill. This app ID is used to authenticate requests\"\n                }\n            }\n        },\n        \"eventActivity\": {\n            \"type\": \"object\",\n            \"description\": \"An activity with Type=Event where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"event\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name for the event\",\n                    \"examples\": [\n                        \"BookFlight\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            }\n        },\n        \"invokeActivity\": {\n            \"type\": \"object\",\n            \"description\": \"An activity with Type=Invoke where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"invoke\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name property for the invoke activity\",\n                    \"examples\": [\n                        \"GetWeather\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            }\n        },\n        \"messageActivity\": {\n            \"type\": \"object\",\n            \"description\": \"An activity with Type=Message where the utterance is passed to the skill in the Text property\",\n            \"required\": [\n                \"type\"\n            ],\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"message\"\n                    ],\n                    \"default\": \"message\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this message would like to have\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this message may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/skill-manifest-2.1.preview-1.json",
    "content": "{\n    \"$id\": \"https://schemas.botframework.com/schemas/skills/skill-manifest-2.1.preview-1.json\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$version\": \"2.1.preview-1\",\n    \"title\": \"Skill Manifest Schema (v2.1.preview-1)\",\n    \"description\": \"A schema for Bot Framework skill manifests\",\n    \"type\": \"object\",\n    \"required\": [\n        \"$id\",\n        \"$schema\",\n        \"name\",\n        \"version\",\n        \"publisherName\",\n        \"endpoints\"\n    ],\n    \"properties\": {\n        \"$schema\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The schema to verify this skill manifest against\"\n        },\n        \"$id\": {\n            \"type\": \"string\",\n            \"description\": \"The identifier for the skill manifest\"\n        },\n        \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Name of the skill\"\n        },\n        \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Skill version\"\n        },\n        \"description\": {\n            \"type\": \"string\",\n            \"description\": \"A human readable description for the skill\"\n        },\n        \"publisherName\": {\n            \"type\": \"string\",\n            \"description\": \"The name of the skill publisher\"\n        },\n        \"privacyUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The URL with the privacy description for the skill\"\n        },\n        \"copyright\": {\n            \"type\": \"string\",\n            \"description\": \"The copyright for the skill\"\n        },\n        \"license\": {\n            \"type\": \"string\",\n            \"description\": \"The license agreement for the skill\"\n        },\n        \"iconUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"Optional icon to be shown for the skill\"\n        },\n        \"tags\": {\n            \"type\": \"array\",\n            \"uniqueItems\": true,\n            \"description\": \"An array of strings with tags for the skill\",\n            \"items\": {\n                \"type\": \"string\"\n            }\n        },\n        \"endpoints\": {\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"uniqueItems\": true,\n            \"description\": \"List of endpoints supported by the skill\",\n            \"items\": {\n                \"$ref\": \"#/definitions/endpoint\"\n            }\n        },\n        \"dispatchModels\": {\n            \"type\": \"object\",\n            \"description\": \"Language models and top level intents for the skill\",\n            \"properties\": {\n                \"languages\": {\n                    \"type\": \"object\",\n                    \"description\": \"List of languages supported by the skill\",\n                    \"minProperties\": 1,\n                    \"additionalProperties\": {\n                        \"type\": \"array\",\n                        \"minItems\": 1,\n                        \"uniqueItems\": true,\n                        \"description\": \"List of language models supported by the skill\",\n                        \"items\": {\n                            \"$ref\": \"#/definitions/languageModel\"\n                        }\n                    }\n                },\n                \"intents\": {\n                    \"type\": \"array\",\n                    \"uniqueItems\": true,\n                    \"description\": \"A list of the skill's top level intents that can be used by the consumer to filter out language files.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"activities\": {\n            \"type\": \"object\",\n            \"description\": \"Definition of activities to enable skill host tooling to programmatically interact with the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/invokeActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"activitiesSent\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of activities to enable skill host tooling to handle activities which may be sent by the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"definitions\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of the structure of object payloads\",\n            \"additionalProperties\": {\n                \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n            }\n        }\n    },\n    \"additionalProperties\": false,\n    \"definitions\": {\n        \"endpoint\": {\n            \"type\": \"object\",\n            \"description\": \"Skill endpoint definition\",\n            \"required\": [\n                \"name\",\n                \"endpointUrl\",\n                \"msAppId\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Unique name for the endpoint\",\n                    \"default\": \"default\"\n                },\n                \"protocol\": {\n                    \"type\": \"string\",\n                    \"description\": \"Supported protocol\",\n                    \"default\": \"BotFrameworkV3\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description of the endpoint\",\n                    \"examples\": [\n                        \"Production bot\"\n                    ]\n                },\n                \"endpointUrl\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint Url\",\n                    \"format\": \"uri\",\n                    \"description\": \"Endpoint for the skill\",\n                    \"examples\": [\n                        \"http://contoso.com/api/messaages\"\n                    ]\n                },\n                \"msAppId\": {\n                    \"type\": \"string\",\n                    \"title\": \"Microsoft App Id\",\n                    \"pattern\": \"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\",\n                    \"description\": \"The Microsoft AppId for the skill. This app ID is used to authenticate requests\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"eventActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Event Activity\",\n            \"description\": \"An activity with Type=Event where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"const\": \"event\"\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name for the event\",\n                    \"examples\": [\n                        \"BookFlight\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\"\n                },\n                \"resultValue\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"invokeActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Invoke Activity\",\n            \"description\": \"An activity with Type=Invoke where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"const\": \"invoke\"\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name property for the invoke activity\",\n                    \"examples\": [\n                        \"GetWeather\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"messageActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Message Activity\",\n            \"description\": \"An activity with Type=Message where the utterance is passed to the skill in the Text property\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"const\": \"message\",\n                    \"default\": \"message\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this message would like to have\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this message may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"otherActivities\": {\n            \"type\": \"object\",\n            \"title\": \"Activity\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity Type\",\n                    \"description\": \"Contains the activity type (message, event, invoke, etc.)\",\n                    \"enum\": [\n                        \"message\",\n                        \"event\",\n                        \"invoke\",\n                        \"messageReaction\",\n                        \"endOfConversation\",\n                        \"handoff\",\n                        \"typing\",\n                        \"conversationUpdate\",\n                        \"trace\",\n                        \"installationUpdate\",\n                        \"contactRelationUpdate\",\n                        \"suggestion\",\n                        \"deleteUserData\",\n                        \"messageUpdate\",\n                        \"messageDelete\"\n                    ],\n                    \"pattern\":\"^(?!(message|event|invoke)$)((messageReaction|endOfConversation|handoff|typing|conversationUpdate|trace|installationUpdate|contactRelationUpdate|suggestion|deleteUserData|messageUpdate|messageDelete)$)\"\n                }\n            },\n            \"additionalProperties\": true\n        },\n        \"languageModel\": {\n            \"type\": \"object\",\n            \"description\": \"A language model for a given culture. The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region\",\n            \"required\": [\n                \"name\",\n                \"contentType\",\n                \"url\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Name for the language model\"\n                },\n                \"contentType\": {\n                    \"type\": \"string\",\n                    \"description\": \"Type of the language model\"\n                },\n                \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"A URL for the location of the language model file\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the language model\"\n                }\n            },\n            \"additionalProperties\": false\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.0/samples/complex-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.0/skill-manifest.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        },\n        {\n            \"name\": \"eu\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot in Europe\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"11111111-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.0/samples/echo-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.0/skill-manifest.json\",\n    \"$id\": \"EchoSkill\",\n    \"name\": \"Echo skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This skill echoes whatever the user says\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"echo\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"a0000f00-Ad00-a000-a000-a0000aaaAaa0\"\n        }\n    ],\n    \"activities\": {\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"A message activity containing the utterance that the skill will echo back to the user\"\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.0/samples/simple-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.0/skill-manifest.json\",\n    \"$id\": \"CatchAllSkill\",\n    \"name\": \"Simple Skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This is the simplest skill you can think of, it just defines an endpoint that can receive any activity\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        }\n    ]\n}"
  },
  {
    "path": "schemas/skills/v2.0/skill-manifest.json",
    "content": "{\n    \"$id\": \"https://schemas.botframework.com/schemas/skills/skill-manifest.json\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$version\": \"2.0.1\",\n    \"title\": \"Skill Manifest Schema\",\n    \"description\": \"A schema for Bot Framework skill manifests\",\n    \"type\": \"object\",\n    \"required\": [\n        \"$id\",\n        \"$schema\",\n        \"name\",\n        \"version\",\n        \"publisherName\",\n        \"endpoints\"\n    ],\n    \"additionalProperties\": false,\n    \"properties\": {\n        \"$schema\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The schema to verify this skill manifest against\"\n        },\n        \"$id\": {\n            \"type\": \"string\",\n            \"description\": \"The identifier for the skill manifest\"\n        },\n        \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Name of the skill\"\n        },\n        \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Skill version\"\n        },\n        \"description\": {\n            \"type\": \"string\",\n            \"description\": \"A human readable description for the skill\"\n        },\n        \"publisherName\": {\n            \"type\": \"string\",\n            \"description\": \"The name of the skill publisher\"\n        },\n        \"privacyUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The URL with the privacy description for the skill\"\n        },\n        \"copyright\": {\n            \"type\": \"string\",\n            \"description\": \"The copyright for the skill\"\n        },\n        \"license\": {\n            \"type\": \"string\",\n            \"description\": \"The license agreement for the skill\"\n        },\n        \"iconUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"Optional icon to be shown for the skill\"\n        },\n        \"tags\": {\n            \"type\": \"array\",\n            \"uniqueItems\": true,\n            \"description\": \"An array of strings with tags for the skill\"\n        },\n        \"endpoints\": {\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"uniqueItems\": true,\n            \"description\": \"List of endpoints supported by the skill\",\n            \"items\": {\n                \"$ref\": \"#/definitions/endpoint\"\n            }\n        },\n        \"activities\": {\n            \"type\": \"object\",\n            \"description\": \"Definition for the activities accepted by the skill\",\n            \"additionalProperties\": {\n                \"anyOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/invokeActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    }\n                ]\n            }\n        },\n        \"definitions\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of the structure of object payloads\",\n            \"additionalProperties\": {\n                \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n            }\n        }\n    },\n    \"definitions\": {\n        \"endpoint\": {\n            \"type\": \"object\",\n            \"description\": \"Skill endpoint definition\",\n            \"additionalProperties\": false,\n            \"required\": [\n                \"name\",\n                \"endpointUrl\",\n                \"msAppId\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Unique name for the endpoint\",\n                    \"default\": \"default\"\n                },\n                \"protocol\": {\n                    \"type\": \"string\",\n                    \"description\": \"Supported protocol\",\n                    \"default\": \"BotFrameworkV3\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description of the endpoint\",\n                    \"examples\": [\n                        \"Production bot\"\n                    ]\n                },\n                \"endpointUrl\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint Url\",\n                    \"format\": \"uri\",\n                    \"description\": \"Endpoint for the skill\",\n                    \"examples\": [\n                        \"http://contoso.com/api/messaages\"\n                    ]\n                },\n                \"msAppId\": {\n                    \"type\": \"string\",\n                    \"title\": \"Microsoft App Id\",\n                    \"pattern\": \"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\",\n                    \"description\": \"The Microsoft AppId for the skill. This app ID is used to authenticate requests\"\n                }\n            }\n        },\n        \"eventActivity\": {\n            \"type\": \"object\",\n            \"description\": \"An activity with Type=Event where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"event\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name for the event\",\n                    \"examples\": [\n                        \"BookFlight\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            }\n        },\n        \"invokeActivity\": {\n            \"type\": \"object\",\n            \"description\": \"An activity with Type=Invoke where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"invoke\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name property for the invoke activity\",\n                    \"examples\": [\n                        \"GetWeather\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            }\n        },\n        \"messageActivity\": {\n            \"type\": \"object\",\n            \"description\": \"An activity with Type=Message where the utterance is passed to the skill in the Text property\",\n            \"required\": [\n                \"type\"\n            ],\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"message\"\n                    ],\n                    \"default\": \"message\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this message would like to have\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this message may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.1/samples/complex-pva-manifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"dispatchModels\": {\n        \"languages\": {\n            \"en\": [\n                {\n                    \"name\": \"SkillBot LU (English)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-en.lu\",\n                    \"description\": \"English language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (English)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-en.qna\",\n                    \"description\": \"English language model for the skill (QnAMaker)\"\n                }\n            ]\n        },\n        \"intents\": [\n            \"bookFlight\",\n            \"getWeather\"\n        ]\n    },\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        },\n        \"typing\": {\n            \"type\": \"typing\"\n        },\n        \"conversationUpdate\": {\n            \"type\": \"conversationUpdate\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    },\n    \"activitiesSent\": {\n        \"flightUpdated\": {\n            \"type\": \"event\",\n            \"name\": \"FlightUpdated\",\n            \"description\": \"Event which is sent by the skill when there is an update in flight info\",\n            \"value\": {\n                \"type\": \"object\",\n                \"description\": \"Flight update information\",\n                \"properties\": {\n                    \"flightNumber\": {\n                        \"type\": \"string\"\n                    },\n                    \"departureDate\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure date for the flight in YYYY-MM-DD format\"\n                    },\n                    \"departureTime\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure time for the flight in HH-MM format\"\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.1/samples/complex-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        },\n        {\n            \"name\": \"eu\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in Europe\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"11111111-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"dispatchModels\": {\n        \"languages\": {\n            \"en\": [\n                {\n                    \"name\": \"SkillBot LU (English)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-en.lu\",\n                    \"description\": \"English language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (English)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-en.qna\",\n                    \"description\": \"English language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-ES\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Spain)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-es-ES.lu\",\n                    \"description\": \"Spanish (Spain) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Spain)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-es-ES.qna\",\n                    \"description\": \"Spanish (Spain) language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-MX\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-es-MX.lu\",\n                    \"description\": \"Spanish (Mexico) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-es-MX.qna\",\n                    \"description\": \"Spanish (Mexico) language model for the skill (QnAMaker)\"\n                }\n            ]\n        },\n        \"intents\": [\n            \"bookFlight\",\n            \"getWeather\"\n        ]\n    },\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        },\n        \"typing\": {\n            \"type\": \"typing\"\n        },\n        \"conversationUpdate\": {\n            \"type\": \"conversationUpdate\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    },\n    \"activitiesSent\": {\n        \"flightUpdated\": {\n            \"type\": \"event\",\n            \"name\": \"FlightUpdated\",\n            \"description\": \"Event which is sent by the skill when there is an update in flight info\",\n            \"value\": {\n                \"type\": \"object\",\n                \"description\": \"Flight update information\",\n                \"properties\": {\n                    \"flightNumber\": {\n                        \"type\": \"string\"\n                    },\n                    \"departureDate\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure date for the flight in YYYY-MM-DD format\"\n                    },\n                    \"departureTime\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure time for the flight in HH-MM format\"\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.1/samples/echo-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json\",\n    \"$id\": \"EchoSkill\",\n    \"name\": \"Echo skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This skill echoes whatever the user says\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"echo\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"a0000f00-Ad00-a000-a000-a0000aaaAaa0\"\n        }\n    ],\n    \"activities\": {\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"A message activity containing the utterance that the skill will echo back to the user\"\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.1/samples/simple-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json\",\n    \"$id\": \"CatchAllSkill\",\n    \"name\": \"Simple Skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This is the simplest skill you can think of, it just defines an endpoint that can receive any activity\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        }\n    ]\n}"
  },
  {
    "path": "schemas/skills/v2.1/skill-manifest.json",
    "content": "{\n    \"$id\": \"https://schemas.botframework.com/schemas/skills/v2.1/skill-manifest.json\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$version\": \"2.1.1\",\n    \"title\": \"Skill Manifest Schema\",\n    \"description\": \"A schema for Bot Framework skill manifests\",\n    \"type\": \"object\",\n    \"required\": [\n        \"$id\",\n        \"$schema\",\n        \"name\",\n        \"version\",\n        \"publisherName\",\n        \"endpoints\"\n    ],\n    \"properties\": {\n        \"$schema\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The schema to verify this skill manifest against\"\n        },\n        \"$id\": {\n            \"type\": \"string\",\n            \"description\": \"The identifier for the skill manifest\"\n        },\n        \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Name of the skill\"\n        },\n        \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Skill version\"\n        },\n        \"description\": {\n            \"type\": \"string\",\n            \"description\": \"A human readable description for the skill\"\n        },\n        \"publisherName\": {\n            \"type\": \"string\",\n            \"description\": \"The name of the skill publisher\"\n        },\n        \"privacyUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The URL with the privacy description for the skill\"\n        },\n        \"copyright\": {\n            \"type\": \"string\",\n            \"description\": \"The copyright for the skill\"\n        },\n        \"license\": {\n            \"type\": \"string\",\n            \"description\": \"The license agreement for the skill\"\n        },\n        \"iconUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"Optional icon to be shown for the skill\"\n        },\n        \"tags\": {\n            \"type\": \"array\",\n            \"uniqueItems\": true,\n            \"description\": \"An array of strings with tags for the skill\",\n            \"items\": {\n                \"type\": \"string\"\n            }\n        },\n        \"endpoints\": {\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"uniqueItems\": true,\n            \"description\": \"List of endpoints supported by the skill\",\n            \"items\": {\n                \"$ref\": \"#/definitions/endpoint\"\n            }\n        },\n        \"dispatchModels\": {\n            \"type\": \"object\",\n            \"description\": \"Language models and top level intents for the skill\",\n            \"properties\": {\n                \"languages\": {\n                    \"type\": \"object\",\n                    \"description\": \"List of languages supported by the skill\",\n                    \"minProperties\": 1,\n                    \"additionalProperties\": {\n                        \"type\": \"array\",\n                        \"minItems\": 1,\n                        \"uniqueItems\": true,\n                        \"description\": \"List of language models supported by the skill\",\n                        \"items\": {\n                            \"$ref\": \"#/definitions/languageModel\"\n                        }\n                    }\n                },\n                \"intents\": {\n                    \"type\": \"array\",\n                    \"uniqueItems\": true,\n                    \"description\": \"A list of the skill's top level intents that can be used by the consumer to filter out language files.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"activities\": {\n            \"type\": \"object\",\n            \"description\": \"Definition of activities to enable skill host tooling to programmatically interact with the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/invokeActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"activitiesSent\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of activities to enable skill host tooling to handle activities which may be sent by the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"definitions\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of the structure of object payloads\",\n            \"additionalProperties\": {\n                \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n            }\n        }\n    },\n    \"additionalProperties\": false,\n    \"definitions\": {\n        \"endpoint\": {\n            \"type\": \"object\",\n            \"description\": \"Skill endpoint definition\",\n            \"required\": [\n                \"name\",\n                \"endpointUrl\",\n                \"msAppId\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Unique name for the endpoint\",\n                    \"default\": \"default\"\n                },\n                \"protocol\": {\n                    \"type\": \"string\",\n                    \"description\": \"Supported protocol\",\n                    \"default\": \"BotFrameworkV3\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description of the endpoint\",\n                    \"examples\": [\n                        \"Production bot\"\n                    ]\n                },\n                \"endpointUrl\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint Url\",\n                    \"format\": \"uri\",\n                    \"description\": \"Endpoint for the skill\",\n                    \"examples\": [\n                        \"http://contoso.com/api/messaages\"\n                    ]\n                },\n                \"msAppId\": {\n                    \"type\": \"string\",\n                    \"title\": \"Microsoft App Id\",\n                    \"pattern\": \"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\",\n                    \"description\": \"The Microsoft AppId for the skill. This app ID is used to authenticate requests\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"eventActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Event Activity\",\n            \"description\": \"An activity with Type=Event where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity Type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"event\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name for the event\",\n                    \"examples\": [\n                        \"BookFlight\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\"\n                },\n                \"resultValue\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"invokeActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Invoke Activity\",\n            \"description\": \"An activity with Type=Invoke where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity Type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"invoke\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name property for the invoke activity\",\n                    \"examples\": [\n                        \"GetWeather\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"messageActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Message Activity\",\n            \"description\": \"An activity with Type=Message where the utterance is passed to the skill in the Text property\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"message\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this message would like to have\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this message may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"otherActivities\": {\n            \"type\": \"object\",\n            \"title\": \"Activity\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity Type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"messageReaction\",\n                        \"endOfConversation\",\n                        \"handoff\",\n                        \"typing\",\n                        \"conversationUpdate\",\n                        \"trace\",\n                        \"installationUpdate\",\n                        \"contactRelationUpdate\",\n                        \"suggestion\",\n                        \"deleteUserData\",\n                        \"messageUpdate\",\n                        \"messageDelete\"\n                    ]\n                }\n            },\n            \"additionalProperties\": true\n        },\n        \"languageModel\": {\n            \"type\": \"object\",\n            \"description\": \"A language model for a given culture. The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region\",\n            \"required\": [\n                \"name\",\n                \"contentType\",\n                \"url\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Name for the language model\"\n                },\n                \"contentType\": {\n                    \"type\": \"string\",\n                    \"description\": \"Type of the language model\"\n                },\n                \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"A URL for the location of the language model file\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the language model\"\n                }\n            },\n            \"additionalProperties\": false\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/skills/v2.1.preview-1/samples/complex-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/skill-manifest-2.1.preview-1.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        },\n        {\n            \"name\": \"eu\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot in Europe\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"11111111-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"dispatchModels\": {\n        \"languages\": {\n            \"en\": [\n                {\n                    \"name\": \"SkillBot LU (English)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-en.lu\",\n                    \"description\": \"English language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (English)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-en.qna\",\n                    \"description\": \"English language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-ES\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Spain)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-es-ES.lu\",\n                    \"description\": \"Spanish (Spain) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Spain)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-es-ES.qna\",\n                    \"description\": \"Spanish (Spain) language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-MX\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-es-MX.lu\",\n                    \"description\": \"Spanish (Mexico) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-es-MX.qna\",\n                    \"description\": \"Spanish (Mexico) language model for the skill (QnAMaker)\"\n                }\n            ]\n        },\n        \"intents\": [\n            \"bookFlight\",\n            \"getWeather\"\n        ]\n    },\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        },\n        \"typing\": {\n            \"type\": \"typing\"\n        },\n        \"conversationUpdate\": {\n            \"type\": \"conversationUpdate\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    },\n    \"activitiesSent\": {\n        \"flightUpdated\": {\n            \"type\": \"event\",\n            \"name\": \"FlightUpdated\",\n            \"description\": \"Event which is sent by the skill when there is an update in flight info\",\n            \"value\": {\n                \"type\": \"object\",\n                \"description\": \"Flight update information\",\n                \"properties\": {\n                    \"flightNumber\": {\n                        \"type\": \"string\"\n                    },\n                    \"departureDate\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure date for the flight in YYYY-MM-DD format\"\n                    },\n                    \"departureTime\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure time for the flight in HH-MM format\"\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.1.preview-1/samples/echo-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/skill-manifest-2.0.0.json\",\n    \"$id\": \"EchoSkill\",\n    \"name\": \"Echo skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This skill echoes whatever the user says\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"echo\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"a0000f00-Ad00-a000-a000-a0000aaaAaa0\"\n        }\n    ],\n    \"activities\": {\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"A message activity containing the utterance that the skill will echo back to the user\"\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.1.preview-1/samples/simple-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/skill-manifest-2.0.0.json\",\n    \"$id\": \"CatchAllSkill\",\n    \"name\": \"Simple Skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This is the simplest skill you can think of, it just defines an endpoint that can receive any activity\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        }\n    ]\n}"
  },
  {
    "path": "schemas/skills/v2.1.preview-1/skill-manifest.json",
    "content": "{\n    \"$id\": \"https://schemas.botframework.com/schemas/skills/skill-manifest-2.1.preview-1.json\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$version\": \"2.1.preview-1\",\n    \"title\": \"Skill Manifest Schema\",\n    \"description\": \"A schema for Bot Framework skill manifests\",\n    \"type\": \"object\",\n    \"required\": [\n        \"$id\",\n        \"$schema\",\n        \"name\",\n        \"version\",\n        \"publisherName\",\n        \"endpoints\"\n    ],\n    \"properties\": {\n        \"$schema\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The schema to verify this skill manifest against\"\n        },\n        \"$id\": {\n            \"type\": \"string\",\n            \"description\": \"The identifier for the skill manifest\"\n        },\n        \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Name of the skill\"\n        },\n        \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Skill version\"\n        },\n        \"description\": {\n            \"type\": \"string\",\n            \"description\": \"A human readable description for the skill\"\n        },\n        \"publisherName\": {\n            \"type\": \"string\",\n            \"description\": \"The name of the skill publisher\"\n        },\n        \"privacyUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"The URL with the privacy description for the skill\"\n        },\n        \"copyright\": {\n            \"type\": \"string\",\n            \"description\": \"The copyright for the skill\"\n        },\n        \"license\": {\n            \"type\": \"string\",\n            \"description\": \"The license agreement for the skill\"\n        },\n        \"iconUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"Optional icon to be shown for the skill\"\n        },\n        \"tags\": {\n            \"type\": \"array\",\n            \"uniqueItems\": true,\n            \"description\": \"An array of strings with tags for the skill\",\n            \"items\": {\n                \"type\": \"string\"\n            }\n        },\n        \"endpoints\": {\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"uniqueItems\": true,\n            \"description\": \"List of endpoints supported by the skill\",\n            \"items\": {\n                \"$ref\": \"#/definitions/endpoint\"\n            }\n        },\n        \"dispatchModels\": {\n            \"type\": \"object\",\n            \"description\": \"Language models and top level intents for the skill\",\n            \"properties\": {\n                \"languages\": {\n                    \"type\": \"object\",\n                    \"description\": \"List of languages supported by the skill\",\n                    \"minProperties\": 1,\n                    \"additionalProperties\": {\n                        \"type\": \"array\",\n                        \"minItems\": 1,\n                        \"uniqueItems\": true,\n                        \"description\": \"List of language models supported by the skill\",\n                        \"items\": {\n                            \"$ref\": \"#/definitions/languageModel\"\n                        }\n                    }\n                },\n                \"intents\": {\n                    \"type\": \"array\",\n                    \"uniqueItems\": true,\n                    \"description\": \"A list of the skill's top level intents that can be used by the consumer to filter out language files.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"activities\": {\n            \"type\": \"object\",\n            \"description\": \"Definition of activities to enable skill host tooling to programmatically interact with the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/invokeActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"activitiesSent\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of activities to enable skill host tooling to handle activities which may be sent by the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"definitions\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of the structure of object payloads\",\n            \"additionalProperties\": {\n                \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n            }\n        }\n    },\n    \"additionalProperties\": false,\n    \"definitions\": {\n        \"endpoint\": {\n            \"type\": \"object\",\n            \"description\": \"Skill endpoint definition\",\n            \"required\": [\n                \"name\",\n                \"endpointUrl\",\n                \"msAppId\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Unique name for the endpoint\",\n                    \"default\": \"default\"\n                },\n                \"protocol\": {\n                    \"type\": \"string\",\n                    \"description\": \"Supported protocol\",\n                    \"default\": \"BotFrameworkV3\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description of the endpoint\",\n                    \"examples\": [\n                        \"Production bot\"\n                    ]\n                },\n                \"endpointUrl\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint Url\",\n                    \"format\": \"uri\",\n                    \"description\": \"Endpoint for the skill\",\n                    \"examples\": [\n                        \"http://contoso.com/api/messaages\"\n                    ]\n                },\n                \"msAppId\": {\n                    \"type\": \"string\",\n                    \"title\": \"Microsoft App Id\",\n                    \"pattern\": \"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\",\n                    \"description\": \"The Microsoft AppId for the skill. This app ID is used to authenticate requests\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"eventActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Event Activity\",\n            \"description\": \"An activity with Type=Event where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"const\": \"event\"\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name for the event\",\n                    \"examples\": [\n                        \"BookFlight\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\"\n                },\n                \"resultValue\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"invokeActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Invoke Activity\",\n            \"description\": \"An activity with Type=Invoke where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"const\": \"invoke\"\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"The name property for the invoke activity\",\n                    \"examples\": [\n                        \"GetWeather\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"messageActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Message Activity\",\n            \"description\": \"An activity with Type=Message where the utterance is passed to the skill in the Text property\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"description\": \"The activity type\",\n                    \"const\": \"message\",\n                    \"default\": \"message\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this message would like to have\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this message may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"otherActivities\": {\n            \"type\": \"object\",\n            \"title\": \"Activity\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity Type\",\n                    \"description\": \"Contains the activity type (message, event, invoke, etc.)\",\n                    \"enum\": [\n                        \"message\",\n                        \"event\",\n                        \"invoke\",\n                        \"messageReaction\",\n                        \"endOfConversation\",\n                        \"handoff\",\n                        \"typing\",\n                        \"conversationUpdate\",\n                        \"trace\",\n                        \"installationUpdate\",\n                        \"contactRelationUpdate\",\n                        \"suggestion\",\n                        \"deleteUserData\",\n                        \"messageUpdate\",\n                        \"messageDelete\"\n                    ],\n                    \"pattern\":\"^(?!(message|event|invoke)$)((messageReaction|endOfConversation|handoff|typing|conversationUpdate|trace|installationUpdate|contactRelationUpdate|suggestion|deleteUserData|messageUpdate|messageDelete)$)\"\n                }\n            },\n            \"additionalProperties\": true\n        },\n        \"languageModel\": {\n            \"type\": \"object\",\n            \"description\": \"A language model for a given culture. The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region\",\n            \"required\": [\n                \"name\",\n                \"contentType\",\n                \"url\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"description\": \"Name for the language model\"\n                },\n                \"contentType\": {\n                    \"type\": \"string\",\n                    \"description\": \"Type of the language model\"\n                },\n                \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"description\": \"A URL for the location of the language model file\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the language model\"\n                }\n            },\n            \"additionalProperties\": false\n        }\n    }\n}"
  },
  {
    "path": "schemas/skills/v2.2/samples/complex-pva-manifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"dispatchModels\": {\n        \"languages\": {\n            \"en\": [\n                {\n                    \"name\": \"SkillBot LU (English)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-en.lu\",\n                    \"description\": \"English language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (English)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-en.qna\",\n                    \"description\": \"English language model for the skill (QnAMaker)\"\n                }\n            ]\n        },\n        \"intents\": [\n            \"bookFlight\",\n            \"getWeather\"\n        ]\n    },\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        },\n        \"typing\": {\n            \"type\": \"typing\"\n        },\n        \"conversationUpdate\": {\n            \"type\": \"conversationUpdate\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    },\n    \"activitiesSent\": {\n        \"flightUpdated\": {\n            \"type\": \"event\",\n            \"name\": \"FlightUpdated\",\n            \"description\": \"Event which is sent by the skill when there is an update in flight info\",\n            \"value\": {\n                \"type\": \"object\",\n                \"description\": \"Flight update information\",\n                \"properties\": {\n                    \"flightNumber\": {\n                        \"type\": \"string\"\n                    },\n                    \"departureDate\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure date for the flight in YYYY-MM-DD format\"\n                    },\n                    \"departureTime\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure time for the flight in HH-MM format\"\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/complex-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"skillIcon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        },\n        {\n            \"name\": \"eu\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in Europe\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"11111111-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"dispatchModels\": {\n        \"languages\": {\n            \"en\": [\n                {\n                    \"name\": \"SkillBot LU (English)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-en.lu\",\n                    \"description\": \"English language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (English)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-en.qna\",\n                    \"description\": \"English language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-ES\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Spain)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-es-ES.lu\",\n                    \"description\": \"Spanish (Spain) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Spain)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-es-ES.qna\",\n                    \"description\": \"Spanish (Spain) language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-MX\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"http://sample.com/SkillBot-es-MX.lu\",\n                    \"description\": \"Spanish (Mexico) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"http://sample.com/SkillBot-QnA-es-MX.qna\",\n                    \"description\": \"Spanish (Mexico) language model for the skill (QnAMaker)\"\n                }\n            ]\n        },\n        \"intents\": [\n            \"bookFlight\",\n            \"getWeather\"\n        ]\n    },\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        },\n        \"typing\": {\n            \"type\": \"typing\"\n        },\n        \"conversationUpdate\": {\n            \"type\": \"conversationUpdate\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    },\n    \"activitiesSent\": {\n        \"flightUpdated\": {\n            \"type\": \"event\",\n            \"name\": \"FlightUpdated\",\n            \"description\": \"Event which is sent by the skill when there is an update in flight info\",\n            \"value\": {\n                \"type\": \"object\",\n                \"description\": \"Flight update information\",\n                \"properties\": {\n                    \"flightNumber\": {\n                        \"type\": \"string\"\n                    },\n                    \"departureDate\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure date for the flight in YYYY-MM-DD format\"\n                    },\n                    \"departureTime\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure time for the flight in HH-MM format\"\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/echo-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json\",\n    \"$id\": \"EchoSkill\",\n    \"name\": \"Echo skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This skill echoes whatever the user says\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\",\n        \"echo\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"a0000f00-Ad00-a000-a000-a0000aaaAaa0\"\n        }\n    ],\n    \"activities\": {\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"A message activity containing the utterance that the skill will echo back to the user\"\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/complex-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json\",\n    \"$id\": \"SkillBot\",\n    \"name\": \"Sample skill definition that can handle multiple types of activities\",\n    \"version\": \"1.0\",\n    \"description\": \"This is a sample skill definition for multiple activity types\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"skillIcon.png\",\n    \"tags\": [\n        \"sample\",\n        \"travel\",\n        \"weather\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"americas\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in the Americas\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        },\n        {\n            \"name\": \"eu\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production endpoint for SkillBot in Europe\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"11111111-0000-0000-0000-000000000000\"\n        }\n    ],\n    \"dispatchModels\": {\n        \"languages\": {\n            \"en\": [\n                {\n                    \"name\": \"SkillBot LU (English)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"language-understanding/SkillBot-en.lu\",\n                    \"description\": \"English language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (English)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"knowledge-base/SkillBot-QnA-en.qna\",\n                    \"description\": \"English language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-ES\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Spain)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"language-understanding/SkillBot-es-ES.lu\",\n                    \"description\": \"Spanish (Spain) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Spain)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"knowledge-base/SkillBot-QnA-es-ES.qna\",\n                    \"description\": \"Spanish (Spain) language model for the skill (QnAMaker)\"\n                }\n            ],\n            \"es-MX\": [\n                {\n                    \"name\": \"SkillBot LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/lu\",\n                    \"url\": \"language-understanding/SkillBot-es-MX.lu\",\n                    \"description\": \"Spanish (Mexico) language model for the skill\"\n                },\n                {\n                    \"name\": \"SkillBot QnA LU (Spanish-Mexico)\",\n                    \"contentType\": \"application/qna\",\n                    \"url\": \"knowledge-base/SkillBot-QnA-es-MX.qna\",\n                    \"description\": \"Spanish (Mexico) language model for the skill (QnAMaker)\"\n                }\n            ]\n        },\n        \"intents\": [\n            \"bookFlight\",\n            \"getWeather\"\n        ]\n    },\n    \"activities\": {\n        \"bookFlight\": {\n            \"description\": \"Books a flight\",\n            \"type\": \"event\",\n            \"name\": \"BookFlight\",\n            \"value\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/bookingInfo\"\n            }\n        },\n        \"getWeather\": {\n            \"description\": \"Retrieves and returns the weather for the user's location\",\n            \"type\": \"invoke\",\n            \"name\": \"GetWeather\",\n            \"value\": {\n                \"$ref\": \"#/definitions/location\"\n            },\n            \"resultValue\": {\n                \"$ref\": \"#/definitions/weatherReport\"\n            }\n        },\n        \"message\": {\n            \"type\": \"message\",\n            \"description\": \"Receives the user's' utterance and attempts to resolve it using the skill's LU models\"\n        },\n        \"typing\": {\n            \"type\": \"typing\"\n        },\n        \"conversationUpdate\": {\n            \"type\": \"conversationUpdate\"\n        }\n    },\n    \"definitions\": {\n        \"localeValue\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"locale\": {\n                    \"type\": \"string\",\n                    \"description\": \"The current user's locale ISO code\"\n                }\n            }\n        },\n        \"bookingInfo\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"origin\"\n            ],\n            \"properties\": {\n                \"origin\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the origin city for the flight\"\n                },\n                \"destination\": {\n                    \"type\": \"string\",\n                    \"description\": \"this is the destination city for the flight\"\n                },\n                \"date\": {\n                    \"type\": \"string\",\n                    \"description\": \"The date for the flight in YYYY-MM-DD format\"\n                }\n            }\n        },\n        \"weatherReport\": {\n            \"type\": \"array\",\n            \"description\": \"Array of forecasts for the next week.\",\n            \"items\": [\n                {\n                    \"type\": \"string\"\n                }\n            ]\n        },\n        \"location\": {\n            \"type\": \"object\",\n            \"description\": \"Location metadata\",\n            \"properties\": {\n                \"latitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Latitude\"\n                },\n                \"longitude\": {\n                    \"type\": \"number\",\n                    \"title\": \"Longitude\"\n                },\n                \"postalCode\": {\n                    \"type\": \"string\",\n                    \"title\": \"Postal code\"\n                }\n            }\n        }\n    },\n    \"activitiesSent\": {\n        \"flightUpdated\": {\n            \"type\": \"event\",\n            \"name\": \"FlightUpdated\",\n            \"description\": \"Event which is sent by the skill when there is an update in flight info\",\n            \"value\": {\n                \"type\": \"object\",\n                \"description\": \"Flight update information\",\n                \"properties\": {\n                    \"flightNumber\": {\n                        \"type\": \"string\"\n                    },\n                    \"departureDate\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure date for the flight in YYYY-MM-DD format\"\n                    },\n                    \"departureTime\": {\n                        \"type\": \"string\",\n                        \"description\": \"The departure time for the flight in HH-MM format\"\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/knowledge-base/SkillBot-QnA-en.qna",
    "content": "# ? Sample Question\n- sample answer 1\n- sample answer 2\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/knowledge-base/SkillBot-QnA-es-ES.qna",
    "content": "# ? Sample Question\n- sample answer 1\n- sample answer 2\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/knowledge-base/SkillBot-QnA-es-MX.qna",
    "content": "# ? Sample Question\n- sample answer 1\n- sample answer 2\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/language-understanding/SkillBot-en.lu",
    "content": "# bookFlight\n- Utterance 1\n- Utterance 2\n\n# getWeather\n- Utterance 3\n- Utterance 4\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/language-understanding/SkillBot-es-ES.lu",
    "content": "# bookFlight\n- Utterance 1\n- Utterance 2\n\n# getWeather\n- Utterance 3\n- Utterance 4\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/language-understanding/SkillBot-es-MX.lu",
    "content": "# bookFlight\n- Utterance 1\n- Utterance 2\n\n# getWeather\n- Utterance 3\n- Utterance 4\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/relativeUris/privacy.html",
    "content": "<!DOCTYPE html>\n\n<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta charset=\"utf-8\"/>\n    <title>Sample privacy notice</title>\n</head>\n<body>\nTODO\n</body>\n</html>\n"
  },
  {
    "path": "schemas/skills/v2.2/samples/simple-skillmanifest.json",
    "content": "{\n    \"$schema\": \"https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json\",\n    \"$id\": \"CatchAllSkill\",\n    \"name\": \"Simple Skill\",\n    \"version\": \"1.0\",\n    \"description\": \"This is the simplest skill you can think of, it just defines an endpoint that can receive any activity\",\n    \"publisherName\": \"Microsoft\",\n    \"privacyUrl\": \"https://myskill.contoso.com/privacy.html\",\n    \"copyright\": \"Copyright (c) Microsoft Corporation. All rights reserved.\",\n    \"license\": \"\",\n    \"iconUrl\": \"https://myskill.contoso.com/icon.png\",\n    \"tags\": [\n        \"sample\"\n    ],\n    \"endpoints\": [\n        {\n            \"name\": \"default\",\n            \"protocol\": \"BotFrameworkV3\",\n            \"description\": \"Production  endpoint for SkillBot.\",\n            \"endpointUrl\": \"http://myskill.contoso.com/api/messages\",\n            \"msAppId\": \"00000000-0000-0000-0000-000000000000\"\n        }\n    ]\n}\n"
  },
  {
    "path": "schemas/skills/v2.2/skill-manifest.json",
    "content": "{\n    \"$id\": \"https://schemas.botframework.com/schemas/skills/v2.2/skill-manifest.json\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"$version\": \"2.2.0\",\n    \"title\": \"Skill Manifest Schema\",\n    \"description\": \"A schema for Bot Framework skill manifests\",\n    \"type\": \"object\",\n    \"required\": [\n        \"$id\",\n        \"$schema\",\n        \"name\",\n        \"version\",\n        \"publisherName\",\n        \"endpoints\"\n    ],\n    \"properties\": {\n        \"$schema\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"title\": \"Manifest schema\",\n            \"description\": \"The schema to verify this skill manifest against\"\n        },\n        \"$id\": {\n            \"type\": \"string\",\n            \"title\": \"Manifest ID\",\n            \"description\": \"The identifier for the skill manifest\"\n        },\n        \"name\": {\n            \"type\": \"string\",\n            \"title\": \"Skill name\",\n            \"description\": \"Name of the skill\"\n        },\n        \"version\": {\n            \"type\": \"string\",\n            \"title\": \"Skill version\",\n            \"description\": \"Skill version\"\n        },\n        \"description\": {\n            \"type\": \"string\",\n            \"title\": \"Skill description\",\n            \"description\": \"A human readable description for the skill\"\n        },\n        \"publisherName\": {\n            \"type\": \"string\",\n            \"title\": \"Publisher name\",\n            \"description\": \"The name of the skill publisher\"\n        },\n        \"privacyUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri-reference\",\n            \"title\": \"Privacy URL\",\n            \"description\": \"The URL with the privacy description for the skill\"\n        },\n        \"copyright\": {\n            \"type\": \"string\",\n            \"title\": \"Copyright\",\n            \"description\": \"The copyright for the skill\"\n        },\n        \"license\": {\n            \"type\": \"string\",\n            \"title\": \"License\",\n            \"description\": \"The license agreement for the skill\"\n        },\n        \"iconUrl\": {\n            \"type\": \"string\",\n            \"format\": \"uri-reference\",\n            \"title\": \"Icon URL\",\n            \"description\": \"Optional icon to be shown for the skill\"\n        },\n        \"tags\": {\n            \"type\": \"array\",\n            \"uniqueItems\": true,\n            \"title\": \"Tags\",\n            \"description\": \"An array of strings with tags for the skill\",\n            \"items\": {\n                \"type\": \"string\"\n            }\n        },\n        \"endpoints\": {\n            \"type\": \"array\",\n            \"minItems\": 1,\n            \"uniqueItems\": true,\n            \"title\": \"Skill endpoints\",\n            \"description\": \"List of endpoints supported by the skill\",\n            \"items\": {\n                \"$ref\": \"#/definitions/endpoint\"\n            }\n        },\n        \"dispatchModels\": {\n            \"type\": \"object\",\n            \"title\": \"Language models\",\n            \"description\": \"Language models and top level intents for the skill\",\n            \"properties\": {\n                \"languages\": {\n                    \"type\": \"object\",\n                    \"description\": \"List of languages supported by the skill\",\n                    \"minProperties\": 1,\n                    \"additionalProperties\": {\n                        \"type\": \"array\",\n                        \"minItems\": 1,\n                        \"uniqueItems\": true,\n                        \"description\": \"List of language models supported by the skill\",\n                        \"items\": {\n                            \"$ref\": \"#/definitions/languageModel\"\n                        }\n                    }\n                },\n                \"intents\": {\n                    \"type\": \"array\",\n                    \"uniqueItems\": true,\n                    \"description\": \"A list of the skill's top level intents that can be used by the consumer to filter out language files.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"activities\": {\n            \"type\": \"object\",\n            \"title\": \"Activities\",\n            \"description\": \"Definition of activities to enable skill host tooling to programmatically interact with the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/invokeActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"activitiesSent\": {\n            \"type\": \"object\",\n            \"title\": \"Activities sent\",\n            \"description\": \"Definitions of activities to enable skill host tooling to handle activities which may be sent by the skill.\",\n            \"additionalProperties\": {\n                \"oneOf\": [\n                    {\n                        \"$ref\": \"#/definitions/eventActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/messageActivity\"\n                    },\n                    {\n                        \"$ref\": \"#/definitions/otherActivities\"\n                    }\n                ]\n            }\n        },\n        \"definitions\": {\n            \"type\": \"object\",\n            \"description\": \"Definitions of the structure of object payloads\",\n            \"additionalProperties\": {\n                \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n            }\n        }\n    },\n    \"additionalProperties\": false,\n    \"definitions\": {\n        \"endpoint\": {\n            \"type\": \"object\",\n            \"title\": \"Skill endpoint\",\n            \"description\": \"Skill endpoint definition\",\n            \"required\": [\n                \"name\",\n                \"endpointUrl\",\n                \"msAppId\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint name\",\n                    \"description\": \"Unique name for the endpoint\",\n                    \"default\": \"default\"\n                },\n                \"protocol\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint protocol\",\n                    \"description\": \"Supported protocol\",\n                    \"default\": \"BotFrameworkV3\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Endpoint description\",\n                    \"description\": \"Description of the endpoint\",\n                    \"examples\": [\n                        \"Production bot\"\n                    ]\n                },\n                \"endpointUrl\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\",\n                    \"title\": \"Endpoint URL\", \n                    \"description\": \"Endpoint for the skill\",\n                    \"examples\": [\n                        \"http://contoso.com/api/messaages\"\n                    ]\n                },\n                \"msAppId\": {\n                    \"type\": \"string\",\n                    \"title\": \"Microsoft App Id\",\n                    \"pattern\": \"^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\",\n                    \"description\": \"The Microsoft AppId for the skill. This app ID is used to authenticate requests\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"eventActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Event Activity\",\n            \"description\": \"An activity with Type=Event where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"event\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"Event name\",\n                    \"description\": \"The name for the event\",\n                    \"examples\": [\n                        \"BookFlight\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Event description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"title\": \"Value\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\"\n                },\n                \"resultValue\": {\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\",\n                    \"type\": \"object\",\n                    \"title\": \"Result\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"invokeActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Invoke Activity\",\n            \"description\": \"An activity with Type=Invoke where the Name property indicates the task that the skill will execute\",\n            \"required\": [\n                \"type\",\n                \"name\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"invoke\"\n                    ]\n                },\n                \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"Invoke name\",\n                    \"description\": \"The name property for the invoke activity\",\n                    \"examples\": [\n                        \"GetWeather\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"title\": \"Value\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this event expects\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"title\": \"Result\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this event may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"messageActivity\": {\n            \"type\": \"object\",\n            \"title\": \"Message Activity\",\n            \"description\": \"An activity with Type=Message where the utterance is passed to the skill in the Text property\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"message\"\n                    ]\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the activity\"\n                },\n                \"value\": {\n                    \"type\": \"object\",\n                    \"title\": \"Value\",\n                    \"description\": \"The JsonSchema definition of the shape of the value property that this message would like to have\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                },\n                \"resultValue\": {\n                    \"type\": \"object\",\n                    \"title\": \"Result\",\n                    \"description\": \"The JsonSchema definition of the shape of the resultValue that this message may produce\",\n                    \"$ref\": \"http://json-schema.org/draft-07/schema#\"\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"otherActivities\": {\n            \"type\": \"object\",\n            \"title\": \"Activity\",\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Activity type\",\n                    \"description\": \"The activity type\",\n                    \"enum\": [\n                        \"messageReaction\",\n                        \"endOfConversation\",\n                        \"handoff\",\n                        \"typing\",\n                        \"conversationUpdate\",\n                        \"trace\",\n                        \"installationUpdate\",\n                        \"contactRelationUpdate\",\n                        \"suggestion\",\n                        \"deleteUserData\",\n                        \"messageUpdate\",\n                        \"messageDelete\"\n                    ]\n                }\n            },\n            \"additionalProperties\": true\n        },\n        \"languageModel\": {\n            \"type\": \"object\",\n            \"title\": \"Language model\",\n            \"description\": \"A language model for a given culture. The name is a combination of an ISO 639 two-letter lowercase culture code associated with a language and an ISO 3166 two-letter uppercase subculture code associated with a country or region\",\n            \"required\": [\n                \"name\",\n                \"contentType\",\n                \"url\"\n            ],\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"Language model name\",\n                    \"description\": \"Name for the language model\"\n                },\n                \"contentType\": {\n                    \"type\": \"string\",\n                    \"title\": \"Language model content type\",\n                    \"description\": \"Type of the language model\"\n                },\n                \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri-reference\",\n                    \"title\": \"Language model URL\",\n                    \"description\": \"An absolute or relative URI for the location of the language model file\"\n                },\n                \"description\": {\n                    \"type\": \"string\",\n                    \"title\": \"Description\",\n                    \"description\": \"Description for the language model\"\n                }\n            },\n            \"additionalProperties\": false\n        }\n    }\n}\n"
  },
  {
    "path": "schemas/ui/v1.0/ui.schema",
    "content": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema\",\n    \"$id\": \"https://schemas.botframework.com/schemas/ui/v1.0/ui.schema\",\n    \"$ref\": \"#/definitions/UISchema\",\n    \"definitions\": {\n        \"UISchema\": {\n            \"title\": \"UI Schema\",\n            \"description\": \"Visual customization options for BotFramework SDK components.\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"form\": {\n                    \"title\": \"Form UI Options\",\n                    \"description\": \"UI Options object describing form UI customizations for this $kind.\",\n                    \"$ref\": \"#/definitions/FormUIOptions\"\n                },\n                \"menu\": {\n                    \"title\": \"Menu Options\",\n                    \"description\": \"Configure how this component appears in the menu. Can be a menu option object or an array of menu option objects.\",\n                    \"$ref\": \"#/definitions/MenuOptions\"\n                },\n                \"flow\": {\n                    \"title\": \"Flow UI Options\",\n                    \"description\": \"UI Options object describing flow UI customizations for this $kind.\",\n                    \"$ref\": \"#/definitions/FlowUIOptions\"\n                },\n                \"trigger\": {\n                    \"title\": \"Trigger UI Options\",\n                    \"description\": \"UI Options object describing how this component appreas in the Trigger dropdown.\",\n                    \"$ref\": \"#/definitions/TriggerUIOptions\"\n                },\n                \"recognizer\": {\n                    \"title\": \"Recognizer UI Options\",\n                    \"description\": \"UI Options object describing how this component appreas in the Recognizer dropdown.\",\n                    \"$ref\": \"#/definitions/RecognizerUIOptions\"\n                }\n            },\n            \"additionalProperties\": {\n                \"title\": \"Component $kind\",\n                \"description\": \"UI Schema for this component.\",\n                \"$ref\": \"#/definitions/UISchema\"\n            },\n            \"patternProperties\": {\n                \"^\\\\$.*$\": {}\n            }\n        },\n        \"FormUIOptions\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"description\": {\n                    \"title\": \"Description\",\n                    \"description\": \"Description override. Used in tooltips.\",\n                    \"type\": \"string\"\n                },\n                \"helpLink\": {\n                    \"title\": \"Help Link\",\n                    \"description\": \"URI to component or property documentation. Used in tooltips.\",\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                },\n                \"hidden\": {\n                    \"title\": \"Hidden Properties\",\n                    \"description\": \"An array of property names to hide in the UI.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                },\n                \"fieldsets\": {\n                    \"title\": \"Field Sets\",\n                    \"description\": \"An array of field sets.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"title\": \"Field set\",\n                        \"description\": \"Groups fields into collapsible sections in the UI.\",\n                        \"type\": \"object\",\n                        \"properties\": {\n                            \"title\": {\n                                \"title\": \"Title\",\n                                \"description\": \"Field set title.\",\n                                \"type\": \"string\"\n                            },\n                            \"fields\": {\n                                \"title\": \"Fields\",\n                                \"description\": \"Array of property names.\",\n                                \"type\": \"array\",\n                                \"items\": {\n                                    \"oneOf\": [\n                                        {\n                                            \"type\": \"string\"\n                                        },\n                                        {\n                                            \"type\": \"object\",\n                                            \"properties\": {\n                                                \"title\": {\n                                                    \"title\": \"Title\",\n                                                    \"description\": \"Field set title.\",\n                                                    \"type\": \"string\"\n                                                },\n                                                \"fields\": {\n                                                    \"title\": \"Fields\",\n                                                    \"description\": \"Array of property names.\",\n                                                    \"type\": \"array\",\n                                                    \"items\": {\n                                                        \"type\": \"string\"\n                                                    }\n                                                },\n                                                \"defaultExpanded\": {\n                                                    \"title\": \"Default expanded\",\n                                                    \"description\": \"Default expanded state for the field set.\",\n                                                    \"type\": \"boolean\",\n                                                    \"default\": false\n                                                }\n                                            }\n                                        }\n                                    ]\n                                }\n                            },\n                            \"defaultExpanded\": {\n                                \"title\": \"Default expanded\",\n                                \"description\": \"Default expanded state for the field set.\",\n                                \"type\": \"boolean\",\n                                \"default\": false\n                            }\n                        }\n                    }\n                },\n                \"intellisenseScopes\": {\n                    \"title\": \"Intellisense scopes\",\n                    \"description\": \"An array of valid scopes to help Intellisense return the correct type of results.\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"examples\": [[\"expressions\",\"user-variables\"]]\n                },\n                \"label\": {\n                    \"title\": \"Label\",\n                    \"description\": \"Label override. Can either be a string or false to hide the label.\",\n                    \"oneOf\": [\n                        {\n                            \"type\": \"string\"\n                        },\n                        {\n                            \"const\": false\n                        }\n                    ]\n                },\n                \"order\": {\n                    \"title\": \"Property Order\",\n                    \"description\": \"Set the order of fields. Use \\\"*\\\" for all other fields. ex. [\\\"foo\\\", \\\"*\\\", \\\"bar\\\"]\",\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"examples\": [[\"*\"]]\n                },\n                \"pivotFieldsets\": {\n                    \"title\": \"Pivot Field Sets\",\n                    \"description\": \"If 'pivotFieldsets' is set to true, the field sets render in a tabbed view.\",\n                    \"type\": \"boolean\"\n                },\n                \"placeholder\": {\n                    \"title\": \"Placeholder\",\n                    \"description\": \"Placeholder override. Default is `examples` property in the schema.\",\n                    \"type\": \"string\"\n                },\n                \"properties\": {\n                    \"title\": \"Properties\",\n                    \"description\": \"A map of component property names to UI options with customizations for each property.\",\n                    \"type\": \"object\",\n                    \"additionalProperties\": {\n                        \"title\": \"Property Name\",\n                        \"description\": \"UI Options object describing UI customizations for this property.\",\n                        \"$ref\": \"#/definitions/FormUIOptions\"\n                    }\n                },\n                \"subtitle\": {\n                    \"title\": \"Subtitle\",\n                    \"description\": \"Subtitle rendered in form title, defaults to schema.$kind\",\n                    \"type\": \"string\"\n                },\n                \"widget\": {\n                    \"title\": \"Field Widget\",\n                    \"description\": \"Override default field widget.\",\n                    \"type\": \"string\",\n                    \"enum\": [\n                        \"checkbox\",\n                        \"date\",\n                        \"datetime\",\n                        \"input\",\n                        \"number\",\n                        \"radio\",\n                        \"select\",\n                        \"textarea\"\n                    ]\n                }\n            },\n            \"additionalProperties\": false\n        },\n        \"FlowUIOptions\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"widget\": {\n                    \"title\": \"Flow Widget Name\",\n                    \"description\": \"Flow widget name of current $kind.\",\n                    \"type\": \"string\",\n                    \"examples\": [\n                        \"ActionHeader\",\n                        \"ActionCard\",\n                        \"IfConditionWidget\",\n                        \"SwitchConditionWidget\",\n                        \"ForeachWidget\"\n                    ]\n                }\n            },\n            \"additionalProperties\": true\n        },\n        \"TriggerUIOptions\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"label\": {\n                    \"title\": \"Displayed trigger name\",\n                    \"description\": \"Displayed trigger name in trigger creation flow.\",\n                    \"type\": \"string\",\n                    \"examples\": [\"Intent recognized\"]\n                },\n                \"submenu\": {\n                    \"oneOf\": [\n                        {\n                            \"type\": \"string\",\n                            \"description\": \"Label name of the submenu.\"\n                        },\n                        {\n                            \"type\": \"object\",\n                            \"properties\": {\n                                \"label\": {\n                                    \"title\": \"Submenu name\",\n                                    \"type\": \"string\",\n                                    \"examples\": [\"Dialog events\"]\n                                },\n                                \"prompt\": {\n                                    \"title\": \"Submenu prompt\",\n                                    \"description\": \"Prompt of next level Trigger menu.\",\n                                    \"type\": \"string\",\n                                    \"examples\": [\"Which event?\"]\n                                },\n                                \"placeholder\": {\n                                    \"title\": \"Submenu placeholder\",\n                                    \"description\": \"Placeholder text to show when no trigger selected.\",\n                                    \"type\": \"string\",\n                                    \"examples\": [\"Select an event type\"]\n                                }\n                            }\n                        }\n                    ]\n                },\n                \"disabled\": {\n                    \"title\": \"Trigger disabled\",\n                    \"description\": \"When set to true, the trigger will be hidden from the creation flow.\",\n                    \"type\": \"boolean\"\n                },\n                \"order\": {\n                    \"title\": \"Trigger order (Optional)\",\n                    \"description\": \"Indexing order of a Trigger, be used to sort the Trigger menu.\",\n                    \"type\": \"number\"\n                }\n            }\n        },\n        \"RecognizerUIOptions\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"displayName\": {\n                    \"title\": \"Recognizer name\",\n                    \"description\": \"Recognizer name displayed in the dropdown option.\",\n                    \"type\": \"string\",\n                    \"examples\": [\"Regular expression recognizer\"]\n                },\n                \"intentEditor\": {\n                    \"title\": \"Trigger phrases editor name\",\n                    \"description\": \"Hook a trigger phrases editor to all child triggers.\",\n                    \"type\": \"string\",\n                    \"examples\": [\"LuIntentEditor\", \"RegexIntentEditor\"]\n                },\n                \"fields\": {\n                    \"title\": \"Fields initializer object\",\n                    \"description\": \"A template of the recognizer to define a custom initializer. LG, Expression is supported.\",\n                    \"type\": \"object\",\n                    \"additionalProperties\": true,\n                    \"examples\": [\n                        {\n                            \"luFileId\": \"${dialogId}.lu\"\n                        }\n                    ]\n                },\n                \"default\": {\n                    \"title\": \"Default recognizer\",\n                    \"description\": \"When set to true, new dialogs will use this recognizer by default.\",\n                    \"type\": \"boolean\"\n                },\n                \"disabled\": {\n                    \"title\": \"Recognizer disabled\",\n                    \"description\": \"When set to true, the recognizer will be hidden from the dropdown.\",\n                    \"type\": \"boolean\"\n                },\n                \"order\": {\n                    \"title\": \"Recognizer order (Optional)\",\n                    \"description\": \"Indexing order of a Recognizer, be used to sort the Recognizer dropdown.\",\n                    \"type\": \"number\"\n                }\n            }\n        },\n        \"MenuOptions\": {\n            \"oneOf\": [\n                {\n                    \"$ref\": \"#/definitions/SubmenuGroup\"\n                },\n                {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/SubmenuGroup\"\n                    }\n                }\n            ]\n        },\n        \"SubmenuGroup\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"label\": {\n                    \"title\": \"Menu Item Label (Optional) \",\n                    \"description\": \"Text that appears as the menu item. Defaults to $kind.\",\n                    \"type\": \"string\"\n                },\n                \"group\": {\n                    \"title\": \"Menu Group (Optional) \",\n                    \"description\": \"Menu group that this component belongs to. Leave blank to be ungrouped.\",\n                    \"type\": \"string\",\n                    \"examples\": [\"Dialog actions\", \"Dev tools\"]\n                },\n                \"submenu\": {\n                    \"title\": \"Submenu (Optional)\",\n                    \"description\": \"An array of submenu labels to configure how this component is nested in the menu. Set to false to show this component as a top-level menu item.\",\n                    \"oneOf\": [\n                        {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"title\": \"Submenu label\",\n                                \"type\": \"string\"\n                            },\n                            \"examples\": [[\"Top Level Menu\", \"Secondary Menu\"]]\n                        },\n                        {\n                            \"const\": false,\n                            \"description\": \"Do not put menu item in a submenu.\"\n                        }\n                    ]\n                },\n                \"disabled\": {\n                    \"title\": \"Menu disabled\",\n                    \"description\": \"When set to true, current $kind will be hidden from the Action flyout menu.\",\n                    \"type\": \"boolean\"\n                },\n                \"order\": {\n                    \"title\": \"Action menu order (Optional)\",\n                    \"description\": \"A float number as the indexing order of an Action, be used to sort the Action menu.\",\n                    \"type\": \"number\"\n                }\n            },\n            \"additionalProperties\": false\n        }\n    }\n}\n"
  },
  {
    "path": "specs/botframework-activity/botframework-activity.md",
    "content": "# Bot Framework -- Activity\n\nVersion: 3.1.12\n\n**This specification has moved to [Agents SDK](https://github.com/microsoft/agents)**\n\n## Abstract\n\nThe Bot Framework Activity schema is an application-level representation of conversational actions made by humans and automated software. The schema includes provisions for communicating text, multimedia, and non-content actions like social interactions and typing indicators.\n\nThis schema is used within the Bot Framework protocol and is implemented by Microsoft chat systems and by interoperable bots and clients from many sources.\n\n## Table of Contents\n\n1. [Introduction](#introduction)\n2. [Basic activity structure](#basic-activity-structure)\n3. [Message activity](#message-activity)\n4. [Contact relation update activity](#contact-relation-update-activity)\n5. [Conversation update activity](#conversation-update-activity)\n6. [End of conversation activity](#end-of-conversation-activity)\n7. [Event activity](#event-activity)\n8. [Invoke activity](#invoke-activity)\n9. [Installation update activity](#installation-update-activity)\n10. [Message delete activity](#message-delete-activity)\n11. [Message update activity](#message-update-activity)\n12. [Message reaction activity](#message-reaction-activity)\n13. [Suggestion activity](#suggestion-activity)\n13. [Trace activity](#trace-activity)\n14. [Typing activity](#typing-activity)\n15. [Handoff activity](#handoff-activity)\n16. [Command activity](#command-activity)\n17. [Command result activity](#command-result-activity)\n18. [Complex types](#complex-types)\n19. [References](#references)\n20. [Appendix I - Changes](#appendix-i---changes)\n21. [Appendix II - Non-IRI entity types](#appendix-ii---non-iri-entity-types)\n22. [Appendix III - Protocols using the Invoke activity](#appendix-iii---protocols-using-the-invoke-activity)\n23. [Appendix IV - Priming format](#appendix-iv---priming-format)\n24. [Appendix V - Caller ID values](#appendix-v---caller-id-values)\n25. [Appendix VI - Protocols using the Command activity](#appendix-vi---protocols-using-the-command-activity)\n\n## Introduction\n\n### Overview\n\nThe Bot Framework Activity schema represents conversational behaviors made by humans and automated software within chat applications, email, and other text interaction programs. Each activity object includes a type field and represents a single action: most commonly, sending text content, but also including multimedia attachments and non-content behaviors like a \"like\" button or a typing indicator.\n\nThis document provides meanings for each type of activity, and describes the required and optional fields that may be included. It also defines the roles of the client and server, and provides guidance on which fields are mastered by each participant, and which may be ignored.\n\nThere are three roles of consequence in this specification: clients, which send and receive activities on behalf of users; bots, which send and receive activities and are typically automated; and the channel, which stores and forwards activities between clients and bots.\n\nAlthough this specification requires activities to be transmitted between roles, the exact nature of that transmission is not described here. This may be found instead in the companion Bot Framework Protocol specification [[1](#references)].\n\nFor compactness, visual interactive cards are not defined in this specification. Instead, these are defined within the [Bot Framework Cards](botframework-cards.md) [[10](#references)] and [Adaptive Cards](https://adaptivecards.io) [[11](#references)] specifications. These cards, and other undefined card types, may be included as attachments within Bot Framework activities.\n\n### Requirements\n\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119) [[2](#references)].\n\nAn implementation is not compliant if it fails to satisfy one or more of the MUST or REQUIRED level requirements for the protocols it implements. An implementation that satisfies all the MUST or REQUIRED level and all the SHOULD level requirements for its protocols is said to be \"unconditionally compliant\"; one that satisfies all the MUST level requirements but not all the SHOULD level requirements for its protocols is said to be \"conditionally compliant.\"\n\nExplanatory text describes the intent. Editors are encouraged to omit normative statements from explanatory text. All [numbered requirements](#numbered-requirements) are normative. All examples are non-normative.\n\n### Numbered requirements\n\nLines beginning with markers of the form `AXXXX` are specific requirements designed to be referenced by number in discussion outside of this document. They do not carry any more or less weight than normative statements made outside of `AXXXX` lines.\n\n`A1000`: Editors of this specification MAY add new `AXXXX` requirements. They SHOULD find numeric `AXXXX` values that preserve the document's flow.\n\n`A1001`: Editors MUST NOT renumber existing `AXXXX` requirements.\n\n`A1002`: Editors MAY delete or revise `AXXXX` requirements. If revised, editors SHOULD retain the existing `AXXXX` value if the topic of the requirement remains largely intact.\n\n`A1003`: Editors SHOULD NOT reuse retired `AXXXX` values. A list of deleted values MAY be maintained at the end of this document.\n\n### Terminology\n\nactivity\n> An action expressed by a bot, a channel, or a client that conforms to the Activity schema.\n\nchannel\n> Software that sends and receives activities, and transforms them to and from chat or application behaviors. Channels are the authoritative store for activity data.\n\nbot\n> Software that sends and receives activities, and generates automated, semi-automated, or entirely manual responses. Bots have endpoints that are registered with channels.\n\nclient\n> Software that sends and receives activities, typically on behalf of human users. Clients do not have endpoints.\n\nsender\n> Software transmitting an activity.\n\nreceiver\n> Software accepting an activity.\n\nendpoint\n> A programmatically addressable location where a bot or channel can receive activities.\n\naddress\n> An identifier or address where a user or bot can be contacted.\n\nfield\n> A named value within an activity or nested object.\n\n### Overall organization\n\nThe activity object is a flat list of name/value pairs, some of which are primitive objects, and some of which are complex (nested). The activity object is commonly expressed in the JSON format, but can also be projected into in-memory data structures in .Net or JavaScript.\n\nThe activity `type` field controls the meaning of the activity and the fields contained within it. Depending on the role that a participant is playing (client, bot, or channel), each field is mandatory, optional, or ignored. For example, the `id` field is mastered by the channel, and is mandatory in some circumstances, but ignored if it is sent by a bot.\n\nFields that describe the identity of the activity and any participants, such as the `type` and `from` fields, are shared across all activities. In many programming languages, it is convenient to organize these fields on a core base type from which other, more specific, activity types derive.\n\nWhen storing or transmitting activities, some fields may be duplicated within the transport mechanism. For example, if an activity is transmitted via HTTP POST to a URL that includes the conversation ID, the receiver may infer its value without requiring it to be present within the activity body. This document merely describes the abstract requirements for these fields, and it is up to the controlling protocol to establish whether the values must be explicitly declared or if implicit or inferred values are allowed.\n\nWhen a bot or client sends an activity to a channel, it is typically a request for the activity to be recorded. When a channel sends an activity to a bot or client, it is typically a notification that the activity has already been recorded.\n\n## Basic activity structure\n\nThis section defines the requirements for the basic structure of the activity object.\n\nActivity objects include a flat list of name/value pairs, called fields. Fields may be primitive types. JSON is used as the common interchange format and although not all activities must be serialized to JSON at all times, they must be serializable to it. This allows implementations to rely on a simple set of conventions for handling known and unknown activity fields.\n\n`A2001`: Activities MUST be serializable to the JSON format defined in [RFC 4627](http://www.ietf.org/rfc/rfc4627.txt) [[15](#references)], including adherence to e.g. field uniqueness constraints.\n\n`A2002`: Receivers MAY allow improperly-cased field names, although this is not required. Receivers MAY reject activities that do not include fields with the proper casing.\n\n`A2004`: Unless otherwise noted, senders SHOULD NOT include empty string values for string fields.\n\n`A2005`: Unless otherwise noted, senders MAY include additional fields within the activity or any nested complex objects. Receivers MUST accept fields they do not understand.\n\n`A2006`: Receivers SHOULD accept events of types they do not understand.\n\nThis document defines data types for fields used within the Activity object. These type definitions include a syntactic type (e.g. `string` or `complex type`) and in the case of strings, an optional format (e.g. [ISO 8601 date time format](https://www.iso.org/iso-8601-date-and-time-format.html) [[3](#references)]).\n\n`A2007`: Senders MUST adhere to data type definitions contained in this document.\n\n`A2003`: Receivers SHOULD reject activities that contain field values whose types do not match the data types described in this specification.\n\n### Type\n\nThe `type` field controls the meaning of each activity, and are by convention short strings (e.g. \"`message`\"). Senders may define their own application-layer types, although they are encouraged to choose values that are unlikely to collide with future well-defined values. If senders use URIs as type values, they SHOULD NOT implement URI ladder comparisons to establish equivalence.\n\n`A2010`: Activities MUST include a `type` field, with string value type.\n\n`A2011`: Two `type` values are equivalent only if they are ordinally identical.\n\n`A2012`: A sender MAY generate activity `type` values not defined in this document.\n\n`A2013`: A channel SHOULD reject activities of type it does not understand.\n\n`A2014`: A bot or client SHOULD ignore activities of type it does not understand.\n\n### Channel ID\n\nThe `channelId` field establishes the channel and authoritative store for the activity. The value of the `channelId` field is of type string.\n\n`A2020`: Activities MUST include a `channelId` field, with string value type.\n\n`A2021`: Two `channelId` values are equivalent only if they are ordinally identical.\n\n`A2022`: A channel MAY ignore or reject any activity it receives without an expected `channelId` value.\n\n### ID\n\nThe `id` field establishes the identity for the activity once it has been recorded in the channel. Activities in-flight that have not yet been recorded do not have identities. Not all activities are assigned identities (for example, a [typing activity](#typing-activity) may never be assigned an `id`.) The value of the `id` field is of type string.\n\n`A2030`: Channels SHOULD include an `id` field if it is available for that activity.\n\n`A2031`: Clients and bots SHOULD NOT include an `id` field in activities they generate.\n\nFor ease of implementation, it should be assumed that other participants do not have sophisticated knowledge of activity IDs, and that they will use only ordinal comparison to establish equivalency.\n\nFor example, a channel may use hex-encoded GUIDs for each activity ID. Even though GUIDs encoded in uppercase are logically equivalent to GUIDs encoded in lowercase, senders SHOULD NOT use these alternative encodings when possible. The normalized version of each ID is established by the authoritative store, the channel.\n\n`A2032`: When generating `id` values, senders SHOULD choose values whose equivalency can be established by ordinal comparison. However, senders and receivers MAY allow logical equivalence of two values that are not ordinally equivalent if they have special knowledge of the circumstances.\n\nThe `id` field is designed to allow de-duplication, but this is prohibitive in most applications.\n\n`A2033`: Receivers MAY de-duplicate activities by ID, however senders SHOULD NOT rely on receivers performing this de-duplication.\n\n### Timestamp\n\nThe `timestamp` field records the exact UTC time when the activity occurred. Due to the distributed nature of computing systems, the important time is when the channel (the authoritative store) records the activity. The time when a client or bot initiated an activity may be transmitted separately in the `localTimestamp` field. The value of the `timestamp` field is an ISO 8601 [[3](#references)] encoded datetime within a string.\n\n`A2040`: Channels SHOULD include a `timestamp` field if it is available for that activity.\n\n`A2041`: Clients and bots SHOULD NOT include a `timestamp` field in activities they generate.\n\n`A2042`: Clients and bots SHOULD NOT use `timestamp` to reject activities, as they may appear out-of-order. However, they MAY use `timestamp` to order activities within a UI or for downstream processing.\n\n`A2043`: Senders SHOULD always use encode the value of `timestamp` fields as UTC, and they SHOULD always include Z as an explicit UTC mark within the value.\n\n### Local timezone\nThe `localTimezone` field expresses the timezone where the activity was generated. The value of the `localTimezone` field is a time zone name (zone entry) per the IANA Time Zone database. [[15](#references)]\n\n`A2055`: Clients MAY include the `localTimezone` in their activities.\n\n`A2056`: Channels SHOULD preserve `localTimezone` when forwarding activities from a sender to recipient(s).\n\n`A2057`: A receiver MAY ignore `localTimezone` values it does not understand.\n\n### Local timestamp\n\nThe `localTimestamp` field expresses the datetime and timezone offset where the activity was generated. This may be different from the UTC `timestamp` where the activity was recorded. The value of the `localTimestamp` field is an ISO 8601 [[3](#references)] encoded datetime within a string.\n\nWhen both the `localTimezone` and `localTimestamp` fields are included in an activity, the interpretation is to first convert the value of the localTimestamp to UTC and then apply a conversion to the local timezone.\n\n`A2050`: Clients and bots MAY include the `localTimestamp` field in their activities. They SHOULD explicitly list the timezone offset within the encoded value.\n\n`A2051`: Channels SHOULD preserve `localTimestamp` when forwarding activities from a sender to recipient(s).\n\n### From\n\nThe `from` field describes which client, bot, or channel generated an activity. The value of the `from` field is a complex object of the [Channel account](#channel-account) type.\n\nThe `from.id` field identifies who generated an activity. Most commonly, this is another user or bot within the system. In some cases, the `from` field identifies the channel itself.\n\n`A2060`: Channels MUST include the `from` and `from.id` fields when generating an activity.\n\n`A2061`: Bots and clients SHOULD include the `from` and `from.id` fields when generating an activity. A channel MAY reject an activity due to missing `from` and `from.id` fields.\n\nThe `from.name` field is optional and represents the display name for the account within the channel. Channels SHOULD include this value so clients and bots can populate their UIs and backend systems. Bots and clients SHOULD NOT send this value to channels that have a central record of this store, but they MAY send this value to channels that populate the value on every activity (e.g. an email channel).\n\n`A2062`: Channels SHOULD include the `from.name` field if the `from` field is present and `from.name` is available.\n\n`A2063`: Bots and clients SHOULD NOT include the `from.name` field unless it is semantically valuable within the channel.\n\n### Recipient\n\nThe `recipient` field describes which client or bot is receiving this activity. This field is only meaningful when an activity is transmitted to exactly one recipient; it is not meaningful when it is broadcast to multiple recipients (as happens when an activity is sent to a channel). The purpose of the field is to allow the recipient to identify themselves. This is helpful when a client or bot has more than one identity within the channel. The value of the `recipient` field is a complex object of the [Channel account](#channel-account) type.\n\n`A2070`: Channels MUST include the `recipient` and `recipient.id` fields when transmitting an activity to a single recipient.\n\n`A2071`: Bots and clients SHOULD NOT include the `recipient` field when generating an activity. The exception to this is when sending a [Suggestion activity](#suggestion-activity), in which case the recipient MUST identify the user that should receive the suggestion.\n\nThe `recipient.name` field is optional and represents the display name for the account within the channel. Channels SHOULD include this value so clients and bots can populate their UIs and backend systems.\n\n`A2072`: Channels SHOULD include the `recipient.name` field if the `recipient` field is present and `recipient.name` is available.\n\n### Conversation\n\nThe `conversation` field describes the conversation in which the activity exists. The value of the `conversation` field is a complex object of the [Conversation account](#conversation-account) type.\n\n`A2080`: Channels, bots, and clients MUST include the `conversation` and `conversation.id` fields when generating an activity.\n\nThe `conversation.name` field is optional and represents the display name for the conversation if it exists and is available.\n\n`A2081`: Channels SHOULD include the `conversation.name` and `conversation.isGroup` fields if they are available.\n\n`A2082`: Bots and clients SHOULD NOT include the `conversation.name` field unless it is semantically valuable within the channel.\n\n`A2083`: Bots and clients SHOULD NOT include the `conversation.isGroup` and `conversation.converationType` fields in activities they generate.\n\n`A2084`: Channels SHOULD include the `conversation.conversationType` field if more than one value is defined for the channel. Channels SHOULD NOT include the field if there is only one possible value.\n\n### Reply to ID\n\nThe `replyToId` field identifies the prior activity to which the current activity is a reply. This field allows threaded conversation and comment nesting to be communicated between participants. `replyToId` is valid only within the current conversation. (See [relatesTo](#relates-to) for references to other conversations.) The value of the `replyToId` field is a string.\n\n`A2090`: Senders SHOULD include `replyToId` on an activity when it is a reply to another activity.\n\n`A2091`: A channel MAY reject an activity if its `replyToId` does not reference a valid activity within the conversation.\n\n`A2092`: Bots and clients MAY omit `replyToId` if it knows the channel does not make use of the field, even if the activity being sent is a reply to another activity.\n\n### Entities\n\nThe `entities` field contains a flat list of metadata objects pertaining to this activity. Unlike attachments (see the [attachments](#attachments) field), entities do not necessarily manifest as user-interactable content elements, and are intended to be ignored if not understood. Senders may include entities they think may be useful to a receiver even if they are not certain the receiver can accept them. The value of each `entities` list element is a complex object of the [Entity](#entity) type.\n\n`A2100`: Senders SHOULD omit the `entities` field if it contains no elements.\n\n`A2101`: Senders MAY send multiple entities of the same type, provided the entities have distinct meaning.\n\n`A2102`: Senders MUST NOT include two or more entities with identical types and contents.\n\n`A2103`: Senders and receivers SHOULD NOT rely on specific ordering of the entities included in an activity.\n\n`A2104`: Receivers MUST ignore entities whose types they do not understand.\n\n`A2105`: Receivers SHOULD ignore entities whose type they understand but are unable to process due to e.g. syntactic errors.\n\n### Channel data\n\nExtensibility data in the activity schema is organized principally within the `channelData` field. This simplifies plumbing in SDKs that implement the protocol. The format of the `channelData` object is defined by the channel sending or receiving the activity.\n\n`A2200`: Channels SHOULD NOT define `channelData` formats that are JSON primitives (e.g., strings, ints). Instead, they SHOULD define `channelData` as a complex type, or leave it undefined.\n\n`A2201`: If the `channelData` format is undefined for the current channel, receivers SHOULD ignore the contents of `channelData`.\n\n### Caller ID\n\nIn some cases, it's important to record where an activity was sent. The `callerId` field is a string containing an [IRI](https://tools.ietf.org/html/rfc3987) [[4](#references)] identifying the caller of a bot, described in more detail in [Appendix V](#appendix-v---caller-id-values). This field is not intended to be transmitted over the wire, but is instead populated by bots and clients based on cryptographically verifiable data that asserts the identity of the callers (e.g. tokens).\n\n`A2250`: Senders SHOULD NOT populate the `callerId` field.\n\n`A2251`: Receivers SHOULD discard any data included in the `callerId` field on the wire.\n\n`A2252`: Bots SHOULD, after receiving an Activity, populate its `callerId` field with an identifier described in [Appendix V](#appendix-v---caller-id-values)\n\n### Service URL\n\nActivities are frequently sent asynchronously, with separate transport connections for sending and receiving traffic. The `serviceUrl` field is used by channels to denote the URL where replies to the current activity may be sent. The value of the `serviceUrl` field is of type string.\n\n`A2300`: Channels MUST include the `serviceUrl` field in all activities they send to bots.\n\n`A2301`: Channels SHOULD NOT include the `serviceUrl` field to clients who demonstrate they already know the channel's endpoint.\n\n`A2302`: Bots and clients SHOULD NOT populate the `serviceUrl` field in activities they generate.\n\n`A2302`: Channels MUST ignore the value of `serviceUrl` in activities sent by bots and clients.\n\n`A2304`: Channels SHOULD use stable values for the `serviceUrl` field as bots may persist them for long periods.\n\n## Message activity\n\nMessage activities represent content intended to be shown within a conversational interface. Message activities may contain text, speech, interactive cards, and binary or unknown attachments; typically channels require at most one of these for the message activity to be well-formed.\n\nMessage activities are identified by a `type` value of `message`.\n\n### Text\n\nThe `text` field contains text content, either in the Markdown format, XML, or as plain text. The format is controlled by the [`textFormat`](#text-Format) field as is plain if unspecified or ambiguous. The value of the `text` field is of type string.\n\n`A3000`: The `text` field MAY contain an empty string to indicate sending text without contents.\n\n`A3001`: Channels SHOULD handle `markdown`-formatted text in a way that degrades gracefully for that channel.\n\n### Text format\n\nThe `textFormat` field denotes whether the [`text`](#text) field should be interpreted as [Markdown](https://daringfireball.net/projects/markdown/) [[5](#references)], plain text, or XML. The value of the `textFormat` field is of type string, with defined values of `markdown`, `plain`, and `xml`. The default value is `plain`. This field is not designed to be extended with arbitrary values.\n\nThe `textFormat` field controls additional fields within attachments etc. This relationship is described within those fields, elsewhere in this document.\n\n`A3010`: If a sender includes the `textFormat` field, it SHOULD only send defined values.\n\n`A3011`: Senders SHOULD omit `textFormat` if the value is `plain`.\n\n`A3012`: Receivers SHOULD interpret undefined values as `plain`.\n\n`A3013`: Bots and clients SHOULD NOT send the value `xml` unless they have prior knowledge that the channel supports it, and the characteristics of the supported XML dialect.\n\n`A3014`: Channels SHOULD NOT send `markdown` or `xml` contents to bots.\n\n`A3015`: Channels SHOULD accept `textformat` values of at least `plain` and `markdown`.\n\n`A3016`: Channels MAY reject `textformat` of value `xml`.\n\n### Locale\n\nThe `locale` field communicates the language code of the [`text`](#text) field. The value of the `locale` field is an [IETF BCP-47](https://tools.ietf.org/html/bcp47) [[19](#references)] language tag within a string.\n\n`A3020`: Receivers SHOULD treat missing and unknown values of the `locale` field as unknown.\n\n`A3021`: Receivers SHOULD NOT reject activities with unknown locale.\n\n### Speak\n\nThe `speak` field indicates how the activity should be spoken via a text-to-speech system. The field is only used to customize speech rendering when the default is deemed inadequate. It replaces speech synthesis for any content within the activity, including text, attachments, and summaries. The value of the `speak` field is either plain text or [SSML](https://www.w3.org/TR/speech-synthesis/) [[7](#references)] encoded within a string.\n\n`A3030`: The `speak` field MAY contain an empty string to indicate no speech should be generated.\n\n`A3031`: Receivers unable to generate speech SHOULD ignore the `speak` field.\n\n`A3033`: Receivers SHOULD NOT use XML DTD or schema resolution to include remote resources from outside the communicated XML fragment.\n\n`A3034`: Channels SHOULD NOT send the `speak` field to bots.\n\n`A3035`: Receivers generating speech from an Activity with a missing or null `speak` field SHOULD render message contents such as [`text`](#text) and [`summary`](#summary) instead.\n\n### Input hint\n\nThe `inputHint` field indicates whether or not the generator of the activity is anticipating a response. This field is used predominantly within channels that have modal user interfaces, and is typically not used in channels with continuous chat feeds. The value of the `inputHint` field is of type string, with defined values of `accepting`, `expecting`, and `ignoring`. The default value is `accepting`.\n\n`A3040`: If a sender includes the `inputHint` field, it SHOULD only send defined values.\n\n`A3041`: If sending an activity to a channel where `inputHint` is used, bots SHOULD include the field, even when the value is `accepting`.\n\n`A3042`: Receivers SHOULD interpret undefined values as `accepting`.\n\n### Attachments\n\nThe `attachments` field contains a flat list of objects to be displayed as part of this activity. The value of each `attachments` list element is a complex object of the [Attachment](#attachment) type.\n\n`A3050`: Senders SHOULD omit the `attachments` field if it contains no elements.\n\n`A3051`: Senders MAY send multiple entities of the same type.\n\n`A3052`: Receivers MAY treat attachments of unknown types as downloadable documents.\n\n`A3053`: Receivers SHOULD preserve the ordering of attachments when processing content, except when rendering limitations force changes, e.g. grouping of documents after images.\n\n### Attachment layout\n\nThe `attachmentLayout` field instructs user interface renderers how to present content included in the [`attachments`](#attachments) field. The value of the `attachmentLayout` field is of type string, with defined values of `list` and `carousel`. The default value is `list`.\n\n`A3060`: If a sender includes the `attachmentLayout` field, it SHOULD only send defined values.\n\n`A3061`: Receivers SHOULD interpret undefined values as `list`.\n\n### Summary\n\nThe `summary` field contains text used to replace [`attachments`](#attachments) on channels that do not support them. The value of the `summary` field is of type string.\n\n`A3070`: Receivers SHOULD consider the `summary` field to logically follow the `text` field.\n\n`A3071`: Channels SHOULD NOT send the `summary` field to bots.\n\n`A3072`: Channels able to process all attachments within an activity SHOULD ignore the `summary` field.\n\n### Suggested actions\n\nThe `suggestedActions` field contains a payload of interactive actions that may be displayed to the user. Support for `suggestedActions` and their manifestation depends heavily on the channel. The value of the `suggestedActions` field is a complex object of the [Suggested actions](#suggested-actions-2) type.\n\n### Value\n\nThe `value` field contains a programmatic payload specific to the activity being sent. Its meaning and format are defined in other sections of this document that describe its use.\n\n`A3080`: Senders SHOULD NOT include `value` fields of primitive types (e.g. string, int). `value` fields SHOULD be complex types or omitted.\n\n### Expiration\n\nThe `expiration` field contains a time at which the activity should be considered to be \"expired\" and should not be presented to the recipient. The value of the `expiration` field is an ISO 8601 [[3](#references)] encoded datetime within a string.\n\n`A3090`: Senders SHOULD always use encode the value of `expiration` fields as UTC, and they SHOULD always include Z as an explicit UTC mark within the value.\n\n### Importance\n\nThe `importance` field contains an enumerated set of values to signal to the recipient the relative importance of the activity. It is up to the receiver to map these importance hints to the user experience. The value of the `importance` field is of type string, with defined values of `low`, `normal` and `high`. The default value is `normal`.\n\n`A3100`: If a sender includes the `importance` field, it SHOULD only send defined values.\n\n`A3101`: Receivers SHOULD interpret undefined values as `normal`.\n\n### Delivery mode\n\nThe `deliveryMode` field contains any one of an enumerated set of values to signal to the recipient alternate delivery paths for the activity or response. The value of the `deliveryMode` field is of type string, with defined values of `normal`, `notification` and `expectReplies`. The default value is `normal`.\n\nActivities with a `deliveryMode` of `expectReplies` differ only in their requirement to return a response payload back to the caller synchronously, as a direct response to the initial request.\n \n`A3110`: If a sender includes the `deliveryMode` field, it SHOULD only send defined values.\n\n`A3111`: Receivers SHOULD interpret undefined values as `normal`.\n\n`A3112`: Receivers SHOULD reject activities with `deliveryMode` of `expectReplies` if they do not support synchronous responses.\n\n`A3113`: Receivers SHOULD NOT reply with asynchronous responses to activities with `deliveryMode` of `expectReplies`.\n\n`A3114`: Senders MUST NOT include `deliveryMode` of `expectReplies` on Invoke activities unless the Invoke profile explicitly allows and describes its behavior.\n\n`A3115`: Senders MUST establish whether a receiver understands `deliveryMode` of `expectReplies` prior to sending activities with that value.\n\n`A3116`: Bots SHOULD NOT send activities with `deliveryMode` of `expectReplies` to channels.  \n\n### Listen for\n\nThe `listenFor` field contains a list of terms or references to term sources that speech and language processing systems can listen for. The value of the `listenFor` field is an array of strings whose format is defined in [Appendix IV](#appendix-iv---priming-format).\n\nA missing `listenFor` field indicates default priming behavior should be used. The default is defined by the channel and may depend on variables such as the identity of the user and the bot.\n\n`A3120`: Channels SHOULD NOT populate the `listenFor` field.\n\n`A3121`: Bots SHOULD send `listenFor` contents that reflect the complete set of utterances expected from users, not just the utterances in response to the content in the message in which the `listenFor` is included.\n\n### Semantic action\n\nThe `semanticAction` field contains an optional programmatic action accompanying the user request. The semantic action field is populated by the channel and bot based on some understanding of what the user is trying to accomplish; this understanding may be achieved with natural language processing, additional user interface elements tied specifically to these actions, through a process of conversational refinement, or contextually via other means. The meaning and structure of the semantic action is agreed ahead of time between the channel and the bot.\n\nThe value of the `semanticAction` field is a complex object of the [semantic action](#semantic-action-type) type.\n\n`A3130`: Channels and bots MAY populate the `semanticAction` field. Other senders SHOULD NOT populate the `semanticAction` field.\n\nInformation within the semantic action field is meant to augment, not replace, existing content within the activity. A well-formed semantic action has a defined name, corresponding well-formed entities, and matches the user's intent in generating the activity.\n\n`A3131`: Senders SHOULD NOT remove any content used to generate the `semanticAction` field.\n\n`A3132`: Receivers MAY ignore parts or all of the `semanticAction` field.\n\n`A3133`: Receivers MUST ignore `semanticAction` fields they cannot parse or do not understand.\n\nSemantic actions are sometimes used to indicate a change in which participant controls the conversation. For example, a channel may use actions during an exchange with a skill. When so defined, skills can relinquish control through the [handoff activity](#handoff-activity) after the final `semanticAction` `state` is `done`.\n\n`A3135`: Channels MAY define the use of [handoff activity](#handoff-activity) in conjunction with semantic actions.\n\n`A3136`: Bots MAY use semantic action and [handoff activity](#handoff-activity) internally to coordinate conversational focus between components of the bot.\n\n## Contact relation update activity\n\nContact relation update activities signal a change in the relationship between the recipient and a user within the channel. Contact relation update activities generally do not contain user-generated content. The relationship update described by a contact relation update activity exists between the user in the `from` field (often, but not always, the user initiating the update) and the user or bot in the `recipient` field.\n\nContact relation update activities are identified by a `type` value of `contactRelationUpdate`.\n\n### Action\n\nThe `action` field describes the meaning of the contact relation update activity. The value of the `action` field is a string. Only values of `add` and `remove` are defined, which denote a relationship between the users/bots in the `from` and `recipient` fields.\n\n## Conversation update activity\n\nConversation update activities describe a change in a conversation's members, description, existence, or otherwise. Conversation update activities generally do not contain user-generated content. The conversation being updated is described in the `conversation` field.\n\nConversation update activities are identified by a `type` value of `conversationUpdate`.\n\n`A4100`: Senders MAY include zero or more of `membersAdded`, `membersRemoved`, `topicName`, and `historyDisclosed` fields in a conversation update activity.\n\n`A4101`: Each `channelAccount` (identified by `id` field) SHOULD appear at most once within the `membersAdded` and `membersRemoved` fields. An ID SHOULD NOT appear in both fields. An ID SHOULD NOT be duplicated within either field.\n\n`A4102`: Channels SHOULD NOT use conversation update activities to indicate changes to a channel account's fields (e.g., `name`) if the channel account was not added to or removed from the conversation.\n\n`A4103`: Channels SHOULD NOT send the `topicName` or `historyDisclosed` fields if the activity is not signaling a change in value for either field.\n\n### Members added\n\nThe `membersAdded` field contains a list of channel participants (bots or users) added to the conversation. The value of the `membersAdded` field is an array of type [`channelAccount`](#channel-account).\n\n### Members removed\n\nThe `membersRemoved` field contains a list of channel participants (bots or users) removed from the conversation. The value of the `membersRemoved` field is an array of type [`channelAccount`](#channel-account).\n\n### Topic name\n\nThe `topicName` field contains the text topic or description for the conversation. The value of the `topicName` field is of type string.\n\n### History disclosed\n\nThe `historyDisclosed` field is deprecated.\n\n`A4110`: Senders SHOULD NOT include the `historyDisclosed` field.\n\n## End of conversation activity\n\nEnd of conversation activities signal the end of a conversation from the recipient's perspective. This may be because the conversation has been completely ended, or because the recipient has been removed from the conversation in a way that is indistinguishable from it ending. The conversation being ended is described in the `conversation` field.\n\nEnd of conversation activities are identified by a `type` value of `endOfConversation`.\n\nBoth the `code` and the `text` fields are optional.\n\n### Code\n\nThe `code` field contains a programmatic value describing why or how the conversation was ended. The value of the `code` field is of type string and its meaning is defined by the channel sending the activity.\n\n### Text\n\nThe `text` field contains optional text content to be communicated to a user. The value of the `text` field is of type string, and its format is plain text.\n\n## Event activity\n\nEvent activities communicate programmatic information from a client or channel to a bot. The meaning of an event activity is defined by the `name` field, which is meaningful within the scope of a channel. Event activities are designed to carry both interactive information (such as button clicks) and non-interactive information (such as a notification of a client automatically updating an embedded speech model).\n\nEvent activities are the asynchronous counterpart to [invoke activities](#invoke-activity). Unlike invoke, event is designed to be extended by client application extensions.\n\nEvent activities are identified by a `type` value of `event` and specific values of the `name` field.\n\n`A5000`: Channels MAY allow application-defined event messages between clients and bots, if the clients allow application customization.\n\n### Name\n\nThe `name` field controls the meaning of the event and the schema of the `value` field. The value of the `name` field is of type string.\n\n`A5001`: Event activities MUST contain a `name` field.\n\n`A5002`: Receivers MUST ignore event activities with `name` fields they do not understand.\n\n### Value\n\nThe `value` field contains parameters specific to this event, as defined by the event name. The value of the `value` field is a complex type.\n\n`A5100`: The `value` field MAY be missing or empty, if defined by the event name.\n\n`A5101`: Extensions to the event activity SHOULD NOT require receivers to use any information other than the activity `type` and `name` fields to understand the schema of the `value` field.\n\n### Relates to\n\nThe `relatesTo` field references another conversation, and optionally a specific activity within that conversation. The value of the `relatesTo` field is a complex object of the [Conversation reference](#conversation-reference) type.\n\n`A5200`: `relatesTo` SHOULD NOT reference an activity within the conversation identified by the `conversation` field.\n\n## Invoke activity\n\nInvoke activities communicate programmatic information from a client or channel to a bot, and have a corresponding return payload for use within the channel. The meaning of an invoke activity is defined by the `name` field, which is meaningful within the scope of a channel.\n\nInvoke activities are the synchronous counterpart to [event activities](#event-activity). Event activities are designed to be extensible. Invoke activities differ only in their ability to return response payloads back to the channel; because the channel must decide where and how to process these response payloads, Invoke is useful only in cases where explicit support for each invoke name has been added to the channel. Thus, Invoke is not designed to be a generic application extensibility mechanism.\n\nInvoke activities are identified by a `type` value of `invoke` and specific values of the `name` field.\n\nThe list of defined Invoke activities is included in [Appendix III](#appendix-iii---protocols-using-the-invoke-activity).\n\n`A5301`: Channels SHOULD NOT allow application-defined invoke messages between clients and bots.\n\n### Name\n\nThe `name` field controls the meaning of the invocation and the schema of the `value` field. The value of the `name` field is of type string.\n\n`A5401`: Invoke activities MUST contain a `name` field.\n\n`A5402`: Receivers MUST ignore event activities with `name` fields they do not understand.\n\n### Value\n\nThe `value` field contains parameters specific to this event, as defined by the event name. The value of the `value` field is a complex type.\n\n`A5500`: The `value` field MAY be missing or empty, if defined by the event name.\n\n`A5501`: Extensions to the event activity SHOULD NOT require receivers to use any information other than the activity `type` and `name` fields to understand the schema of the `value` field.\n\n### Relates to\n\nThe `relatesTo` field references another conversation, and optionally a specific activity within that conversation. The value of the `relatesTo` field is a complex object of the [Conversation reference](#conversation-reference) type.\n\n`A5600`: `relatesTo` SHOULD NOT reference an activity within the conversation identified by the `conversation` field.\n\n## Installation update activity\n\nInstallation update activities represent an installation or uninstallation of a bot within an organizational unit (such as a customer tenant or \"team\") of a channel. Installation update activities generally do not represent adding or removing a channel.\n\nInstallation update activities are identified by a `type` value of `installationUpdate`.\n\n`A5700`: Channels MAY send installation activities when a bot is added to or removed from a tenant, team, or other organization unit within the channel.\n\n`A5701`: Channels SHOULD NOT send installation activities when the bot is installed into or removed from a channel.\n\n### Action\n\nThe `action` field describes the meaning of the installation update activity. The value of the `action` field is a string. Only values of `add` and `remove` are defined.\n\n## Message delete activity\n\nMessage delete activities represent a deletion of an existing message activity within a conversation. The deleted activity is referred to by the `id` and `conversation` fields within the activity.\n\nMessage delete activities are identified by a `type` value of `messageDelete`.\n\n`A5800`: Channels MAY elect to send message delete activities for all deletions within a conversation, a subset of deletions within a conversation (e.g. only deletions by certain users), or no activities within the conversation.\n\n`A5801`: Channels SHOULD NOT send message delete activities for conversations or activities that the bot did not observe.\n\n`A5802`: If a bot triggers a delete, the channel SHOULD NOT send a message delete activity back to that bot.\n\n`A5803`: Channels SHOULD NOT send message delete activities corresponding to activities whose type is not `message`.\n\n## Message update activity\n\nMessage update activities represent an update of an existing message activity within a conversation. The updated activity is referred to by the `id` and `conversation` fields within the activity, and the message update activity contains all fields in the revised message activity.\n\nMessage update activities are identified by a `type` value of `messageUpdate`.\n\n`A5900`: Channels MAY elect to send messageUpdate  activities for all updates within a conversation, a subset of updates within a conversation (e.g. only updates by certain users), or no activities within the conversation.\n\n`A5901`: If a bot triggers an update, the channel SHOULD NOT send a message update activity back to that bot.\n\n`A5902`: Channels SHOULD NOT send message update activities corresponding to activities whose type is not `message`.\n\n## Message reaction activity\n\nMessage reaction activities represent a social interaction on an existing message activity within a conversation. The original activity is referred to by the `id` and `conversation` fields within the activity. The `from` field represents the source of the reaction (i.e., the user that reacted to the message).\n\nMessage reaction activities are identified by a `type` value of `messageReaction`.\n\n### Reactions added\n\nThe `reactionsAdded` field contains a list of reactions added to this activity. The value of the `reactionsAdded` field is an array of type [`messageReaction`](#message-reaction).\n\n### Reactions removed\n\nThe `reactionsRemoved` field contains a list of reactions removed from this activity. The value of the `reactionsRemoved` field is an array of type [`messageReaction`](#message-reaction).\n\n## Suggestion activity\n\nSuggestion activities allow a bot to send content targeting a single user in the conversation which refers to a previous activity and suggests content that augments it. The suggested content is a superset of the [message activity](#message-activity), and fields present on the message activity are schematically valid on the suggestion activity. The channel in which the suggestion activity is sent defines limitations on text or attachment content, and these limitations may differ from the channel's limitations on message activities. The suggestion activity includes the `textHighlights` property so that the suggestions can be surfaced as annotations to the original content in the source activity.\n\nFor example: an message activity with the text \"...we should meet on Monday to review this plan...\" could cause a bot to send a suggestion activity which refers to that section of text and offers the user an affordance to create a meeting on their calendar. Some channels use this information to highlight and turn into a hot link the snippet of text to show the suggestion in context.\n\nSuggestion activities are identified by a `type` value of `suggestion`. Suggestion activities refer to another activity by using the [`replyToId`](#reply-to-ID) property.\n\n`A6100`: If there is no `replyToId` then the suggested content should be shown to the recipient as a normal message activity.\n\nSuggestion activity uses the [`recipient`](#recipient) field to signal which user the suggestion is for.\n\nAll `textHighlight` objects are relative to the activity specified by the `replyToId` property.  There can be multiple `textHighlight` provided, allowing a client the option to turn different sections of the text into links which would show the suggestion content.\n\n`A6101`: Bots MAY use `replyToId` and `textHighlights` to associate the suggestion with an activity.\n\n`A6102`: Channels MAY use `replyToId` and `textHighlights` to show the suggestion activity contextually to the recipient.\n\n`A6103`: Channels MUST only show the suggestion activity to the recipient. If unable to identify the intended recipient or show the content only to them, the channel MUST drop the activity.\n\n`A6104`: Channels SHOULD NOT send suggestion activities to bots.\n\n### Suggestion activity text highlights\n\nThe `textHighlights` field contains a list of text to highlight in the `text` field of the activity referred to by `replyToId`. The value of the `textHighlights` field is an array of type [`textHighlight`](#text-highlight).\n\n## Trace activity\n\nThe Trace activity is an activity which the developer inserts in to the stream of activities to represent a point in the developers bot logic. The trace activity typically is logged by transcript history components to become part of a [Transcript-format](../transcript/transcript.md) history file.  In remote debugging scenarios the Trace activity can be sent to the client so that the activity can be inspected as part of the debug flow.\n\nTrace activities are normally not shown to the user, and are internal to transcript logging and developer debugging.\n\nTrace  activities are identified by a `type` value of `trace`.\n\n`A6150`: channels SHOULD NOT display trace activities to the user, unless the user has identified itself as the developer in a secure manner.\n\n### Name\n\nThe `name` field controls the name of the trace operation. The value of the `name` field is of type string.\n\n`A6151`: Trace activities MAY contain a `name` field.\n\n`A6152`: Receivers MUST ignore event activities with `name` fields they do not understand.\n\n### Label\n\nThe `label` field contains optional a label which can provide contextual information about the trace. The value of the `label` field is of type string.\n\n`A6153`: Trace activities MAY contain a `label` field.\n\n### ValueType\n\nThe `valueType` field is a string type which contains a unique value which identifies the shape of the `value` object for this trace.\n\n`A6154`: The `valueType` field MAY be missing or empty, if the `name` property is sufficient to understand the shape of the `value` property.\n\n### Value\n\nThe `value` field contains an object for this trace, as defined by the `valueType` or `name` property if there is no `valueType`. The value of the `value` field is a complex type.\n\n`A6155`: The `value` field MAY be missing or empty.\n\n`A6156`: Extensions to the trace activity SHOULD NOT require receivers to use any information other than the activity `type` and `name` or `valueType` field to understand the schema of the `value` field.\n\n### Relates to\n\nThe `relatesTo` field references another conversation, and optionally a specific activity within that conversation. The value of the `relatesTo` field is a complex object of the [Conversation reference](#conversation-reference) type.\n\n`A6157`: `relatesTo` MAY reference an activity within the conversation identified by the `conversation` field.\n\n## Typing activity\n\nTyping activities represent ongoing input from a user or a bot. This activity is often sent when keystrokes are being entered by a user, although it's also used by bots to indicate they're \"thinking,\" and could also be used to indicate e.g. collecting audio from users.\n\nTyping activities are intended to persist within UIs for three seconds.\n\nTyping activities are identified by a `type` value of `typing`.\n\n`A6000`: If able, clients SHOULD display typing indicators for three seconds upon receiving a typing activity.\n\n`A6001`: Unless otherwise known for the channel, senders SHOULD NOT send typing activities more frequently than one every three seconds. (Senders MAY send typing activities every two seconds to prevent gaps from appearing.)\n\n`A6002`: If a channel assigns an [`id`](#id) to a typing activity, it MAY allow bots and clients to delete the typing activity before its expiration.\n\n`A6003`: If able, channels SHOULD send typing activities to bots.\n\n## Handoff activity\n\nHandoff activities are used to request or signal a change in focus between elements inside a bot. They are not intended to be used in wire communication (besides internal communication that occurs between services in a distributed bot).\n\nHandoff activities are identified by a `type` value of `handoff`.\n\n`A6200`: Channels SHOULD drop handoff activities if they are not supported.\n\n## Command activity\n\nCommand activities communicate a request to perform a specific action. They are identified by a `type` value of `command` and specific values of the `name` field. \n\nCommands look similar in structure to events but have different semantics. Commands are requests to perform an action and receivers typically respond with one or more commandResult activities. Receivers are also expected to explicitly reject unsupported command activities.\n\n`A6300`: Channels MAY allow application-defined command activities between clients and bots, if the clients allow application customization.\n\n`A6301`: Application-defined command activities MUST be declared in the `application/*` namespace.\n\n`A6302`: Command activities outside the `application/*` are considered reserved for Bot Framework Protocols.\n\nThe list of all Bot Framework protocols using command activities is included in [Appendix VI](#appendix-vi---protocols-using-the-command-activity).\n\n### Name\n\nThe `name` field defines the meaning of the command activity. The value of the `name` field is of type string.\n\n`A6310`: Command activities MUST contain a `name` field.\n\n`A6311`: The `name` of a command activity MUST use a [MIME media type](https://www.iana.org/assignments/media-types/media-types.xhtml) [[9](#references)] format.\n\n`A6312`: Receivers MUST ignore command activities with missing or invalid `name` field.\n\nThe recommended patterns for rejecting command activities are included in [Appendix VI](#appendix-vi---protocols-using-the-command-activity).\n\n### Value\n\nThe `value` field contains the command metadata and parameters specific to a command, as defined by the command `name`. The `value` field is a complex object of the [command value](#command-value) type.\n\n`A6321`: Command activities MUST contain a `value` field. \n\n`A6322`: Receivers MUST ignore command activities with missing or invalid `value` field.\n\n## Command result activity\n\nCommand result activities communicate the result of a [command activity](#command-activity). \n\nCommand result activities are identified by a `type` value of `commandResult` and specific values of the `name` field. The `name` field of a command result is always set to the `name` of the original command activity. \n\n`A6400`: Senders MAY send one or more command result activities to communicate the result of the command.\n\n### Name\n\nThe `name` field defines the meaning of the command result activity. The value of the `name` field is of type string.\n\n`A6411`: Command result activities MUST contain a `name` field. \n\n`A6412`: Receivers MUST ignore command activities with missing or invalid `name` field.\n\n`A6413`: The `name` of a command result activity MUST be the same as the `name` of the original command activity.\n\n### Value\n\nThe `value` field contains the command metadata and additional information specific to a command result, as defined by the command result `name`. The value of the `value` field is a complex object of type [command result value](#command-result-value) type.\n\n`A6421`: Command result activities MUST contain a `value` field. \n\n`A6422`: Receivers MUST reject command result activities with missing or invalid `value` field.\n\n## Complex types\n\nThis section defines complex types used within the activity schema, described above.\n\n### Attachment\n\nAttachments are content included within a [message activity](#message-activity): cards, binary documents, and other interactive content. They're intended to be displayed in conjunction with text content. Content may be sent via URL data URI within the `contentUrl` field, or inline in the `content` field.\n\n`A7100`: Senders SHOULD NOT include both `content` and `contentUrl` fields in a single attachment.\n\n#### Content type\n\nThe `contentType` field describes the [MIME media type](https://www.iana.org/assignments/media-types/media-types.xhtml) [[9](#references)] of the content of the attachment. The value of the `contentType` field is of type string.\n\n#### Content\n\nWhen present, the `content` field contains a structured JSON object attachment. The value of the `content` field is a complex type defined by the `contentType` field.\n\n`A7110`: Senders SHOULD NOT include JSON primitives in the `content` field of an attachment.\n\n#### Content URL\n\nWhen present, the `contentUrl` field contains a URL to the content in the attachment. Data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)] are typically supported by channels. The value of the `contentUrl` field is of type string.\n\n`A7120`: Receivers SHOULD accept HTTPS URLs.\n\n`A7121`: Receivers MAY accept HTTP URLs.\n\n`A7122`: Channels SHOULD accept data URIs.\n\n`A7123`: Channels SHOULD NOT send data URIs to clients or bots.\n\n#### Name\n\nThe `name` field contains an optional name or filename for the attachment. The value of the `name` field is of type string.\n\n#### Thumbnail URL\n\nSome clients have the ability to display custom thumbnails for non-interactive attachments or as placeholders for interactive attachments. The `thumbnailUrl` field identifies the source for this thumbnail. Data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)] are typically also allowed.\n\n`A7140`: Receivers SHOULD accept HTTPS URLs.\n\n`A7141`: Receivers MAY accept HTTP URLs.\n\n`A7142`: Channels SHOULD accept data URIs.\n\n`A7143`: Channels SHOULD NOT send `thumbnailUrl` fields to bots.\n\n### Card action\n\nA card action represents a clickable or interactive button for use within cards or as [suggested actions](#suggested-actions). They are used to solicit input from users. Despite their name, card actions are not limited to use solely on cards.\n\nCard actions are meaningful only when sent to channels.\n\nChannels decide how each action manifests in their user experience. In most cases, the cards are clickable. In others, they may be selected by speech input. In cases where the channel does not offer an interactive activation experience (e.g., when interacting over SMS), the channel may not support activation whatsoever. The decision about how to render actions is controlled by normative requirements elsewhere in this document (e.g. within the card format, or within the [suggested actions](#suggested-actions) definition).\n\n#### Type\n\nThe `type` field describes the meaning of the button and behavior when the button is activated. Values of the `type` field are by convention short strings (e.g. \"`openUrl`\"). See subsequent sections for requirements specific to each action type.\n\n* An action of type `messageBack` represents a text response to be sent via the chat system.\n* An action of type `imBack` represents a text response that is added to the chat feed.\n* An action of type `postBack` represents a text response that is not added to the chat feed.\n* An action of type `openUrl` represents a hyperlink to be handled by the client.\n* An action of type `downloadFile` represents a hyperlink to be downloaded.\n* An action of type `showImage` represents an image that may be displayed.\n* An action of type `signin` represents a hyperlink to be handled by the client's signin system.\n* An action of type `playAudio` represents audio media that may be played.\n* An action of type `playVideo` represents video media that may be played.\n* An action of type `call` represents a telephone number that may be called.\n\n#### Title\n\nThe `title` field includes text to be displayed on the button's face. The value of the `title` field is of type string, and does not contain markup.\n\nThis field applies to actions of all types.\n\n`A7210`: Channels SHOULD NOT process markup within the `title` field (e.g. Markdown).\n\n#### Image\n\nThe `image` field contains a URL referencing an image to be displayed on the button's face. Data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)] are typically supported by channels. The value of the `image` field is of type string.\n\nThis field applies to actions of all types.\n\n`A7220`: Channels SHOULD accept HTTPS URLs.\n\n`A7221`: Channels MAY accept HTTP URLs.\n\n`A7222`: Channels SHOULD accept data URIs.\n\n#### Image alt text\n\nThe `imageAltText` field contains alternate image text to be used in place of the `image` field. This field should only be used when the `text` field is inadequate as alt text. The value of the `imageAltText` field is of type string.\n\n`A7225`: Senders SHOULD NOT populate the `imageAltText` field if its value is identical to the `text` field.\n\n`A7226`: Receivers SHOULD use the value of the `imageAltText` field if it is present in the enclosing [card action](#card-action). If the `imageAltText` field is missing, receivers SHOULD use the `text` field as the alt text.\n\n#### Text\n\nThe `text` field contains text content to be sent to a bot and included in the chat feed when the button is clicked. The contents of the `text` field may or may not be displayed, depending on the button type. The `text` field may contain markup, controlled by the [`textFormat`](#text-format) field in the activity root. The value of the `text` field is of type string.\n\nThis field is only used on actions of select types. Details on each type of action are included later in this document.\n\n`A7230`: The `text` field MAY contain an empty string to indicate sending text without contents.\n\n`A7231`: Channels SHOULD process the contents of the `text` field in accordance with the [`textFormat`](#text-format) field in the activity root.\n\n#### Display text\n\nThe `displayText` field contains text content to be included in the chat feed when the button is clicked. The contents of the `displayText` field SHOULD always be displayed, when technically possible within the channel. The `displayText` field may contain markup, controlled by the [`textFormat`](#text-format) field in the activity root. The value of the `displayText` field is of type string.\n\nThis field is only used on actions of select types. Details on each type of action are included later in this document.\n\n`A7240`: The `displayText` field MAY contain an empty string to indicate sending text without contents.\n\n`A7241`: Channels SHOULD process the contents of the `displayText` field in accordance with the [`textFormat`](#text-format) field in the activity root.\n\n#### Value\n\nThe `value` field contains programmatic content to be sent to a bot when the button is clicked. The contents of the `value` field are of any primitive or complex type, although certain activity types constrain this field.\n\nThis field is only used on actions of select types. Details on each type of action are included later in this document.\n\n#### Message Back\n\nA `messageBack` action represents a text response to be sent via the chat system. Message Back uses the following fields:\n* `type` (\"`messageBack`\")\n* `title`\n* `image`\n* `text`\n* `displayText`\n* `value` (of any type)\n\n`A7350`: Senders SHOULD NOT include `value` fields of primitive types (e.g. string, int). `value` fields SHOULD be complex types or omitted.\n\n`A7351`: Channels MAY reject or drop `value` fields not of complex type.\n\n`A7352`: When activated, channels MUST send an activity of type `message` to all relevant recipients.\n\n`A7353`: If the channel supports storing and transmitting text, the contents of the `text` field of the action MUST be preserved and transmitted in the `text` field of the generated message activity.\n\n`A7355`: If the channel supports storing and transmitting additional programmatic values, the contents of the `value` field MUST be preserved and transmitted in the `value` field of the generated message activity.\n\n`A7356`: If the channel supports preserving a different value in the chat feed than is sent to bots, it MUST include the `displayText` field in the chat history.\n\n`A7354`: If the channel does not support `A7353` but does support recording text within the chat feed, it MUST include the `text` field in the chat history.\n\n`A7357`: If the channel supports presenting an image on the action, the contents of the `image` field of the action MUST be shown on or in connection with the action.\n\n`A7358`: The contents of the `title` field of the action MUST be shown on or in connection with the action.\n\n`A7359`: Senders SHOULD include an `image` field, a `title` field, or both. Channels MAY reject or drop `messageBack` actions which have neither an `image` field nor a `title` field.\n\n#### IM Back\n\nAn `imBack` action represents a text response that is added to the chat feed. IM Back uses the following fields:\n* `type` (\"`imBack`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7360`: When activated, channels MUST send an activity of the type `message` to all relevant recipients.\n\n`A7361`: If the channel supports storing and transmitting text, the contents of the `title` field MUST be preserved and transmitted in the `text` field of the generated message activity.\n\n`A7362`: If the `title` field on an action is missing and the `value` field is of type string, the channel MAY transmit the contents of the `value` field in the `text` field of the generated message activity.\n\n`A7363`: If the channel supports recording text within the chat feed, it MUST include the contents of the `title` field in the chat history.\n\n#### Post Back\n\nA `postBack` action represents a text response that is not added to the chat feed. Post Back uses the following fields:\n* `type` (\"`postBack`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7370`: When activated, channels MUST send an activity of the type `message` to all relevant recipients.\n\n`A7371`: Channels SHOULD NOT include text within the chat history when a Post Back action is activated.\n\n`A7372`: Channels MUST reject or drop `value` fields not of string type.\n\n`A7373`: If the channel supports storing and transmitting text, the contents of the `value` field MUST be preserved and transmitted in the `text` field of the generated message activity.\n\n`A7374`: If the channel is unable to support transmitting to the bot without including history in the chat feed, it SHOULD use the `title` field as the display text.\n\n#### Open URL actions\n\nAn `openUrl` action represents a hyperlink to be handled by the client. Open URL uses the following fields:\n* `type` (\"`openUrl`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7380`: Senders MUST include a URL in the `value` field of an `openUrl` action.\n\n`A7381`: Receivers MAY reject `openUrl` action whose `value` field is missing or not a string.\n\n`A7382`: Receivers SHOULD reject or drop `openUrl` actions whose `value` field contains a data URI, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)].\n\n`A7383`: Receivers SHOULD NOT reject `openUrl` actions whose `value` URI is of an otherwise unexpected URI scheme or value.\n\n`A7384`: Clients with knowledge of particular URI schemes (e.g. HTTP) MAY handle `openUrl` actions within an embedded renderer (e.g., a browser control).\n\n`A7385`: When available, clients SHOULD delegate handling of `openUrl` actions not handled by `A7354` to the operating-system- or shell-level URI handler.\n\n#### Download File actions\n\nAn `downloadFile` action represents a hyperlink to be downloaded. Download File uses the following fields:\n* `type` (\"`downloadFile`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7390`: Senders MUST include a URL in the `value` field of an `downloadFile` action.\n\n`A7391`: Receivers MAY reject `downloadFile` action whose `value` field is missing or not a string.\n\n`A7392`: Receivers SHOULD reject or drop `downloadFile` actions whose `value` field contains a data URI, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)].\n\n#### Show Image File actions\n\nAn `showImage` action represents an image that may be displayed. Show Image uses the following fields:\n* `type` (\"`showImage`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7400`: Senders MUST include a URL in the `value` field of an `showImage` action.\n\n`A7401`: Receivers MAY reject `showImage` action whose `value` field is missing or not a string.\n\n`A7402`: Receivers MAY reject `showImage` actions whole `value` field is a Data URI, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)].\n\n#### Signin\n\nA `signin` action represents a hyperlink to be handled by the client's signin system. Signin uses the following fields:\n* `type` (\"`signin`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7410`: Senders MUST include a URL in the `value` field of an `signin` action.\n\n`A7411`: Receivers MAY reject `signin` action whose `value` field is missing or not a string.\n\n`A7412`: Receivers MUST reject or drop `signin` actions whose `value` field contains a data URI, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)].\n\n#### Play Audio\n\nA `playAudio` action represents audio media that may be played. Play Audio uses the following fields:\n* `type` (\"`playAudio`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7420`: When activated, channels MAY play the audio referenced by URI in the `value` field.\n\n`A7421`: Channels MUST reject or drop `value` fields not of string type.\n\n`A7422`: Senders SHOULD NOT send data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)], without prior knowledge that the channel supports them.\n\n#### Play video\n\nA `playVideo` action represents video media that may be played. Play Video uses the following fields:\n* `type` (\"`playVideo`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7430`: When activated, channels MAY play the video referenced by URI in the `value` field.\n\n`A7431`: Channels MUST reject or drop `value` fields not of string type.\n\n`A7432`: Senders SHOULD NOT send data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[10](#references)], without prior knowledge that the channel supports them.\n\n#### Call\n\nA `call` action represents a telephone number that may be called. Call uses the following fields:\n* `type` (\"`call`\")\n* `title`\n* `image`\n* `value` (of type string)\n\n`A7440`: Senders MUST include a URL of scheme `tel` in the `value` field of an `signin` action.\n\n`A7441`: Receivers MUST reject `signin` action whose `value` field is missing or not a string URI of the `tel` scheme.\n\n### Channel account\n\nChannel accounts represent identities within a channel. The channel account includes an ID that can be used to identify and contact the account within that channel. Sometimes these IDs exist within a single namespace (e.g. Skype IDs); sometimes, they are federated across many servers (e.g. email addresses). In addition to the ID, channel accounts include display names and Azure Active Directory (AAD) object IDs.\n\n#### Channel account ID\n\nThe `id` field is the identifier and address within the channel. The value of the `id` field is a string. An example `id` within a channel that uses email addresses is \"name@example.com\"\n\n`A7510`: Channels SHOULD use the same values and conventions for account IDs regardless of their position within the schema (`from.id`, `recipient.id`, `membersAdded`, etc.). This allows bots and clients to use ordinal string comparisons to know when e.g. they are described in the `membersAdded` field of a `conversationUpdate` activity.\n\n#### Channel account name\n\nThe `name` field is an optional, friendly name within the channel. The value of the `name` field is a string. An example `name` within a channel is \"John Doe\"\n\n#### Channel account AAD Object ID\n\nThe `aadObjectId` field is an optional ID corresponding to the account's object ID within Azure Active Directory (AAD). The value of the `aadObjectId` field is a string.\n\n#### Channel account role\n\nThe `role` field indicates whether entity behind the account is a user or bot. This field is intended for use in the [Transcript format](../transcript/transcript.md) [[16](#references)] to distinguish between activities sent by users and activities sent by bots. The value of the `role` field is a string.\n\n`A7511`: Senders SHOULD NOT include this field. Receivers SHOULD ignore this field.\n\n### Conversation account\n\nConversation accounts represent the identity of conversations within a channel. In channels that support only a single conversation between two accounts (e.g. SMS), the conversation account is persistent and does not have a predetermined start or end. In channels that support multiple parallel conversations (e.g. email), each conversation will likely have a unique ID.\n\n#### Conversation account ID\n\nThe `id` field is the identifier within the channel. The format of this ID is defined by the channel and is used as an opaque string throughout the protocol.\n\nChannels SHOULD choose `id` values that are stable for all participants within a conversation. (For example, a poor example for the `id` field for a 1:1 conversation is to use the other participant's ID as the `id` value. This would result in a different `id` from each participant's perspective. A better choice is to sort the IDs of both participants and concatenate them together, which would be the same for both parties.)\n\n#### Conversation account name\n\nThe `name` field is an optional, friendly name for the conversation within the channel. The value of the `name` field is a string.\n\n#### Conversation account AAD Object ID\n\nThe `aadObjectId` field is an optional ID corresponding to the conversation's object ID within Azure Active Directory (AAD). The value of the `aadObjectId` field is a string.\n\n#### Conversation account Is Group\n\nThe `isGroup` field indicates whether the conversation contains more than two participants at the time the activity was generated. The value of the `isGroup` field is a boolean; if omitted, the default value is `false`. This field typically controls the at-mention behavior for participants in the channel, and SHOULD be set to `true` if and only if more than two participants have the ability to both send and receive activities within the conversation.\n\n#### Conversation account Conversation Type\n\nIf the channel distinguishes between types of conversations (e.g. group vs. personal), the `conversationType` field indicates the type of the conversation. This field augments the lower-fidelity [`isGroup`](#conversation-account-is-group) field. The value of the `conversationType` field is a string and its meaning is defined by the channel in which the type occurs.\n\n#### Conversation account role\n\nThe `role` field indicates whether entity behind the account is a user or bot. This field is intended for use in the [Transcript format](../transcript/transcript.md) [[16](#references)] to distinguish between activities sent by users and activities sent by bots. The value of the `role` field is a string.\n\n`A7512`:Senders SHOULD NOT include this field. Receivers SHOULD ignore this field.\n\n#### Conversation account tenant ID\n\nThe `tenantId` field is an optional ID corresponding to the conversation's tenant ID within the channel. The value of the `tenantId` field is a string.\n\n### Conversation reference\n\nThe `conversationReference` type contains a reference into another conversation. In its most minimal form, this reference may only contain the IDs of the target conversation. Implementers may wish to carry additional information in the `conversationReference`, such as the identity and roles of participants, and the ID of a specific [`activity`](#activity) within the conversation. Consumers of the `conversationReference` type are not provided any de facto guarantees about the validity or consistency of the IDs within the object; this is instead conferred by the sender who created the object.\n\nThe `conversationReference` type is frequently used to store a reference to a conversation so it can be later retrieved and used to continue a conversation.\n\n`A7550`: Senders MUST include the `channelId` and the `conversation.id` properties within a conversation reference, even if they contain the same values as the parent Activity.\n\n#### Conversation reference channel ID\n\nThe `channelId` field contains the [channel ID](#channel-id) of the conversation referenced by the conversationReference object. The value of the `channelId` field is of type string.\n\n#### Conversation reference activity ID\n\nThe `activityId` field contains an optional [ID](#id) of an activity to refer to within the conversation. The value of the `activityId` field is of type string.\n\n#### Conversation reference conversation\n\nThe `conversation` field contains the [Conversation account](#conversation-account) representing the conversation's identity. The value of the `conversation` field is a complex object of type [Conversation account](#conversation-account).\n\n#### Conversation reference user\n\nThe `user` field contains an optional reference to the user's identity within the conversation. The value of the `user` field is of type [Channel account](#channel-account).\n\n#### Conversation reference bot\n\nThe `bot` field contains an optional reference to the bot's identity within the conversation. The value of the `bot` field is of type [Channel account](#channel-account).\n\n#### Conversation reference serviceUrl\n\nThe `serviceUrl` field contains an optional copy of the [`serviceUrl`](#service-url) that applies to the referenced conversation. The value of the `serviceUrl` field is of type string.\n\n`A7560`: Receivers SHOULD ensure the `serviceUrl` property in conversation references is accompanied by either a corresponding security endorsement (in the case of transmitted Conversation references), or a flag indicating the `serviceUrl` and its security endorsement was verified before storage (in the case of a stored Conversation reference).\n\n#### Conversation reference locale\n\nThe `locale` field contains an optional copy of the [`locale`](#locale) that applies to the referenced conversation. The value of the `locale` field is an [IETF BCP-47](https://tools.ietf.org/html/bcp47) [[19](#references)] language tag within a string.\n\n### Entity\n\nEntities carry metadata about an activity or conversation. Each entity's meaning and shape is defined by the `type` field. Additional type-specific fields sit as peers to the `type` field.\n\nSome non-Bot-Framework entities may have a preexisting field called `type`. Parties integrating these entities into the activity entity format are advised to define field-level mapping to resolve conflicts with the `type` field name and other incompatibilities with serialization requirement `A2001` as part of the IRI defining the entity type.\n\nFrequently, entities used within Bot Framework are also expressed elsewhere using [JSON-LD](https://www.w3.org/TR/json-ld/) [[18](#references)]. The entity format is designed to be compatible with JSON-LD contexts, but does not require senders or receivers to implement JSON-LD to successfully process an entity.\n\n`A7603`: Senders MAY include [JSON-LD](https://www.w3.org/TR/json-ld/) [[18](#references)] fields within entities.\n\n`A7604`: Senders MUST NOT expect or require [JSON-LD](https://www.w3.org/TR/json-ld/) [[18](#references)] processing to parse an entity.\n\n#### Entity type\n\nThe `type` field is required, and defines the meaning and shape of the entity. `type` is intended to contain [IRIs](https://tools.ietf.org/html/rfc3987) [[4](#references)] although there are a small number on non-IRI entity types defined in [Appendix II](#appendix-ii---non-iri-entity-types). The value of the `type` field is a string.\n\n`A7610`: Senders SHOULD use non-IRI types names only for types described in [Appendix II](#appendix-ii---non-iri-entity-types).\n\n`A7611`: Senders MAY send IRI types for types described in [Appendix II](#appendix-ii---non-iri-entity-types) if they have knowledge that the receiver understands them.\n\n`A7612`: Senders SHOULD use or establish IRIs for entity types not defined in [Appendix II](#appendix-ii---non-iri-entity-types).\n\n`A7613`: Senders MUST NOT use relative IRIs within the `type` field, nor require JSON-LD IRI resolution to understand a type identifier.\n\n### Suggested actions\n\nSuggested actions may be sent within message content to create interactive action elements within a client UI.\n\n`A7700`: Clients that do not support UI capable of rendering suggested actions SHOULD ignore the `suggestedActions` field.\n\n`A7701`: Senders SHOULD omit the `suggestedActions` field if the `actions` field is empty.\n\n#### To\n\nThe `to` field contains channel account IDs to whom the suggested actions should be displayed. This field may be used to filter actions to a subset of participants within the conversation.\n\n`A7710`: If the `to` field is missing or empty, the client SHOULD display the suggested actions to all conversation participants.\n\n`A7711`: If the `to` field contains invalid IDs, those values SHOULD be ignored.\n\n#### Actions\n\nThe `actions` field contains a flat list of actions to be displayed. The value of each `actions` list element is a complex object of type `cardAction`.\n\n### Message reaction\n\nMessage reactions represent a social interaction (\"like\", \"+1\", etc.). Message reactions currently only carry a single field: the `type` field.\n\n#### Type\n\nThe `type` field describes the type of social interaction. The value of the `type` field is a string, and its meaning is defined by the channel in which the interaction occurs. Some common values such as `like` and `+1` although these are uniform by convention and not by rule.\n\n### Text highlight\n\nA text highlight refers to a substring of content within another field. This type is used within [suggestion activities](#suggestion-activity) to annotate text within another activity.\n\n`A7720`: Receivers MUST ignore a text highlight if the `text` field is missing or empty, if it contains with a `occurrence` value less than 0, or if the `occurrence` field greater than the number of occurrences of the `text` field within the referenced text.\n\n#### Text\n\nThe `text` field is required, and defines the snippet of text to highlight. The contents of the `text` field MUST be ordinally identical to the content of the referenced text. The value of the `text` field is of type string.\n\n`A7721`: Senders MUST NOT send missing or empty strings for `text`. Receivers MUST ignore text higlights with missing or empty `text` fields.\n\n#### Occurrence\n\nThe `occurrence` field is optional. It gives the sender the ability to specify which occurrence of the `text` to highlight. If it is not specified or is 0 then clients should highlight the first occurrence. The value of the `occurrence` field is of type integer.\n\n`A7722`: Senders SHOULD NOT include the `occurrence` field if its value is `0` or `1`.\n\n### Semantic action type\n\nThe semantic action type represents a programmatic reference. It is used within the [`semanticAction`](#semantic-action) field in [message activities](#message-activity). Actions are defined and registered externally to this protocol, typically as part of the [Bot Framework Manifest](../manifest/botframework-manifest.md) [[14](#references)]. The action definition declares the ID for the action and associates it with named entities, each of which has a corresponding type. Senders are receivers of actions use these names and types to create and parse actions that conform to the action definition.\n\nActions proceed through a lifecycle, described by the [`state`](#semantic-action-state) and [`id`](#semantic-action-id) fields.\n\nAt the beginning of the lifecycle, the channel indicates the `id` of the action it wishes to invoke, and sends a `state` of `start`.\n\nThe bot then sends and receives subsequent activities. During this time, both the bot and the channel may send additional metadata in the form of actions with `state` of `continue`. If the bot detects the user changing topic, it reflects this in a revised value of `id`.\n\nWhen complete, the bot may send `state` of `done`. Just like earlier steps, the bot can update the `id` field to reflect what was actually in the conversation.\n\nExample data flow for `semanticAction`. (Note that [entities](#semantic-action-entities) are abbreviated).\n```\nUser: Book a flight from SeaTac to NYC\n    Semantic action: state=\"start\", id=\"bookFlight\", entities=\"SeaTac\", \"NYC\"\n\nBot: Would you like to arrive at LaGuardia Airport or JFK International Airport?\n    Semantic action: state=\"continue\", id=\"bookFlight\", entities=\"KLGA\", \"KJFK\"\n\nUser: Hold on a second\n    Semantic action empty\n\nBot: No problem, please reply when you'd like to continue.\n    Semantic action empty\n\nUser: LaGuardia\n    Semantic action: state=\"continue\", id=\"bookFlight\", entities=\"KLGA\"\n\nBot: OK, would you like to book your flight?\n    Semantic action: state=\"continue\", id=\"bookFlight\"\n\nUser: Yes\n    Semantic action empty\n\nBot: OK, your flight has been booked for November 10 at 8:05am.\n    Semantic action: state=\"done\", id=\"flightBooked\", entities=\"Flight 81, KSEA to KLGA\"\n```\n\n#### Semantic action state\n\nThe `state` field describes whether the action is beginning, continuing, or ending. The value of the `state` field is of type string with defined values of `start`, `continue`, and `done`. This field is not extensible.\n\n**Note: the `state` field is not a mechanism to control a bot's state machine. Instead, it may be used to *request* that an action be started, or it may be used by bots to *inform* that the current action has changed or completed.**\n\nBecause `semanticAction` is optional and the topic of a conversation may drift over time, receivers are cautioned to be flexible in accepting `semanticAction` contents, especially with states of `continue` and `done`. Specifically, channels and bots are cautioned not to create a state machine requiring specific values of `semanticAction` fields `state` and `id`. Instead, treat `semanticAction` as additional metadata that can be used to optionally enrich data sharing between actors. Receivers may always discard unexpected `semanticAction` values in accordance with `A3133`.\n\nThe `start` state indicates an action is being started. Subsequent `start` actions indicate the sender wishes to start this action or another action (depending on the value of the `id` field).\n\n`A7760`: Channels MUST only send `state` of `start` on the first message of an exchange invoking an action. Others senders MUST NOT send `state` of `start`.\n\nThe `continue` state indicates processing of an action is ongoing, and this activity contains new information within the `semanticAction` field.\n\n`A7761`: Channels and bots MAY send `state` of `continue` when they populate the `semanticAction` field. Other senders MUST NOT send `state` of `continue`.\n\nThe `done` state indicates an action was successfully completed.\n\n`A7762`: Bots SHOULD send `state` of `done` when an action has been completed, even if `semanticAction` contains no entities. Other senders MUST NOT send `state` of `done`.\n\nChannels are expected to provide continuity when issuing actions to bots, but should expect changes in the `state` or `id` values received from bots.\n\n`A7763`: Channels SHOULD NOT send `state` of `continue` without a preceding `state` of `start`.\n\n`A7764`: Receivers MUST NOT require senders to include `semanticAction` fields with `state` of `continue` or `done`, nor a specific `id` value during a conversation.\n\n#### Semantic action ID\n\nThe `id` field establishes the identity for the action, and is associated with a definition for the meaning and structure of the action (typically communicated via a registration system). The value of the `id` field is of type string.\n\n`A7730`: Senders MUST NOT generate semantic actions with missing or empty `id` fields.\n\n`A7731`: Two `id` values are equivalent only if they are ordinally identical.\n\n`A7732`: Channels SHOULD only change the value of the `id` field within a conversation when a new action with `state` of `start` is sent, or when the bot sends a `state` of `continue` with a new `id` value.\n\n`A7733`: Bots SHOULD make best-effort attempts to update the `id` field to reflect the topic of the conversation. Channels SHOULD make best-effort attempts to honor the bot's stated `id` values.\n\n#### Semantic action entities\n\nThe `entities` field contains entities associated with this action. The value of the `entities` field is a complex object; the keys of this object are entity names and the values of each key is the corresponding entity values of type [entity](#entity). The meaning of each entity is defined by the enclosing action and the entity name. An additional field named `$instance` occurs after the named entities. The value of the `$instance` field is of type [`entityInstance`](#entity-instance).\n\n`A7740`: Unless otherwise specified, senders MAY omit some or all entities associated with an action definition.\n\n`A7742`: Senders MAY add entities with unknown keys if they have special knowledge that the bot supports them.\n\nActions support dynamic typing. An implementer of an action expresses a list of types it prefers, and callers of that action can match the desired types with known entities of varying fidelity. For example, assume an action prefers to receive a destination in the form of a *city* entity. The caller may not have a city available, but is able to supply either a *string* or *geocoordinates* based on what it was able to extract from the conversation. The caller can examine the action's preferred types and send the *string* or *geocoordinates* if the action can handle it.\n\n`A7744`: Senders MAY send downgraded entities in accordance with the rules outlined in the action definition.\n\nEntities sent within the semantic action have a specific meaning, defined by their name. For example, an action may be named `findRoute` with entities named `source` and `destination`. Sometimes, additional entities are available that do not fit a specific meaning within the action. The root [`entities`](#entities) array is a suitable location to transmit these entities.\n\n`A7745`: Senders MAY send entities not listed in the action definition in the [`entities`](#entities) array in the activity root. Senders SHOULD NOT send these entities in the semantic action.\n\nThe `$instance` field carries metadata about the source of each entity. The keys of this object are identical to the entity names as peers. The values of each key is the corresponding instance metadata of type [`semanticEntityInstance`](#semantic-entity-instance).\n\n`A7746`: Senders SHOULD include properties within `$instance` for any entities bearing instance metadata.\n\n`A7747`: Senders SHOULD NOT include empty fields within `$instance` or an empty `$instance` object.\n\n`A7748`: Senders MUST NOT include a `$instance` field within the `$instance` object.\n\nExample of semantic action entities\n```\n\"entities\": {\n    \"sourceAirport\": {\n        \"type\": \"http://icao.org/airport/code\"\n        \"code\": \"KSEA\",\n        \"name\": \"Seattle-Tacoma International Airport\",\n    },\n    \"destinationAirport\": {\n        \"type\": \"http://schema.org/City\",\n        \"name\": \"New York\",\n        \"geo\": {\n            \"type\": \"http://schema.org/GeoCoordinates\",\n            \"latitude\": 40.7127,\n            \"longitude\": -74.0059\n        }\n    },\n    \"$instance\": {\n        \"sourceAirport\": {\n            \"text\": \"SeaTac\",\n            \"startIndex\": 19,\n            \"endIndex\": 25\n        },\n        \"destinationAirport\": {\n            \"text\": \"New York\",\n            \"startIndex\": 29,\n            \"endIndex\": 37\n        }\n    }\n}\n```\n\n### Semantic entity instance\n\nThe `semanticEntityInstance` type references to source information about where the entity was mentioned. This specification includes source data to refer to the `text` field although others may be added in the future. The value of the `$instance` field is a complex object with fields `text`, `startIndex`, and `endIndex`. The `text` field is a string containing a copy of the text within the [`text`](#text) field in the activity root; `startIndex` is a number containing the index of the first character where `text` is found (inclusive); `endIndex` is a number containing the index after the last character where `text` is found (exclusive).\n\n`A7750`: Senders MUST NOT include the `$instance` field if its `text` field is empty or null or the contents of its `text` field cannot be found within the `text` field in the activity root.\n\n`A7751`: The `startIndex` field MUST be an integer greater than or equal to zero and less than the length of the `text` field in the activity root.\n\n`A7752`: The `endIndex` field MUST be an integer greater than zero and less than or equal to the length of the `text` field in the activity root. Its value MUST be greater than the `startIndex` value.\n\n`A7753`: The contents of the `text` field within `$instance` MUST contain characters ordinally identical to the value of the `text` field in the activity root starting at `startIndex` characters from the beginning and ending immediately before `endIndex` characters from the beginning.\n\n### Command value\nThe `value` field of a [command activity](#command-activity) contains metadata related to a command. An optional extensible `data` payload may be included if defined by the command activity `name`.\n\n#### Command Id\n\n`A10100`: A command value MAY include the `commandId` field with the unique ID that the sender assigns to this command.\n\n#### Data\n\nThe `data` field contains optional parameters specific to this command activity, as defined by the `name`. The value of the `data` field is a complex type.\n\n`A10200`: The `data` field MAY be missing or empty, if defined by the command activity `name`.\n\n`A10201`: Extensions to the command activity SHOULD NOT require receivers to use any information other than the activity `type` and `name` fields to understand the schema of the `data` field.\n\n### Command result Value\nThe `value` field of a [command result activity](#command-result-activity) contains metadata related to a command. An optional extensible `data` payload may be included if defined by the command result activity `name`. The presence of an `error` field indicates that the original command failed to complete. \n\n#### Command Id\n\n`A11100`: If the original command includes a valid `commandId`, then the command result value MUST include the same value in `commandId` to allow the result to be correlated to the original command instance.\n\n#### Data\n\nThe `data` field contains optional additional information specific to this command result activity, as defined by the `name`. The value of the `data` field is a complex type.\n\n`A11200`: The `data` field MAY be missing or empty, if defined by the command result activity name. \n\n`A11201`: Extensions to the command result activity SHOULD NOT require receivers to use any information other than the activity `type` and `name` fields to understand the schema of the `data` field.\n\n#### Error\n\nThe `error` field contains the reason the original [command activity](#command-activity) failed to complete.\n\n`A11300`: Senders MUST include the `error` field when the command was not successful. The value of the `error` field is of type  [Error Object](../botframework-protocol/botframework-protocol.md#error-object)\n\n`A11301`: Senders MUST NOT include the `error` field when the command was successful.\n\n## References\n\n1. [Bot Framework Protocol](../botframework-protocol/botframework-channel.json) -- *Bot Framework Protocol swagger definition*\n2. [RFC 2119](https://tools.ietf.org/html/rfc2119) -- *Key words for use in RFCs to Indicate Requirement Levels*\n3. [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) -- *Date and time format*\n4. [RFC 3987](https://tools.ietf.org/html/rfc3987) -- *Internationalized Resource Identifiers (IRIs)*\n5. [Markdown](https://daringfireball.net/projects/markdown/)\n6. [ISO 639](https://www.iso.org/iso-639-language-codes.html) -- *Language codes*\n7. [SSML](https://www.w3.org/TR/speech-synthesis/) -- *Speech Synthesis Markup Language*\n8. [XML](https://www.w3.org/TR/xml/) -- *Extensible Markup Language*\n9. [MIME media types](https://www.iana.org/assignments/media-types/media-types.xhtml)\n10. [RFC 2397](https://tools.ietf.org/html/rfc2397) -- *The \"data\" URL scheme*\n11. [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) -- *Country codes*\n12. [Bot Framework Cards](botframework-cards.md)\n13. [Adaptive Cards](https://adaptivecards.io)\n14. [Bot Framework Manifest](../manifest/botframework-manifest.md)\n15. [RFC 4627](http://www.ietf.org/rfc/rfc4627.txt) -- *The application/json Media Type for JavaScript Object Notation (JSON)*\n16. [Transcript](../transcript/transcript.md)\n17. [RFC 6557](https://tools.ietf.org/html/rfc6557)\n18. [JSON-LD](https://www.w3.org/TR/json-ld/) -- *A JSON-based serialization for Linked Data*\n19. [IETF BCP-47](https://tools.ietf.org/html/bcp47) -- *Language tag*\n\n# Appendix I - Changes\n\n## 2020-07-07 - contact.me@nlchar.rocks\n* Fix the broken link to the Bot Framework Manifest Spec in the References section\n\n## 2020-06-19 - dandris@microsoft.com\n* Fix `A7420` and `A7430` text to reflect original intent of `playAudio` and `playVideo` actions\n* Add [conversation reference](#conversation-reference) type definition\n\n## 2020-06-16 - dandris@microsoft.com\n* Integrate typo and casing fixes\n* Fix internal anchor links and relative file links\n\n## 2020-03-02 - dandris@microsoft.com\n* Added [`imageAltText`](#image-alt-text)\n\n## 2019-07-15 - dandris@microsoft.com\n* Added `A3035` to clarify behavior in the absence of a `speak` field.\n\n## 2019-05-09 - toddne@microsoft.com\n* Removed A3032.  Speak takes either plain text or valid SSML\n\n## 2019-01-31 - toddne@microsoft.com\n* Revised specification of [locale] to reference BCP-47.\n\n## 2019-05-02 - dandris@microsoft.com\n* Added [`callerId`](#caller-Id) and [Appendix V](#appendix-v---caller-id-values)\n\n## 2019-01-31 - toddne@microsoft.com\n* Revised specification of [locale] to reference BCP-47.\n\n## 2019-01-31 - dandris@microsoft.com\n* Add `tenantId` to [conversation account](#conversation-account) type\n\n## 2019-01-11 - dandris@microsoft.com\n* Add `A7357`, `A7358`, and `A7359` to profile `image` and `title` fields of the `messageBack` action\n\n## 2019-01-04 - dandris@microsoft.com\n* Resolved collision in [Trace activity](#trace-activity) numbering: `A610x` -> `A615x`\n\n## 2018-12-06 - dandris@microsoft.com\n* Resolved restriction number collision by renaming duplicate `A7352` and `A7353` to `A7355` and `A7356`, respectively\n* Fixed broken links\n\n## 2018-10-23 - dandris@microsoft.com\n* Added action [`state`](#semantic-action-state)\n\n## 2018-09-27 - dandris@microsoft.com\n* Revised reference descriptions and links\n* Clarified syntactic rules, revised `A2003`, added `A2007`\n* Removed `A7743` as redundant\n* Removed ordering requirement for semantic action entities (`A7741`)\n* Added `$instance` to semantic action entities\n* Added action type downgrading\n* Move `A7600` and `A7601` and re-introduce as `A2104` and `A2105`\n\n## 2018-09-18 - toddne@microsoft.com\n* Added localTimezone property\n\n## 2018-08-27 - daveta@microsoft.com\n* Added [Channel account role](#channel-account-role) property\n* Added [Conversation account role](#conversation-account-role) property\n\n## 2018-07-17 - dandris@microsoft.com\n* Added [`semanticAction`](#semantic-action)\n* Added [handoff activity](#handoff-activity)\n\n## 2018-07-05 - dandris@microsoft.com\n* Changed `RXXXX` (*R*equiment) to `AXXXX` (*A*ctivity) to match other Bot Framework specifications.\n\n## 2018-04-11 - dandris@microsoft.com\n* Added [Listen for](#listen-for) field and [Appendix IV](#appendix-iv---priming-format)\n\n## 2018-04-08 - tomlm@microsoft.com\n* Added [Suggestion activity](#suggestion-activity) and [`textHighlight`](#text-highlight) complex type.\n* Amended `A2071` to allow suggestion activities to specify receipients\n\n## 2018-03-07 - dandris@microsoft.com\n* Added [`conversationAccount.conversationType`](#conversation-account-conversation-type) and `A2084`.\n\n## 2018-02-07 - dandris@microsoft.com\n* Initial draft\n\n# Appendix II - Non-IRI entity types\n\nActivity [entities](#entity) communicate extra metadata about the activity, such as a user's location or the version of the messaging app they're using. Activity types are intended to be IRIs, but a small list of non-IRI names are in common use. This appendix is an exhaustive list of the supported non-IRI entity types.\n\n| Type           | IRI equivalent                          | Description               |\n| -------------- | --------------------------------------- | ------------------------- |\n| GeoCoordinates | http://schema.org/GeoCoordinates/       | Schema.org GeoCoordinates |\n| Mention        | https://botframework.com/schema/mention | @-mention                 |\n| Place          | http://schema.org/Place                 | Schema.org Place          |\n| Thing          | http://schema.org/Thing                 | Schema.org Thing          |\n| string         | N/A                                     | String                    |\n| number         | N/A                                     | Number                    |\n| clientInfo     | N/A                                     | Skype client info         |\n\n### string and number\n\nThe `string` and `number` primitive entity types contains simple values within the `value` field. The `value` field is a string or number, respectively.\n\nExample:\n```\n{\n    \"type\": \"string\",\n    \"value\": \"This is the string value\"\n}\n```\n\n### clientInfo\n\nThe `clientInfo` entity type contains extended information about the client software used to send a user's message. It contains three properties, all of which are optional.\n\n`A9201`: Bots SHOULD NOT send the `clientInfo` entity.\n\n`A9202`: Senders SHOULD include the `clientInfo` entity only when one or more fields are populated.\n\n#### Locale (Deprecated)\n\nThe `locale` field contains the user's locale. This field duplicates the [`locale`](#locale) field in the Activity root. The value of the `locale` field is an [ISO 639](https://www.iso.org/iso-639-language-codes.html) [[6](#references)] code within a string.\n\nThe `locale` field within `clientInfo` is deprecated.\n\n`A9211`: Receivers SHOULD NOT use the `locale` field within the `clientInfo` object.\n\n`A9212`: Senders MAY populate the `locale` field within `clientInfo` for compatibility reasons. If compatibility with older receivers is not required, senders SHOULD NOT send the `locale` property.\n\n#### Country\n\nThe `country` field contains the user's detected location. This value may differ from any [`locale`](#locale) data as the `country` is detected whereas `locale` is typically a user or application setting. The value of the `country` field is an [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) [[11](#references)] 2- or 3-letter country code.\n\n`A9220`: Channels SHOULD NOT allow clients to specify arbitrary values for the `country` field. Channels SHOULD use a mechanism like GPS, location API, or IP address detection to establish the country generating a request.\n\n#### Platform\n\nThe `platform` field describes the messaging client platform used to generate the activity. The value of the `platform` field is a string and the list of possible values and their meaning is defined by the channel sending them.\n\nNote that on channels with a persistent chat feed, `platform` is typically useful only in deciding which content to include, not the format of that content. For instance, if a user on a mobile device asks for product support help, a bot could generate help specific to their mobile device. However, the user may then re-open the chat feed on their PC so they can read it on that screen while making changes to their mobile device. In this situation, the `platform` field is intended to inform the content, but the content should be viewable on other devices.\n\n`A9230`: Bots SHOULD NOT use the `platform` field to control how response data is formatted unless they have specific knowledge that the content they are sending may only ever be seen on the device in question.\n\n# Appendix III - Protocols using the Invoke activity\n\nThe [invoke activity](#invoke-activity) is designed for use only within protocols supported by Bot Framework channels (i.e., it is not a generic extensibility mechanism). This appendix contains a list of all Bot Framework protocols using this activity.\n\n## Teams compose extension\n\nThe Microsoft Teams channel uses Invoke for [compose extensions](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/messaging-extensions). This use of Invoke is specific to Microsoft Teams.\n\n# Appendix IV - Priming format\n\nThe [`listenFor`](#listen-for) field within the Bot Framework activity schema contains a list of terms and references to hint to a speech or language processor which terms to prefer when processing input. This format is referred to within this appendix as the priming format.\n\nThe format allows:\n1. Phrases, including single-term phrases (e.g. \"house\", \"open the doors\")\n2. Sources of phrases (e.g., a LUIS model)\n\nAll contents appear within a flat array of strings.\n\nPhrases are specified directly without markup. Sources are enclosed by `{` and `}` and their contents may be either a full URI or a shortened URI adhering to one of the conventions below.\n\n`A9300`: Senders SHOULD NOT include punctuation that does not affect language processing, such as enclosing parentheses or trailing periods. Senders MUST NOT enclose plain phrases with leading `{` and trailing `}`.\n\n`A9301`: Senders MAY include phrase sources by URI or short form. Phrase source URIs and short forms MUST be enclosed by leading `{` and trailing `}`. Senders SHOULD NOT include whitespace before or after `{` and `}` characters.\n\n`A9302`: Senders MUST URI-encode any `{`, `}`, and `\"` characters that occur within a phrase source.\n\n`A9303`: Processors SHOULD ignore phrase sources they do not understand.\n\nPhrase source URIs may be symbolic or may be URLs. For example, `https://example.com/language/models/1234#intent0001` could identify `intent0001` within the `example.com` language model with ID `1234`. The format of these URIs and relationship to the backing phrase source data is bounded by the `example.com` hostname and is established entirely by the service supporting that name. Processors must have specific knowledge of each phrase source to determine the method of extraction. In some cases, an HTTP GET directly to the URL is adequate, in others, an entire language model may be retrieved and parsed to select individual phrases. A processor knows how to retrieve the data by inspecting the hostname.\n\n`A9304`: Processors MAY upgrade phrase source URIs to URLs when they have knowledge that the source supports phrase retrieval.\n\n`A9305`: Processors SHOULD use plain ordinal hostname comparisons when determining whether they recognize a source URI.\n\n`A9306`: Processors MAY ignore any resolved URLs that are not HTTPS.\n\nPhrase sources specified in complete URIs (e.g. `https://luis.ai/apps/12345#intent0001`) can be verbose and this spec establishes a format for shortening these URIs, and one known format specifically for [LUIS](https://luis.ai) apps.\n\n`A9307`: If a processor supports a phrase source, and that source has a compact representation, processors SHOULD support both the compact and the expanded format.\n\n`A9308`: Phrase sources SHOULD establish a well-defined mapping between compact and expanded forms of phrase source references.\n\n### LUIS.ai phrase source\n\nThis section provides a definition for the [LUIS](https://luis.ai) phrase source URI and compact form.\n\nLUIS.ai models can be referenced with the following format:\n    `https://luis.ai/apps/<appId>[/intents/<intentId>]`\n\nThe short form for these IDs is:\n    `luis:<appId>[#intentId]`\n\n# Appendix V - Caller ID Values\n\nThe Activity schema includes a ['callerId'](#caller-Id) field that identifies the caller sending an activity. The field is not populated on the wire but is used for internal routing within a bot, and for tracking this data when an Activity is committed to storage (in e.g. the [Transcript](../transcript/transcript.md) [[#16](#references)] format).\n\nThis specification defines three IRI schemes for caller IDs.\n\nIt is important that implementers follow the verification rules in this appendix to ensure a caller ID is set only when the caller is successfully authenticated.\n\n## Bot Framework\n\nBot Framework services call registered bots to transmit messages sent over Bot Framework channels. The caller ID for any Bot Framework channel service is `urn:botframework:azure`.\n\nThe authenticity of a call from Bot Framework can be established by inspecting its JSON Web Token and ensuring it is both correctly formed and is signed with a key listed in the Bot Framework Open ID Metadata Document.\n\n## Bot Framework (US Government Cloud)\n\nBot Framework services running in the US Government Cloud are in a distinct security domain from traditional Bot Framework serivces. The caller ID for any Bot Framework channel service is `urn:botframework:azureusgov`.\n\nThe authenticity of a call from Bot Framework US Government Cloud can be established by inspecting its JSON Web Token and ensuring it is both correctly formed and is signed with a key listed in the Bot Framework US Government Cloud Open ID Metadata Document.\n\n## Bot calling skill\n\nThe Activity schema can be used when a bot initiates a request to another bot acting as a skill. The caller ID for these calls is the prefix `urn:botframework:aadappid:` followed by the Azure Active Directory App ID used by the bot initiating the call.\n\nThe authenticity of a call from a bot can be established by inspecting its JSON Web Token and ensuring it is both correctly formed and is signed with a key listed in the Azure Active Directory Open ID Metadata Document.\n\n# Appendix VI - Protocols using the Command activity\n[Command activities](#command-activity) communicate a request to perform a specific action. Command activities outside the `application` are considered reserved for Bot Framework Protocols. This appendix contains a list of command activities used in Bot Framework protocols and recommended patterns for defining and using command activities.\n\n## Telephony Channel \n\nThe Microsoft Telephony channel defines channel command activities in the namespace `channel/vnd.microsoft.telephony.<action>`. \n\n## Patterns for rejecting commands\n\n### General pattern for rejecting commands\nThe general pattern for rejecting commands is to send an asynchronous commands result with an error. This is used in most cases when the receiver needs to process the command before rejecting it. \n\nHere is an example of a command result indicating that the command was not supported by the receiver:\n```\n    {\n        'type': 'commandResult'\n        'name': 'channel/vnd.microsoft.telephony.<action>'\n        'value': {                        \n            'error' : {\n                'code': 'NotSupported',\n                'message' : 'Command channel/vnd.microsoft.telephony.<action> is not supported'\n            }\n        }\n    }\n```\n\n### Channel rejecting commands\nSome channels may may not support the command protocol or not allow for application customization of commands. In this case, the channel can reject commands with a transport-level response codes to allow a sender to detect the command activity was rejected. Example: When the transport is HTTP, 200 indicates acceptance and 400 indicates that the Activity name is not supported.\n\n"
  },
  {
    "path": "specs/botframework-activity/botframework-cards.md",
    "content": "# Bot Framework -- Cards\n\nVersion: 3.1.12\n\n**This specification has moved to [Agents SDK](https://github.com/microsoft/agents)**\n\n## Abstract\n\nThe Bot Framework Card schema is an application-level representation of interactive cards for use within chat and other applications. The schema includes provisions for controlling the content, layout, and interactive elements of a card.\n\nThis schema is used within the Bot Framework Activity schema and is implemented by Microsoft chat systems and by interoperable bots and clients from many sources.\n\n## Table of Contents\n\n1. [Introduction](#Introduction)\n2. [Card structure](#Card-structure)\n3. [Basic cards](#Basic-cards)\n4. [Media cards](#Media-cards)\n5. [Animation card](#Animation-card)\n6. [Audio card](#Audio-card)\n7. [Video card](#Video-card)\n8. [Receipt card](#Receipt-card)\n9. [Signin card](#Signin-card)\n10. [Complex types](#Complex-types)\n11. [References](#References)\n\n## Introduction\n\n### Overview\n\nThe Bot Framework Card schema provides a mechanism for transmitting content, layout information, and interactive elements within an interactive card. This specification does not describe the final visual form of a card, but the structure of the card suggests a layout without prescribing particular visual styles.\n\nThese cards are typically presented as attachments within the [Bot Framework Activity](BotFramework-Activity.md) schema, which in turn is typically transmitted within the [Bot Framework Protocol](BotFramework-Protocol.md) [[1](#References)], [[2](#References)].\n\nBot Framework cards are each oriented around a particular kind of content (e.g. thumbnail images, transaction receipts) but use a shared set of features and conventions. These cards are designed to be rendered within interfaces that do not have full fidelity or interactive elements; in these cases, this specification provides guidance on how to predictably and gracefully reduce the complexity of each card to preserve the intent of the original item.\n\n### Relationship with Adaptive Cards\n\nThe Bot Framework Card schema was developed in conjunction with the v3 Bot Framework protocol. After Bot Framework v3 was released, a new effort to supplant Bot Framework cards with cross-application, generic cards resulted in the [Adaptive Card](https://adaptivecards.io) [[3](#References)] schema. Adaptive Cards provide a content-neutral format for data layout, in contrast to the content-specific Bot Framework cards.\n\nAdaptive Cards are the recommended choice for new card content where supported. This is true even when a specific Bot Framework card exists.\n\nBot Framework cards are available where Adaptive Cards are not supported, and will be supported for existing users of the format until further announcements are made.\n\n### Requirements\n\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119) [[4](#References)].\n\nAn implementation is not compliant if it fails to satisfy one or more of the MUST or REQUIRED level requirements for the protocols it implements. An implementation that satisfies all the MUST or REQUIRED level and all the SHOULD level requirements for its protocols is said to be \"unconditionally compliant\"; one that satisfies all the MUST level requirements but not all the SHOULD level requirements for its protocols is said to be \"conditionally compliant.\"\n\n### Numbered requirements\n\nLines beginning with markers of the form `CXXXX` are specific requirements designed to be referenced by number in discussion outside of this document. They do not carry any more or less weight than normative statements made outside of `CXXXX` lines.\n\n`C1000`: Editors of this specification MAY add new `CXXXX` requirements. They SHOULD find numeric `CXXXX` values that preserve the document's flow.\n\n`C1001`: Editors MUST NOT renumber existing `CXXXX` requirements.\n\n`C1002`: Editors MAY delete or revise `CXXXX` requirements. If revised, editors SHOULD retain the existing `CXXXX` value if the topic of the requirement remains largely intact.\n\n`C1003`: Editors SHOULD NOT reuse retired `CXXXX` values. A list of deleted values MAY be maintained at the end of this document.\n\n### Terminology\n\nactivity\n> An action expressed by a bot, a channel, or a client that conforms to the Activity schema.\n\ncard\n> A Bot Framework card that adheres to this specification\n\nchannel\n> Software that sends and receives activities, and transforms them to and from chat or application behaviors. Channels are the authoritative store for activity data.\n\nbot\n> Software that sends and receives activities, and generates automated, semi-automated, or entirely manual responses. Bots have endpoints that are registered with channels.\n\nclient\n> Software that sends and receives activities, typically on behalf of human users. Clients do not have endpoints.\n\nsender\n> Software transmitting an activity.\n\nreceiver\n> Software accepting an activity.\n\nfield\n> A named value within an activity or nested object.\n\n## Card structure\n\nThis section defines the requirements for the basic structure of each card.\n\nCards include a flat list of name/value pairs, called fields. Fields may be primitive types. JSON is used as the common interchange format and although not all cards must be serialized to JSON at all times, they must be serializable to it. This allows implementations to rely on a simple set of conventions for handling known and unknown activity fields.\n\n`C2001`: Cards MUST be serializable to the JSON format, including adherence to e.g. field uniqueness constraints.\n\n`C2002`: Receivers MAY allow improperly-cased field names, although this is not required. Receivers MAY reject cards that do not include fields with the proper casing.\n\n`C2003`: Receivers MAY reject cards that contain field values whose types do not match the value types described in this specification.\n\n`C2004`: Unless otherwise noted, senders SHOULD NOT include empty string values for string fields.\n\n`C2005`: Unless otherwise noted, senders MAY include additional fields within the card or any nested complex objects. Receivers MUST accept fields they do not understand.\n\n### Content-type\n\nCards are identified by a MIME-compatible [[5](#References)] content-type. These content-types are not specified within the card itself; instead, these values accompany the card payload. In the [Bot Framework Activity](BotFramework-Activity.md) [[1](#References)] schema, cards are included within [attachments](BotFramework-Activity.md#Attachment) alongside the corresponding (`contentType`)[BotFramework-Activity.md#Content-type] field. \n\n### Transformations and display\n\nDisplaying a card within a client user interface frequently requires the implementer to make specific decisions about how to order and constrain content to match the visual style of the enclosing design. Further, this specification anticipates that these limitations are largely unavoidable and aims to assist implementers in choosing a path that makes graceful degradation of functionality possible.\n\nThis section provides guidance on which transformations best achieve the goal of preserving the intent of the card.\n\n`C3000`: A Channel's card transformations and display MUST account for all known Bot Framework card types and include best-effort transformations into formats suitable for display to users.\n\n`C3002`: Channels SHOULD preserve the ordering of text-bearing content fields as presented within this specification. Channels SHOULD NOT change the displayed format of the card based on how the fields appear in a payload transmitted by a sender.\n\n`C3003`: Channels MAY alter the position of non-text multimedia content within the card in relation to text-bearing fields in order to achieve visual layout goals. Channels SHOULD preserve the order of non-text multimedia content as presented within the specification.\n\nThe `C3003` requirement is intended to allow repositioning of e.g. an image below or above a card title to match visual style within the channel.\n\n`C3004`: Channels SHOULD preserve all content within the card.\n\n`C3005`: Channels MAY establish rules requiring specific fields within card types.\n\nChannels are recommended to make these rules simple.\n\n`C3006`: Unless otherwise noted in this specification or in accordance with `C3004`, all card fields are optional.\n\n### Buttons\n\nAll cards include content (in the form of one or more fields) and an array of buttons, each of which is represented by an action. Some cards include an additional card action, the \"tap action,\" describing the behavior when the user taps the card but not any of the buttons.\n\nAll Bot Framework card types except Adaptive Cards include a `buttons` field, which contains zero or more buttons to be presented to a user. The type of the `buttons` field is an array of type [`cardAction`](botframework-activity.md#card-action), defined in the [Bot Framework Activity](botframework-activity.md) schema [[1](#References)].\n\n`C4000`: Channels MAY define a minimum and maximum number of buttons to allow on each card type.\n\nChannels are recommended to use simple values for the minimum and maximum number of buttons and avoid complex formulas, such as changing the total number of buttons based on whether certain kinds of content are used.\n\n`C4001`: Channels MUST NOT change the order of buttons on a card.\n\n`C4002`: If a bot sends a button with action type not supported by the channel, the channel SHOULD preserve the button but provide a degraded experience.\n\nThe best degraded experience is an interactive dialog that, upon being clicked, tells the user that the bot sent an action that is not supported. If this is not possible, showing a disabled button is preferred. If this is not possible, the button should be dropped, taking care that the order of other buttons not be changed per `C4001`.\n\n`C4004`: If a bot sends fewer than the minimum or more than the maximum number of buttons allowed on a card, the channel MAY drop the card. Alternatively, the channel MAY down-render the card using rules described for that card type.\n\n## Basic cards\n\nBot Framework defines two cards for presenting a mix of image, text, and interactive elements:\n* [Hero cards](#Hero-cards), which present included images in a large banner\n* [Thumbnail cards](#Thumbnail-cards), which present included images as thumbnails\n\nBoth basic cards support a shared set of properties and generally have card-specific layout.\n\n#### Basic card title\n\nThe `title` field contains the title of the card. The value of the `title` field is of type string.\n\n#### Basic card subtitle\n\nThe `subtitle` field contains the subtitle of the card. The value of the `subtitle` field is of type string.\n\n#### Basic card text\n\nThe `text` field contains the text of the card. The value of the `text` field is of type string.\n\n#### Basic card images\n\nThe `images` field contains one or more images to be shown within the card. The value of the `images` field is an array of type [`cardImage`](#Card-image).\n\n`C5400`: If a bot sends more than the maximum number of images allowed on a card, the channel SHOULD drop excess images.\n\n`C5401`: If a bot sends fewer than the minimum or more than the maximum number of images allowed on a card, the channel MAY drop the card.\n\n#### Basic card buttons\n\nThe `buttons` field is described in detail in the above section titled [Buttons](#Buttons).\n\n#### Basic card tap\n\nThe `tap` field contains an action that may be activated when a user clicks on a non-button or otherwise non-interactive part of a card. The value of the `tap` field is of type [`cardAction`](#Card-action).\n\n`C5500`: Channels that do not support interactive image actions SHOULD drop the `tap` field while preserving the containing card.\n\n## Media cards\n\nBot Framework defines three kinds of cards designed expressly to transmit rich media content:\n* [Animation cards](#Animation-card), for animation or video typically without sound.\n* [Audio cards](#Audio-card), for audio without video\n* [Video cards](#Video-card), for video that may or may not contain audio\n\nAll media cards support a shared set of properties and have card-specific behaviors.\n\n`C6000`: Channels that can display media card content SHOULD document which formats are supported and corresponding limitations (minimum/maximum bitrate, resolution, etc.).\n\n`C6001`: Channels SHOULD use HTTP content-type when retrieving the media to establish its actual type.\n\n`C6002`: A channel that receives media card content of an unsupported type MAY send a hyperlink to the media to the user.\n\n#### Media card title\n\nThe `title` field contains the title of the card. The value of the `title` field is of type string.\n\n#### Media card subtitle\n\nThe `subtitle` field contains the subtitle of the card. The value of the `subtitle` field is of type string.\n\n#### Media card image\n\nThe `image` field contains a placeholder image to be used in place of the media. The value of the `image` field is a complex object of type [`thumbnailUrl`](#Thumbnail-URL).\n\n#### Media card media\n\nThe `media` field contains one or more alternative formats of the same media to be presented. The value of the `media` field is an array of complex objects of type ['mediaUrl'](#Media-URL).\n\n`C6401`: If a receiver receives multiple objects within the `media` array, it MAY prefer media whose `profile` field it understands.\n\n`C6402`: If a receiver receives multiple objects within the `media` array and it does not understand the `profile` field of any, it SHOULD display the first object in the array.\n\n#### Media card buttons\n\nThe `buttons` field is described in detail in the above section titled [Buttons](#Buttons).\n\n`C6500`: Senders SHOULD NOT include media transport control buttons (e.g., play/pause). These are intrinsic to the media playback window.\n\n#### Media card shareable\n\nThe `shareable` field describes whether a client user experience should allow the user to share the content. The value of the `shareable` field is a boolean. If omitted, the default value is `true`.\n\n`C6600`: Channels that do not have configurable settings for sharing content SHOULD ignore the value of the `shareable` field.\n\n#### Media card autoloop\n\nThe `autoloop` field describes whether a client should automatically restart the media when it reaches the end of its content. The value of the `autoloop` field is a boolean. If omitted, the default value is `true`.\n\n`C6700`: Channels that do not have configurable looping for content SHOULD ignore the value of the `autoloop` field.\n\n#### Media card autostart\n\nThe `autostart` field describes whether a client should automatically start playing content when received. The value of the `autostart` field is a boolean. If omitted, the default value is `true`.\n\n`C6800`: Channels SHOULD honor the value of the `autostart` if able and if doing so does not degrade a user's experience.\n\n#### Media card aspect\n\nThe `aspect` field describes the visual aspect ratio of the media content. The value of the `aspect` field is a string with allowed values of `16:9` and `4:3`. `16:9` corresponds to media with width-to-height ratio of 16 to 9; `4:3` corresponds to media with width-to-height ratio of 4 to 3. Any other values have undefined meaning.\n\nThis field is advisory in nature only. The media's actual aspect ratio should be determined by inspecting the media itself.\n\n`C6900`: Senders SHOULD list an `aspect` value corresponding to the media linked in the [`media`](#Media-card-media) field.\n\n`C6901`: If media of multiple aspect ratios is included in the [`media`](#Media-card-media) field, senders SHOULD include an aspect ratio for the first object in the array.\n\n`C6902`: Senders MAY include `aspect` values for media that do not have visual aspect ratios (e.g., audio-only media) if the `aspect` field applies to the [`image`](#Media-card-image) field for the card.\n\n`C6903`: Senders SHOULD NOT include `aspect` values if the media does not have a visual aspect ration and if no [`image`](#Media-card-image) field is supplied.\n\n`C6904`: Senders SHOULD NOT include values other than `16:9` or `4:3` unless it has knowledge that the receiver supports it.\n\n#### Media card duration\n\nThe `duration` field describes the length of the media content without requiring a receiver to open the content. The value of the `duration` field is a string in [ISO 8601 duration format]((https://www.iso.org/iso-8601-date-and-time-format.html) [[7](#References)]).\n\n`C6920`: Senders SHOULD only send values in the ISO 8601 Duration format. Senders SHOULD NOT send times or time intervals in the `duration` field.\n\n`C6930`: Receivers SHOULD ignore `duration` fields they do not understand or which are in conflict with length encoded into the media.\n\n#### Media card value\n\nThe `value` field contains a programmatic payload specific to this media card.\n\n`C6950`: Senders SHOULD NOT include `value` fields of primitive types (e.g. string, int). `value` fields SHOULD be complex types or omitted.\n\n### Animation card\n\nAnimation cards contain animated image content. Typically this content does not contain sound, and is typically presented with minimal transport controls (e.g, pause/play) or no transport controls at all. Some channels treat animation and video content the same way.\n\nAnimation cards follow all shared rules defined for [Media cards](#Media-cards).\n\nAnimation cards are identified by a `contentType` value of `application/vnd.microsoft.card.animation`.\n\n### Audio card\n\nAudio cards contain audio content.\n\nAudio cards follow all shared rules defined for [Media cards](#Media-cards).\n\nAudio cards are identified by a `contentType` value of `application/vnd.microsoft.card.audio`.\n\n`C7100`: Senders SHOULD NOT send video content within audio cards.\n\n`C7101`: If it receives video content within an audio card, a client MAY elect to present only the audio portion of the media.\n\n### Video card\n\nVideo cards contain video content. Typically this content is presented to the user with advanced transport controls (e.g. rewind/restart/pause/play). Some channels treat animation and video content the same way.\n\nVideo cards follow all shared rules defined for [Media cards](#Media-cards).\n\nVideo cards are identified by a `contentType` value of `application/vnd.microsoft.card.video`.\n\n## Receipt card\n\nReceipt cards contain two tables of data (a list of receipt items, and a list of facts). They are intended to be an informative display and are not necessarily actionable on their own. For integration with payment systems suitable for conducting transactions, see the [payment action](#Payment).\n\nReceipt cards are identified by a `contentType` value of `application/vnd.microsoft.card.receipt`.\n\n`C7300`: Channels SHOULD render the `items` and `facts` fields as visual tables or approximations of tables (using e.g. fixed-width formatting).\n\n`C7301`: Channels SHOULD render a delimiter between the `items` and `facts` field if both are present and contain any elements.\n\n### Receipt card title\n\nThe `title` field contains the title of the card. The value of the `title` field is of type string.\n\n### Receipt card items\n\nThe `items` field contains receipt items to be displayed in tabular form. The value of the `items` field is an array of type [`receiptItem`](#Receipt-item).\n\n`C7310`: Channels MUST NOT alter the order of items within the `items` array.\n\n### Receipt card facts\n\nThe `facts` field contains a flat list of key/value pairs to be displayed in tabular form. The value of the `facts` field is an array of type [`fact`](#Fact).\n\n`C7320`: Channels MUST NOT alter the order of items within the `facts` array.\n\n`C7321`: Channels SHOULD NOT reject the `facts` field or its contents if more than two items have the same [`key`](#Fact-key).\n\nAlthough `facts` contains key-value pairs, receivers should not take the key-value pairing literally, and should allow duplicates per `C7531`.\n\n### Receipt card tap\n\nThe `tap` field contains an action that may be activated when a user clicks on a non-button or otherwise non-interactive part of a card. The value of the `tap` field is of type [`cardAction`](#Card-action).\n\n`C7330`: Channels that do not support interactive image actions SHOULD drop the `tap` field while preserving the containing card.\n\n### Receipt card total\n\nThe `total` field contains the total field to be displayed on the receipt. The value of the `total` field is a string.\n\n### Receipt card tax\n\nThe `tax` field contains the tax field to be displayed on the receipt. The value of the `tax` field is a string.\n\n### Receipt card VAT\n\nThe `vat` field contains the value-added tax (VAT) field to be displayed on the receipt. The value of the `vat` field is a string.\n\n### Receipt card buttons\n\nThe `buttons` field is described in detail in the above section titled [Buttons](#Buttons).\n\n## Signin card\n\nSignin cards are used to send a sign-in request to a user. Channels that support sign-in cards typically adorn the card with additional visual style to designate it as a sign-in card.\n\nSignin cards are identified by a `contentType` value of `application/vnd.microsoft.card.signin`.\n\n### Signin card text\n\nThe `text` field contains the text of the card. The value of the `text` field is of type string.\n\n### Signin card buttons\n\nThe `buttons` field is described in detail in the above section titled [Buttons](#Buttons).\n\n## Complex types\n\nThis section defines complex types used within the activity schema, described above.\n\n### Thumbnail URL\n\nSome clients have the ability to display custom thumbnails for non-interactive attachments or as placeholders for interactive attachments. The `thumbnailUrl` field identifies the source for this thumbnail. Data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[6](#References)] are typically also allowed.\n\n`C8000`: Receivers SHOULD accept HTTPS URLs.\n\n`C8001`: Receivers MAY accept HTTP URLs.\n\n`C8002`: Channels SHOULD accept data URIs.\n\n`C8003`: Channels SHOULD NOT send `thumbnailUrl` fields to bots.\n\n### Card image\n\nCard images are used to display image content within [Hero cards](#Hero-cards) and [Thumbnail cards](#Thumbnail-cards).\n\n#### Card image URL\n\nThe `url` field references image content to be displayed within a card. Data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[6](#References)] are typically supported by channels. The value of the `url` field is of type string.\n\n`C8100`: Channels SHOULD accept HTTPS URLs.\n\n`C8101`: Channels MAY accept HTTP URLs.\n\n`C8102`: Channels SHOULD accept data URIs.\n\n#### Card image Alt tag\n\nThe `alt` field contains equivalent content for clients that cannot process images or have not yet loaded the image. The value of the `alt` field is a string.\n\n#### Card image tap\n\nThe `tap` field contains an action to be activated if the user taps on an image or associated framing. The value of the `tap` field is of type [`cardAction`](#Card-action).\n\n`C8120`: Channels that do not support interactive image actions SHOULD drop the `tap` field while preserving the containing card image.\n\n### Media URL\n\nA media URL object contains information about a media attachment.\n\n#### Media URL URL\n\nThe `url` field contains a URL to the media. Because media URL objects do not contain content type information, data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[6](#References),  are not supported.\n\n`C8200`: Receivers SHOULD accept HTTPS URLs.\n\n`C8201`: Receivers MAY accept HTTP URLs.\n\n`C8202`: Senders SHOULD NOT send data URIs.\n\n#### Media URL profile\n\nThe `profile` field contains an optional hint to the client to allow it to differentiate between media URLs. The value of the `profile` field is of type string and is defined by the channel.\n\n### Receipt item\n\nA `receiptItem` is a single row to be shown within the [`items`](#Receipt-card-items) field of a [receipt card](#Receipt-card).\n\n#### Receipt item title\n\nThe `title` field contains the title for the receipt item. The value of the `title` field is a string.\n\n#### Receipt item subtitle\n\nThe `subtitle` field contains the subtitle for the receipt item. The value of the `subtitle` field is a string.\n\n#### Receipt item text\n\nThe `text` field contains the text for the receipt item. The value of the `text` field is a string.\n\n#### Receipt item image\n\nThe `image` field contains an image to be shown within the receipt item row. The value of the `image` field is an object of type [`cardImage`](#Card-image).\n\n#### Receipt item price\n\nThe `price` field contains the displayed unit price with accompanying currency symbols. The value of the `price` field is a string.\n\n#### Receipt item quantity\n\nThe `quantity` field contains the quantity of units in the receipt row. The value of the `quantity` field is a string. If omitted, the implied value is `1`.\n\n#### Receipt item tap\n\nThe `tap` field contains an action that may be activated when a user clicks on a non-button or otherwise non-interactive part of a card. The value of the `tap` field is of type [`cardAction`](#Card-action).\n\n### Fact\n\nA `fact` is a single row to be shown within the [`facts`](#Receipt-card-facts) field of a [receipt card](#Receipt-card).\n\n#### Fact key\n\nThe `key` field contains the nominative component of the fact. The value of the `key` field is a string.\n\n#### Fact value\n\nThe `value` field contains the objective component of the fact. The value of the `value` field is a string.\n\n## References\n\n1. [Bot Framework Activity](botframework-activity.md)\n2. [Bot Framework Protocol](../botframework-protocol/botframework-protocol.md)\n3. [Adaptive Cards](https://adaptivecards.io)\n4. [RFC 2119](https://tools.ietf.org/html/rfc2119)\n5. [MIME media types](https://www.iana.org/assignments/media-types/media-types.xhtml)\n6. [RFC 2397](https://tools.ietf.org/html/rfc2397)\n7. [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html)\n\n# Appendix I - Changes\n\n## 2018-10-08 - dandris@microsoft.com\n\n* Add [`duration`](#Media-card-duration) field\n\n## 2018-07-05 - dandris@microsoft.com\n\n* Initial draft\n"
  },
  {
    "path": "specs/botframework-protocol/botframework-channel.json",
    "content": "{\n  \"swagger\": \"2.0\",\n  \"info\": {\n    \"version\": \"3.1.12\",\n    \"title\": \"Microsoft Bot Connector API - v3.1\",\n    \"description\": \"The Microsoft Bot Framework Connector APIs allow bots to send and receive\\r\\nmessages, button clicks, and other programmatic events when connecting with\\r\\nend users. This API also includes facilities to get conversation metadata\\r\\nand perform other operations (deletions and content editing). This REST API\\r\\nmay be used directly over HTTP and Web Socket, but is easiest to use with\\r\\nthe Bot Framework SDK.\\r\\n\\r\\n© 2020 Microsoft\",\n    \"termsOfService\": \"https://www.microsoft.com/en-us/legal/intellectualproperty/copyright/default.aspx\",\n    \"contact\": {\n      \"name\": \"Bot Framework\",\n      \"url\": \"https://botframework.com\",\n      \"email\": \"botframework@microsoft.com\"\n    },\n    \"license\": {\n      \"name\": \"The MIT License (MIT)\",\n      \"url\": \"https://opensource.org/licenses/MIT\"\n    }\n  },\n  \"host\": \"api.botframework.com\",\n  \"schemes\": [\n    \"https\"\n  ],\n  \"paths\": {\n    \"/v3/attachments/{attachmentId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Attachments\"\n        ],\n        \"summary\": \"GetAttachmentInfo\",\n        \"description\": \"Get AttachmentInfo structure describing the attachment views\",\n        \"operationId\": \"Attachments_GetAttachmentInfo\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"attachmentId\",\n            \"in\": \"path\",\n            \"description\": \"attachment id\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An attachmentInfo object is returned which describes the:\\r\\n* type of the attachment\\r\\n* name of the attachment\\r\\n\\r\\n\\r\\nand an array of views:\\r\\n* Size - size of the object\\r\\n* ViewId - View Id which can be used to fetch a variation on the content (ex: original or thumbnail)\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/AttachmentInfo\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/attachments/{attachmentId}/views/{viewId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Attachments\"\n        ],\n        \"summary\": \"GetAttachment\",\n        \"description\": \"Get the named view as binary content\",\n        \"operationId\": \"Attachments_GetAttachment\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"attachmentId\",\n            \"in\": \"path\",\n            \"description\": \"attachment id\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"viewId\",\n            \"in\": \"path\",\n            \"description\": \"View id from attachmentInfo\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Attachment stream\",\n            \"schema\": {\n              \"format\": \"byte\",\n              \"type\": \"file\"\n            }\n          },\n          \"301\": {\n            \"description\": \"The Location header describes where the content is now.\"\n          },\n          \"302\": {\n            \"description\": \"The Location header describes where the content is now.\"\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversations\",\n        \"description\": \"List the Conversations in which this bot has participated.\\r\\n\\r\\nGET from this method with a skip token\\r\\n\\r\\nThe return value is a ConversationsResult, which contains an array of ConversationMembers and a skip token.  If the skip token is not empty, then \\r\\nthere are further values to be returned. Call this method again with the returned token to get more values.\\r\\n\\r\\nEach ConversationMembers object contains the ID of the conversation and an array of ChannelAccounts that describe the members of the conversation.\",\n        \"operationId\": \"Conversations_GetConversations\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"continuationToken\",\n            \"in\": \"query\",\n            \"description\": \"skip or continuation token\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing \\r\\n* an array (Conversations) of ConversationMembers objects\\r\\n* a continuation token\\r\\n\\r\\nEach ConversationMembers object contains:\\r\\n* the Id of the conversation\\r\\n* an array (Members) of ChannelAccount objects\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationsResult\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"CreateConversation\",\n        \"description\": \"Create a new Conversation.\\r\\n\\r\\nPOST to this method with a\\r\\n* Bot being the bot creating the conversation\\r\\n* IsGroup set to true if this is not a direct message (default is false)\\r\\n* Array containing the members to include in the conversation\\r\\n\\r\\nThe return value is a ResourceResponse which contains a conversation id which is suitable for use\\r\\nin the message payload and REST API uris.\\r\\n\\r\\nMost channels only support the semantics of bots initiating a direct message conversation.  An example of how to do that would be:\\r\\n\\r\\n```\\r\\nvar resource = await connector.conversations.CreateConversation(new ConversationParameters(){ Bot = bot, members = new ChannelAccount[] { new ChannelAccount(\\\"user1\\\") } );\\r\\nawait connect.Conversations.SendToConversationAsync(resource.Id, new Activity() ... ) ;\\r\\n\\r\\n```\",\n        \"operationId\": \"Conversations_CreateConversation\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"parameters\",\n            \"in\": \"body\",\n            \"description\": \"Parameters to create the conversation from\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationParameters\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing \\r\\n* the ID for the conversation\\r\\n* ActivityId for the activity if provided.  If ActivityId is null then the channel doesn't support returning resource id's for activity.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"An object will be returned containing \\r\\n* the ID for the conversation\\r\\n* ActivityId for the activity if provided.  If ActivityId is null then the channel doesn't support returning resource id's for activity.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing \\r\\n* the ID for the conversation\\r\\n* ActivityId for the activity if provided.  If ActivityId is null then the channel doesn't support returning resource id's for activity.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"SendToConversation\",\n        \"description\": \"This method allows you to send an activity to the end of a conversation.\\r\\n\\r\\nThis is slightly different from ReplyToActivity().\\r\\n* SendToConversation(conversationId) - will append the activity to the end of the conversation according to the timestamp or semantics of the channel.\\r\\n* ReplyToActivity(conversationId,ActivityId) - adds the activity as a reply to another activity, if the channel supports it. If the channel does not support nested replies, ReplyToActivity falls back to SendToConversation.\\r\\n\\r\\nUse ReplyToActivity when replying to a specific activity in the conversation.\\r\\n\\r\\nUse SendToConversation in all other cases.\",\n        \"operationId\": \"Conversations_SendToConversation\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"Activity to send\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities/history\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"SendConversationHistory\",\n        \"description\": \"This method allows you to upload the historic activities to the conversation.\\r\\n\\r\\nSender must ensure that the historic activities have unique ids and appropriate timestamps. The ids are used by the client to deal with duplicate activities and the timestamps are used by the client to render the activities in the right order.\",\n        \"operationId\": \"Conversations_SendConversationHistory\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"history\",\n            \"in\": \"body\",\n            \"description\": \"Historic activities\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Transcript\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities/{activityId}\": {\n      \"put\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"UpdateActivity\",\n        \"description\": \"Edit an existing activity.\\r\\n\\r\\nSome channels allow you to edit an existing activity to reflect the new state of a bot conversation.\\r\\n\\r\\nFor example, you can remove buttons after someone has clicked \\\"Approve\\\" button.\",\n        \"operationId\": \"Conversations_UpdateActivity\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"activityId to update\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"replacement Activity\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"ReplyToActivity\",\n        \"description\": \"This method allows you to reply to an activity.\\r\\n\\r\\nThis is slightly different from SendToConversation().\\r\\n* SendToConversation(conversationId) - will append the activity to the end of the conversation according to the timestamp or semantics of the channel.\\r\\n* ReplyToActivity(conversationId,ActivityId) - adds the activity as a reply to another activity, if the channel supports it. If the channel does not support nested replies, ReplyToActivity falls back to SendToConversation.\\r\\n\\r\\nUse ReplyToActivity when replying to a specific activity in the conversation.\\r\\n\\r\\nUse SendToConversation in all other cases.\",\n        \"operationId\": \"Conversations_ReplyToActivity\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"activityId the reply is to (OPTIONAL)\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"Activity to send\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"DeleteActivity\",\n        \"description\": \"Delete an existing activity.\\r\\n\\r\\nSome channels allow you to delete an existing activity, and if successful this method will remove the specified activity.\",\n        \"operationId\": \"Conversations_DeleteActivity\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"activityId to delete\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation succeeded, there is no response.\"\n          },\n          \"202\": {\n            \"description\": \"The request has been accepted for processing, but the processing has not been completed\"\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/members\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversationMembers\",\n        \"description\": \"Enumerate the members of a conversation. \\r\\n\\r\\nThis REST API takes a ConversationId and returns an array of ChannelAccount objects representing the members of the conversation.\",\n        \"operationId\": \"Conversations_GetConversationMembers\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An array of ChannelAccount objects\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/ChannelAccount\"\n              },\n              \"x-omitempty\": true\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/members/{memberId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversationMember\",\n        \"description\": \"Get a single member of a conversation.\\r\\n\\r\\nThis REST API takes a ConversationId and MemberId and returns a single ChannelAccount object, if that member is found in this conversation.\",\n        \"operationId\": \"Conversations_GetConversationMember\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"memberId\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A ChannelAccount which has \\r\\n\\r\\n* id - address on this channel\\r\\n* name - name of the user/bot on this channel\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ChannelAccount\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"DeleteConversationMember\",\n        \"description\": \"Deletes a member from a conversation. \\r\\n\\r\\nThis REST API takes a ConversationId and a memberId (of type string) and removes that member from the conversation. If that member was the last member\\r\\nof the conversation, the conversation will also be deleted.\",\n        \"operationId\": \"Conversations_DeleteConversationMember\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"memberId\",\n            \"in\": \"path\",\n            \"description\": \"ID of the member to delete from this conversation\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation succeeded, there is no response.\"\n          },\n          \"204\": {\n            \"description\": \"The operation succeeded but no content was returned.\"\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/pagedmembers\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversationPagedMembers\",\n        \"description\": \"Enumerate the members of a conversation one page at a time.\\r\\n\\r\\nThis REST API takes a ConversationId. Optionally a pageSize and/or continuationToken can be provided. It returns a PagedMembersResult, which contains an array\\r\\nof ChannelAccounts representing the members of the conversation and a continuation token that can be used to get more values.\\r\\n\\r\\nOne page of ChannelAccounts records are returned with each call. The number of records in a page may vary between channels and calls. The pageSize parameter can be used as \\r\\na suggestion. If there are no additional results the response will not contain a continuation token. If there are no members in the conversation the Members will be empty or not present in the response.\\r\\n\\r\\nA response to a request that has a continuation token from a prior request may rarely return members from a previous request.\",\n        \"operationId\": \"Conversations_GetConversationPagedMembers\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"pageSize\",\n            \"in\": \"query\",\n            \"description\": \"Suggested page size\",\n            \"required\": false,\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          {\n            \"name\": \"continuationToken\",\n            \"in\": \"query\",\n            \"description\": \"Continuation Token\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PagedMembersResult\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities/{activityId}/members\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetActivityMembers\",\n        \"description\": \"Enumerate the members of an activity. \\r\\n\\r\\nThis REST API takes a ConversationId and a ActivityId, returning an array of ChannelAccount objects representing the members of the particular activity in the conversation.\",\n        \"operationId\": \"Conversations_GetActivityMembers\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"Activity ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An array of ChannelAccount objects\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/ChannelAccount\"\n              },\n              \"x-omitempty\": true\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/attachments\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"UploadAttachment\",\n        \"description\": \"Upload an attachment directly into a channel's blob storage.\\r\\n\\r\\nThis is useful because it allows you to store data in a compliant store when dealing with enterprises.\\r\\n\\r\\nThe response is a ResourceResponse which contains an AttachmentId which is suitable for using with the attachments API.\",\n        \"operationId\": \"Conversations_UploadAttachment\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"attachmentUpload\",\n            \"in\": \"body\",\n            \"description\": \"Attachment data\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/AttachmentData\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    }\n  },\n  \"definitions\": {\n    \"AttachmentInfo\": {\n      \"description\": \"Metadata for an attachment\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"description\": \"Name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"ContentType of the attachment\",\n          \"type\": \"string\"\n        },\n        \"views\": {\n          \"description\": \"attachment views\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AttachmentView\"\n          },\n          \"x-omitempty\": true\n        }\n      }\n    },\n    \"AttachmentView\": {\n      \"description\": \"Attachment View name and size\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"viewId\": {\n          \"description\": \"Id of the attachment\",\n          \"type\": \"string\"\n        },\n        \"size\": {\n          \"format\": \"int32\",\n          \"description\": \"Size of the attachment\",\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"ErrorResponse\": {\n      \"description\": \"An HTTP API response\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"error\": {\n          \"$ref\": \"#/definitions/Error\",\n          \"description\": \"Error message\"\n        }\n      }\n    },\n    \"Error\": {\n      \"description\": \"Object representing error information\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"code\": {\n          \"description\": \"Error code\",\n          \"type\": \"string\"\n        },\n        \"message\": {\n          \"description\": \"Error message\",\n          \"type\": \"string\"\n        },\n        \"innerHttpError\": {\n          \"$ref\": \"#/definitions/InnerHttpError\",\n          \"description\": \"Error from inner http call\"\n        }\n      }\n    },\n    \"InnerHttpError\": {\n      \"description\": \"Object representing inner http error\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"statusCode\": {\n          \"format\": \"int32\",\n          \"description\": \"HttpStatusCode from failed request\",\n          \"type\": \"integer\"\n        },\n        \"body\": {\n          \"description\": \"Body from failed request\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ConversationParameters\": {\n      \"description\": \"Parameters for creating a new conversation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"isGroup\": {\n          \"description\": \"IsGroup\",\n          \"type\": \"boolean\"\n        },\n        \"bot\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"The bot address for this conversation\"\n        },\n        \"members\": {\n          \"description\": \"Members to add to the conversation\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          },\n          \"x-omitempty\": true\n        },\n        \"topicName\": {\n          \"description\": \"(Optional) Topic of the conversation (if supported by the channel)\",\n          \"type\": \"string\"\n        },\n        \"tenantId\": {\n          \"description\": \"(Optional) The tenant ID in which the conversation should be created\",\n          \"type\": \"string\"\n        },\n        \"activity\": {\n          \"$ref\": \"#/definitions/Activity\",\n          \"description\": \"(Optional) When creating a new conversation, use this activity as the initial message to the conversation\"\n        },\n        \"channelData\": {\n          \"description\": \"Channel specific payload for creating the conversation\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ChannelAccount\": {\n      \"description\": \"Channel account information needed to route a message\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or 123456)\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Display friendly name\",\n          \"type\": \"string\"\n        },\n        \"aadObjectId\": {\n          \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"$ref\": \"#/definitions/RoleTypes\",\n          \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\"\n        }\n      }\n    },\n    \"Activity\": {\n      \"description\": \"An Activity is the basic communication type for the Bot Framework 3.0 protocol.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/ActivityTypes\",\n          \"description\": \"Contains the activity type.\"\n        },\n        \"id\": {\n          \"description\": \"Contains an ID that uniquely identifies the activity on the channel.\",\n          \"type\": \"string\"\n        },\n        \"timestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.\",\n          \"type\": \"string\",\n          \"x-nullable\": true\n        },\n        \"localTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Contains the local date and time of the message, expressed in ISO-8601 format.\\r\\nFor example, 2016-09-23T13:07:49.4714686-07:00.\",\n          \"type\": \"string\",\n          \"x-nullable\": true\n        },\n        \"localTimezone\": {\n          \"description\": \"Contains the name of the local timezone of the message, expressed in IANA Time Zone database format.\\r\\nFor example, America/Los_Angeles.\",\n          \"type\": \"string\"\n        },\n        \"callerId\": {\n          \"description\": \"A string containing an IRI identifying the caller of a bot. This field is not intended to be transmitted\\r\\nover the wire, but is instead populated by bots and clients based on cryptographically verifiable data\\r\\nthat asserts the identity of the callers (e.g. tokens).\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Contains the URL that specifies the channel's service endpoint. Set by the channel.\",\n          \"type\": \"string\"\n        },\n        \"channelId\": {\n          \"description\": \"Contains an ID that uniquely identifies the channel. Set by the channel.\",\n          \"type\": \"string\"\n        },\n        \"from\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Identifies the sender of the message.\"\n        },\n        \"conversation\": {\n          \"$ref\": \"#/definitions/ConversationAccount\",\n          \"description\": \"Identifies the conversation to which the activity belongs.\"\n        },\n        \"recipient\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Identifies the recipient of the message.\"\n        },\n        \"textFormat\": {\n          \"$ref\": \"#/definitions/TextFormatTypes\",\n          \"description\": \"Format of text fields Default:markdown\"\n        },\n        \"attachmentLayout\": {\n          \"$ref\": \"#/definitions/AttachmentLayoutTypes\",\n          \"description\": \"The layout hint for multiple attachments. Default: list.\"\n        },\n        \"membersAdded\": {\n          \"description\": \"The collection of members added to the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          },\n          \"x-omitempty\": true\n        },\n        \"membersRemoved\": {\n          \"description\": \"The collection of members removed from the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          },\n          \"x-omitempty\": true\n        },\n        \"reactionsAdded\": {\n          \"description\": \"The collection of reactions added to the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MessageReaction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"reactionsRemoved\": {\n          \"description\": \"The collection of reactions removed from the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MessageReaction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"topicName\": {\n          \"description\": \"The updated topic name of the conversation.\",\n          \"type\": \"string\"\n        },\n        \"historyDisclosed\": {\n          \"description\": \"Indicates whether the prior history of the channel is disclosed.\",\n          \"type\": \"boolean\"\n        },\n        \"locale\": {\n          \"description\": \"A BCP-47 locale name for the contents of the text field.\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"The text content of the message.\",\n          \"type\": \"string\"\n        },\n        \"speak\": {\n          \"description\": \"The text to speak.\",\n          \"type\": \"string\"\n        },\n        \"inputHint\": {\n          \"$ref\": \"#/definitions/InputHints\",\n          \"description\": \"Indicates whether your bot is accepting,\\r\\nexpecting, or ignoring user input after the message is delivered to the client.\"\n        },\n        \"summary\": {\n          \"description\": \"The text to display if the channel cannot render cards.\",\n          \"type\": \"string\"\n        },\n        \"suggestedActions\": {\n          \"$ref\": \"#/definitions/SuggestedActions\",\n          \"description\": \"The suggested actions for the activity.\"\n        },\n        \"attachments\": {\n          \"description\": \"Attachments\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Attachment\"\n          },\n          \"x-omitempty\": true\n        },\n        \"entities\": {\n          \"description\": \"Represents the entities that were mentioned in the message.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Entity\"\n          },\n          \"x-omitempty\": true\n        },\n        \"channelData\": {\n          \"description\": \"Contains channel-specific content.\",\n          \"type\": \"object\"\n        },\n        \"action\": {\n          \"description\": \"Indicates whether the recipient of a contactRelationUpdate was added or removed from the sender's contact list.\",\n          \"type\": \"string\"\n        },\n        \"replyToId\": {\n          \"description\": \"Contains the ID of the message to which this message is a reply.\",\n          \"type\": \"string\"\n        },\n        \"label\": {\n          \"description\": \"A descriptive label for the activity.\",\n          \"type\": \"string\"\n        },\n        \"valueType\": {\n          \"description\": \"The type of the activity's value object.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"A value that is associated with the activity.\",\n          \"type\": \"object\"\n        },\n        \"name\": {\n          \"description\": \"The name of the operation associated with an invoke or event activity.\",\n          \"type\": \"string\"\n        },\n        \"relatesTo\": {\n          \"$ref\": \"#/definitions/ConversationReference\",\n          \"description\": \"A reference to another conversation or activity.\"\n        },\n        \"code\": {\n          \"$ref\": \"#/definitions/EndOfConversationCodes\",\n          \"description\": \"The a code for endOfConversation activities that indicates why the conversation ended.\"\n        },\n        \"expiration\": {\n          \"format\": \"date-time\",\n          \"description\": \"The time at which the activity should be considered to be \\\"expired\\\" and should not be presented to the recipient.\",\n          \"type\": \"string\",\n          \"x-nullable\": true\n        },\n        \"importance\": {\n          \"$ref\": \"#/definitions/ActivityImportance\",\n          \"description\": \"The importance of the activity.\"\n        },\n        \"deliveryMode\": {\n          \"$ref\": \"#/definitions/DeliveryModes\",\n          \"description\": \"A delivery hint to signal to the recipient alternate delivery paths for the activity.\\r\\nThe default delivery mode is \\\"default\\\".\"\n        },\n        \"listenFor\": {\n          \"description\": \"List of phrases and references that speech and language priming systems should listen for\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"x-omitempty\": true\n        },\n        \"textHighlights\": {\n          \"description\": \"The collection of text fragments to highlight when the activity contains a ReplyToId value.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/TextHighlight\"\n          },\n          \"x-omitempty\": true\n        },\n        \"semanticAction\": {\n          \"$ref\": \"#/definitions/SemanticAction\",\n          \"description\": \"An optional programmatic action accompanying this request\"\n        }\n      }\n    },\n    \"ConversationAccount\": {\n      \"description\": \"Conversation account represents the identity of the conversation within a channel\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"isGroup\": {\n          \"description\": \"Indicates whether the conversation contains more than two participants at the time the activity was generated\",\n          \"type\": \"boolean\"\n        },\n        \"conversationType\": {\n          \"description\": \"Indicates the type of the conversation in channels that distinguish between conversation types\",\n          \"type\": \"string\"\n        },\n        \"tenantId\": {\n          \"description\": \"This conversation's tenant ID\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or 123456)\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Display friendly name\",\n          \"type\": \"string\"\n        },\n        \"aadObjectId\": {\n          \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"$ref\": \"#/definitions/RoleTypes\",\n          \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\"\n        }\n      }\n    },\n    \"MessageReaction\": {\n      \"description\": \"Message reaction object\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/MessageReactionTypes\",\n          \"description\": \"Message reaction type\"\n        }\n      }\n    },\n    \"SuggestedActions\": {\n      \"description\": \"SuggestedActions that can be performed\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"to\": {\n          \"description\": \"Ids of the recipients that the actions should be shown to.  These Ids are relative to the channelId and a subset of all recipients of the activity\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"actions\": {\n          \"description\": \"Actions that can be shown to the user\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"Attachment\": {\n      \"description\": \"An attachment within an activity\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"contentType\": {\n          \"description\": \"mimetype/Contenttype for the file\",\n          \"type\": \"string\"\n        },\n        \"contentUrl\": {\n          \"description\": \"Content Url\",\n          \"type\": \"string\"\n        },\n        \"content\": {\n          \"description\": \"Embedded content\",\n          \"type\": \"object\"\n        },\n        \"name\": {\n          \"description\": \"(OPTIONAL) The name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"thumbnailUrl\": {\n          \"description\": \"(OPTIONAL) Thumbnail associated with attachment\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Entity\": {\n      \"description\": \"Metadata object pertaining to an activity\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Type of this entity (RFC 3987 IRI)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ConversationReference\": {\n      \"description\": \"An object relating to a particular point in a conversation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activityId\": {\n          \"description\": \"(Optional) ID of the activity to refer to\",\n          \"type\": \"string\"\n        },\n        \"user\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"(Optional) User participating in this conversation\"\n        },\n        \"bot\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"(Optional) Bot participating in this conversation\"\n        },\n        \"conversation\": {\n          \"$ref\": \"#/definitions/ConversationAccount\",\n          \"description\": \"Reference to the conversation\"\n        },\n        \"channelId\": {\n          \"description\": \"ID of the channel in which the referenced conversation exists\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"(Optional) Service endpoint where operations concerning the referenced conversation may be performed\",\n          \"type\": \"string\"\n        },\n        \"locale\": {\n          \"description\": \"(Optional) A BCP-47 locale name for the referenced conversation\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TextHighlight\": {\n      \"description\": \"Refers to a substring of content within another field\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Defines the snippet of text to highlight\",\n          \"type\": \"string\"\n        },\n        \"occurrence\": {\n          \"format\": \"int32\",\n          \"description\": \"Occurrence of the text field within the referenced text, if multiple exist.\",\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"SemanticAction\": {\n      \"description\": \"Represents a reference to a programmatic action\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"state\": {\n          \"$ref\": \"#/definitions/SemanticActionStates\",\n          \"description\": \"State of this action. Allowed values: `start`, `continue`, `done`\"\n        },\n        \"id\": {\n          \"description\": \"ID of this action\",\n          \"type\": \"string\"\n        },\n        \"entities\": {\n          \"description\": \"Entities associated with this action\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/Entity\"\n          }\n        }\n      }\n    },\n    \"CardAction\": {\n      \"description\": \"A clickable action\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/ActionTypes\",\n          \"description\": \"The type of action implemented by this button\"\n        },\n        \"title\": {\n          \"description\": \"Text description which appears on the button\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"description\": \"Image URL which will appear on the button, next to text label\",\n          \"type\": \"string\"\n        },\n        \"imageAltText\": {\n          \"description\": \"Alternate text to be used for the Image property\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for this action\",\n          \"type\": \"string\"\n        },\n        \"displayText\": {\n          \"description\": \"(Optional) text to display in the chat feed if the button is clicked\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for action. Content of this property depends on the ActionType\",\n          \"type\": \"object\"\n        },\n        \"channelData\": {\n          \"description\": \"Channel-specific data associated with this action\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ConversationResourceResponse\": {\n      \"description\": \"A response containing a resource\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activityId\": {\n          \"description\": \"ID of the Activity (if sent)\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Service endpoint where operations concerning the conversation may be performed\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"Id of the resource\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ConversationsResult\": {\n      \"description\": \"Conversations result\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Paging token\",\n          \"type\": \"string\"\n        },\n        \"conversations\": {\n          \"description\": \"List of conversations\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ConversationMembers\"\n          }\n        }\n      }\n    },\n    \"ConversationMembers\": {\n      \"description\": \"Conversation and its members\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Conversation ID\",\n          \"type\": \"string\"\n        },\n        \"members\": {\n          \"description\": \"List of members in this conversation\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        }\n      }\n    },\n    \"ResourceResponse\": {\n      \"description\": \"A response containing a resource ID\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Id of the resource\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Transcript\": {\n      \"description\": \"Transcript\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activities\": {\n          \"description\": \"A collection of Activities that conforms to the Transcript schema.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Activity\"\n          }\n        }\n      }\n    },\n    \"PagedMembersResult\": {\n      \"description\": \"Page of members.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Paging token\",\n          \"type\": \"string\"\n        },\n        \"members\": {\n          \"description\": \"The Channel Accounts.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        }\n      }\n    },\n    \"AttachmentData\": {\n      \"description\": \"Attachment data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Content-Type of the attachment\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"originalBase64\": {\n          \"format\": \"byte\",\n          \"description\": \"Attachment content\",\n          \"type\": \"string\"\n        },\n        \"thumbnailBase64\": {\n          \"format\": \"byte\",\n          \"description\": \"Attachment thumbnail\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"HeroCard\": {\n      \"description\": \"A Hero card (card with a single, large image)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"CardImage\": {\n      \"description\": \"An image on a card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL thumbnail image for major content property\",\n          \"type\": \"string\"\n        },\n        \"alt\": {\n          \"description\": \"Image description intended for screen readers\",\n          \"type\": \"string\"\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"Action assigned to specific Attachment\"\n        }\n      }\n    },\n    \"AnimationCard\": {\n      \"description\": \"An animation card (Ex: gif or short video clip)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ThumbnailUrl\": {\n      \"description\": \"Thumbnail URL\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL pointing to the thumbnail to use for media content\",\n          \"type\": \"string\"\n        },\n        \"alt\": {\n          \"description\": \"HTML alt text to include on this thumbnail image\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"MediaUrl\": {\n      \"description\": \"Media URL\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"Url for the media\",\n          \"type\": \"string\"\n        },\n        \"profile\": {\n          \"description\": \"Optional profile hint to the client to differentiate multiple MediaUrl objects from each other\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"AudioCard\": {\n      \"description\": \"Audio card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"BasicCard\": {\n      \"description\": \"A basic card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"MediaCard\": {\n      \"description\": \"Media card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ReceiptCard\": {\n      \"description\": \"A receipt card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"facts\": {\n          \"description\": \"Array of Fact objects\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Fact\"\n          },\n          \"x-omitempty\": true\n        },\n        \"items\": {\n          \"description\": \"Array of Receipt Items\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ReceiptItem\"\n          },\n          \"x-omitempty\": true\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card\"\n        },\n        \"total\": {\n          \"description\": \"Total amount of money paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"tax\": {\n          \"description\": \"Total amount of tax paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"vat\": {\n          \"description\": \"Total amount of VAT paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        }\n      }\n    },\n    \"Fact\": {\n      \"description\": \"Set of key-value pairs. Advantage of this section is that key and value properties will be \\r\\nrendered with default style information with some delimiter between them. So there is no need for developer to specify style information.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"key\": {\n          \"description\": \"The key for this Fact\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"The value for this Fact\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ReceiptItem\": {\n      \"description\": \"An item on a receipt card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the Card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle appears just below Title field, differs from Title in font styling only\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text field appears just below subtitle, differs from Subtitle in font styling only\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/CardImage\",\n          \"description\": \"Image\"\n        },\n        \"price\": {\n          \"description\": \"Amount with currency\",\n          \"type\": \"string\"\n        },\n        \"quantity\": {\n          \"description\": \"Number of items of given kind\",\n          \"type\": \"string\"\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the Item bubble.\"\n        }\n      }\n    },\n    \"SigninCard\": {\n      \"description\": \"A card representing a request to sign in\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Text for signin request\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Action to use to perform signin\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        }\n      }\n    },\n    \"OAuthCard\": {\n      \"description\": \"A card representing a request to perform a sign in via OAuth\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Text for signin request\",\n          \"type\": \"string\"\n        },\n        \"connectionName\": {\n          \"description\": \"The name of the registered connection\",\n          \"type\": \"string\"\n        },\n        \"tokenExchangeResource\": {\n          \"$ref\": \"#/definitions/TokenExchangeResource\",\n          \"description\": \"The resource to try to perform token exchange with\"\n        },\n        \"buttons\": {\n          \"description\": \"Action to use to perform signin\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        }\n      }\n    },\n    \"TokenExchangeResource\": {\n      \"description\": \"Record for a token exchange request that is sent as part of an OAuthCard\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"A unique identifier for this token exchange instance\",\n          \"type\": \"string\"\n        },\n        \"uri\": {\n          \"description\": \"The application ID / resource identifier with which to exchange a token on behalf of\",\n          \"type\": \"string\"\n        },\n        \"providerId\": {\n          \"description\": \"The identifier of the provider with which to attempt a token exchange\\r\\nA value of null or empty will default to Azure Active Directory\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ThumbnailCard\": {\n      \"description\": \"A thumbnail card (card with a single, small thumbnail image)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"VideoCard\": {\n      \"description\": \"Video card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          },\n          \"x-omitempty\": true\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          },\n          \"x-omitempty\": true\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"GeoCoordinates\": {\n      \"description\": \"GeoCoordinates (entity type: \\\"https://schema.org/GeoCoordinates\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"elevation\": {\n          \"format\": \"double\",\n          \"description\": \"Elevation of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"latitude\": {\n          \"format\": \"double\",\n          \"description\": \"Latitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"longitude\": {\n          \"format\": \"double\",\n          \"description\": \"Longitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Mention\": {\n      \"description\": \"Mention information (entity type: \\\"mention\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"mentioned\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"The mentioned user\"\n        },\n        \"text\": {\n          \"description\": \"Sub Text which represents the mention (can be null or empty)\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"Type of this entity (RFC 3987 IRI)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Place\": {\n      \"description\": \"Place (entity type: \\\"https://schema.org/Place\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"address\": {\n          \"description\": \"Address of the place (may be `string` or complex object of type `PostalAddress`)\",\n          \"type\": \"object\"\n        },\n        \"geo\": {\n          \"description\": \"Geo coordinates of the place (may be complex object of type `GeoCoordinates` or `GeoShape`)\",\n          \"type\": \"object\"\n        },\n        \"hasMap\": {\n          \"description\": \"Map to the place (may be `string` (URL) or complex object of type `Map`)\",\n          \"type\": \"object\"\n        },\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Thing\": {\n      \"description\": \"Thing (entity type: \\\"https://schema.org/Thing\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"MediaEventValue\": {\n      \"description\": \"Supplementary parameter for media events\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"cardValue\": {\n          \"description\": \"Callback parameter specified in the Value field of the MediaCard that originated this event\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"TokenResponse\": {\n      \"description\": \"A response that includes a user token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"channelId\": {\n          \"description\": \"The channelId of the TokenResponse\",\n          \"type\": \"string\"\n        },\n        \"connectionName\": {\n          \"description\": \"The connection name\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"The user token\",\n          \"type\": \"string\"\n        },\n        \"expiration\": {\n          \"description\": \"Expiration for the token, in ISO 8601 format (e.g. \\\"2007-04-05T14:30Z\\\")\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TokenExchangeInvokeRequest\": {\n      \"description\": \"A request to exchange a token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"connectionName\": {\n          \"description\": \"The connection name\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"The user token that can be exchanged\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TokenExchangeInvokeResponse\": {\n      \"description\": \"The response object of a token exchange invoke\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"connectionName\": {\n          \"description\": \"The connection name\",\n          \"type\": \"string\"\n        },\n        \"failureDetail\": {\n          \"description\": \"The details of why the token exchange failed\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ExpectedReplies\": {\n      \"description\": \"Contents of the reply to an operation which returns expected Activity replies\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activities\": {\n          \"description\": \"A list of Activities included in the response.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Activity\"\n          },\n          \"x-omitempty\": true\n        }\n      }\n    },\n    \"ActivityTypes\": {\n      \"description\": \"Types of Activities\",\n      \"enum\": [\n        \"message\",\n        \"contactRelationUpdate\",\n        \"conversationUpdate\",\n        \"typing\",\n        \"endOfConversation\",\n        \"event\",\n        \"invoke\",\n        \"deleteUserData\",\n        \"messageUpdate\",\n        \"messageDelete\",\n        \"installationUpdate\",\n        \"messageReaction\",\n        \"suggestion\",\n        \"trace\",\n        \"handoff\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ActivityTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"AttachmentLayoutTypes\": {\n      \"description\": \"Attachment layout types\",\n      \"enum\": [\n        \"list\",\n        \"carousel\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"AttachmentLayoutTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"SemanticActionStates\": {\n      \"description\": \"Indicates whether the semantic action is starting, continuing, or done\",\n      \"enum\": [\n        \"start\",\n        \"continue\",\n        \"done\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"SemanticActionStates\",\n        \"modelAsString\": true\n      }\n    },\n    \"ActionTypes\": {\n      \"description\": \"Defines action types for clickable buttons.\",\n      \"enum\": [\n        \"openUrl\",\n        \"imBack\",\n        \"postBack\",\n        \"playAudio\",\n        \"playVideo\",\n        \"showImage\",\n        \"downloadFile\",\n        \"signin\",\n        \"call\",\n        \"messageBack\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ActionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"ContactRelationUpdateActionTypes\": {\n      \"description\": \"Action types valid for ContactRelationUpdate activities\",\n      \"enum\": [\n        \"add\",\n        \"remove\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ContactRelationUpdateActionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"InstallationUpdateActionTypes\": {\n      \"description\": \"Action types valid for InstallationUpdate activities\",\n      \"enum\": [\n        \"add\",\n        \"remove\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"InstallationUpdateActionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"MessageReactionTypes\": {\n      \"description\": \"Message reaction types\",\n      \"enum\": [\n        \"like\",\n        \"plusOne\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"MessageReactionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"TextFormatTypes\": {\n      \"description\": \"Text format types\",\n      \"enum\": [\n        \"markdown\",\n        \"plain\",\n        \"xml\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"TextFormatTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"InputHints\": {\n      \"description\": \"Indicates whether the bot is accepting, expecting, or ignoring input\",\n      \"enum\": [\n        \"acceptingInput\",\n        \"ignoringInput\",\n        \"expectingInput\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"InputHints\",\n        \"modelAsString\": true\n      }\n    },\n    \"EndOfConversationCodes\": {\n      \"description\": \"Codes indicating why a conversation has ended\",\n      \"enum\": [\n        \"unknown\",\n        \"completedSuccessfully\",\n        \"userCancelled\",\n        \"botTimedOut\",\n        \"botIssuedInvalidMessage\",\n        \"channelFailed\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"EndOfConversationCodes\",\n        \"modelAsString\": true\n      }\n    },\n    \"ActivityImportance\": {\n      \"description\": \"Defines the importance of an Activity\",\n      \"enum\": [\n        \"low\",\n        \"normal\",\n        \"high\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ActivityImportance\",\n        \"modelAsString\": true\n      }\n    },\n    \"RoleTypes\": {\n      \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\",\n      \"enum\": [\n        \"user\",\n        \"bot\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"RoleTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"DeliveryModes\": {\n      \"description\": \"Values for deliveryMode field\",\n      \"enum\": [\n        \"normal\",\n        \"notification\",\n        \"ephemeral\",\n        \"expectReplies\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"DeliveryModes\",\n        \"modelAsString\": true\n      }\n    }\n  },\n  \"securityDefinitions\": {\n    \"bearer_auth\": {\n      \"type\": \"apiKey\",\n      \"description\": \"Access token to authenticate calls to the Bot Connector Service.\",\n      \"name\": \"Authorization\",\n      \"in\": \"header\"\n    }\n  }\n}\n"
  },
  {
    "path": "specs/botframework-protocol/channel-update-spec.md",
    "content": "# Updating the botframework-channel swagger file\nVersion: 3.1.12\n\n**This specification has moved to [Agents SDK](https://github.com/microsoft/agents)**\n\n## Abstract\nThis document describe specific guidelines for updating the [swagger definition file](https://github.com/microsoft/botframework-sdk/blob/master/specs/botframework-protocol/botframework-channel.json) hosted in this repo. These guidelines specify the steps and requirements to maintaining a consistent source of truth that describes the state of connector-features in each SDK codebase. This source of truth is the combination of 2 concepts:\n* The botframework-protocol.json file, representing the ideal state that all language SDKs should meet.\n* A set of tracking issues per specific SDK that describes each codebase missing diff against the botframework-protocol.json file.\n\n## Requirements\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119) [[1](#References)].\n\n## Terminology\n\nThis document will use the following terms as described for the purpose of being succinct:\n\nlanguage repo(s)\n> Any (every) of the BF SDK language repositories.\n\nSDK repo\n> This repository.\n\nswagger file\n> The [json file](https://github.com/microsoft/botframework-sdk/blob/master/specs/botframework-protocol/botframework-channel.json) describing the swagger definition, contained in the SDK repo.\n\nschema update\n> An individual change made to the swagger file.\n\nschema label\n> A specific standardized github label (same color, same name) with the text 'BF Channel Schema' that MUST exist in every language repo to categorize a PR/issue as related to the process mentioned on this spec.\n\nversion label\n> A standardized github label (same color, same name) used in the language repos to relate an issue with a certain schema update. The text for the label MUST be the version number in the schema update.\n\nendpoint\n> Every json object under the base-level object 'paths' in the swagger file.\n\nschema PR\n> A PR containing a schema update.\n\nimplementation issue\n> The issue opened in a language repo to track the implementation of an endpoint change.\n\n## The process\nThe steps enumerated bellow MUST be executed every time that a schema PR is submitted.\n\n### 1. Submitting the PR\nEvery schema PR MUST include **only** the schema update. This means that the only file changed in that PR should be the swagger file.\n\nThe schema PR MAY include changes in different parts of the json, it SHOULD NOT be one schema PR per change in json object, but every schema PR including content change (not just format, like indentation) MUST increment the 'version' object inside the 'info' base-level object. (Specific version system is still WIP)\n\nThe schema PR MUST be tagged with the schema label.\n\n### 2. Tracking issues\n\nOnce a schema PR is approved, one implementation issue MUST be opened for **each endpoint changed** per language repo. The implementation issue MUST reference the schema PR that it comes from, as well as include the schema label and a version label. The implementation issue MAY provide additional context in the body text.\n\nThe implementation issue MUST NOT track more than one endpoint changed.\n\nA 'main issue' MAY be opened in the SDK repo to track each language implementation issue of an endpoint change. The main issue MUST contain the schema version in the title. The main issue MUST list every language repo with a link to the corresponding implementation issue and 3 checkboxes, the boxes MUST be the following:\n- [ ] PR\n- [ ] Merged\n- [ ] Irrelevant\n\n### 3. Updating issues\n\nIn the case that a language repo receives an implementation issue that deletes, overrides or modifies the same endpoint referenced in another currently open implementation issue, the older issue MUST be closed after updating the first line of its description with '[Irrelevant]' and a link to the new issue.\n\nIn the case of having a 'main issue', the criteria for ticking the box under an implementation issue is the following:\n* PR: a PR addressing the implementation issue is ready for review.\n* Merged: a PR addressing the implementation issue was merged and the issue closed.\n* Irrelevant: the implementation was closed with the description '[Irrelevant]'.\n\n## References\n\n1. [RFC 2119](https://tools.ietf.org/html/rfc2119) -- *Key words for use in RFCs to Indicate Requirement Levels*\n\n# Appendix I - Changes\n\n## Merging date - axsuarez@microsoft.com\n\n* Initial draft\n"
  },
  {
    "path": "specs/botframework-protocol/directline-1.1.json",
    "content": "{\n  \"swagger\": \"2.0\",\n  \"info\": {\n    \"version\": \"v1\",\n    \"title\": \"Bot Connector - Direct Line API - V1.1\",\n    \"description\": \"Direct Line 1.1\\r\\n===============\\r\\n\\r\\n\\r\\nThe Direct Line API is a simple REST API for connecting directly to a single bot. This API is intended for developers\\r\\nwriting their own client applications, web chat controls, mobile apps, or service-to-service applications that will\\r\\ntalk to their bot.\\r\\n\\r\\nWithin the Direct Line API, you will find:\\r\\n\\r\\n* An **authentication mechanism** using standard secret/token patterns\\r\\n* The ability to **send** messages from your client to your bot via an HTTP POST message\\r\\n* The ability to **receive** messages by **polling HTTP GET**\\r\\n* A stable **schema**, even if your bot changes its protocol version\\r\\n\\r\\nDirect Line 1.1 and 3.0 are both available and supported. This document describes Direct Line 1.1. For information\\r\\non Direct Line 3.0, visit the [Direct Line 3.0 reference documentation](/en-us/restapi/directline3/). **If you're\\r\\nbuilding a new Direct Line client, consider using Direct Line 3.0.**\\r\\n\\r\\n# Authentication: Secrets and Tokens\\r\\n\\r\\nDirect Line allows you to authenticate all calls with either a secret (retrieved from the Direct Line channel\\r\\nconfiguration page) or a token (which you may get at runtime by converting your secret).\\r\\n\\r\\nA Direct Line **secret** is a master key that can access any conversation, and create tokens. Secrets do not expire.\\r\\n\\r\\nA Direct Line **token** is a key for a single conversation. It expires but can be refreshed.\\r\\n\\r\\nIf you're writing a service-to-service application, using the secret may be simplest. If you're writing an\\r\\napplication where the client runs in a web browser or mobile app, you may want to exchange your secret for a token,\\r\\nwhich only works for a single conversation and will expire unless refreshed. You choose which security model works\\r\\nbest for you.\\r\\n\\r\\nYour secret or token is communicated in the ```Authorization``` header of every call. The caller may use either the\\r\\n\\\"Bearer\\\" or \\\"BotConnector\\\" authorization scheme. Examples in this document use \\\"Bearer\\\" except for the first\\r\\nexample, below.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /api/conversations/abc123/messages HTTP/1.1\\r\\nAuthorization: BotConnector RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other HTTP headers, omitted]\\r\\n```\\r\\n\\r\\nYou may notice that your Direct Line client credentials are different from your bot's credentials. This is\\r\\nintentional, and it allows you to revise your keys independently and lets you share client tokens without\\r\\ndisclosing your bot's password. \\r\\n\\r\\n## Exchanging a secret for a token\\r\\n\\r\\nThis operation is optional. Use this step if you want to prevent clients from accessing conversations they aren't\\r\\nparticipating in.\\r\\n\\r\\nTo exchange a secret for a token, POST to ```/api/tokens/conversation``` with your secret in the auth header and no\\r\\nHTTP body.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /api/tokens/conversation HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\nRCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\r\\n```\\r\\n\\r\\nIf successful, the response is a token suitable for one conversation. The token expires in 30 minutes and must\\r\\nbe refreshed before then to remain useful.\\r\\n\\r\\nThis call is similar to ```/api/conversations```. The difference is that the call to\\r\\n```/api/tokens/conversation``` does not start the conversation or contact the bot.\\r\\n* Call ```/api/tokens/conversation``` if you will distribute the token to client(s) and want them to\\r\\n  initiate the conversation.\\r\\n* Call ```/api/conversations``` if you intend to start the conversation immediately.\\r\\n\\r\\n## Refreshing a token\\r\\n\\r\\nA token may be refreshed an unlimited number of times unless it is expired. Tokens are valid for 30 minutes\\r\\nfrom the time they are generated.\\r\\n\\r\\nTo refresh a token, POST to ```/api/tokens/{conversationId}/renew```. This method is valid only for\\r\\nunexpired tokens.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /api/tokens/{conversationId}/renew HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\nRCurR_XV9ZA.cwA.BKA.y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xniaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n```\\r\\n\\r\\n# REST calls for a Direct Line conversation\\r\\n\\r\\nDirect Line conversations are explicitly opened by clients and may run as long as the bot and client participate\\r\\n(and have valid credentials). While the conversation is open, the bot and client may both send messages. More\\r\\nthan one client may connect to a given conversation and each client may participate on behalf of multiple users.\\r\\n\\r\\n## Starting a conversation\\r\\n\\r\\nClients begin by explicitly starting a conversation. If successful, the Direct Line service replies with a JSON\\r\\nobject containing a conversation ID and a token.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /api/conversations HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"conversationId\\\": \\\"abc123\\\",\\r\\n  \\\"token\\\": \\\"RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\\",\\r\\n  \\\"expires_in\\\": 1800\\r\\n}\\r\\n```\\r\\n\\r\\nThis call is similar to to ```/api/tokens/conversations```. The difference is that the call to\\r\\n```/api/tokens/conversation``` does not start the conversation or contact the bot.\\r\\n* Call ```/api/tokens/conversation``` if you will distribute the token to client(s) and want them to\\r\\n  initiate the conversation.\\r\\n* Call ```/api/conversations``` if you intend to start the conversation immediately.\\r\\n\\r\\n## Sending a message to the bot\\r\\n\\r\\nUsing the Direct Line 1.1 protocol, clients send and receive messages. These messages are converted to the schema\\r\\nthat the bot supports (Bot Framework v1 or Bot Framework v3).\\r\\n\\r\\nTo send a message to a bot,\\r\\n\\r\\n1. the client formulates the message according to the message schema (see below)\\r\\n2. the client issues a POST message to ```/api/conversations/{id}/messages```\\r\\n3. the service returns when the message was delivered to the bot, with an HTTP status code reflecting the bot's\\r\\nstatus code. If the POST was successful, the service returns an HTTP 204 status code.\\r\\n\\r\\nSee the section near the bottom of this document describing the Direct Line 1.1 schema.\\r\\n\\r\\nExample follows.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /api/conversations/abc123/messages HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"text\\\": \\\"hello\\\",\\r\\n  \\\"from\\\": \\\"user1\\\"\\r\\n}\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 204 No Content\\r\\n[other headers]\\r\\n```\\r\\n\\r\\nNo data is returned in this call. The client's message and any messages from the bot are available\\r\\nin the polling GET response.\\r\\n\\r\\nThe total time to POST a message to a Direct Line conversation is:\\r\\n\\r\\n* Transit time to the Direct Line service,\\r\\n* Internal processing time within Direct Line (typically less than 120ms)\\r\\n* Transit time to the bot\\r\\n* Processing time within the bot\\r\\n* Transit time for HTTP responses to travel back to the client.\\r\\n\\r\\nIf the bot generates an error, that error will trigger an HTTP 500 error in the ```POST /api/conversations/{id}/messages``` call.\\r\\n\\r\\n### Sending one or more attachments by URL\\r\\n\\r\\nClients may optionally send attachments, such as images or documents. If the client already has a URL for the\\r\\nattachment, the simplest way to send it is to include the URL in the attachments or images array on the message\\r\\nit sends.\\r\\n\\r\\n### Sending a single attachment by upload\\r\\n\\r\\nOften, clients have an image or document on a device but no URL that can be included in the message.\\r\\n\\r\\nTo upload an attachment, POST to the ```/api/conversations/{conversationId}/upload``` endpoint. You may\\r\\ninclude a single attachment or ```multipart/form-data``` web payload containing multiple attachments.\\r\\n\\r\\nIf uploading a single attachment, a message is sent to the bot when the upload completes.\\r\\n\\r\\nThe ```Content-Type``` and ```Content-Disposition``` headers control the attachment's type and filename,\\r\\nrespectively.\\r\\n\\r\\nYou may specify which user is uploading the attachment by including the ```?userId=``` query parameter\\r\\non the upload URL.\\r\\n\\r\\nOn completion, the service returns an HTTP 204 message.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/users/user1/upload?userId=user1 HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\nContent-Type: image/jpeg\\r\\nContent-Disposition: name=\\\"file\\\"; filename=\\\"badjokeeel.jpg\\\"\\r\\n[other headers]\\r\\n\\r\\n[JPEG content]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 204 No Content\\r\\n[other headers]\\r\\n```\\r\\n\\r\\n### Sending multiple attachments by upload\\r\\n\\r\\nIf uploading multiple attachments, use ```multipart/form-data``` as the content type and include each\\r\\nattachment as a separate part.\\r\\n\\r\\nA message may be included by adding a part with content type of ```application/vnd.microsoft.bot.message```.\\r\\nThis allows the client to customize the message containing the attachment. Other file parts in the payload\\r\\nare attached to this message before it is sent.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /api/conversations/abc123/upload HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\nContent-Type: multipart/form-data; boundary=----DD4E5147-E865-4652-B662-F223701A8A89\\r\\n[other headers]\\r\\n\\r\\n----DD4E5147-E865-4652-B662-F223701A8A89\\r\\nContent-Type: image/jpeg\\r\\nContent-Disposition: form-data; name=\\\"file\\\"; filename=\\\"badjokeeel.jpg\\\"\\r\\n[other headers]\\r\\n\\r\\n[JPEG content]\\r\\n\\r\\n----DD4E5147-E865-4652-B662-F223701A8A89\\r\\nContent-Type: application/vnd.microsoft.bot.message\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"text\\\": \\\"Hey I just IM'd you\\\\n\\\\nand this is crazy\\\\n\\\\nbut here's my webhook\\\\n\\\\nso POST me maybe\\\",\\r\\n  \\\"from\\\": \\\"user1\\\"\\r\\n}\\r\\n\\r\\n----DD4E5147-E865-4652-B662-F223701A8A89\\r\\n\\r\\n\\r\\n    \\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 204 No Content\\r\\n[other headers]\\r\\n```\\r\\n\\r\\n## Receiving Activities from the bot\\r\\n\\r\\nIn Direct Line 1.1, clients must poll an HTTP GET interface to receive messages.\\r\\n\\r\\nClients issue GET calls to the ```/api/conversations/{conversationId/messages``` endpoint and optionally supply a\\r\\nwatermark indicating the most recent message seen. An updated watermark field is returned as a property in the JSON\\r\\nresult, even if no messages are included.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nGET /api/conversations/abc123/messages?watermark=0001a-94 HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"messages\\\": [{\\r\\n    \\\"conversation\\\": \\\"abc123\\\",\\r\\n    \\\"id\\\": \\\"abc123|0000\\\",\\r\\n    \\\"text\\\": \\\"hello\\\",\\r\\n    \\\"from\\\": \\\"user1\\\"\\r\\n  }, {\\r\\n    \\\"conversation\\\": \\\"abc123\\\",\\r\\n    \\\"id\\\": \\\"abc123|0001\\\",\\r\\n    \\\"text\\\": \\\"Nice to see you, user1!\\\",\\r\\n    \\\"from\\\": \\\"bot1\\\"\\r\\n  }],\\r\\n  \\\"watermark\\\": \\\"0001a-95\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nClients should page through the available messages by advancing the \\\"watermark\\\" value until no messages are returned.\\r\\n\\r\\nDo not attempt to construct the watermark field on your own as its format may change in the future.\\r\\n\\r\\n### Timing considerations \\r\\n\\r\\nThe \\\"watermark\\\" field sent in GET responses is reliable. You will not miss messages as long as you replay\\r\\nthe watermark verbatim.\\r\\n\\r\\nClients should choose a polling interval that matches their intended use.\\r\\n\\r\\n* Service-to-service applications often use a polling interval of 5s or 10s.\\r\\n* Client-facing applications often use a polling interval of 1s, and fire an additional request ~300ms after\\r\\nevery message the client sends to rapidly pick up a bot's response. This 300ms delay should be adjusted based\\r\\non the bot's speed and transit time.\\r\\n\\r\\n## REST API errors\\r\\n\\r\\nHTTP calls to the Direct Line service follow standard HTTP error conventions:\\r\\n\\r\\n* 2xx status codes indicate success. (Direct Line 1.1 uses 200 and 204.)\\r\\n* 4xx status codes indicate an error in your request.\\r\\n  * 401 indicates a missing or malformed Authorization header (or URL token, in calls where a token parameter\\r\\n    is allowed).\\r\\n  * 403 indicates an unauthorized client.\\r\\n  * 404 indicates a missing path, site, conversation, etc.\\r\\n* 5xx status codes indicate a service-side error.\\r\\n  * 500 indicates an error inside the Direct Line service or a failure within the bot.\\r\\n  * If you receive a 500 error when POSTing to send a message to a bot, it is possible that the 500 was\\r\\n    triggered by a failure in the bot. **This is a common error code.**\\r\\n\\r\\n# Schema\\r\\n\\r\\nThe Direct Line 1.1 schema is a simplified copy of the Bot Framework v1 protocol. The core type is a ```message```,\\r\\nwhich is what clients send and receive.\\r\\n\\r\\n|Property|Description|\\r\\n|--------|-----------|\\r\\n|Id|Message ID (assigned by Direct Line)|\\r\\n|ConversationId|Conversation ID|\\r\\n|Created|Message creation timestamp|\\r\\n|From&#x2071;|ID of the user sending the message.|\\r\\n|Text|Message text|\\r\\n|ChannelData&#x2071;&#x2071;|Data sent unmodified between client and bot|\\r\\n|Images&#x2071;&#x2071;&#x2071;|Array of strings, each the URL to an image|\\r\\n|Attachemnts&#x2071;&#x2071;&#x2071;|Array of non-image attachments. Each attachment contains a ```Url``` and a ```ContentType``` property.|\\r\\n\\r\\n&#x2071; Clients should set the From field to a stable user ID. **Direct Line assigns a user ID if none is supplied, which\\r\\ntypically results in unexpected behavior.**\\r\\n\\r\\n&#x2071;&#x2071; ChannelData should be a complex object, or empty. Do not set it to a string, number, or other simple type.\\r\\n\\r\\n&#x2071;&#x2071;&#x2071; Images and Attachment arrays are, in some cases, relative URLs. If you see an image or attachment URL\\r\\nthat does not already start with HTTP or HTTPS, prepend ```https://directline.botframework.com``` to the URL.\\r\\n\\r\\nExample message follows. All message properties are shown; in most cases, the client only needs to supply the\\r\\n```From``` property and a content field (```Text```, ```Images```, ```Attachments```, or ```ChannelData```).\\r\\n\\r\\n```\\r\\n{\\r\\n  \\\"id\\\": \\\"CuvLPID4kDb|000000000000000004\\\",\\r\\n  \\\"conversationId\\\": \\\"CuvLPID4kDb\\\",\\r\\n  \\\"created\\\": \\\"2016-10-28T21:19:51.0357965Z\\\",\\r\\n  \\\"from\\\": \\\"examplebot\\\",\\r\\n  \\\"text\\\": \\\"Hello!\\\",\\r\\n  \\\"channelData\\\": {\\r\\n    \\\"examplefield\\\": \\\"abc123\\\"\\r\\n  },\\r\\n  \\\"images\\\": [\\r\\n    \\\"/attachments/CuvLPID4kDb/0.jpg?...\\\"\\r\\n  ],\\r\\n  \\\"attachments\\\": [{\\r\\n    \\\"url\\\": \\\"https://example.com/example.docx\\\",\\r\\n    \\\"contentType\\\": \\\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\\\"\\r\\n  }, {\\r\\n    \\\"url\\\": \\\"https://example.com/example.doc\\\",\\r\\n    \\\"contentType\\\": \\\"application/msword\\\"\\r\\n  }]\\r\\n}\\r\\n```\\r\\n\\r\\n\\r\\n# Libraries for the Direct Line API\\r\\n\\r\\nThe Direct Line API is designed to be coded directly, but the Bot Framework includes libraries and controls\\r\\nthat help you to embed Direct-Line-powered bots into your application.\\r\\n\\r\\n* The Bot Framework Web Chat control is an easy way to embed the Direct Line channel into a webpage.\\r\\n* [Direct Line Nuget package](https://www.nuget.org/packages/Microsoft.Bot.Connector.DirectLine/1.1.1) with libraries\\r\\n  for .Net 4.5+, UWP, and .Net Standard. (Be sure to use 1.x libraries for this version of Direct Line.)\\r\\n* You may generate your own from the [Direct Line Swagger file](swagger.json)\\r\\n\",\n    \"termsOfService\": \"https://www.microsoft.com/en-us/legal/intellectualproperty/copyright/default.aspx\",\n    \"contact\": {\n      \"name\": \"Bot Framework\",\n      \"url\": \"https://botframework.com\",\n      \"email\": \"botframework@microsoft.com\"\n    },\n    \"license\": {\n      \"name\": \"The MIT License (MIT)\",\n      \"url\": \"https://opensource.org/licenses/MIT\"\n    }\n  },\n  \"host\": \"directline.botframework.com\",\n  \"schemes\": [\n    \"https\"\n  ],\n  \"paths\": {\n    \"/api/conversations\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Start a new conversation\",\n        \"operationId\": \"Conversations_NewConversation\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The conversation was successfully created, updated, or retrieved.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/Conversation\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"409\": {\n            \"description\": \"The object you are trying to create already exists.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      }\n    },\n    \"/api/conversations/{conversationId}/messages\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Get messages in this conversation. This method is paged with the 'watermark' parameter.\",\n        \"operationId\": \"Conversations_GetMessages\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"watermark\",\n            \"in\": \"query\",\n            \"description\": \"(Optional) only returns messages newer than this watermark\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A set of messages and a watermark are returned.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/MessageSet\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Send a message\",\n        \"operationId\": \"Conversations_PostMessage\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"message\",\n            \"in\": \"body\",\n            \"description\": \"Message to send\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Message\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The operation succeeded. No content was returned.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      }\n    },\n    \"/api/conversations/{conversationId}/upload\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Upload file(s) and send as attachment(s)\",\n        \"operationId\": \"Conversations_Upload\",\n        \"consumes\": [\n          \"multipart/form-data\"\n        ],\n        \"produces\": [],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"userId\",\n            \"in\": \"query\",\n            \"description\": \"User ID (optional)\",\n            \"required\": false,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"file\",\n            \"in\": \"formData\",\n            \"required\": true,\n            \"type\": \"file\"\n          }\n        ],\n        \"responses\": {\n          \"204\": {\n            \"description\": \"The operation succeeded. No content was returned.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      }\n    },\n    \"/api/tokens\": {\n      \"get\": {\n        \"tags\": [\n          \"Tokens\"\n        ],\n        \"summary\": \"Generate a token for a new conversation\",\n        \"operationId\": \"Tokens_Get\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A string is returned.\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      }\n    },\n    \"/api/tokens/{conversationId}/renew\": {\n      \"get\": {\n        \"tags\": [\n          \"Tokens\"\n        ],\n        \"summary\": \"Renew a token for a conversation\",\n        \"operationId\": \"Tokens_RenewToken\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A string is returned.\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      }\n    },\n    \"/api/tokens/conversation\": {\n      \"post\": {\n        \"tags\": [\n          \"Tokens\"\n        ],\n        \"summary\": \"Generate a token for a new conversation\",\n        \"operationId\": \"Tokens_GenerateTokenForNewConversation\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A string is returned.\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorMessage\"\n            }\n          }\n        }\n      }\n    }\n  },\n  \"definitions\": {\n    \"Conversation\": {\n      \"description\": \"An object representing a conversation or a conversation token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"conversationId\": {\n          \"description\": \"ID for this conversation\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"Token scoped to this conversation\",\n          \"type\": \"string\"\n        },\n        \"expires_in\": {\n          \"format\": \"int32\",\n          \"description\": \"Expiration for token\",\n          \"type\": \"integer\"\n        },\n        \"eTag\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ErrorMessage\": {\n      \"description\": \"A standardized message error payload\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"error\": {\n          \"$ref\": \"#/definitions/Error\",\n          \"description\": \"Error message\"\n        }\n      }\n    },\n    \"Error\": {\n      \"description\": \"An error message\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"code\": {\n          \"description\": \"Error code\",\n          \"enum\": [\n            \"MissingProperty\",\n            \"MalformedData\",\n            \"NotFound\",\n            \"ServiceError\",\n            \"Internal\",\n            \"InvalidRange\",\n            \"NotSupported\",\n            \"NotAllowed\",\n            \"BadCertificate\"\n          ],\n          \"type\": \"string\"\n        },\n        \"message\": {\n          \"description\": \"Error message\",\n          \"type\": \"string\"\n        },\n        \"statusCode\": {\n          \"format\": \"int32\",\n          \"description\": \"Status code\",\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"MessageSet\": {\n      \"description\": \"A collection of messages\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"messages\": {\n          \"description\": \"Messages\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Message\"\n          }\n        },\n        \"watermark\": {\n          \"description\": \"Maximum watermark included in this set of messages\",\n          \"type\": \"string\"\n        },\n        \"eTag\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Message\": {\n      \"description\": \"A communication message sent to/from Direct Line\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"ID for this message\",\n          \"type\": \"string\"\n        },\n        \"conversationId\": {\n          \"description\": \"Conversation ID for this message\",\n          \"type\": \"string\"\n        },\n        \"created\": {\n          \"format\": \"date-time\",\n          \"description\": \"UTC timestamp when this message was created\",\n          \"type\": \"string\"\n        },\n        \"from\": {\n          \"description\": \"Identity of the sender of this message\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text in this message\",\n          \"type\": \"string\"\n        },\n        \"channelData\": {\n          \"description\": \"Opaque block of data passed to/from bot via the ChannelData field\",\n          \"type\": \"object\"\n        },\n        \"images\": {\n          \"description\": \"Array of URLs for images included in this message\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"attachments\": {\n          \"description\": \"Array of non-image attachments included in this message\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Attachment\"\n          }\n        },\n        \"eTag\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Attachment\": {\n      \"description\": \"An attachment\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL for this attachment\",\n          \"type\": \"string\"\n        },\n        \"contentType\": {\n          \"description\": \"Content type for this attachment\",\n          \"type\": \"string\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "specs/botframework-protocol/directline-3.0.json",
    "content": "{\n  \"swagger\": \"2.0\",\n  \"info\": {\n    \"version\": \"v3\",\n    \"title\": \"Bot Connector - Direct Line API - v3.0\",\n    \"description\": \"Direct Line 3.0\\r\\n===============\\r\\n\\r\\n\\r\\nThe Direct Line API is a simple REST API for connecting directly to a single bot. This API is intended for developers\\r\\nwriting their own client applications, web chat controls, mobile apps, or service-to-service applications that will\\r\\ntalk to their bot.\\r\\n\\r\\nWithin the Direct Line API, you will find:\\r\\n\\r\\n* An **authentication mechanism** using standard secret/token patterns\\r\\n* The ability to **send** messages from your client to your bot via an HTTP POST message\\r\\n* The ability to **receive** messages by **WebSocket** stream, if you choose\\r\\n* The ability to **receive** messages by **polling HTTP GET**, if you choose\\r\\n* A stable **schema**, even if your bot changes its protocol version\\r\\n\\r\\nDirect Line 1.1 and 3.0 are both available and supported. This document describes Direct Line 3.0. For information\\r\\non Direct Line 1.1, visit the [Direct Line 1.1 reference documentation](/en-us/restapi/directline/).\\r\\n\\r\\n# Authentication: Secrets and Tokens\\r\\n\\r\\nDirect Line allows you to authenticate all calls with either a secret (retrieved from the Direct Line channel\\r\\nconfiguration page) or a token (which you may get at runtime by converting your secret).\\r\\n\\r\\nA Direct Line **secret** is a master key that can access any conversation, and create tokens. Secrets do not expire.\\r\\n\\r\\nA Direct Line **token** is a key for a single conversation. It expires but can be refreshed.\\r\\n\\r\\nIf you're writing a service-to-service application, using the secret may be simplest. If you're writing an application\\r\\nwhere the client runs in a web browser or mobile app, you may want to exchange your secret for a token, which only\\r\\nworks for a single conversation and will expire unless refreshed. You choose which security model works best for you.\\r\\n\\r\\nYour secret or token is communicated in the ```Authorization``` header of every call, with the Bearer scheme.\\r\\nExample below.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/activities HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other HTTP headers, omitted]\\r\\n```\\r\\n\\r\\nYou may notice that your Direct Line client credentials are different from your bot's credentials. This is\\r\\nintentional, and it allows you to revise your keys independently and lets you share client tokens without\\r\\ndisclosing your bot's password. \\r\\n\\r\\n## Exchanging a secret for a token\\r\\n\\r\\nThis operation is optional. Use this step if you want to prevent clients from accessing conversations they aren't\\r\\nparticipating in.\\r\\n\\r\\nTo exchange a secret for a token, POST to /v3/directline/tokens/generate with your secret in the auth header\\r\\nand no HTTP body.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/tokens/generate HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"conversationId\\\": \\\"abc123\\\",\\r\\n  \\\"token\\\": \\\"RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\\",\\r\\n  \\\"expires_in\\\": 1800\\r\\n}\\r\\n```\\r\\n\\r\\nIf successful, the response is a token suitable for one conversation. The token expires in the seconds\\r\\nindicated in the ```expires_in``` field (30 minutes in the example above) and must be refreshed before then to\\r\\nremain useful.\\r\\n\\r\\nThis call is similar to ```/v3/directline/conversations```. The difference is that the call to\\r\\n```/v3/directline/tokens/generate``` does not start the conversation, does not contact the bot, and does not\\r\\ncreate a streaming WebSocket URL.\\r\\n* Call ```/v3/directline/conversations``` if you will distribute the token to client(s) and want them to \\r\\n  initiate the conversation.\\r\\n* Call ```/v3/directline/conversations``` if you intend to start the conversation immediately.\\r\\n\\r\\n\\r\\n## Refreshing a token\\r\\n\\r\\nA token may be refreshed an unlimited number of times unless it is expired.\\r\\n\\r\\nTo refresh a token, POST to /v3/directline/tokens/refresh. This method is valid only for unexpired tokens.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/tokens/refresh HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"conversationId\\\": \\\"abc123\\\",\\r\\n  \\\"token\\\": \\\"RCurR_XV9ZA.cwA.BKA.y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xniaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\\",\\r\\n  \\\"expires_in\\\": 1800\\r\\n}\\r\\n```\\r\\n\\t\\r\\n\\r\\n# REST calls for a Direct Line conversation\\r\\n\\r\\nDirect Line conversations are explicitly opened by clients and may run as long as the bot and client participate\\r\\n(and have valid credentials). While the conversation is open, the bot and client may both send messages. More than\\r\\none client may connect to a given conversation and each client may participate on behalf of multiple users.\\r\\n\\r\\n## Starting a conversation\\r\\n\\r\\nClients begin by explicitly starting a conversation. If successful, the Direct Line service replies with a\\r\\nJSON object containing a conversation ID, a token, and a WebSocket URL that may be used later.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 201 Created\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"conversationId\\\": \\\"abc123\\\",\\r\\n  \\\"token\\\": \\\"RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\\",\\r\\n  \\\"expires_in\\\": 1800,\\r\\n  \\\"streamUrl\\\": \\\"https://directline.botframework.com/v3/directline/conversations/abc123/stream?t=RCurR_XV9ZA.cwA...\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nIf the conversation was started, an HTTP 201 status code is returned. HTTP 201 is the code that clients\\r\\nwill receive under most circumstances, as the typical use case is for a client to start a new conversation.\\r\\nUnder certain conditions -- specifically, when the client has a token scoped to a single conversation AND\\r\\nwhen that conversation was started with a prior call to this URL -- this method will return HTTP 200 to signify\\r\\nthe request was acceptable but that no conversation was created (as it already existed).\\r\\n\\r\\nYou have 60 seconds to connect to the WebSocket URL. If the connection cannot be established during this time,\\r\\nuse the reconnect method below to generate a new stream URL.\\r\\n\\r\\nThis call is similar to ```/v3/directline/tokens/generate```. The difference is that the call to\\r\\n```/v3/directline/conversations``` starts the conversation, contacts the bot, and creates a streaming WebSocket\\r\\nURL, none of which occur when generating a token.\\r\\n* Call ```/v3/directline/conversations``` if you will distribute the token to client(s) and want them to\\r\\n  initiate the conversation.\\r\\n* Call ```/v3/directline/conversations``` if you intend to start the conversation immediately.\\r\\n\\r\\n## Reconnecting to a conversation\\r\\n\\r\\nIf a client is using the WebSocket interface to receive messages but loses its connection, it may need to reconnect.\\r\\nReconnecting requires generating a new WebSocket stream URL, and this can be accomplished by sending a GET request\\r\\nto the ```/v3/directline/conversations/{id}``` endpoint.\\r\\n\\r\\nThe ```watermark``` parameter is optional. If supplied, the conversation replays from the watermark,\\r\\nguaranteeing no messages are lost. If ```watermark``` is omitted, only messages received after the reconnection\\r\\ncall (```GET /v3/directline/conversations/abc123```) are replayed.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nGET /v3/directline/conversations/abc123?watermark=0000a-42 HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"conversationId\\\": \\\"abc123\\\",\\r\\n  \\\"token\\\": \\\"RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0y8qbOF5xPGfiCpg4Fv0y8qqbOF5x8qbOF5xn\\\",\\r\\n  \\\"streamUrl\\\": \\\"https://directline.botframework.com/v3/directline/conversations/abc123/stream?watermark=000a-4&t=RCurR_XV9ZA.cwA...\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nYou have 60 seconds to connect to the WebSocket stream URL. If the connection cannot be established during this\\r\\ntime, issue another reconnect request to get an updated stream URL.\\r\\n\\r\\n## Sending an Activity to the bot\\r\\n\\r\\nUsing the Direct Line 3.0 protocol, clients and bots may exchange many different Bot Framework v3 Activities,\\r\\nincluding Message Activities, Typing Activities, and custom activities that the bot supports.\\r\\n\\r\\nTo send any one of these activities to the bot,\\r\\n\\r\\n1. the client formulates the Activity according to the Activity schema (see below)\\r\\n2. the client issues a POST message to ```/v3/directline/conversations/{id}/activities```\\r\\n3. the service returns when the activity was delivered to the bot, with an HTTP status code reflecting the\\r\\n   bot's status code. If the POST was successful, the service returns a JSON payload containing the ID of the\\r\\n   Activity that was sent.\\r\\n\\r\\nExample follows.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/activities HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"type\\\": \\\"message\\\",\\r\\n  \\\"from\\\": {\\r\\n    \\\"id\\\": \\\"user1\\\"\\r\\n  },\\r\\n  \\\"text\\\": \\\"hello\\\"\\r\\n}\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"id\\\": \\\"0001\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nThe client's Activity is available in the message retrieval path (either polling GET or WebSocket) and is not\\r\\nreturned inline.\\r\\n\\r\\nThe total time to POST a message to a Direct Line conversation is:\\r\\n\\r\\n* Transit time to the Direct Line service,\\r\\n* Internal processing time within Direct Line (typically less than 120ms)\\r\\n* Transit time to the bot\\r\\n* Processing time within the bot\\r\\n* Transit time for HTTP responses to travel back to the client.\\r\\n\\r\\nIf the bot generates an error, that error will trigger an HTTP 502 error (\\\"Bad Gateway\\\") in\\r\\nthe ```POST /v3/directline/conversations/{id}/activities``` call.\\r\\n\\r\\n### Sending one or more attachments by URL\\r\\n\\r\\nClients may optionally send attachments, such as images or documents. If the client already has a URL for the\\r\\nattachment, the simplest way to send it is to include the URL in the ```contentUrl``` field of an Activity\\r\\nattachment object. This applies to HTTP, HTTPS, and ```data:``` URIs.\\r\\n\\r\\n### Sending a single attachment by upload\\r\\n\\r\\nOften, clients have an image or document on a device but no URL that can be included in the activity.\\r\\n\\r\\nTo upload an attachment, POST a single attachment to\\r\\nthe ```/v3/directline/conversations/{conversationId}/upload``` endpoint. The ```Content-Type```\\r\\nand ```Content-Disposition``` headers control the attachment's type and filename, respectively.\\r\\n\\r\\nA user ID is required. Supply the ID of the user sending the attachment as a ```userId``` parameter in the URL.\\r\\n\\r\\nIf uploading a single attachment, a message activity is sent to the bot when the upload completes.\\r\\n\\r\\nOn completion, the service returns the ID of the activity that was sent.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/upload?userId=user1 HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\nContent-Type: image/jpeg\\r\\nContent-Disposition: name=\\\"file\\\"; filename=\\\"badjokeeel.jpg\\\"\\r\\n[other headers]\\r\\n\\r\\n[JPEG content]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"id\\\": \\\"0003\\\"\\r\\n}\\r\\n```\\r\\n\\r\\n### Sending multiple attachments by upload\\r\\n\\r\\nIf uploading multiple attachments, use ```multipart/form-data``` as the content type and include each\\r\\nattachment as a separate part. Each attachment's type and filename may be included in the ```Content-Type```\\r\\nand ```Content-Disposition``` headers in each part.\\r\\n\\r\\nAn activity may be included by adding a part with content type of ```application/vnd.microsoft.activity```.\\r\\nOther parts in the payload are attached to this activity before it is sent. If an Activity is not included,\\r\\nan empty Activity is created as a wrapper for the attachments.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/upload?userId=user1 HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\nContent-Type: multipart/form-data; boundary=----DD4E5147-E865-4652-B662-F223701A8A89\\r\\n[other headers]\\r\\n\\r\\n----DD4E5147-E865-4652-B662-F223701A8A89\\r\\nContent-Type: image/jpeg\\r\\nContent-Disposition: form-data; name=\\\"file\\\"; filename=\\\"badjokeeel.jpg\\\"\\r\\n[other headers]\\r\\n\\r\\n[JPEG content]\\r\\n\\r\\n----DD4E5147-E865-4652-B662-F223701A8A89\\r\\nContent-Type: application/vnd.microsoft.activity\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"type\\\": \\\"message\\\",\\r\\n  \\\"from\\\": {\\r\\n    \\\"id\\\": \\\"user1\\\"\\r\\n  },\\r\\n  \\\"text\\\": \\\"Hey I just IM'd you\\\\n\\\\nand this is crazy\\\\n\\\\nbut here's my webhook\\\\n\\\\nso POST me maybe\\\"\\r\\n}\\r\\n\\r\\n----DD4E5147-E865-4652-B662-F223701A8A89\\r\\n\\r\\n\\r\\n    \\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"id\\\": \\\"0004\\\"\\r\\n}\\r\\n```\\r\\n\\r\\n## Receiving Activities from the bot\\r\\n\\r\\nDirect Line 3.0 clients may choose from two different mechanisms for retrieving messages:\\r\\n\\r\\n1. A **streaming WebSocket**, which pushes messages efficiently to clients.\\r\\n2. A **polling GET** interface, which is available for clients unable to use WebSockets or for clients\\r\\n   retrieving the conversation history.\\r\\n\\r\\n**Not all activities are available via the polling GET interface.** A table of activity availability follows.\\r\\n\\r\\n|Activity type|Availability|\\r\\n|-------------|--------|\\r\\n|Message|Polling GET and WebSocket|\\r\\n|Typing|WebSocket only|\\r\\n|ConversationUpdate|Not sent/received via client|\\r\\n|ContactRelationUpdate|Not supported in Direct Line|\\r\\n|EndOfConversation|Polling GET and WebSocket|\\r\\n|All other activity types|Polling GET and WebSocket|\\r\\n\\r\\n### Receiving Activities by WebSocket\\r\\n\\r\\nTo connect via WebSocket, a client uses the StreamUrl when starting a conversation. The stream URL is\\r\\npreauthorized and does NOT require an Authorization header containing the client's secret or token.\\r\\n\\r\\n```\\r\\n-- connect to wss://directline.botframework.com --\\r\\nGET /v3/directline/conversations/abc123/stream?t=RCurR_XV9ZA.cwA...\\\" HTTP/1.1\\r\\nUpgrade: websocket\\r\\nConnection: upgrade\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 101 Switching Protocols\\r\\n[other headers]\\r\\n```\\r\\n\\r\\nThe Direct Line service sends the following messages:\\r\\n\\r\\n* An **ActivitySet**, which contains one or more activities and a watermark (described below)\\r\\n* An empty message, which the Direct Line service uses to ensure the connection is still valid\\r\\n* Additional types, to be defined later. These types are identified by the properties in the JSON root.\\r\\n\\r\\nActivitySets contain messages sent by the bot and by all users. Example ActivitySet:\\r\\n\\r\\n```\\r\\n{\\r\\n  \\\"activities\\\": [{\\r\\n    \\\"type\\\": \\\"message\\\",\\r\\n    \\\"channelId\\\": \\\"directline\\\",\\r\\n    \\\"conversation\\\": {\\r\\n      \\\"id\\\": \\\"abc123\\\"\\r\\n    },\\r\\n    \\\"id\\\": \\\"abc123|0000\\\",\\r\\n    \\\"from\\\": {\\r\\n      \\\"id\\\": \\\"user1\\\"\\r\\n    },\\r\\n    \\\"text\\\": \\\"hello\\\"\\r\\n  }],\\r\\n  \\\"watermark\\\": \\\"0000a-42\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nClients should keep track of the \\\"watermark\\\" value from each ActivitySet so they can use it on reconnect.\\r\\n**Note** that a ```null``` or missing watermark should be ignored and should not overwrite a prior watermark\\r\\nin the client.\\r\\n\\r\\nClients should ignore empty messages.\\r\\n\\r\\nClients may send their own empty messages to verify connectivity. The Direct Line service will ignore these.\\r\\n\\r\\nThe service may forcibly close the connection under certain conditions. If the client has not received an\\r\\nEndOfConversation activity, it may reconnect by issuing a GET request to the conversation endpoint to get a\\r\\nnew stream URL (see above).\\r\\n\\r\\nThe WebSocket stream contains live updates and very recent messages (since the call to get the WebSocket call\\r\\nwas issued) but it does not include messages sent prior to the most recent POST\\r\\nto ```/v3/directline/conversations/{id}```. To retrieve messages sent earlier in the conversation, use the\\r\\nGET mechanism below.\\r\\n\\r\\n### Receiving Activities by GET\\r\\n\\r\\nThe GET mechanism is useful for clients who are unable to use the WebSocket, or for clients wishing to retrieve\\r\\nthe conversation history.\\r\\n\\r\\nTo retrieve messages, issue a GET call to the conversation endpoint. Optionally supply a watermark, indicating\\r\\nthe most recent message seen. The watermark field accompanies all GET/WebSocket messages as a property in the\\r\\nActivitySet.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nGET /v3/directline/conversations/abc123/activities?watermark=0001a-94 HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"activities\\\": [{\\r\\n    \\\"type\\\": \\\"message\\\",\\r\\n    \\\"channelId\\\": \\\"directline\\\",\\r\\n    \\\"conversation\\\": {\\r\\n      \\\"id\\\": \\\"abc123\\\"\\r\\n    },\\r\\n    \\\"id\\\": \\\"abc123|0000\\\",\\r\\n    \\\"from\\\": {\\r\\n      \\\"id\\\": \\\"user1\\\"\\r\\n    },\\r\\n    \\\"text\\\": \\\"hello\\\"\\r\\n  }, {\\r\\n    \\\"type\\\": \\\"message\\\",\\r\\n    \\\"channelId\\\": \\\"directline\\\",\\r\\n    \\\"conversation\\\": {\\r\\n      \\\"id\\\": \\\"abc123\\\"\\r\\n    },\\r\\n    \\\"id\\\": \\\"abc123|0001\\\",\\r\\n    \\\"from\\\": {\\r\\n      \\\"id\\\": \\\"bot1\\\"\\r\\n    },\\r\\n    \\\"text\\\": \\\"Nice to see you, user1!\\\"\\r\\n  }],\\r\\n  \\\"watermark\\\": \\\"0001a-95\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nClients should page through the available activities by advancing the ```watermark``` value until no activities\\r\\nare returned.\\r\\n\\r\\n\\r\\n### Timing considerations \\r\\n\\r\\nMost clients wish to retain a complete message history. Even though Direct Line is a multi-part protocol with\\r\\npotential timing gaps, the protocol and service is designed to make it easy to build a reliable client.\\r\\n\\r\\n1. The ```watermark``` field sent in the WebSocket stream and GET response is reliable. You will not miss\\r\\n   messages as long as you replay the watermark verbatim.\\r\\n2. When starting a conversation and connecting to the WebSocket stream, any Activities sent after the POST but\\r\\n   before the socket is opened are replayed before new messages.\\r\\n3. When refreshing history by GET call while connected to the WebSocket, Activities may be duplicated across both\\r\\n   channels. Keeping a list of all known Activity IDs will allow you to reject duplicate messages should they occur.\\r\\n\\r\\nClients using the polling GET interface should choose a polling interval that matches their intended use.\\r\\n\\r\\n* Service-to-service applications often use a polling interval of 5s or 10s.\\r\\n* Client-facing applications often use a polling interval of 1s, and fire an additional request ~300ms after\\r\\n  every message the client sends to rapidly pick up a bot's response. This 300ms delay should be adjusted\\r\\n  based on the bot's speed and transit time.\\r\\n\\r\\n## Ending a conversation\\r\\n\\r\\nEither a client or a bot may signal the end of a DirectLine conversation. This operation halts communication\\r\\nand prevents the bot and the client from sending messages. Messages may still be retrieved via the GET mechanism.\\r\\nSending this messages is as simple as POSTing an EndOfConversation activity.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/activities HTTP/1.1\\r\\nAuthorization: Bearer RCurR_XV9ZA.cwA.BKA.iaJrC8xpy8qbOF5xnR2vtCX7CZj0LdjAPGfiCpg4Fv0\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"type\\\": \\\"endOfConversation\\\",\\r\\n  \\\"from\\\": {\\r\\n    \\\"id\\\": \\\"user1\\\"\\r\\n  }\\r\\n}\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 200 OK\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"id\\\": \\\"0004\\\"\\r\\n}\\r\\n```\\r\\n\\r\\n## REST API errors\\r\\n\\r\\nHTTP calls to the Direct Line service follow standard HTTP error conventions:\\r\\n\\r\\n* 2xx status codes indicate success. (Direct Line 3.0 uses 200 and 201.)\\r\\n* 4xx status codes indicate an error in your request.\\r\\n  * 401 indicates a missing or malformed Authorization header (or URL token, in calls where a token parameter\\r\\n    is allowed).\\r\\n  * 403 indicates an unauthorized client.\\r\\n    * If calling with a valid but expired token, the ```code``` field is set to ```TokenExpired```.\\r\\n  * 404 indicates a missing path, site, conversation, etc.\\r\\n* 5xx status codes indicate a service-side error.\\r\\n  * 500 indicates an error inside the Direct Line service.\\r\\n  * 502 indicates an error was returned by the bot. **This is a common error code.**\\r\\n* 101 is used in the WebSocket connection path, although this is likely handled by your WebSocket client.\\r\\n\\r\\nWhen an error message is returned, error detail may be present in a JSON response. Look for an ```error```\\r\\nproperty with ```code``` and ```message``` fields.\\r\\n\\r\\n```\\r\\n-- connect to directline.botframework.com --\\r\\nPOST /v3/directline/conversations/abc123/activities HTTP/1.1\\r\\n[detail omitted]\\r\\n\\r\\n-- response from directline.botframework.com --\\r\\nHTTP/1.1 502 Bad Gateway\\r\\n[other headers]\\r\\n\\r\\n{\\r\\n  \\\"error\\\": {\\r\\n    \\\"code\\\": \\\"BotRejectedActivity\\\",\\r\\n    \\\"message\\\": \\\"Failed to send activity: bot returned an error\\\"\\r\\n  }\\r\\n}\\r\\n```\\r\\n\\r\\nThe contents of the ```message``` field may change. The HTTP status code and values in the ```code```\\r\\nproperty are stable.\\r\\n\\r\\n# Schema\\r\\n\\r\\nThe Direct Line 3.0 schema is identical to the Bot Framework v3 schema.\\r\\n\\r\\nWhen a bot sends an Activity to a client through Direct Line:\\r\\n\\r\\n* attachment cards are preserved,\\r\\n* URLs for uploaded attachments are hidden with a private link, and\\r\\n* the ```channelData``` property is preserved without modification.\\r\\n\\r\\nWhen a client sends an Activity to a bot through Direct Line:\\r\\n\\r\\n* the ```type``` property contains the kind of activity you are sending (typically ```message```),\\r\\n* the ```from``` property must be populated with a user ID, chosen by your client,\\r\\n* attachments may contain URLs to existing resources or URLs uploaded through the Direct Line attachment\\r\\n  endpoint, and\\r\\n* the ```channelData``` property is preserved without modification.\\r\\n\\r\\nClients and bots may send Activities of any type, including Message Activities, Typing Activities, and\\r\\ncustom Activity types.\\r\\n\\r\\nClients may send a single Activity at a time.\\r\\n\\r\\n```\\r\\n{\\r\\n  \\\"type\\\": \\\"message\\\",\\r\\n  \\\"channelId\\\": \\\"directline\\\",\\r\\n  \\\"from\\\": {\\r\\n    \\\"id\\\": \\\"user1\\\"\\r\\n  },\\r\\n  \\\"text\\\": \\\"hello\\\"\\r\\n}\\r\\n```\\r\\n\\r\\nClients receive multiple Activities as part of an ActivitySet. The ActivitySet has an array of activities\\r\\nand a watermark field.\\r\\n\\r\\n```\\r\\n{\\r\\n  \\\"activities\\\": [{\\r\\n    \\\"type\\\": \\\"message\\\",\\r\\n    \\\"channelId\\\": \\\"directline\\\",\\r\\n    \\\"conversation\\\": {\\r\\n      \\\"id\\\": \\\"abc123\\\"\\r\\n    },\\r\\n    \\\"id\\\": \\\"abc123|0000\\\",\\r\\n    \\\"from\\\": {\\r\\n      \\\"id\\\": \\\"user1\\\"\\r\\n    },\\r\\n    \\\"text\\\": \\\"hello\\\"\\r\\n  }],\\r\\n  \\\"watermark\\\": \\\"0000a-42\\\"\\r\\n}\\r\\n```\\r\\n\\r\\n# Libraries for the Direct Line API\\r\\n\\r\\nThe Direct Line API is designed to be coded directly, but the Bot Framework includes libraries and controls that\\r\\nhelp you to embed Direct-Line-powered bots into your application.\\r\\n\\r\\n* The [Bot Framework Web Chat control](https://github.com/Microsoft/BotFramework-WebChat) is an easy way to embed\\r\\n  the Direct Line protocol into a webpage.\\r\\n* [Direct Line Nuget package](https://www.nuget.org/packages/Microsoft.Bot.Connector.DirectLine) with libraries for\\r\\n  .Net 4.5, UWP, and .Net Standard.\\r\\n* [DirectLineJs](https://github.com/Microsoft/BotFramework-DirectLineJs), also available on\\r\\n  [NPM](https://www.npmjs.com/package/botframework-directlinejs)\\r\\n* You may generate your own from the [Direct Line Swagger file](swagger.json)\\r\\n\\r\\nOur [BotBuilder-Samples GitHub repo](https://github.com/Microsoft/BotBuilder-Samples) also contains samples for\\r\\n  [C#](https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/core-DirectLine) and\\r\\n  [JavaScript](https://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/core-DirectLine).\",\n    \"termsOfService\": \"https://www.microsoft.com/en-us/legal/intellectualproperty/copyright/default.aspx\",\n    \"contact\": {\n      \"name\": \"Bot Framework\",\n      \"url\": \"https://botframework.com\",\n      \"email\": \"botframework@microsoft.com\"\n    },\n    \"license\": {\n      \"name\": \"The MIT License (MIT)\",\n      \"url\": \"https://opensource.org/licenses/MIT\"\n    }\n  },\n  \"host\": \"directline.botframework.com\",\n  \"schemes\": [\n    \"https\"\n  ],\n  \"paths\": {\n    \"/v3/directline/session/getsessionid\": {\n      \"get\": {\n        \"tags\": [\n          \"Session\"\n        ],\n        \"operationId\": \"Session_GetSessionId\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"schema\": {\n              \"type\": \"object\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/directline/conversations\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Start a new conversation\",\n        \"operationId\": \"Conversations_StartConversation\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"tokenParameters\",\n            \"in\": \"body\",\n            \"required\": false,\n            \"schema\": {\n              \"$ref\": \"#/definitions/TokenParameters\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The conversation was successfully created, updated, or retrieved.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/Conversation\"\n            }\n          },\n          \"201\": {\n            \"description\": \"The conversation was successfully created.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/Conversation\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The URL, body, or headers in the request are malformed or invalid.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"409\": {\n            \"description\": \"The object you are trying to create already exists.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          }\n        }\n      }\n    },\n    \"/v3/directline/conversations/{conversationId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Get information about an existing conversation\",\n        \"operationId\": \"Conversations_ReconnectToConversation\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"watermark\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The conversation was successfully created, updated, or retrieved.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/Conversation\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The URL, body, or headers in the request are malformed or invalid.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          }\n        }\n      }\n    },\n    \"/v3/directline/conversations/{conversationId}/activities\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Get activities in this conversation. This method is paged with the 'watermark' parameter.\",\n        \"operationId\": \"Conversations_GetActivities\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"watermark\",\n            \"in\": \"query\",\n            \"description\": \"(Optional) only returns activities newer than this watermark\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"A set of activities and a watermark are returned.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ActivitySet\"\n            }\n          },\n          \"400\": {\n            \"description\": \"The URL, body, or headers in the request are malformed or invalid.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Send an activity\",\n        \"operationId\": \"Conversations_PostActivity\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"Activity to send\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation succeeded.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"204\": {\n            \"description\": \"The operation succeeded. No content was returned.\"\n          },\n          \"400\": {\n            \"description\": \"The URL, body, or headers in the request are malformed or invalid.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          },\n          \"502\": {\n            \"description\": \"The bot is unavailable or returned an error.\"\n          }\n        }\n      }\n    },\n    \"/v3/directline/conversations/{conversationId}/upload\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"Upload file(s) and send as attachment(s)\",\n        \"operationId\": \"Conversations_Upload\",\n        \"consumes\": [\n          \"multipart/form-data\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"userId\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"file\",\n            \"in\": \"formData\",\n            \"required\": true,\n            \"type\": \"file\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation succeeded.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"The request was accepted for processing.\"\n          },\n          \"204\": {\n            \"description\": \"The operation succeeded. No content was returned.\"\n          },\n          \"400\": {\n            \"description\": \"The URL, body, or headers in the request are malformed or invalid.\"\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          },\n          \"502\": {\n            \"description\": \"The bot is unavailable or returned an error.\"\n          }\n        }\n      }\n    },\n    \"/v3/directline/tokens/refresh\": {\n      \"post\": {\n        \"tags\": [\n          \"Tokens\"\n        ],\n        \"summary\": \"Refresh a token\",\n        \"operationId\": \"Tokens_RefreshToken\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The conversation was successfully created, updated, or retrieved.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/Conversation\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          }\n        }\n      }\n    },\n    \"/v3/directline/tokens/generate\": {\n      \"post\": {\n        \"tags\": [\n          \"Tokens\"\n        ],\n        \"summary\": \"Generate a token for a new conversation\",\n        \"operationId\": \"Tokens_GenerateTokenForNewConversation\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"tokenParameters\",\n            \"in\": \"body\",\n            \"required\": false,\n            \"schema\": {\n              \"$ref\": \"#/definitions/TokenParameters\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The conversation was successfully created, updated, or retrieved.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/Conversation\"\n            }\n          },\n          \"401\": {\n            \"description\": \"The operation included an invalid or missing Authorization header.\"\n          },\n          \"403\": {\n            \"description\": \"You are forbidden from performing this action because your token or secret is invalid.\"\n          },\n          \"404\": {\n            \"description\": \"The requested resource was not found.\"\n          },\n          \"429\": {\n            \"description\": \"Too many requests have been submitted to this API. This error may be accompanied by a Retry-After header, which includes the suggested retry interval.\"\n          },\n          \"500\": {\n            \"description\": \"An internal server error has occurred.\"\n          }\n        }\n      }\n    }\n  },\n  \"definitions\": {\n    \"TokenParameters\": {\n      \"description\": \"Parameters for creating a token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"user\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"User account to embed within the token\"\n        },\n        \"trustedOrigins\": {\n          \"description\": \"Trusted origins to embed within the token\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"eTag\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ChannelAccount\": {\n      \"description\": \"Channel account information needed to route a message\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or 123456)\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Display friendly name\",\n          \"type\": \"string\"\n        },\n        \"aadObjectId\": {\n          \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Conversation\": {\n      \"description\": \"An object representing a conversation or a conversation token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"conversationId\": {\n          \"description\": \"ID for this conversation\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"Token scoped to this conversation\",\n          \"type\": \"string\"\n        },\n        \"expires_in\": {\n          \"format\": \"int32\",\n          \"description\": \"Expiration for token\",\n          \"type\": \"integer\"\n        },\n        \"streamUrl\": {\n          \"description\": \"URL for this conversation's message stream\",\n          \"type\": \"string\"\n        },\n        \"referenceGrammarId\": {\n          \"description\": \"ID for the reference grammar for this bot\",\n          \"type\": \"string\"\n        },\n        \"eTag\": {\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ActivitySet\": {\n      \"description\": \"A collection of activities\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activities\": {\n          \"description\": \"Activities\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Activity\"\n          }\n        },\n        \"watermark\": {\n          \"description\": \"Maximum watermark of activities within this set\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Activity\": {\n      \"description\": \"An Activity is the basic communication type for the Bot Framework 3.0 protocol.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Contains the activity type.\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"Contains an ID that uniquely identifies the activity on the channel.\",\n          \"type\": \"string\"\n        },\n        \"timestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.\",\n          \"type\": \"string\"\n        },\n        \"localTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Contains the local date and time of the message, expressed in ISO-8601 format.\\r\\nFor example, 2016-09-23T13:07:49.4714686-07:00.\",\n          \"type\": \"string\"\n        },\n        \"localTimezone\": {\n          \"description\": \"Contains the name of the local timezone of the message, expressed in IANA Time Zone database format.\\r\\nFor example, America/Los_Angeles.\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Contains the URL that specifies the channel's service endpoint. Set by the channel.\",\n          \"type\": \"string\"\n        },\n        \"channelId\": {\n          \"description\": \"Contains an ID that uniquely identifies the channel. Set by the channel.\",\n          \"type\": \"string\"\n        },\n        \"from\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Identifies the sender of the message.\"\n        },\n        \"conversation\": {\n          \"$ref\": \"#/definitions/ConversationAccount\",\n          \"description\": \"Identifies the conversation to which the activity belongs.\"\n        },\n        \"recipient\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Identifies the recipient of the message.\"\n        },\n        \"textFormat\": {\n          \"description\": \"Format of text fields Default:markdown\",\n          \"type\": \"string\"\n        },\n        \"attachmentLayout\": {\n          \"description\": \"The layout hint for multiple attachments. Default: list.\",\n          \"type\": \"string\"\n        },\n        \"membersAdded\": {\n          \"description\": \"The collection of members added to the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        },\n        \"membersRemoved\": {\n          \"description\": \"The collection of members removed from the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        },\n        \"reactionsAdded\": {\n          \"description\": \"The collection of reactions added to the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MessageReaction\"\n          }\n        },\n        \"reactionsRemoved\": {\n          \"description\": \"The collection of reactions removed from the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MessageReaction\"\n          }\n        },\n        \"topicName\": {\n          \"description\": \"The updated topic name of the conversation.\",\n          \"type\": \"string\"\n        },\n        \"historyDisclosed\": {\n          \"description\": \"Indicates whether the prior history of the channel is disclosed.\",\n          \"type\": \"boolean\"\n        },\n        \"locale\": {\n          \"description\": \"A locale name for the contents of the text field.\\r\\nThe locale name is a combination of an ISO 639 two- or three-letter culture code associated with a language\\r\\nand an ISO 3166 two-letter subculture code associated with a country or region.\\r\\nThe locale name can also correspond to a valid BCP-47 language tag.\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"The text content of the message.\",\n          \"type\": \"string\"\n        },\n        \"speak\": {\n          \"description\": \"The text to speak.\",\n          \"type\": \"string\"\n        },\n        \"inputHint\": {\n          \"description\": \"Indicates whether your bot is accepting,\\r\\nexpecting, or ignoring user input after the message is delivered to the client.\",\n          \"type\": \"string\"\n        },\n        \"summary\": {\n          \"description\": \"The text to display if the channel cannot render cards.\",\n          \"type\": \"string\"\n        },\n        \"suggestedActions\": {\n          \"$ref\": \"#/definitions/SuggestedActions\",\n          \"description\": \"The suggested actions for the activity.\"\n        },\n        \"attachments\": {\n          \"description\": \"Attachments\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Attachment\"\n          }\n        },\n        \"entities\": {\n          \"description\": \"Represents the entities that were mentioned in the message.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Entity\"\n          }\n        },\n        \"channelData\": {\n          \"description\": \"Contains channel-specific content.\",\n          \"type\": \"object\"\n        },\n        \"action\": {\n          \"description\": \"Indicates whether the recipient of a contactRelationUpdate was added or removed from the sender's contact list.\",\n          \"type\": \"string\"\n        },\n        \"replyToId\": {\n          \"description\": \"Contains the ID of the message to which this message is a reply.\",\n          \"type\": \"string\"\n        },\n        \"label\": {\n          \"description\": \"A descriptive label for the activity.\",\n          \"type\": \"string\"\n        },\n        \"valueType\": {\n          \"description\": \"The type of the activity's value object.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"A value that is associated with the activity.\",\n          \"type\": \"object\"\n        },\n        \"name\": {\n          \"description\": \"The name of the operation associated with an invoke or event activity.\",\n          \"type\": \"string\"\n        },\n        \"relatesTo\": {\n          \"$ref\": \"#/definitions/ConversationReference\",\n          \"description\": \"A reference to another conversation or activity.\"\n        },\n        \"code\": {\n          \"description\": \"The a code for endOfConversation activities that indicates why the conversation ended.\",\n          \"type\": \"string\"\n        },\n        \"expiration\": {\n          \"format\": \"date-time\",\n          \"description\": \"The time at which the activity should be considered to be \\\"expired\\\" and should not be presented to the recipient.\",\n          \"type\": \"string\"\n        },\n        \"importance\": {\n          \"description\": \"The importance of the activity.\",\n          \"type\": \"string\"\n        },\n        \"deliveryMode\": {\n          \"description\": \"A delivery hint to signal to the recipient alternate delivery paths for the activity.\\r\\nThe default delivery mode is \\\"default\\\".\",\n          \"type\": \"string\"\n        },\n        \"listenFor\": {\n          \"description\": \"List of phrases and references that speech and language priming systems should listen for\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"textHighlights\": {\n          \"description\": \"The collection of text fragments to highlight when the activity contains a ReplyToId value.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/TextHighlight\"\n          }\n        },\n        \"semanticAction\": {\n          \"$ref\": \"#/definitions/SemanticAction\",\n          \"description\": \"An optional programmatic action accompanying this request\"\n        }\n      }\n    },\n    \"ConversationAccount\": {\n      \"description\": \"Conversation account represents the identity of the conversation within a channel\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"isGroup\": {\n          \"description\": \"Indicates whether the conversation contains more than two participants at the time the activity was generated\",\n          \"type\": \"boolean\"\n        },\n        \"conversationType\": {\n          \"description\": \"Indicates the type of the conversation in channels that distinguish between conversation types\",\n          \"type\": \"string\"\n        },\n        \"tenantId\": {\n          \"description\": \"This conversation's tenant ID\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or 123456)\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Display friendly name\",\n          \"type\": \"string\"\n        },\n        \"aadObjectId\": {\n          \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"MessageReaction\": {\n      \"description\": \"Message reaction object\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Message reaction type\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"SuggestedActions\": {\n      \"description\": \"SuggestedActions that can be performed\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"to\": {\n          \"description\": \"Ids of the recipients that the actions should be shown to.  These Ids are relative to the channelId and a subset of all recipients of the activity\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"actions\": {\n          \"description\": \"Actions that can be shown to the user\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"Attachment\": {\n      \"description\": \"An attachment within an activity\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"contentType\": {\n          \"description\": \"mimetype/Contenttype for the file\",\n          \"type\": \"string\"\n        },\n        \"contentUrl\": {\n          \"description\": \"Content Url\",\n          \"type\": \"string\"\n        },\n        \"content\": {\n          \"description\": \"Embedded content\",\n          \"type\": \"object\"\n        },\n        \"name\": {\n          \"description\": \"(OPTIONAL) The name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"thumbnailUrl\": {\n          \"description\": \"(OPTIONAL) Thumbnail associated with attachment\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Entity\": {\n      \"description\": \"Metadata object pertaining to an activity\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Type of this entity (RFC 3987 IRI)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ConversationReference\": {\n      \"description\": \"An object relating to a particular point in a conversation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activityId\": {\n          \"description\": \"(Optional) ID of the activity to refer to\",\n          \"type\": \"string\"\n        },\n        \"user\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"(Optional) User participating in this conversation\"\n        },\n        \"bot\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Bot participating in this conversation\"\n        },\n        \"conversation\": {\n          \"$ref\": \"#/definitions/ConversationAccount\",\n          \"description\": \"Conversation reference\"\n        },\n        \"channelId\": {\n          \"description\": \"Channel ID\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Service endpoint where operations concerning the referenced conversation may be performed\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TextHighlight\": {\n      \"description\": \"Refers to a substring of content within another field\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Defines the snippet of text to highlight\",\n          \"type\": \"string\"\n        },\n        \"occurrence\": {\n          \"format\": \"int32\",\n          \"description\": \"Occurrence of the text field within the referenced text, if multiple exist.\",\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"SemanticAction\": {\n      \"description\": \"Represents a reference to a programmatic action\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"state\": {\n          \"description\": \"State of this action. Allowed values: `start`, `continue`, `done`\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"ID of this action\",\n          \"type\": \"string\"\n        },\n        \"entities\": {\n          \"description\": \"Entities associated with this action\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/Entity\"\n          }\n        }\n      }\n    },\n    \"CardAction\": {\n      \"description\": \"A clickable action\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"The type of action implemented by this button\",\n          \"type\": \"string\"\n        },\n        \"title\": {\n          \"description\": \"Text description which appears on the button\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"description\": \"Image URL which will appear on the button, next to text label\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for this action\",\n          \"type\": \"string\"\n        },\n        \"displayText\": {\n          \"description\": \"(Optional) text to display in the chat feed if the button is clicked\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for action. Content of this property depends on the ActionType\",\n          \"type\": \"object\"\n        },\n        \"channelData\": {\n          \"description\": \"Channel-specific data associated with this action\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ResourceResponse\": {\n      \"description\": \"A response containing a resource ID\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Id of the resource\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"HeroCard\": {\n      \"description\": \"A Hero card (card with a single, large image)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"CardImage\": {\n      \"description\": \"An image on a card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL thumbnail image for major content property\",\n          \"type\": \"string\"\n        },\n        \"alt\": {\n          \"description\": \"Image description intended for screen readers\",\n          \"type\": \"string\"\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"Action assigned to specific Attachment\"\n        }\n      }\n    },\n    \"ErrorResponse\": {\n      \"description\": \"An HTTP API response\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"error\": {\n          \"$ref\": \"#/definitions/Error\",\n          \"description\": \"Error message\"\n        }\n      }\n    },\n    \"Error\": {\n      \"description\": \"Object representing error information\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"code\": {\n          \"description\": \"Error code\",\n          \"type\": \"string\"\n        },\n        \"message\": {\n          \"description\": \"Error message\",\n          \"type\": \"string\"\n        },\n        \"innerHttpError\": {\n          \"$ref\": \"#/definitions/InnerHttpError\",\n          \"description\": \"Error from inner http call\"\n        }\n      }\n    },\n    \"InnerHttpError\": {\n      \"description\": \"Object representing inner http error\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"statusCode\": {\n          \"format\": \"int32\",\n          \"description\": \"HttpStatusCode from failed request\",\n          \"type\": \"integer\"\n        },\n        \"body\": {\n          \"description\": \"Body from failed request\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"AnimationCard\": {\n      \"description\": \"An animation card (Ex: gif or short video clip)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ThumbnailUrl\": {\n      \"description\": \"Thumbnail URL\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL pointing to the thumbnail to use for media content\",\n          \"type\": \"string\"\n        },\n        \"alt\": {\n          \"description\": \"HTML alt text to include on this thumbnail image\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"MediaUrl\": {\n      \"description\": \"Media URL\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"Url for the media\",\n          \"type\": \"string\"\n        },\n        \"profile\": {\n          \"description\": \"Optional profile hint to the client to differentiate multiple MediaUrl objects from each other\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"AudioCard\": {\n      \"description\": \"Audio card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"BasicCard\": {\n      \"description\": \"A basic card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"MediaCard\": {\n      \"description\": \"Media card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ReceiptCard\": {\n      \"description\": \"A receipt card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"facts\": {\n          \"description\": \"Array of Fact objects\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Fact\"\n          }\n        },\n        \"items\": {\n          \"description\": \"Array of Receipt Items\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ReceiptItem\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card\"\n        },\n        \"total\": {\n          \"description\": \"Total amount of money paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"tax\": {\n          \"description\": \"Total amount of tax paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"vat\": {\n          \"description\": \"Total amount of VAT paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"Fact\": {\n      \"description\": \"Set of key-value pairs. Advantage of this section is that key and value properties will be \\r\\nrendered with default style information with some delimiter between them. So there is no need for developer to specify style information.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"key\": {\n          \"description\": \"The key for this Fact\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"The value for this Fact\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ReceiptItem\": {\n      \"description\": \"An item on a receipt card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the Card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle appears just below Title field, differs from Title in font styling only\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text field appears just below subtitle, differs from Subtitle in font styling only\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/CardImage\",\n          \"description\": \"Image\"\n        },\n        \"price\": {\n          \"description\": \"Amount with currency\",\n          \"type\": \"string\"\n        },\n        \"quantity\": {\n          \"description\": \"Number of items of given kind\",\n          \"type\": \"string\"\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the Item bubble.\"\n        }\n      }\n    },\n    \"SigninCard\": {\n      \"description\": \"A card representing a request to sign in\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Text for signin request\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Action to use to perform signin\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"OAuthCard\": {\n      \"description\": \"A card representing a request to perform a sign in via OAuth\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Text for signin request\",\n          \"type\": \"string\"\n        },\n        \"connectionName\": {\n          \"description\": \"The name of the registered connection\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Action to use to perform signin\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"ThumbnailCard\": {\n      \"description\": \"A thumbnail card (card with a single, small thumbnail image)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"VideoCard\": {\n      \"description\": \"Video card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"GeoCoordinates\": {\n      \"description\": \"GeoCoordinates (entity type: \\\"https://schema.org/GeoCoordinates\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"elevation\": {\n          \"format\": \"double\",\n          \"description\": \"Elevation of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"latitude\": {\n          \"format\": \"double\",\n          \"description\": \"Latitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"longitude\": {\n          \"format\": \"double\",\n          \"description\": \"Longitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Mention\": {\n      \"description\": \"Mention information (entity type: \\\"mention\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"mentioned\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"The mentioned user\"\n        },\n        \"text\": {\n          \"description\": \"Sub Text which represents the mention (can be null or empty)\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"Type of this entity (RFC 3987 IRI)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Place\": {\n      \"description\": \"Place (entity type: \\\"https://schema.org/Place\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"address\": {\n          \"description\": \"Address of the place (may be `string` or complex object of type `PostalAddress`)\",\n          \"type\": \"object\"\n        },\n        \"geo\": {\n          \"description\": \"Geo coordinates of the place (may be complex object of type `GeoCoordinates` or `GeoShape`)\",\n          \"type\": \"object\"\n        },\n        \"hasMap\": {\n          \"description\": \"Map to the place (may be `string` (URL) or complex object of type `Map`)\",\n          \"type\": \"object\"\n        },\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Thing\": {\n      \"description\": \"Thing (entity type: \\\"https://schema.org/Thing\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TokenRequest\": {\n      \"description\": \"A request to receive a user token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"provider\": {\n          \"description\": \"The provider to request a user token from\",\n          \"type\": \"string\"\n        },\n        \"settings\": {\n          \"description\": \"A collection of settings for the specific provider for this request\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"object\"\n          }\n        }\n      }\n    },\n    \"TokenResponse\": {\n      \"description\": \"A response that includes a user token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"channelId\": {\n          \"description\": \"The channelId of the TokenResponse\",\n          \"type\": \"string\"\n        },\n        \"connectionName\": {\n          \"description\": \"The connection name\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"The user token\",\n          \"type\": \"string\"\n        },\n        \"expiration\": {\n          \"description\": \"Expiration for the token, in ISO 8601 format (e.g. \\\"2007-04-05T14:30Z\\\")\",\n          \"type\": \"string\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "specs/component-model/overview.md",
    "content": "---\ntitle:  'Building bots from building blocks'\nauthor: 'clearab'\n---\n\n# Building bots from building blocks\n\nThe component model for building bots enables developers to build bots with re-usable building blocks (components). This model consists of a configurable [adaptive runtime](#adaptive-runtime), that can be extended by importing [packages](#packages) of functionality or connecting to other bots as [skills](#skills). Getting started [templates](#templates) built on this model will unify the creation experience, and eliminate the \"dead-end\" that can happen for some existing getting started experiences that lock you in to building a particular type of bot.\n\n**Our goals**:\n\n* Encourage the reuse of bot components – either connecting to a skill or importing in a package.\n* Enable the free movement of bots and components across hosting options and editing canvases.\n* Use industry/language-standard concepts and tools wherever possible.\n* Abstract away platform concepts for developers who do not wish to use them directly.\n* Enable provisioning and deployment to the necessary infrastructure based on the components included in a bot.\n* Publish a suite of packages, templates, and skills bot developers can use to build their bots from.\n* Publish components that demonstrate conversational design best practices.\n\n## Adaptive Runtime\n\nAt the core of the component model is the adaptive runtime - an extensible, configurable runtime that is treated as a black box to bot developers and taken as a dependency. The runtime provides extensibility points to add additional functionality by importing packages, connection to skills, or adding your own functionality.\n\n## Packages\n\nPackages are bits of a bot you want to share/import like declarative dialog assets, coded dialogs, custom adapters, middleware or custom actions. They are just packages  - NuGet / npm etc based on the code-language of your bot. You'll use the Bot Framework CLI tool to merge the package's declarative contents with your bot (package management in Composer will handle this for you). They can be made up of any combination of declarative assets (.dialog, .lu, .lg, .qna files) or coded extensions (custom actions, middleware, adapters).\n\nIn addition to the packages published by the Bot Framework team, you'll be able to create and share your own packages. We plan to provide tooling to make the entire package management lifecycle as simple as possible, from discovery and inclusion, to creation and publishing. Some examples of packages include:\n\n* Common conversational constructs like greeting, cancel, help, unknown intent.\n* Bundles of custom actions for working with an API like MS Graph, Dynamics, the Power Platform or GitHub.\n* Vertically aligned solutions containing a combination of custom actions and adaptive assets like human hand-off, or working with your calendar.\n* Bundles of custom actions for working with specific types of data or operations, like math functions or working with dates.\n* Meta-packages, that just take dependencies on a bunch of other packages to group functionality for simpler management.\n\n## Templates\n\nGetting started templates will be created on top of the component model. They will be built primarily by composing packages - ensuring that no matter which template you start from you'll have the flexibility to grow and develop your bot to meet your needs.\n\nFor example, the Conversational Core template will take a dependency on four packages - greeting, help, cancel, and unknown intent. This represents the base set of functionality nearly all conversational bots include. If you were to start from the empty/echo bot template, you could choose to add these packages later - either way you'd get the same set of functionality (without the need to do something like compare code samples and try and stitch them together yourself).\n\n## Skills\n\nSkills are separate bots you connect your bot to in order to process messages for you. The skill manifest establishes a contract other bots can follow - defining messages and events the skill can handle and any data that will be returned when the skill completes its interaction with your user.\n"
  },
  {
    "path": "specs/manifest/botframework-manifest.md",
    "content": "# Bot Framework -- Manifest\n\n## Abstract\n\nThe Bot Framework Manifest format describes a service capable of sending and receiving Bot Framework-compatible messages. The manifest allows configuration, registration, and publishing data about that bot to be authored, stored, and transmitted between services.\n\n## Table of Contents\n\n1. [Introduction](#Introduction)\n2. [Basic manifest structure](#Basic-manifest-structure)\n3. [Serialization](#Serialization)\n4. [Use in APIs](#Use-in-APIs)\n5. [Identity fields](#Identity-fields)\n6. [Action fields](#Action-fields)\n7. [Publishing fields](#Publishing-fields)\n8. [Complex types](#Complex-types)\n9. [References](#References)\n\n## Introduction\n\n### Overview\n\nThe Bot Framework Protocol [[1](#References)] and corresponding Activity schema [[2](#References)] describe a language for sending and receiving conversational messages between humans and automated software. Software that implements the \"bot\" side of this protocol are frequently registered so they can be contacted by users.\n\nThe Bot Framework Manifest format, defined here, describes how to contact this bot, what capabilities it offers, and information about how it should be published. Fields in the manifest appear flat at the root level but are organized within this document according to each goal.\n\nThis format is intended to support initial development of the bot, where tools can be used to automate source code templates based on manifest contents; testing of the bot, by providing information about its configuration; and finally, registering the bot so it can be used in production. During the development process, tools such as [msbot](https://github.com/Microsoft/botbuilder-tools/tree/master/MSBot) [[3](#References)] may be used in conjunction with or as a precursor to the manifest.\n\n### Requirements\n\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119) [[3](#References)].\n\nAn implementation is not compliant if it fails to satisfy one or more of the MUST or REQUIRED level requirements for the protocols it implements. An implementation that satisfies all the MUST or REQUIRED level and all the SHOULD level requirements for its protocols is said to be \"unconditionally compliant\"; one that satisfies all the MUST level requirements but not all the SHOULD level requirements for its protocols is said to be \"conditionally compliant.\"\n\n### Numbered requirements\n\nLines beginning with markers of the form `MXXXX` are specific requirements designed to be referenced by number in discussion outside of this document. They do not carry any more or less weight than normative statements made outside of `MXXXX` lines.\n\n`M1000`: Editors of this specification MAY add new `MXXXX` requirements. They SHOULD find numeric `MXXXX` values that preserve the document's flow.\n\n`M1001`: Editors MUST NOT renumber existing `MXXXX` requirements.\n\n`M1002`: Editors MAY delete or revise `MXXXX` requirements. If revised, editors SHOULD retain the existing `MXXXX` value if the topic of the requirement remains largely intact.\n\n`M1003`: Editors SHOULD NOT reuse retired `MXXXX` values. A list of deleted values MAY be maintained at the end of this document.\n\n### Terminology\n\nbot\n> Software that sends and receives activities conformant with the Bot Framework Protocol. Bots are also referred to as *skills*, *agents*, and otherwise, although this document uses the term *bot* exclusively.\n\nmanifest\n> Stored or transmitted description of a bot that conforms to the Manifest format.\n\nreader\n> Software reading a manifest.\n\nwriter\n> Software writing a manifest.\n\nregistry\n> Software, typically accessed via a portal or API, that accepts manifests for storage and indexing.\n\nfield\n> A named value within a manifest or nested object.\n\n### Overall organization\n\nThe manifest format is a flat list of name/value pairs, some of which are primitive objects, and some of which are complex (nested). The manifest is commonly expressed in the JSON format, but can also be projected into in-memory data structures in languages like C# and JavaScript.\n\nMost fields within the manifest are optional. Developers may wish to use all features of the manifest format to describe their bot, and others will choose to use parts of the format. The format does not put guidelines on the completeness of a manifest, and a manifest that contains only a small number of fields may still be useful for readers.\n\nEven though the manifest is flat, its fields are organized into three categories:\n1. What the bot is and where it can be contacted ([identity fields](#Identity-fields)])\n2. What the bot can do ([action fields](#Action-fields))\n3. Where the bot is published ([publishing fields](#Publishing-fields))\nThe ordering of fields within this document is intended to place similar concepts in the same place in the document.\n\nThe document is intended to be extensible except where specifically noted. To preserve interoperability, writers are encouraged to retain the meaning of existing fields so that a generic reader can make sense of their contents even when extensions are added.\n\n## Basic manifest structure\n\nThis section defines the requirements for the basic structure of the manifest. JSON is used as the common interchange format and defines limitations for field contents and uniqueness. (For example, XML-style attributes on field are not allowed.)\n\n`M2000`: Manifest contents MUST be serializable to the JSON format, including adherence to e.g. field uniqueness constraints.\n\n`M2002`: Readers MAY allow improperly-cased field names, although this is not required. If readers allow any improperly-cased field names, they MUST allow all fields to be improperly cased.\n\n`M2003`: Unless otherwise noted, writers SHOULD NOT include empty string values for string fields.\n\n`M2004`: Unless otherwise noted, writers SHOULD NOT include empty arrays or complex objects without child fields.\n\n`M2005`: Unless otherwise noted, emitters MAY include additional fields within the manifest or any nested complex objects. Readers MUST accept fields they do not understand.\n\n`M2006`: Writers SHOULD preserve the order of fields as described in this specification. Readers MUST allow fields to be expressed in other orders.\n\n## Serialization\n\nManifests are valid in the \".man\" file format described in this section.\n\n### .man file format\n\n`M2100`: Valid .man files MUST be a serialized JSON entity.\n\n`M2101`: Writers SHOULD use UTF-8 encoding for all .man files. Writers SHOULD NOT include byte-order marks (BOM) in .man files. Readers MAY reject .man files that include BOM or encoding other than UTF-8.\n\n`M2102`: For legibility, writers SHOULD pretty-format JSON so it includes newlines and whitespace.\n\n## Use in APIs\n\nManifest contents are commonly exchanged via APIs and those APIs may expose raw file upload or more fine-grained REST APIs that include manifest fields. In the latter case, APIs that faithfully map manifest content and meaning will have the best interoperability with the Bot Framework ecosystem.\n\n### Registries\n\nThe most common use for manifest APIs is as a way to accept manifests as part of a registry.\n\n`M3000`: Registries SHOULD allow raw manifest upload when possible.\n\n`M3001`: Registries MAY map manifest content and meaning to REST APIs.\n\n`M3002`: Registries SHOULD allow raw manifests to be downloaded, even if upload is not supported.\n\n`M3003`: Unless otherwise noted, registries SHOULD accept the entire manifest or reject it entirely. Registries SHOULD NOT ignore fields that are understood but fail to meet syntax or policy requirements. Registries SHOULD ignore fields they do not understand.\n\nFrequently, registries accept manifests in order to list bots for a directory or repository. In these cases, the assignment of IDs is sometimes allowed only by the registry itself.\n\n`M3010`: Registries MAY reject manifests with empty or missing IDs.\n\n`M3011`: Registries MAY allow manifests with empty or missing IDs. If IDs are assigned, the registry SHOULD communicate these IDs back to the submitter.\n\n## Identity fields\n\nThe fields in this description describe what the bot is and where to contact it. Typically these fields are used to assign stable identifiers (for later operations, like updates and deletes) and contact the bot once a channel or orchestrator has decided to route traffic there. Fields in this section appear at the root of the manifest alongside [action fields](#Action-fields) and [publishing fields](#Publishing-fields).\n\n### Id\n\nThe `id` field represents the unique ID of the bot within the system in which it is registered (e.g. the Bot Framework development portal). The value of the `id` field is of type string.\n\n### MsaAppId\n\nThe `msaAppId` field contains the ID of the MSA/AAD app that represents the bot for service-to-service auth. The value of the `msaAppId` field is of type string.\n\n### Endpoint\n\nThe `endpoint` field contains the endpoint URL of the bot compatible with the Bot Framework Protocol [[1](#References)]. This endpoint definition has a fixed protocol (the Bot Framework Protocol) that can be used with many bindings, the most common being HTTP/S. For simplicity, the HTTP/S binding is fixed to the binding defined in the Bot Framework Protocol, although other URL schemes may be used to define different bindings as long as the core protocol semantics are retained.\n\nThe value of the `endpoint` field is a URL [[5](#References)] within a string.\n\n`M4030`: Writers MUST NOT overload the `endpoint` field to contain endpoints with alternative protocols.\n\n`M4031`: Writers MUST NOT use HTTP- or HTTPS-scheme URLs to represent alternative bindings, even if those bindings operate over HTTP/S.\n\n`M4032`: Writers MAY use non-HTTP/S-scheme URLs to represent alternative bindings.\n\n### Icon URL\n\nThe `iconUrl` field contains the URL of the bot's icon. The value of the `iconUrl` is a URI [[5](#References)] within a string.\n\nRegistries typically expect icon URLs with HTTP or HTTPS schemes, and some registries require HTTPS. For this reason, HTTPS is the most interoperable way to deliver icons. However, alternative delivery mechanisms, such as local files or Data URIs (as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[7](#References)]) may be supported by some registries.\n\n`M4100`: Registries SHOULD accept `iconUrl` values of HTTPS scheme.\n\n### Authentication connections\n\nSome registrars accept definitions for authentication providers that bots can use at runtime to collect sign-in and access consent from users. The configuration for this information is stored in the `authenticationConnections` field. The `authenticationConnections` field is an array of type [`authenticationConnection`](#Authentication-connection)\n\n## Action fields\n\nThere is only one field in the actions section: [`actions`](#Actions). This field describes the capabilities that the bot advertises.\n\n### Actions\n\nThe `actions` field contains a list of actions the bot advertises it can accept. The `actions` field is an array of type ['action'](#Action).\n\nTypically actions are used to describe functions central to a bot's purpose, but not ancillary functionality necessary to complete the bot's user experience. For example, a bot for filing bugs could advertise an action for filing a bug, but not advertise an action for surfacing help requests.\n\nActions are sometimes defined by the bot, for example when the functionality is specific to the bot, and in other cases is defined globally so more than one bot can register for the same action. The granularity and details of these actions are up to whoever defines them.\n\nIn cases where the action is defined by the bot, the definition may be included inline within the action registration. In cases where the bot is only registering for a predefined action, the action registration is unlikely to include the definition.\n\nAn action advertisement is not a guarantee that the bot can successfully service a request that meets the syntactical requirements for the action. Instead, it merely indicates that the bot *might* be able to handle requests for that action. Correspondingly, a bot advertising an action is not guaranteed to receive all fields and all entities defined for an action.\n\n### Publishing fields\n\nThe publishing section contains information about how the bot is published into a registry, typically for discovery by users. The name, structure, and meaning of the fields are established by the registry. See [Appendix II](#Appendix-II---Bot-Framework-registry) for details on the central Bot Framework registry.\n\nThis section refers to *publishing fields*. *Publishing fields* are the set of fields defined by a particular registry. These fields are disjoint from the [identity fields](#Identity-fields) and [action fields](#Action-fields) defined in separate sections of this specification.\n\n`M4800`: Writers SHOULD only include publishing fields applicable to the registry where the manifest is intended to be consumed. If the manifest is not intended for consumption within a registry, writers SHOULD NOT include any publishing fields.\n\nRegistries accept extended registration data published as extra fields in the manifest root.\n\n`M4801`: Registries MAY define zero or more top-level field names with corresponding type and meaning.\n\n`M4802`: Registries SHOULD NOT extend fields within non-publishing fields.\n\nSome registries accept a monolithic manifest payload containing all registration data for a bot. Others apply the data in pieces. The decision of which fields appear in which part is made by the registry, and that decision typically takes into consideration grouping of related fields, the ability to commit fields in a single atomic operation, the size of fields, etc. Additional requirements for manifest division appear below.\n\n`M4810`: Registries MAY require manifests to be submitted as a single document.\n\n`M4811`: Registries MAY require manifests to be submitted in pieces. If so, the manifest SHOULD keep [identity fields](#Identity-fields) and [action fields](#Action-fields) in one part and separate only publishing fields into one or more additional parts.\n\n`M4812`: Registries SHOULD produce simple rules for dividing manifests, such as separating publishing fields into distinct documents.\n\n`M4813`: Manifest part definitions MAY all include the [`id`](#Id) field. Manifest part definitions SHOULD NOT duplicate fields other than `id` in multiple parts.\n\n`M4814`: Manifest part definitions MUST provide clear guidance on how to divide a manifest into parts and how to reconstitute the original manifest.\n\n## Complex types\n\n### Action\n\nThe `action` type describes a single action registration, and optionally the action's definition. More details on action registrations and definitions can be found in the ['actions'](#Actions) topic.\n\n#### ID\n\nThe `id` field contains the unique ID of the action within the system in which it is registered (e.g. the Bot Framework development portal). The value of the `id` field is of type string.\n\n#### Definition\n\nThe `definition` field contains the definition for an action. In many cases, the definition is omitted. The type of the `definition` field is of type [`actionDefinition`](#Action-definition).\n\n`M5020`: Readers who do not allow modification of existing action definitions SHOULD ignore `definition` fields for actions that cannot be updated.\n\n`M5021`: Readers SHOULD reject definitions if both the action and the definition contain `id` fields and those fields are not identical.\n\n### Action definition\n\nThe `actionDefinition` type declares the shape and meaning of an action. Actions may be triggered by utterance, direct binding (via a button), physical gesture, regex, and many other schemes. Some of these triggering techniques are expressed directly within the action definition: for example, the [`utterances`](#Utterances) field contains examples that could be used to train an NLP dispatching system. Some triggering systems are outside the scope of this specification, but may be used by readers and writers of the Action.\n\n#### ID\n\nThe `id` field contains the unique ID of the action within the system in which it is registered. The `id` field is redundant with the ID field in the [`action`](#Action) type.\n\n`M5110`: Writers SHOULD omit the `id` field within the `actionDefinition` type if it is contained within an `action` with a corresponding `id`.\n\n#### Description\n\nThe `description` field contains a textual description of the action. The value of the `description` field is of type string.\n\n#### Slots\n\nThe `slots` field contains a list of slot definitions for the action. Slots are places defining the meaning and desired type of entities. The value of the `slots` field is an array of type [`slotDefinition`](#Slot-definition).\n\n`M5130`: Readers and writers SHOULD preserve the order of slot definitions.\n\n#### Triggers\n\nThe `triggers` field contains triggers that orchestrators may use to activate the action. The value of the `triggers` field is of type [`triggerSet`](#Trigger-set).\n\n### Slot definition\n\nThe `slotDefinition` type declares slots, which in turn define the meaning and shape of entities to be submitted with the action.\n\n#### Name\n\nThe `name` field uniquely defines the slot within this action. The value of the `name` field is of type string.\n\n`M2510`: Writers MUST include a unique `name` for each slot definition within an action definition.\n\n`M5211`: Readers SHOULD use ordinal comparison to establish equivalency of the value of the `name` field within an action.\n\n`M5212`: Writers MUST NOT emit entities for two slots with the same name.\n\n#### Types\n\nThe `types` field defines types of entities this action accepts for this slot. The action prefers entities of types in the order specified; the most-desired entity type is expressed first, followed by fallback types that the action can consume. The value of the `types` field is an array of strings containing IRIs [[5](#References)].\n\n`M5220`: Writers MUST include at least one element within the `types` field for each slot definition.\n\n`M5221`: Readers SHOULD use ordinal comparison to establish equivalency of each value of the `types` field. Readers SHOULD NOT use URI ladder comparisons.\n\n`M5222`: Readers and writers MUST preserve the order of contents within the `types` field.\n\nSlot and entity types are typically expressed as [schema.org](https://schema.org) [[8](#References)] types, private entity types defined as URIs/IRIs, or a short list of primitives defined here. Currently the only primitive types are `string` and `number`.\n\n`M5223`: Writers MAY use short names to refer to primitive types: `string` and `number`. Writers MUST use absolute IRIs for all other types.\n\n### Trigger set\n\nThe `triggerSet` type describes a set of conditions for activation, typically in the context of an [action definition](#Action-definition). The conditions for activation are the union (i.e., the logical \"OR\") of all available triggers.\n\n#### Utterances\n\nThe `utterances` field contains a list of text utterances which may trigger this action. The value of the `utterances` field is an array of type [`utteranceDefinition`](#Utterance-definition).\n\n### Utterance definition\n\nAn utterance contains raw data that can be used to identify when, for example, a user's request should trigger this action. The implementation of the system that learns, extracts, and matches text against these utterances is expected to vary across systems.\n\n#### Text\n\nThe `text` field contains the raw text associated with this utterance. The value of the `text` field is of type string.\n\n#### Locale\n\nThe `locale` field communicates the language code of the [`text`](#Text) field. The value of the `locale` field is an [ISO 639](https://www.iso.org/iso-639-language-codes.html) [[6](#References)] code within a string.\n\n`M5320`: Readers SHOULD treat missing and unknown values of the `locale` field as unknown.\n\n`M5321`: Readers SHOULD NOT reject activities with unknown locale.\n\n#### Entities\n\nThe `entities` field contains a list of entities present in the source [`text`](#Text). The value of the `entities` field is an array of type [`entityReference`](#Entity-reference).\n\n`M5330`: Writers SHOULD NOT include entity references that do not match [`name`](#Name) field values defined for the action.\n\n`M5331`: Readers SHOULD ignore entity references that do not match [`name`](#Name) field values defined for the action.\n\n### Entity reference\n\nThe `entityReference` type identifies a entity embedded within text.\n\n#### Name\n\nThe `name` field identifies the referenced entity. The value of the `name` field is of type string.\n\n`M5410`: Readers SHOULD use ordinal comparison to establish equivalency of the value of the `name` field within an action.\n\n#### Start position\n\nThe `startIndex` field identifies the position within the [`text`](#Text) field where the first character of the entity is found. The value of the `startIndex` field is of type number.\n\n#### End position\n\nThe `endIndex` field identifies the position within the [`text`](#Text) field after the last character of the entity is found. The value of the `endIndex` field is of type number.\n\n`M5430`: Writers MUST include `name`, `startIndex`, and `endIndex` in all `entityReference` objects.\n\n`M5431`: Writers MUST only use non-negative integer numbers for the value of `startIndex` and positive integer numbers for the value of `endIndex`.\n\n`M5432`: Writers MUST include `startIndex` values between 0 (inclusive) and the length of the [`text`](#Text) field (exclusive) and `endIndex` values between 0 (exclusive) and the length of the [`text`](#Text) field (inclusive).\n\n`M5433`: Writers MUST NOT include `endIndex` values that are less than or equal to `startIndex` values.\n\n`M5434`: Readers SHOULD reject any `entityReference` objects that do not meet the above criteria.\n\n### Authentication connection\n\nAn authentication connection represents a sign-in service, and contains parameters describing how to use this service to request user sign-in and consent.\n\n#### Authentication connection ID\n\nThe `id` field contains the unique internal identifier for this setting. The value of the `id` field is of type string.\n\n`M5510`: Two `id` values are equivalent only if they are ordinally identical.\n\n#### Authentication connection name\n\nThe `name` field contains a name used to identify the authentication connection when invoked \n\n#### Authentication connection service provider ID\n\nThe `serviceProviderId` field identifies the authentication service providing sign-in functionality. The value of the `serviceProviderId` is of type string and the valid values (and their meanings) are defined by the registry accepting the manifest.\n\n#### Authentication connection client ID\n\nThe `clientId` field contains the identifier sent to the authentication service when requesting sign-in. The value of the `clientId` field is of type string.\n\n#### Authentication connection client secret\n\nThe `clientSecret` field contains the client secret sent to the authentication service when requesting sign-in. The value of the `clientSecret` field is of type string.\n\n#### Authentication connection scope\n\nThe `scopes` field contains the scopes string sent to the authentication service when requesting sign-in. If the authentication connection specifies multiple scopes, they are supplied in this field in whatever format the authentication service is expecting. The value of the `scopes` field is of type string.\n\n#### Authentication connection properties\n\nThe `properties` field contains additional properties to be supplied to the service provider identified by [`serviceProviderId`](#Authentication-connection-service-provider-ID). The value of the `properties` field is a complex type defined by the service provider.\n\n`M5560`: Registries and service providers SHOULD use only strings for authentication property keys and values.\n\n### References\n\n1. [Bot Framework Protocol](../botframework-protocol/botframework-protocol.md)\n2. [Bot Framework Activity](../botframework-activity/botframework-activity.md)\n3. [MSBot](https://github.com/Microsoft/botbuilder-tools/tree/master/MSBot)\n4. [RFC 2119](https://tools.ietf.org/html/rfc2119)\n5. [RFC 3987](https://tools.ietf.org/html/rfc3987)\n6. [ISO 639](https://www.iso.org/iso-639-language-codes.html)\n7. [RFC 2397](https://tools.ietf.org/html/rfc2397)\n8. [schema.org](https://schema.org)\n\n# Appendix I - Changes\n\n## 2018-09-23 - dandris@microsoft.com\n* Change slot type definition from `desiredType` to list of types\n* Convert `startPosition` and `endPosition` to `startIndex` and `endIndex`\n\n## 2018-09-18 - dandris@microsoft.com\n* Revise `M3003` to improve parsing behavior\n* Expand registry section and add [Appendix II](#Appendix-II---Bot-Framework-registry)\n\n## 2018-09-06 - dandris@microsoft.com\n* Rearranged triggers into own section\n\n## 2018-08-24 - dandris@microsoft.com\n* Renamed action entities to action slots\n\n## 2018-08-13 - dandris@microsoft.com\n* Add omitted text in overview descriptions\n* Revise `M5431` to allow zero\n\n## 2018-07-31 - dandris@microsoft.com\n* Move identity/actions/publishing into distinct sections\n\n# 2018-07-29 - dandris@microsoft.com\n* Added icons back into format\n* Added authentication connections\n\n## 2018-07-25 - dandris@microsoft.com\n* Initial draft\n\n## Appendix II - Bot Framework registry\n\nThe manifest format provides a generic mechanism for describing a bot. Sometimes bots are submitted to a central registry, such as the [Bot Framework portal](https://dev.botframework.com), and sometimes they are combined together as skills as part of an agent developed in source code. The registry is different in these two cases; for the former, the registry accepts data about Bot Framework channels such as Skype and Cortana; in the latter, it accepts data used to compose bots/skills together as an agent (which can later be published as a bot on its own).\n\nThis section describes characteristics specific to the [Bot Framework registry](https://botframework.com).\n\n### Structure\n\nManifests intended for the [Bot Framework registry](https://botframework.com) have one or more parts:\n* A mandatory *core part* comprising of [identity fields](#Identity-fields) and [action fields](#Action-fields) defined in this specification\n* One or more *channel parts* defined below\n\nThe total number of parts for a Bot Framework manifest is `N+1`, where `N` is the number of channels included.\n\nA convention for storing these files on disks is to use the bot's ID as a core filename and the channel ID for each associated manifest part. For example:\n`bot.man` contains core properties for the manifest for ID `bot`\n`bot-skype.man` contains Skype properties\n`bot-cortana.man` contains Cortana properties\n\n### Channels\n\nBot Framework defines 13 channels. The list of channels may change over time. Each channel is expressed in a top-level field whose name is the channel ID, in accordance with `M4801`. The schema for each channel is defined in corresponding JSON schema files.\n* `cortana`\n* `directline`\n* `email`\n* `facebook`\n* `groupme`\n* `kik`\n* `slack`\n* `teams`\n* `telegram`\n* `skype`\n* `skypeforbusiness`\n* `sms`\n* `webchat`\n\nTooling used to interact with the Bot Framework service, such as the [Bot Service Azure CLI](https://github.com/Microsoft/botbuilder-tools/tree/master/AzureCli), expect manifests in this format.\n"
  },
  {
    "path": "specs/manifest/example.man",
    "content": "{\n    \"@context\": \"https://botframework.com/schemas\",\n    \"@type\": \"manifest\",\n    \"id\": \"BugFilingBot\",\n    \"msaAppId\": \"e7401b5c-c097-4f0c-9d8d-0e94ad9acdab\",\n    \"iconUrl\": \"https://example.com/bots/BugFilingBot/icons.png\",\n    \"authenticationConnections\": [\n        {\n            \"id\": \"bugServiceConnection\",\n            \"serviceProviderId\": \"bugPlatform\",\n            \"clientId\": \"2d4d7f49-efb8-405f-9733-359936922b3b\",\n            \"clientSecret\": \"d725482a-ad23-44b4-bb5f-073b5e2d3d7d\",\n            \"scopes\": \"bug-read,bug-write\",\n            \"properties\": {\n                \"signin\": \"interactive\"\n            }\n        }\n    ],\n    \"actions\": [\n        {\n            \"id\": \"https://example.org/global/bugs/file\"\n        }, {\n            \"id\": \"https://bugfilingbot.example.org/resolve\",\n            \"definition\": {\n                \"id\": \"https://bugfilingbot.example.org/resolve\",\n                \"description\": \"Resolve a bug\",\n                \"slots\": [{\n                    \"name\": \"bugId\",\n                    \"types\": [ \"http://example.org/bug/id\", \"number\" ]\n                }],\n                \"triggers\":{\n                    \"utterances\": [{\n                        \"text\": \"I'd like to resolve a bug\"\n                    }, {\n                        \"text\": \"resolve bug\"\n                    }, {\n                        \"text\": \"resolve bug number 1234\",\n                        \"entities\": [{\n                            \"name\": \"bugId\",\n                            \"startIndex\": 19,\n                            \"endIndex\": 23\n                        }]\n                    }]\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "specs/manifest/manifest.json",
    "content": "{\n    \"id\": \"https://botframework.com/schemas/manifest\",\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"type\": \"object\",\n    \"properties\": {\n        \"id\": { \"type\": \"string\" },\n        \"msaAppId\": { \"type\": \"string\" },\n        \"endpoint\": { \"type\": \"string\", \"format\": \"uri\" },\n        \"iconUrl\": { \"type\": \"string\", \"format\": \"uri\" },\n        \"authenticationConnections\": { \"type\": \"array\", \"items\": { \"$ref\": \"https://botframework.com/schemas/manifest/authenticationConnectionDefinition\" } },\n        \"actions\": { \"type\": \"array\", \"items\": { \"$ref\": \"https://botframework.com/schemas/manifest/action\" } }\n    },\n    \"definitions\": {\n        \"authenticationConnectionDefinition\": {\n            \"properties\": {\n                \"id\": { \"type\": \"string\" },\n                \"serviceProviderId\": { \"type\": \"string\" },\n                \"clientId\": { \"type\": \"string\" },\n                \"clientSecret\": { \"type\": \"string\" },\n                \"scopes\": { \"type\": \"string\" },\n                \"properties\": { \"type\": \"object\" }\n            }\n        },\n        \"action\": {\n            \"properties\": {\n                \"id\": { \"type\": \"string\" },\n                \"definition\": { \"$ref\": \"https://botframework.com/schemas/manifest/actionDefinition\" }\n            }\n        },\n        \"actionDefinition\": {\n            \"properties\": {\n                \"id\": { \"type\": \"string\" },\n                \"description\": { \"type\": \"string\" },\n                \"slots\": { \"type\": \"array\", \"items\": { \"$ref\": \"https://botframework.com/schemas/manifest/slotDefinition\" } },\n                \"triggers\": { \"$ref\": \"https://botframework.com/schemas/manifest/triggerSet\" }\n            }\n        },\n        \"slotDefinition\": {\n            \"properties\": {\n                \"name\": { \"type\": \"string\" },\n                \"types\": { \"type\": \"array\", \"items\": { \"$ref\": \"string\" } }\n            }\n        },\n        \"triggerSet\": {\n            \"properties\": {\n                \"utterances\": { \"type\": \"array\", \"items\": { \"$ref\": \"https://botframework.com/schemas/manifest/utteranceDefinition\" } }\n            }\n        },\n        \"utteranceDefinition\": {\n            \"properties\": {\n                \"text\": { \"type\": \"string\" },\n                \"locale\": { \"type\": \"string\" },\n                \"entities\": { \"type\": \"array\", \"items\": { \"$ref\": \"https://botframework.com/schemas/manifest/entityReference\" } }\n            }\n        },\n        \"entityReference\": {\n            \"properties\": {\n                \"name\": { \"type\": \"string\" },\n                \"startPosition\": { \"type\": \"number\" },\n                \"endPosition\": { \"type\": \"number\" }\n            }\n        }\n    }\n}"
  },
  {
    "path": "specs/testing/skills/SkillsFunctionalTesting.md",
    "content": "# Skills: Validating skill functionality (DRAFT) <!-- omit in toc -->\n\n## Summary <!-- omit in toc -->\n\nFunctional tests aim to ensure skills and skill consumers function correctly across the breadth of the Bot Framework.\n\n### Goals <!-- omit in toc -->\n\n1. Validate existing functionality consistently, identify issues and potential regressions.\n2. New functionality can be easily tested, without the need to recreate the complex topologies required when working with skills.\n3. The test infrastructure can be used either directly or as a template for support scenarios to repro customer issues.\n4. Execute automated functional tests regularly (as part of the CI/CD pipeline, on a regular schedule or triggered manually).\n5. Ensure a skill built with any of the languages supported by the SDK will work with any other bot built with a different language SDK.\n\nTo support these goals, the testing infrastructure used to validate the functional tests derived from this document must be carefully considered.\n\n## Contents <!-- omit in toc -->\n\n- [Scenarios](#scenarios)\n- [Reference](#reference)\n  - [Things a skill might want to do](#things-a-skill-might-want-to-do)\n  - [Variables](#variables)\n  - [Consumer/Skill architecture](#consumerskill-architecture)\n    - [Simple](#simple)\n    - [Multiple skills](#multiple-skills)\n    - [Multiple consumers](#multiple-consumers)\n    - [Skill chaining](#skill-chaining)\n    - [Complex](#complex)\n    - [Circular](#circular)\n- [Implementation notes](#implementation-notes)\n  - [Consumers](#consumers)\n  - [Skills](#skills)\n    - [GetWeather skill](#getweather-skill)\n    - [Travel skill](#travel-skill)\n    - [OAuth skill](#oauth-skill)\n    - [Teams skill](#teams-skill)\n    - [Proactive Skill](#proactive-skill)\n    - [Cards Skill](#cards-skill)\n    - [RemindMe Skill](#remindme-skill)\n  - [Infrastructure](#infrastructure)\n- [Glossary](#glossary)\n\n## Scenarios\n\nThis section enumerates the testing scenarios for skills, for each one of them we provide a  high level description of the primary test case, the type of consumers used, the skill (or skills) involved and the [consumer/skill architecture](#consumerskill-architecture) used to deploy the testing components.\n\nThe different permutations between consumers, skills and their implementation language are represented using a test matrix.\n\nThe variables section lists the set of [variables](#variables) that apply to the test case and  need to be configured for each case in the matrix.\n\nWherever is relevant, we also include a list of variations that describe small variants in the scenario (e.g.: state of the consumer, state of the skill, error condition, special considerations, etc.).\n\nGiven these elements, the number of test cases for each scenario can be calculated by multiplying the number of permutations in the matrix by the number of values for each variable and then multiplied by the number of variations.\n\nThe list below provides links to each scenario speacification:\n\n1. [Single turn interaction with a skill](scenarios/SingleTurnInteraction.md)\n2. [Multi turn interaction with a skill](scenarios/MultiTurnInteraction.md)\n3. [Skill sends a proactive message to the consumer](scenarios/ProactiveMessage.md)\n4. [Card actions that generate invokes and message activities](scenarios/CardActionsWithInvokes.md)\n5. [A skill can update and delete an adaptive card](scenarios/UpdateDeleteAdaptiveCard.md)\n6. [The skill needs to authenticate the user with an OAuthCard](scenarios/AuthWithOAuthCard.md)\n7. [The consumer authenticates the user and passes OAuth credentials to the skill using SSO](scenarios/AuthWithSSO.md)\n8. [A skill uses team specific APIs](scenarios/TeamsAPI.md)\n9. [A skill calls another skill](scenarios/SkillCallsSkill.md)\n10. [A skill provides a teams task module](scenarios/TeamsSkillWithTaskModule.md)\n11. [A skill receives an attachment](scenarios/SkillReceivesAttachment.md)\n12. [Skill proactively starts a conversation with a user](scenarios/SkillStartsConversation.md)\n13. [Draft scenarios](scenarios/DraftScenarios.md) (Collention of raw ideas for scenarios that need to be defined in more detail)\n\n## Reference\n\n### Things a skill might want to do\n\n- Perform multi-turn dialogs, with child dialog/prompts\n- Send proactive messages\n- Receive and respond to invoke Activities\n- Send cards and respond to card actions\n  - Adaptive Card\n    - Action.Submit\n    - Action.Execute (AC 2.0)\n  - Suggested Actions\n  - Non-invoke actions (ImBack)\n- Retrieve conversation members\n  - Single member\n  - All members\n  - Paged members\n- Update messages\n- Delete messages\n- Create a new conversation\n- Use channel-specific functionality\n  - Retrieve list of channels in a team\n  - Get team info\n- Authentication\n  - SSO\n  - OAuth prompt\n  - OAuth card\n  - OAuth input\n\n### Variables\n\n- Activity Handling (applies to both the skill and the consumer)\n  - Waterfall\n  - Adaptive\n  - Prompts\n  - Raw activity handling\n- Consumer sent the Activity to the skill with \"expectReplies\"\n- Skill is currently active\n- Skill is currently inactive\n- Some _other_ skill is currently active\n- Parent bot is engaged in a _different_ dialog\n- Authentication context, the skill and consumer are deployed to the public cloud, gov cloud, or a sandboxed environment.\n- Network protocol: the consumer is accessed over straight HTTP (webchat) or Web Sockets (streaming clients)\n- BotFramework version for the skill: 4.x or 3.x.\n- Bot runtime: Composer bot, PVA or SDK coded bot.\n- Channel: Emulator, Teams, DirectLine, DirectLine ASE (App Service Extension)\n- Bot programming language: C#, JS, Python or Java.\n- Bot Adapter: Skill or consumer use a OOTB adapter or custom channel adapter\n\n### Consumer/Skill architecture\n\nThis section describes the most common consumer/skill topologies that can exist. The topologies given below are further complicated based on the variables above, as well as the SDK language of any particular bot (consumer or skill) in the topology.\n\nOne of the most important things to keep in mind here is that any bot can act as a stand-alone bot, a consumer, or a skill, and may very well fulfill all three models at different times.\n\n#### Simple\n\nIn the simplest case there is a single consumer and a single skill.\n\n```\nC -----> S\n```\n\n#### Multiple skills\n\nA single consumer with multiple skills.\n\n```\n      ----> S1\nC --<\n      ----> S2\n```\n\n#### Multiple consumers\n\nA single skill is consumed by multiple consumers.\n\n```\nC1 --\\\n      ------> S\nC2 --/\n```\n\n#### Skill chaining\n\nA consumer uses a skill, which in turn consumes another skill.\n\n```\nC1 -----> C2/S1 ----> S2\n```\n\n#### Complex\n\nCombining multiple skills, multiple consumers, and skill chaining.\n\n```\nC1 --\\                              ----> S3\n      ------> C3/S1 ----> C4/S2 --<\nC2 --<              \\               ----> S4\n      ------> S5     -----> S6\n```\n\n#### Circular\n\nA consumer uses a skill, which in turn consumes another skill, which in turn consumes the original consumer as a skill. In practice, this topology should probably be avoided, however nothing directly prevents it from occurring.\n\n```\nC1/S1 ----> C2/S2 --\n   ^                \\----> C3/S3 --\n   |                               |\n   |------------------------------/\n\n```\n\n## Implementation notes\n\nBased on the scenarios described above we will need to build the following artifacts to implement and run functional tests on skills:\n\n### Consumers\n\n- Composer consumer bot (C# only for now)\n- VA consumer bot (C# and TS)\n- PVA consumer bot (C#)\n\n### Skills\n\n#### GetWeather skill\n\nComposer, C# no dialogs, JS no dialogs, Python no dialogs.\n\n#### Travel skill\n\nComposer, C# waterfall, JS waterfall, Python waterfall.\n\n#### OAuth skill\n\nC#, JS, Python\n\n#### Teams skill\n\nTeams skill should implement the update and delete functionality from the [Teams conversation bot](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/57.teams-conversation-bot) sample.\n\nC#, JS, Python\n\n#### Proactive Skill\n\nC#, JS, Python \n\n**Note:** Implement as a refactor of [proactive messages sample](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/16.proactive-messages)\n\n#### Cards Skill\n\nC#, JS, Python\n\n**Note** Implement as a refactor of [This controller](https://fuselabs.visualstudio.com/TeamsIntegrationTesting/_git/TeamsIntegrationTesting?path=%2FDotnetIntegrationBot%2FIntegrationCommandHandler.cs)\n\n#### RemindMe Skill\n\nC#, JS, Python\n\n**Note** Message bot to send message some time later\n\n### Infrastructure\n\n- Proactive service (C#)\n- Transcript based test runner (C#)\n\n## Glossary\n\n- **Consumer:** A bot that passes Activities to another bot (a skill) for processing.\n- **Skill:** A bot that accepts Activities from another bot (a consumer), and passes Activities to users through that consumer.\n- **Active skill:** The consumer is currently forwarding Activities to the skill.\n- **Inactive skill:** The consumer is not currently forwarding Activities to the skill.\n"
  },
  {
    "path": "specs/testing/skills/SkillsMatrixTesting.md",
    "content": "# Automated Testing of Skills\n\nDefines the short term goals around the automated testing of skills. \n\n# Goal\n\nAutomate the testing matrix for Bot/Skill interactions. The full testing matrix runs every night. Failures result in emails. \n\n# Version of the Botbuilder SDK\n\n1. For each test run, the latest *preview* Bot Builder SDK should be consumed from the MyGet.\n2. Alternatly, a specific version of the BotBuilder SDK could be specified via an Azure Devops variable. \n\n# Testing Matrix\n\n## Phase 0, \"Crawl\"\n|        |    |            |        | \n|--------|----|------------|--------|\n|        | C# | Javascript | Python | \n| C#     |   1 |2            |3        | \n| JS     | 4   |5            |6       | \n| Python |7    |8            |9        | \n\n1. C# Bot acting as consumer, calling a C# Skill\n2. C# Bot acting as consumer, calling a JS Skill\n3. C# Bot acting as consumer, calling a Python Skill\n4. JS Bot acting as consumer, calling a C# Skill\n5. JS Bot acting as consumer, calling a JS Skill\n6. JS Bot acting as consumer, calling a Python Skill\n7. Python Bot acting as consumer, calling a C# Skill\n8. Python Bot acting as consumer, calling a JS Skill\n9. Python Bot acting as consumer, calling a Python Skill\n\n## Phase 1\n\n1. The test matrix runs in the Gov cloud.\n\nNote: Python is not currently supported in Gov Cloud, so that portion of the matrix won't be moved over (yet). \n\n## Phase 2, \"Run\"\n\n|                 | C# Net Core 3 | Javascript | Python | C# Net Core 2.1 | v3 Javascript | v3 C# |\n|-----------------|---------------|------------|--------|-----------------|---------------|-------|\n| C# Net Core 3   |     1         |    2        |  3      |    13             |    14           |  15     |\n| JS              |      4         |   5         |   6     |        16         |     17          |    18   |\n| Python          |     7          |   8         |   9     |       19          |       20        |    21   |\n| C# Net Core 2.1 |      10         |    11        |  12      |      22           |      23         |  24     |\n\n1. [Unchanged] C# Bot acting as consumer, calling a C# Skill\n2. [Unchanged] C# Bot acting as consumer, calling a JS Skill\n3. [Unchanged] C# Bot acting as consumer, calling a Pyton Skill\n4. [Unchanged] JS Bot acting as consumer, calling a C# Skill\n5. [Unchanged] JS Bot acting as consumer, calling a JS Skill\n6. [Unchanged] JS Bot acting as consumer, calling a Python Skill\n7. [Unchanged] Python Bot acting as consumer, calling a C# Skill\n8. [Unchanged] Python Bot acting as consumer, calling a JS Skill\n9. [Unchanged] Python Bot acting as consumer, calling a Python Skill\n10. [New] C# Net Core 2.1 Bot acting as a consumer, calling a C# .Net core 3.1 Skill \n11. [New] C# Net Core 2.1 Bot acting as a consumer, calling a JS Skill \n12. [New] C# Net Core 2.1 Bot acting as a consumer, calling a Python Skill \n13. [New] C# Net Core 3.1 Bot acting as a consumer, calling a .Net Core 2.1 Skill \n14. [New] C# Net Core 3.1 Bot acting as a consumer, calling a v3 JS Skill \n15. [New] C# Net Core 3.1 Bot acting as a consumer, calling a v3 C# Skill\n16. [New] JS Bot acting as consumer, calling a C# .Net Core 2.1 Skill\n17. [New] JS Bot acting as consumer, calling a v3 JS Skill\n18. [New] JS Bot acting as consumer, calling a v3 C# Skill\n19. [New] Python Bot acting as consumer, calling a C# Net Core 2.1 Skill\n20. [New] Python Bot acting as consumer, calling a v3 JS  Skill\n21. [New] Python Bot acting as consumer, calling a v3 C#  Skill\n22. [New] C# Net Core 2.1 acting as consumer, calling a C# .NEt Core 2.1 Skill\n23. [New] C# Net Core 2.1 acting as consumer, calling a v3 JS Skill\n24. [New] C# Net Core 2.1 acting as consumer, calling a v4 C# Skill\n\n# Tests\n\n* **Crawl** The only test run is an Echo + end utterance to trigger an EndOfConversation Activity. The Consumer sends a Message containing a GUID to the skill, and the skill echo that back. The skill then sends end the conversation. \n* **Walk** Scenario for Events and Invoke + InvokeResponse are added. \n* **Run** the test matrix grows to include C# .Net Core 2.1 (as a Skill Host and Skill), and v3 JS (as a Skill) and v3 C# (as as Skill)\n\n# Bots we need\n3 Bots (1 in C#, one in JS, one in Python). The Bot picks up \"Skill\" or \"Consumer\" from the ENV variables, which are set as part of the bot's deployment. \n\nThe bots that may server as a starting point for development are here:\n[C#](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/80.skills-simple-bot-to-bot)\n[JS](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/80.skills-simple-bot-to-bot)\n[Python](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/python/80.skills-simple-bot-to-bot)\n\nOPEN ITEM: Unclear if we should have 3 bots or 6. \n\n# Repo\nAll bots are stored in the same git repo. The repo is hosted on Azure Devops, at the following location:\nhttps://github.com/microsoft/BotFramework-FunctionalTests\n\nNote: We are not using GitHub for this, as this repo needs to be public. We may revisit this decision, as it's easier for external vendors to work in a GitHub repo. \n\n# CI/CD and YAML\nEach test case in the matrix has a dedicated YAML file and corresponding build in Azure Devops.\n\nThe testing is kicked off each night via a trigger from our nightly CI/CD build of the SDK. \n\n# Problems to Solve:\n\n1. Picking up the latest SDK version from MyGet. Unclear how best to do this using Azure Devops.\n2. How best to kick-off the build? Is there an easy way to kick off the build once each of the C# / JS / Python nightly builds are complete? \n3. How to apply to Gov Datacenter? \n4. Best way to register / manage / deploy the bots? \n5. What Azure Subscription? \n6. Setup/Teardown each night, re-using the AppID + Password? Use Certs? \n7. Which Azure Resource Group?\n"
  },
  {
    "path": "specs/testing/skills/SkillsScopeInformation.md",
    "content": "# Scope information for Skills\n\nThe purpose of this doc is to capture what is functionally in and out of scope across various Channels and BotFramework features\n\n\n# Cards supported in Channels - WIP\n|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |\n|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n|        | Adaptive card - Card Action |Adaptive card - Task Module|Adpative card - Bot Builder action| Hero Card | Thumbnail Card | Receipt Card | Signin Card | Carousel Card | List of Cards | O365 Card | File card| Animation cards | Audio Cards | Video Cards|\n|Console           |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Cortana           |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|DirectLine        |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|DirectLine Speech |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Email             |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Emulator          |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Facebook          |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|GroupMe           |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Kik               |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Line              |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|MSTeams           |✅|✅|✅|✅|✅|✅|✅|✅|✅|✅|✅|❌|❌|❌|\n|Skype             |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Skype for Business|?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Slack             |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|SMS               |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Telegram          |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Webchat           |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n|Twilio-sms        |?|?|?|?|?|?|?|?|?|?|?|?|?|?|\n\n\n# Activity Update & Delete via Adapted Card - WIP\n\n|                  |Update Supported|Delete Supported|\n|------------------|--|-|\n|Console           |?|?|\n|Cortana           |?|?|\n|DirectLine        |?|?|\n|DirectLine Speech |?|?|\n|Email             |?|?|\n|Emulator          |?|?|\n|Facebook          |?|?|\n|GroupMe           |?|?|\n|Kik               |?|?|\n|Line              |?|?|\n|MSTeams           |✅|✅|\n|Skype             |?|?|\n|Skype for Business|?|?|\n|Slack             |?|?|\n|SMS               |?|?|\n|Telegram          |?|?|\n|Webchat           |?|?|\n|Twilio-sms        |?|?|\n\n\n# Can bot initiate conversation with previously unmessaged/new user? - WIP\n|                  |Can it?| Notes|\n|------------------|-------| ---- |\n|Console           |?| |\n|Cortana           |?| |\n|DirectLine        |?| |\n|DirectLine Speech |?| |\n|Email             |?| |\n|Emulator          |?| |\n|Facebook          |?| |\n|GroupMe           |?| |\n|Kik               |?| |\n|Line              |?| |\n|MSTeams           |✅|Can message users in the conversation, or on the team. Can't message users it can't see.|\n|Skype             |?| |\n|Skype for Business|?| |\n|Slack             |?| |\n|SMS               |?| |\n|Telegram          |?| |\n|Webchat           |?| |\n|Twilio-sms        |?| |\n\n# Auth support for channels - WIP\n|                  |SSO|OAuth Card|OAuth Prompt|\n|------------------|--|-|-|\n|Console           |?|?|?|\n|Cortana           |?|?|?|\n|DirectLine        |?|?|?|\n|DirectLine Speech |?|?|?|\n|Email             |?|?|?|\n|Emulator          |?|?|?|\n|Facebook          |?|?|?|\n|GroupMe           |?|?|?|\n|Kik               |?|?|?|\n|Line              |?|?|?|\n|MSTeams           |?|✅|✅|\n|Skype             |?|?|?|\n|Skype for Business|?|?|?|\n|Slack             |?|?|?|\n|SMS               |?|?|?|\n|Telegram          |?|?|?|\n|Webchat           |?|?|?|\n|Twilio-sms        |?|?|?|\n\n# Auth support for environments - WIP\n|             |SSO|OAuth Card|OAuth Prompt|\n|-------------|---|----------|------------|\n|Public Cloud |?|?|?|\n|Gov Cloud    |?|?|?|\n|Sandbox      |?|?|?|\n|Composer     |?|?|?|\n|Emulator     |?|?|?|\n"
  },
  {
    "path": "specs/testing/skills/scenarios/AuthWithOAuthCard.md",
    "content": "# The skill needs to authenticate the user with an OAuthCard\n\n> A consumer bot starts a multi turn interaction with a skill (e.g.: how does my day look like) and the skill renders an OAuthPrompt to allow the user to log in, once the skill obtains a token it performs an operation, returns a response to the user and logs it out.\n\n## Variations\n\n- The Skill sends a proactive OAuthPrompt because a user token has expired.\n- TODO: we may also need to consider negative/edge scenarios like:\n  - The user has never authorized the application\n  - The user has previously authorized the application\n  - The login fails\n  - Timeouts\n\n## Testing matrix\n\n- Skill: [OAuthSkill](../SkillsFunctionalTesting.md#oauth-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/AuthWithSSO.md",
    "content": "# The consumer authenticates the user and passes OAuth credentials to the skill using SSO\n\n> A consumer bot starts a multi turn interaction with a skill (e.g.: how does my day look like) and the skill renders an OAuthPrompt to allow the user to log in, once the skill obtains a token it performs an operation, returns a response to the user and logs it out.\n\n## Variations\n\n- TODO\n\n## Testing matrix\n\n- Skill: TBD\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/CardActionsWithInvokes.md",
    "content": "# Card actions that generate invokes and message activities\n\n> The Consumer invokes the skill through a dialog, and the Skill sends an Adaptive Card that collects some information with a \"Submit\" button using Action.Submit as the action type.\n\n## Variations\n\nTBD\n\n## Testing matrix\n\n- Skill: [Cards skill](../SkillsFunctionalTesting.md#cards-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/DraftScenarios.md",
    "content": "# Draft scenarios\n\nThis section contains raw ideas to be incorporated in the scenarios enumerated above\n\n> The consumer is actively engaged with a skill in an adaptive dialog, the skill uses adaptive dialogs, and the skill wants to send a proactive message.\n\n> The consumer is actively engaged with a _different_ skill in an adaptive dialog, the skill uses adaptive dialogs, and the skill wants to send a proactive message.\n\n> The consumer is not engaged with a skill, the skill uses adaptive dialogs, and the skill wants to send a proactive message.\n\n> The consumer is not engaged with a skill, the skill uses adaptive dialogs, and the skill wants to call `createConversation` in order to send a new proactive message.\n\n> The consumer engages with a skill in a group conversation.\n\n> The consumer engages with a skill in a group conversation. And the skill starts a DM conversation with one of the users\n\nUsing those examples, we can extrapolate a template for creating a realistic test scenario:\n\n> The consumer is in `someVariableState`, the skill is in `someVariableState`, and the skill wants to `performSomeAction`.\n\n"
  },
  {
    "path": "specs/testing/skills/scenarios/MultiTurnInteraction.md",
    "content": "# Multi turn interaction with a skill\n\n> A consumer bot starts a multi turn interaction with a skill (e.g.: book a flight) and handles multiple turns (2 or more) until the skill completes the task.\n\n## Variations\n\n1. The consumer cancels the skill (sends EndOfConversation)\n2. The consumer sends parameters to the skill\n3. The skill sends a result to the consumer\n4. The skill sends an event to the consumer (GetLocation) and the consumer sends an event back to the skill.\n5. The skill throws and exception and fails (the consumer gets a 500 error)\n\n## Testing matrix\n\n- Skill: [Travel](../SkillsFunctionalTesting.md#travel-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/ProactiveMessage.md",
    "content": "# Skill sends a proactive message to consumer\n\n> A consumer calls a _timer skill_ and the skill finishes the conversation but stores some tasks. Then, some time later the skill sends an update to the consumer as a message.\n\n## Variations\n\n1. The skill starts a multiturn dialog.\n   - When the timer is up the skill sends an option to snooze or end. \n  \n## Testing matrix\n\n- Skill: [Proactive skill](../SkillsFunctionalTesting.md#proactive-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/SingleTurnInteraction.md",
    "content": "# Single turn interaction with a skill\n\n> A consumer bot sends an activity to a skill (e.g.: GetWeather) and the skill responds to the user and ends.\n\n## Variations\n\n1. Negative test, a consumer tries to call a regular bot as a skill (and the bot is not a skill).\n\n## Testing matrix\n\n- Skill: [GetWeather](../SkillsFunctionalTesting.md#getweather-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/SkillCallsSkill.md",
    "content": "# Skill calls another skill\n\n> TODO\n\n## Variations\n\n- Proactively initiate a multi turn conversation.\n\n## Testing matrix\n\n- Skill/Consumer: TBD\n- Skill: TBD\n- Topology: [Skill chaining](../SkillsFunctionalTesting.md#skill-chaining)\n\n![Test matrix](../media/Chaining.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n192 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/SkillReceivesAttachment.md",
    "content": "# A skill receives an attachment\n\n> As part of a multi turn conversation a skill is expecting a file that needs to be uploaded consumer bot and then relayed to the skill\n\n## Variations\n\n**Questions**\n\n- Are there any unsupported file types?\n- What happens if we upload the same file multiple times\n- What happens if we upload a file that's too large\n- What if the skill doesn't know what to do with an attachment\n\n## Testing matrix\n\n- Skill: TBD\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n- Channel: TODO not sure about this yet\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/SkillStartsConversation.md",
    "content": "# Skill proactively starts a conversation with a user\n\n> DRAFT: A user is in a Teams group chat with a bot and some other users. \n> The user says @reminderSkill remind me to finish my status report at 4 PM. \n> The skill schedules a task to fire at 4 PM. \n> At 4 PM, the skill starts 1:1 a conversation (CreateConversation) and sends the reminder to the user.\n\n## Variations\n\n1. The skill creates a conversation (in teams) and starts a 1:1 conversation with a user in the group. Note - the 1:1 conversations created persist, and there is no way to delete them. Repeated calls to createConversation will succeed however, and return the appropriate conversationId that can be re-used.\n\n## Testing matrix\n\n- Skill: [RemindMe](../SkillsFunctionalTesting.md#remindme-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/TeamsAPI.md",
    "content": "# A skill uses team specific APIs\n\n> - Retrieve list of channels in a team\n> - Get team info\n> - Get members from a non-team-scoped conversation\n> - Retrieve the _paged_ list of uses in a group where the group is large enough to necessitate more than one page.\n\n## Variations\n\n- Trying to access Team specific information from a 1:1 or group chat\n  - EX: Calling `GetTeamChannels` from a 1:1 chat\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Testing matrix\n\n- Skill: [Teams skill](../SkillsFunctionalTesting.md#teams-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/TeamsSkillWithTaskModule.md",
    "content": "# A skill provides a teams task module\n\n> The Skill responds to an action/submit invoke with a `taskInfo` object containing a Task Module with an Adaptive Card\n> The Skill responds to the submit action of a TaskModule\n\n## Variations\n\n- TODO\n\n## Testing matrix\n\n- Skill: [Teams skill](../SkillsFunctionalTesting.md#teams-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/skills/scenarios/UpdateDeleteAdaptiveCard.md",
    "content": "# A skill can update and delete an adaptive card\n\n> The skill renders an adaptive card with two buttons and one text field. \n> The text field shows the current number of times the \"Update\" button has been clicked\n> The first button is \"Update\" which increases the number in the text field by 1\n> The second button is \"Delete\" which deletes the adaptive card  \n\n## Variations\n\n1. **Note** There is probably channel specific behavior that exists here. Need to understand how cards work in various channels\n2. **Note** We should also cross reference what kinds of cards work in what channels\n \n## Testing matrix\n\n- Skill: [Teams skill](../SkillsFunctionalTesting.md#teams-skill)\n- Topology: [Simple](../SkillsFunctionalTesting.md#simple)\n\n![Test matrix](../media/Simple.jpg)\n\n## Variables\n\n- Auth context: Public Cloud, Gov Cloud, Sandboxed\n- Delivery mode: Normal, ExpectReplies\n\n## Total test cases\n\n96 (not including variations)\n"
  },
  {
    "path": "specs/testing/testing.md",
    "content": "\n# Testing bots (DRAFT) <!-- omit in toc -->\n\n# Overview <!-- omit in toc -->\n\nTesting a conversational application is often complex and it involves several different layers. The guidance, samples and tools required to test bots are diverse and scattered in different projects, documents and samples.  \n\nA conversational application is made of of code, cognitive models, one or many target channels and several other external services.\n\nThis document describes the different types of tests that can be used in a conversational solution and outlines the requirements that we should address to make easier to test bots throughout their life cycle.\n\n![Bot SDLC](images/bot-service-overview.png)\n\n# Table of Contents <!-- omit in toc -->\n\n- [Tenets](#tenets)\n- [Testing scenarios](#testing-scenarios)\n- [Roadmap](#roadmap)\n- [Test types](#test-types)\n\n# Tenets\n\n1. It should be easy and intuitive to create coded unit tests.\n2. It should be possible to write unit tests that don't rely on actual cognitive services calls.\n3. It should be possible to validate the language models for a bot using tests.\n4. Tests should take a relative short time to run.\n5. Product owners should be able to write functional and language tests without having to write code.\n6. Tests should be \"scriptable\" and it should be possible to execute them from the command line, the IDE of choice and/or as part of the Continuous Integration/Continuous Delivery pipelines [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/).\n7. Whenever a test fails, it should be easy to understand the cause of the failure and the test output should be clean of stack traces and tech jargon (although those may still be available on demand).\n8. It should be possible to run tests throughout the entire bot development life cycle: Build, Test, Deployment and Operations.\n9. It should be possible to test bots using different languages and locales.\n10. Tests should be measurable and should provide metrics that will help determine if the solution quality is improving or not.  \n\n# Testing scenarios\n\n- For a list of the bot testing scenarios targeted to v4.5 see the DCRs posted under [4.5 Preview](https://github.com/Microsoft/botframework-sdk/milestone/1).\n- For a complete list of testing scenarios see [Bot Testing Issues](https://github.com/Microsoft/botframework-sdk/issues?q=is%3Aopen+is%3Aissue+project%3AMicrosoft%2Fbotframework-sdk%2F11).\n\n**Note:** The testing DCRs use the format \"As a ***role*** I would like to ***requirement*** so I can ***benefit***\".\n\n# Roadmap\n\nOur approach is to enhance our samples, documentation and tools to provide clear guidance on how to test bots. We will also extend the SDK with new features where needed to make things easier.\n\nYou can see our roadmap and work in progress stories in the [Bot Testing](https://github.com/Microsoft/botframework-sdk/projects/11?fullscreen=true) project.\n\nThe **4.5 Candidates** column enumerates a prioritized list of the scenarios targeted for the 4.5 release.\n\nNote that anything on here is subject to change, and is not a guarantee of shipping.\n\n# Test types\n\nThere are several test types involved in bot development and operations and different authors and communities use different terminology and naming to refer to them.\n\nThis section describes the types we use for testing bots. It doesn't try to provide a formal definition for each type, it is intended to serve as a broad categorization that we use to classify the different scenarios that we are supporting.\n\n- **Unit Tests**\n  \n  Are written by developers and normally executed as part of the Continuous Integration build pipeline.\n  \n  Their main purpose is to ensure that the coded logic for a bot executes as expected.\n\n- **Natural Language Understanding Tests**\n\n    Can be written by developers, NLU engineers or Product owners and can be executed as part of the CI pipeline or when the language model for the bot changes.\n\n    Their main purpose is to ensure that the bot understands what the user is asking and that there are no regressions in the language models when they are extended or modified.\n\n    These tests typically target LUIS and QnAMaker.\n\n- **Language Generation tests**\n\n   They are written by NLU engineers or Product owners and are executed as part of the CI pipeline of the underlying Language Generation files (.lg files) for the bot change.\n\n   Their main goal is to ensure the bot constructs meaningful, variable and grammatically correct responses to the user.\n\n   See [this page](https://github.com/Microsoft/botbuilder-dotnet/tree/ComposableDialog/doc/LanguageGeneration) for an overview of LG files.\n\n- **Functional tests**\n\n    Also called End to End tests, these tests target the entire bot and its dependent services.\n\n    Non-technical audiences should be able to write and execute these type of tests.\n\n- **UI Testing**\n\n    Coded UI tests are used for UI-driven functional automation of bots deployed to different channels.\n\n    These tests use open source frameworks like [Selenium](https://docs.seleniumhq.org/) or [Appium](http://appium.io/) to automate UI execution of the client app and playback pre-created scripts.\n\n    These tests are written by developers in conjuntion with product owners.\n\n- **Load Tests**\n\n    These tests validate that the solution will work under the expected user load. They are typically written by testers and developers and cover end to end scenarios under a variable set of load conditions.\n\n    **Note**: VS 2019 will be the last version of Visual Studio that will provide load testing tools. For customers requiring load testing tools, Microsoft is recommending using alternate load testing tools such as Apache JMeter, Akamai CloudTest, Blazemeter (see [Changes to load test functionality in Visual Studio](https://docs.microsoft.com/en-us/azure/devops/test/load-test/overview?view=azure-devops)).\n\n- **Health checks**\n\n    Helth checks are executed on deployed bots and ensure that all the bot and its related services are working as expected in production.\n\n    These tests can be integrated with operation dashboard and trigger alerts if something in the bot is broken."
  },
  {
    "path": "specs/transcript/transcript.md",
    "content": "# Transcript\n\n## Abstract\n\nThe Bot Framework Transcript schema is log of conversational actions made by humans and automated software. Transcript extends the Bot Framework Activity schema to include tracing generated during the processing of those activities.\n\nThis schema is used within Bot Builder SDKs and tools, and may be consumed or emitted by other software that understand this format.\n\n## Table of Contents\n\n1. [Introduction](#Introduction)\n2. [Basic transcript structure](#Basic-transcript-structure)\n3. [Serialization](#Serialization)\n4. [Activity schema in transcript](#Activity-schema-in-transcript)\n5. [References](#References)\n6. [Appendix I - Changes](#Appendix-I---Changes)\n\n## Introduction\n\n### Overview\n\nThe Transcript schema represents conversational behaviors made by humans and automated software (typically within chat applications) and corresponding processing artifacts, such as natural-language processing results or calls to APIs. Transcript extends the [Bot Framework Activity](../botframework-activity/botframework-activity.md) format [[1](#References)] to include structured extensibility points. It also provides a format for serializing collections of Activities, which is not provided by the core activity schema.\n\nThis specification contains additions to the core Bot Framework Activity schema, and includes new fields, specific guidance for existing Activity fields when used within Transcript, and minimal explanations required for understanding Activity fields in context. For a complete description, see the [Bot Framework Activity](../botframework-activity/botframework-activity.md) specification [[1](#References)].\n\n### Requirements\n\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119) [[2](#References)].\n\nAn implementation is not compliant if it fails to satisfy one or more of the MUST or REQUIRED level requirements for the protocols it implements. An implementation that satisfies all the MUST or REQUIRED level and all the SHOULD level requirements for its protocols is said to be \"unconditionally compliant\"; one that satisfies all the MUST level requirements but not all the SHOULD level requirements for its protocols is said to be \"conditionally compliant.\"\n\n### Numbered requirements\n\nLines beginning with markers of the form `TXXXX` are specific requirements designed to be referenced by number in discussion outside of this document. They do not carry any more or less weight than normative statements made outside of `TXXXX` lines.\n\n`T1000`: Editors of this specification MAY add new `TXXXX` requirements. They SHOULD find numeric `TXXXX` values that preserve the document's flow.\n\n`T1001`: Editors MUST NOT renumber existing `TXXXX` requirements.\n\n`T1002`: Editors MAY delete or revise `TXXXX` requirements. If revised, editors SHOULD retain the existing `TXXXX` value if the topic of the requirement remains largely intact.\n\n`T1003`: Editors SHOULD NOT reuse retired `TXXXX` values. A list of deleted values MAY be maintained at the end of this document.\n\n### Terminology\n\nactivity\n> An action expressed by a bot, a channel, or a client that conforms to the Activity schema.\n\ntranscript\n> A collection of Activities that conforms to the Transcript schema.\n\nchannel\n> Software that sends and receives activities, and transforms them to and from chat or application behaviors. Channels are the authoritative store for activity data.\n\nbot\n> Software that sends and receives activities, and generates automated, semi-automated, or entirely manual responses. Bots have endpoints that are registered with channels.\n\ntransmitted activity\n> Transmitted activities are sent between bots and channels, or other services that send and receive activity objects. They represent a request or directive.\n\nmetadata activity\n> Metadata activities are generated during the process of another operation (typically a transmitted activity), but are neither requests nor directives.\n\nemitter\n> Software generating an activity within a transcript.\n\nprocessor\n> Software reading an activity within a transcript.\n\nfield\n> A named value within an activity or nested object.\n\n### Overall organization\n\nThe transcript format is designed to contain lists of related activities. Typically these activities are related to the same conversational interaction, but they could be grouped by other characteristics, such as the user sending the activity, or whether a call to a dependent service succeeded or failed.\n\nActivities within the transcript format are either \"transmitted\" (in that they went sent or received as a part of a conversation), or \"metadata\" (in that they were generated, possibly by a participant in the conversation, but not necessarily sent to or received by another party). Typically, metadata activities carry tracing, debugging, and logging data.\n\nThe transcript format defines some additional activity types and fields within the activity structure to aid processing of metadata activities.\n\n## Basic transcript structure\n\nThis section defines the requirements for the basic structure of the transcript format.\n\nTranscripts are ordered collections of Activity objects. JSON is used as the common interchange format and defines limitations for field contents and uniqueness. (For example, XML-style attributes on field are not allowed.) Implementers will find detailed requirements within the Bot Framework Activity specification.\n\n`T2000`: Transcript contents MUST be serializable to the JSON format, including adherence to e.g. field uniqueness constraints.\n\n`T2001`: Transcripts MUST contain only child activities, as defined by [Bot Framework Activity](../botframework-activity/botframework-activity.md) [[1](#References)]. Activities MUST adhere to the requirements of that specification for the transcript to be valid.\n\n`T2002`: Processors MAY allow improperly-cased field names, although this is not required. Processors MAY reject activities that do not include fields with the proper casing.\n\n`T2003`: Processors MAY reject activities that contain field values whose types do not match the value types described in this specification.\n\n`T2004`: Unless otherwise noted, emitters SHOULD NOT include empty string values for string fields. Emitters MAY ignore this rule when storing activities emitted by another participant.\n\n`T2005`: Unless otherwise noted, emitters MAY include additional fields within the activity or any nested complex objects. Processors MUST accept fields they do not understand.\n\n`T2006`: Processors MAY ignore activities of types they do not understand.\n\n`T2007`: Processors MAY read common fields of activities even if they do not understand the type of the activity, unless the activity does not contain a `type` field.\n\n`T2008`: Processors SHOULD NOT process any children of the transcript that do not have a `type` field.\n\n`T2009`: Unless otherwise noted, emitters SHOULD NOT include empty arrays or complex objects. Emitters MAY ignore this rule when storing arrays and objects emitted by another participant.\n\n## Serialization\n\nTranscripts are valid either in a well-defined \".transcript\" file format, defined in this section, or as a custom-serialized collection of activities that adhere to the same characteristics. The .transcript file format is useful when using other transcript-compatible tools, such as editors and analytics tools, and custom serialization is useful when saving to an application-specific store, like a database.\n\n### .transcript file format\n\nThe .transcript format is JSON and allows emitters to choose whether to generate a flat array of activities or a complex object containing a flat array. This choice allows for both efficiency and extensibility.\n\n`T2100`: Valid .transcript files MUST be a serialized JSON entity. That entity MUST be either a flat array of activities or a complex object containing a `transcript` field.\n\n`T2101`: Processors MUST support both the array- and the object-based serialization described in `T2100`.\n\n`T2102`: Emitters SHOULD use UTF-8 encoding for all .transcript files. Emitters SHOULD NOT include byte-order marks (BOM) in .transcript files. Processors MAY reject .transcript files that include BOM or encoding other than UTF-8.\n\nThere is no inherent relationship between a .transcript file and criteria used for including content within it. An emitter may choose to write a .transcript file containing activities from a specific conversation, user, or which meet custom predicates (such as conversations that resulted in poor service latency). Emitters may also split a single collection of activities into multiple .transcript files to e.g. keep file sizes small.\n\n`T2103`: Processors SHOULD allow multiple .transcript files to be loaded for each operation.\n\n### Custom storage\n\nIn addition to the [.transcript format](#.transcript-file-format), many implementations will serialize Transcript-compatible Activities into storage specific to their application, such as a database or key-value store. The conventions and formats may be specific to this custom storage, but the resulting data is considered to be compatible with Transcript as long as it meets the non-serialization requirements imposed by this format. Of course, import to and export from custom storage is left to the implementer.\n\n### Attachments\n\nThe activity schema allows three kinds of attachments:\n1. Attachments expressed inline in JSON or JSON-compatible form (e.g. [Adaptive Cards](https://adaptivecards.io/) [[3](#References)])\n2. Binary attachments serialized as Data URIs, as defined in [RFC 2397](https://tools.ietf.org/html/rfc2397) [[4](#References)]\n3. Binary attachments referenced by URL\n\nTypically attachments of the first two types are self-contained and are meaningful when presented along with the activity containing them. Attachments of the third type reside remotely and may become inaccessible due to permissions, automatic content cleanup, and inadvertent deletion.\n\n`T2200`: Writers SHOULD preserve JSON-compatible and Data URI attachments emitted inline in the JSON payload.\n\n`T2201`: Writers MAY update attachment URIs to reference archived versions of original attachment content.\n\n## Activity extensions\n\nTranscript aims to faithfully reproduce content expressed within the Bot Framework activity schema. In some cases, the stored form of these activities must be augmented or modified to retain their meaning when the activities are archived within storage.\n\nFor example, a [`timestamp`](../botframework-activity/botframework-activity.md#Timestamp) is not strictly required as part of an activity when transmitted because both the sender and the receiver have an internal timestamp correlated with the activity transmission. However, in stored form, a timestamp becomes necessary to reconstruct the meaning that was self-evident at runtime.\n\nAdditionally, some fields become less important. For example, the [`channelId](botframework-activity.md#Channel-ID) field is required at runtime for activity receivers to understand the meaning and equivalency of ID fields, but may not be required when processing a single transcript when it is safe to assume they come from the same source. This allows the synthesis of transcripts from sources that did not contain Bot Framework-compatible activities (e.g. human chat logs).\n\n`T2300`: Unless otherwise stated in this document, emitters SHOULD include all available activity fields when creating transcripts.\n\n`T2310`: If the [`timestamp`](botframework-activity.md#Timestamp) field is not present on an activity, and the emitter knows the exact timestamp when an activity was sent or received, the emitter SHOULD include the timestamp in the activity.\n\n`T2310`: Requirement [`R2020`](botframework-activity.md#Channel-ID) stating that `channelId` is a mandatory field MAY be ignored when emitting or processing activities. Emitters SHOULD include `channelId` if available per `T2300`.\n\n## References\n\n1. [Bot Framework Activity](../botframework-activity/botframework-activity.md)\n2. [RFC 2119](https://tools.ietf.org/html/rfc2119)\n3. [Adaptive Cards](https://adaptivecards.io)\n4. [RFC 2397](https://tools.ietf.org/html/rfc2397)\n\n# Appendix I - Changes\n\n## 2021-10-26 - chrimc@microsoft.com\n* Fixed activity links\n\n## 2018-07-05 - dandris@microsoft.com\n\n* Added `T2009`\n* Fixed typos\n\n## 2018-06-15 - dandris@microsoft.com\n\n* Initial draft\n"
  },
  {
    "path": "tools/changelog/.gitignore",
    "content": "# Ignore input and output files for git-log.js\n*.txt\n*.md"
  },
  {
    "path": "tools/changelog/git-log.js",
    "content": "// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nconst { createReadStream, createWriteStream, existsSync } = require('fs');\nconst { once } = require('events');\nconst { join } = require('path');\nconst { argv, exit } = require('process');\nconst { createInterface } = require('readline');\n\n// Remove first two elements from argv, which are `node` and `script.js`.\n// Currently the script takes two arguments, which are assigned to\n// gitLogFromRepo and optionalOutputName.\nconst [ gitLogFromRepo, optionalOutputName ] = argv.slice(2);\n\nif (!gitLogFromRepo) {\n    throw new TypeError('The captured output of `git log` must be passed in.');\n}\n\nif (!existsSync(join(__dirname, gitLogFromRepo))) {\n    throw new ReferenceError(`The provided file \"${gitLogFromRepo}\" was not found in ${__dirname}`);\n}\n\n// Determine the changelogFile (which contains the formatted merges to main)\n// and the repository URL.\nlet changelogFile;\nlet repository;\nif (gitLogFromRepo.startsWith('dotnet')) {\n    changelogFile = optionalOutputName || 'dotnet.md';\n    repository = 'botbuilder-dotnet';\n} else if (gitLogFromRepo.startsWith('js')) {\n    changelogFile = optionalOutputName || 'js.md';\n    repository = 'botbuilder-js';\n} else if (gitLogFromRepo.startsWith('python')) {\n    changelogFile = optionalOutputName || 'python.md';\n    repository = 'botbuilder-python';\n} else if (gitLogFromRepo.startsWith('java')) {\n    changelogFile = optionalOutputName || 'java.md';\n    repository = 'botbuilder-java';\n} else if (gitLogFromRepo.startsWith('bf-cli')) {\n    changelogFile = optionalOutputName || 'bf-cli.md';\n    repository = 'botframework-cli';\n}\n\n// git log --show-pulls --pretty=tformat:\"%s\" --since=2020-08-13 > dotnet.txt\n// git log --show-pulls --pretty=tformat:\"%s\" --since=2020-08-07 > js.txt\n// git log --show-pulls --pretty=tformat:\"%s\" --since=2020-08-10 > python.txt\n// git log --show-pulls --pretty=tformat:\"%s\" --since=2020-08-17 > java.txt\n// git log --show-pulls --pretty=tformat:\"%s\" --since=2020-08-10 > bf-cli.txt\n\nconst preparedStream = createWriteStream(changelogFile);\n(async function processLineByLine() {\n  try {\n    const rl = createInterface({\n      input: createReadStream(gitLogFromRepo),\n      crlfDelay: Infinity\n    });\n    \n    rl.on('line', (line) => {\n        // Check for squash merges first. This generates a bulletpoint that\n        // by default uses the title of the PR and appends the PR number to\n        // the end of the commit message.\n        // E.g. \"Fix fetch in token server used in E2E Streaming Test (#2944)\"\n        const matches = /(?<message>.*)\\s\\(#(?<num>\\d*)\\)$/gim.exec(line);\n        if (matches) {\n            const { message, num } = matches.groups;\n            preparedStream.write(`- ${message} [[PR ${num}]](https://github.com/microsoft/${repository}/pull/${num})\\n`);\n        } else {\n            // This second check is for PRs that were not squashed and merged.\n            // E.g. \"Merge pull request #1411 from <fork/branch>\"\n            const otherFormatMatches = /^(?<message>Merge pull request #(?<num>\\d*) from.*)/gim.exec(line);\n            if (otherFormatMatches) {\n                const { message, num } = otherFormatMatches.groups;\n                preparedStream.write(`- ${message} [[PR ${num}]](https://github.com/microsoft/${repository}/pull/${num})\\n`)\n            }\n        }\n    });\n\n    await once(rl, 'close');\n    console.log(`Changelog \"${changelogFile}\" created.`);\n  } catch (err) {\n    const errMsgPrefix = `An error occurred during the creation of the changelog.\nPlease file an issue in https://github.com/microsoft/botframework-sdk and provide the necessary reproduction steps.\\n`\n    console.error(errMsgPrefix);\n    console.error(err);\n    exit(1);\n  }\n})();\n"
  }
]