Full Code of Microsoft/slow-cheetah for AI

main 6e80afd1f24d cached
328 files
999.6 KB
243.6k tokens
297 symbols
1 requests
Download .txt
Showing preview only (1,092K chars total). Download the full file or copy to clipboard to get everything.
Repository: Microsoft/slow-cheetah
Branch: main
Commit: 6e80afd1f24d
Files: 328
Total size: 999.6 KB

Directory structure:
gitextract_7_2kiagc/

├── .azuredevops/
│   └── dependabot.yml
├── .config/
│   └── dotnet-tools.json
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── .editorconfig
│   ├── Prime-ForCopilot.ps1
│   ├── actions/
│   │   └── publish-artifacts/
│   │       └── action.yaml
│   ├── copilot-instructions.md
│   ├── renovate.json
│   ├── skills/
│   │   └── update-library-template/
│   │       ├── SKILL.md
│   │       └── template-release-notes.md
│   └── workflows/
│       ├── copilot-setup-steps.yml
│       ├── docs.yml
│       ├── docs_validate.yml
│       └── libtemplate-update.yml
├── .gitignore
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── mcp.json
│   ├── settings.json
│   └── tasks.json
├── .vsts-ci.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CodeQL.yml
├── Directory.Build.props
├── Directory.Build.rsp
├── Directory.Build.targets
├── Directory.Packages.props
├── LICENSE
├── README.md
├── Restore.cmd
├── SECURITY.md
├── SUPPORT.md
├── ThirdPartyNotices.txt
├── appveyor.yml
├── azure-pipelines/
│   ├── Archive-SourceCode.ps1
│   ├── BuildStageVariables.yml
│   ├── Get-InsertionPRId.ps1
│   ├── GlobalVariables.yml
│   ├── Merge-CodeCoverage.ps1
│   ├── NuGetSbom.props
│   ├── PoliCheckExclusions.xml
│   ├── PostPRMessage.ps1
│   ├── TSAOptions.json
│   ├── WIFtoPATauth.yml
│   ├── apiscan.yml
│   ├── archive-sourcecode.yml
│   ├── build.yml
│   ├── dotnet.yml
│   ├── falsepositives.gdnsuppress
│   ├── install-dependencies.yml
│   ├── libtemplate-update.yml
│   ├── microbuild.after.yml
│   ├── microbuild.before.yml
│   ├── no_authenticode.txt
│   ├── no_strongname.txt
│   ├── official.yml
│   ├── prepare-insertion-stages.yml
│   ├── publish-codecoverage.yml
│   ├── publish-symbols.yml
│   ├── publish_artifacts.ps1
│   ├── release-deployment-prep.yml
│   ├── release.yml
│   ├── unofficial.yml
│   ├── vs-insertion-script.ps1
│   ├── vs-insertion.yml
│   └── vs-validation.yml
├── azure-pipelines.yml
├── doc/
│   ├── targets.md
│   ├── transforming_files.md
│   └── update.md
├── docfx/
│   ├── .gitignore
│   ├── docfx.json
│   ├── docs/
│   │   ├── features.md
│   │   ├── getting-started.md
│   │   └── toc.yml
│   ├── index.md
│   └── toc.yml
├── global.json
├── init.cmd
├── init.ps1
├── nuget.config
├── samples/
│   ├── FSharpDemo/
│   │   ├── FSharpDemo.fsproj
│   │   ├── Program.fs
│   │   ├── app.Debug.config
│   │   ├── app.Release.config
│   │   └── app.config
│   ├── Linked-files/
│   │   ├── connectionStrings.Debug.config
│   │   ├── connectionStrings.Release.config
│   │   └── connectionStrings.config
│   ├── SlowCheetah.Samples.sln
│   ├── TransformSetupProject/
│   │   ├── .gitignore
│   │   └── TransformSetupProject.vdproj
│   ├── WebDemo/
│   │   ├── Default.aspx
│   │   ├── Default.aspx.cs
│   │   ├── Default.aspx.designer.cs
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── Web.Debug.config
│   │   ├── Web.Release.config
│   │   ├── Web.config
│   │   ├── WebDemo.csproj
│   │   ├── connectionStrings.Debug.config
│   │   ├── connectionStrings.Release.config
│   │   ├── connectionStrings.ToPkg.config
│   │   └── connectionStrings.config
│   ├── WindowsAzure1/
│   │   ├── ServiceConfiguration.Cloud.cscfg
│   │   ├── ServiceConfiguration.Local.cscfg
│   │   ├── ServiceDefinition.csdef
│   │   └── WindowsAzure1.ccproj
│   ├── WorkerRole1/
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── WorkerRole.cs
│   │   ├── WorkerRole1.csproj
│   │   ├── XMLFile1.xml
│   │   ├── app.Debug.config
│   │   ├── app.Release.config
│   │   ├── app.config
│   │   ├── contacts.Debug.xml
│   │   ├── contacts.Release.xml
│   │   ├── contacts.xml
│   │   └── packages.config
│   └── Wpf.Transform/
│       ├── App.xaml
│       ├── App.xaml.cs
│       ├── Assets/
│       │   └── BureauBlue.xaml
│       ├── MainWindow.xaml
│       ├── MainWindow.xaml.cs
│       ├── Properties/
│       │   ├── AssemblyInfo.cs
│       │   ├── Resources.Designer.cs
│       │   ├── Resources.resx
│       │   ├── Settings.Designer.cs
│       │   └── Settings.settings
│       ├── TransformModel.cs
│       ├── Wpf.Transform.csproj
│       ├── app.Debug.config
│       ├── app.Release.config
│       ├── app.config
│       ├── connectionStrings.Debug.config
│       ├── connectionStrings.Release.config
│       ├── connectionStrings.config
│       ├── contacts.Debug.xml
│       ├── contacts.Release.xml
│       └── contacts.xml
├── src/
│   ├── .editorconfig
│   ├── AssemblyInfo.cs
│   ├── AssemblyInfo.vb
│   ├── Directory.Build.props
│   ├── Directory.Build.targets
│   ├── Microsoft.VisualStudio.SlowCheetah/
│   │   ├── Build/
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.App.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.SetupProject.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.Web.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.targets
│   │   │   ├── TransformTask.cs
│   │   │   └── readme.txt
│   │   ├── Exceptions/
│   │   │   └── TransformFailedException.cs
│   │   ├── Logging/
│   │   │   ├── ITransformationLogger.cs
│   │   │   ├── JsonShimLogger.cs
│   │   │   ├── TransformationTaskLogger.cs
│   │   │   └── XmlShimLogger.cs
│   │   ├── Microsoft.VisualStudio.SlowCheetah.csproj
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── Resources/
│   │   │   ├── Resources.Designer.cs
│   │   │   └── Resources.resx
│   │   └── Transformer/
│   │       ├── ITransformer.cs
│   │       ├── JsonTransformer.cs
│   │       ├── TransformUtilities.cs
│   │       ├── TransformerFactory.cs
│   │       └── XmlTransformer.cs
│   ├── Microsoft.VisualStudio.SlowCheetah.Tests/
│   │   ├── App.config
│   │   ├── BaseTest.cs
│   │   ├── BuildTests/
│   │   │   ├── ConfigTransformTestsBase.cs
│   │   │   ├── ConsoleAppTests.cs
│   │   │   ├── TestProjects/
│   │   │   │   ├── ConsoleApp/
│   │   │   │   │   ├── App.Debug.config
│   │   │   │   │   ├── App.Release.config
│   │   │   │   │   ├── App.config
│   │   │   │   │   ├── ConsoleApp.csproj
│   │   │   │   │   ├── Other.Debug.config
│   │   │   │   │   ├── Other.Release.config
│   │   │   │   │   ├── Other.config
│   │   │   │   │   ├── Program.cs
│   │   │   │   │   └── Properties/
│   │   │   │   │       └── AssemblyInfo.cs
│   │   │   │   ├── Directory.Build.props
│   │   │   │   ├── Directory.Build.targets
│   │   │   │   └── WebApplication/
│   │   │   │       ├── Other.Debug.config
│   │   │   │       ├── Other.Release.config
│   │   │   │       ├── Other.config
│   │   │   │       ├── Properties/
│   │   │   │       │   └── AssemblyInfo.cs
│   │   │   │       ├── Web.Debug.config
│   │   │   │       ├── Web.Release.config
│   │   │   │       ├── Web.config
│   │   │   │       └── WebApplication.csproj
│   │   │   └── WebAppTests.cs
│   │   ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj
│   │   ├── TestUtilities.cs
│   │   ├── TransformTest.cs
│   │   └── example.txt
│   ├── Microsoft.VisualStudio.SlowCheetah.VS/
│   │   ├── Directory.Build.targets
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.csproj
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.pkgdef
│   │   ├── NugetHandler/
│   │   │   ├── PackageHandlers/
│   │   │   │   ├── BackgroundInstallationHandler.cs
│   │   │   │   ├── BasePackageHandler.cs
│   │   │   │   ├── DialogInstallationHandler.cs
│   │   │   │   ├── EmptyHandler.cs
│   │   │   │   ├── IPackageHandler.cs
│   │   │   │   ├── NuGetUninstaller.cs
│   │   │   │   ├── NugetInstaller.cs
│   │   │   │   ├── TargetsUninstaller.cs
│   │   │   │   └── UserInstallationHandler.cs
│   │   │   ├── SlowCheetahNuGetManager.cs
│   │   │   └── VsProjectTypes.cs
│   │   ├── Options/
│   │   │   ├── AdvancedOptionsDialogPage.cs
│   │   │   ├── AdvancedOptionsUserControl.Designer.cs
│   │   │   ├── AdvancedOptionsUserControl.cs
│   │   │   ├── AdvancedOptionsUserControl.resx
│   │   │   ├── BaseOptionsDialogPage.cs
│   │   │   ├── OptionsDialogPage.cs
│   │   │   ├── OptionsUserControl.Designer.cs
│   │   │   ├── OptionsUserControl.cs
│   │   │   └── OptionsUserControl.resx
│   │   ├── Package/
│   │   │   ├── AddTransformCommand.cs
│   │   │   ├── BaseCommand.cs
│   │   │   ├── PackageSolutionEvents.cs
│   │   │   ├── PreviewTransformCommand.cs
│   │   │   └── SlowCheetahPackageLogger.cs
│   │   ├── Resources/
│   │   │   ├── Guids.cs
│   │   │   ├── PkgCmdID.cs
│   │   │   ├── Resources.Designer.cs
│   │   │   └── Resources.resx
│   │   ├── SlowCheetah.vsct
│   │   ├── SlowCheetahPackage.cs
│   │   ├── TransformationPreviewLogger.cs
│   │   ├── Utilities/
│   │   │   ├── PackageUtilities.cs
│   │   │   └── ProjectUtilities.cs
│   │   ├── VSPackage.Designer.cs
│   │   ├── VSPackage.resx
│   │   └── source.extension.vsixmanifest
│   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/
│   │   ├── App.config
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj
│   │   ├── PackageUtilitiesTest.cs
│   │   └── xunit.runner.json
│   ├── Microsoft.VisualStudio.SlowCheetah.Vsix/
│   │   └── Microsoft.VisualStudio.SlowCheetah.Vsix.csproj
│   ├── OptProf.targets
│   ├── SlowCheetah.sln
│   └── build/
│       ├── no_authenticode.txt
│       └── no_strongname.txt
├── stylecop.json
├── test/
│   ├── .editorconfig
│   ├── Directory.Build.props
│   ├── Directory.Build.targets
│   ├── Microsoft.VisualStudio.SlowCheetah.Tests/
│   │   ├── App.config
│   │   ├── BaseTest.cs
│   │   ├── BuildTests/
│   │   │   ├── ConfigTransformTestsBase.cs
│   │   │   ├── ConsoleAppTests.cs
│   │   │   ├── TestProjects/
│   │   │   │   ├── ConsoleApp/
│   │   │   │   │   ├── App.Debug.config
│   │   │   │   │   ├── App.Release.config
│   │   │   │   │   ├── App.config
│   │   │   │   │   ├── ConsoleApp.csproj
│   │   │   │   │   ├── Other.Debug.config
│   │   │   │   │   ├── Other.Release.config
│   │   │   │   │   ├── Other.config
│   │   │   │   │   ├── Program.cs
│   │   │   │   │   └── Properties/
│   │   │   │   │       └── AssemblyInfo.cs
│   │   │   │   ├── Directory.Build.props
│   │   │   │   ├── Directory.Build.targets
│   │   │   │   └── WebApplication/
│   │   │   │       ├── Other.Debug.config
│   │   │   │       ├── Other.Release.config
│   │   │   │       ├── Other.config
│   │   │   │       ├── Web.Debug.config
│   │   │   │       ├── Web.Release.config
│   │   │   │       ├── Web.config
│   │   │   │       └── WebApplication.csproj
│   │   │   └── WebAppTests.cs
│   │   ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj
│   │   ├── TestUtilities.cs
│   │   ├── TransformTest.cs
│   │   └── example.txt
│   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/
│   │   ├── App.config
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj
│   │   └── PackageUtilitiesTest.cs
│   └── dirs.proj
├── tools/
│   ├── Check-DotNetRuntime.ps1
│   ├── Check-DotNetSdk.ps1
│   ├── Convert-PDB.ps1
│   ├── Download-NuGetPackage.ps1
│   ├── Get-ArtifactsStagingDirectory.ps1
│   ├── Get-CodeCovTool.ps1
│   ├── Get-ExternalSymbolFiles.ps1
│   ├── Get-LibTemplateBasis.ps1
│   ├── Get-NuGetTool.ps1
│   ├── Get-ProcDump.ps1
│   ├── Get-SymbolFiles.ps1
│   ├── Get-TempToolsPath.ps1
│   ├── Install-DotNetSdk.ps1
│   ├── Install-NuGetCredProvider.ps1
│   ├── Install-NuGetPackage.ps1
│   ├── MergeFrom-Template.ps1
│   ├── Prepare-Legacy-Symbols.ps1
│   ├── Set-EnvVars.ps1
│   ├── artifacts/
│   │   ├── APIScanInputs.ps1
│   │   ├── LocBin.ps1
│   │   ├── VSInsertion.ps1
│   │   ├── Variables.ps1
│   │   ├── _all.ps1
│   │   ├── _stage_all.ps1
│   │   ├── build_logs.ps1
│   │   ├── coverageResults.ps1
│   │   ├── deployables.ps1
│   │   ├── projectAssetsJson.ps1
│   │   ├── symbols.ps1
│   │   ├── testResults.ps1
│   │   └── test_symbols.ps1
│   ├── dotnet-test-cloud.ps1
│   ├── publish-CodeCov.ps1
│   ├── test.runsettings
│   └── variables/
│       ├── BusinessGroupName.ps1
│       ├── DotNetSdkVersion.ps1
│       ├── InsertJsonValues.ps1
│       ├── InsertPropsValues.ps1
│       ├── InsertTargetBranch.ps1
│       ├── InsertVersionsValues.ps1
│       ├── LocLanguages.ps1
│       ├── ProfilingInputsDropName.ps1
│       ├── ProfilingInputsPropsName.ps1
│       ├── SymbolsFeatureName.ps1
│       ├── VstsDropNames.ps1
│       ├── _all.ps1
│       └── _define.ps1
└── version.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .azuredevops/dependabot.yml
================================================
# Please see the documentation for all configuration options:
# https://eng.ms/docs/products/dependabot/configuration/version_updates

version: 2
updates:
- package-ecosystem: nuget
  directory: /
  schedule:
    interval: monthly


================================================
FILE: .config/dotnet-tools.json
================================================
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "powershell": {
      "version": "7.6.1",
      "commands": [
        "pwsh"
      ],
      "rollForward": false
    },
    "dotnet-coverage": {
      "version": "18.6.2",
      "commands": [
        "dotnet-coverage"
      ],
      "rollForward": false
    },
    "nbgv": {
      "version": "3.9.50",
      "commands": [
        "nbgv"
      ],
      "rollForward": false
    },
    "docfx": {
      "version": "2.78.5",
      "commands": [
        "docfx"
      ],
      "rollForward": false
    },
    "nerdbank.dotnetrepotools": {
      "version": "1.3.22",
      "commands": [
        "repo"
      ],
      "rollForward": false
    },
    "dotnet-symbol": {
      "version": "9.0.661903",
      "commands": [
        "dotnet-symbol"
      ],
      "rollForward": false
    }
  }
}


================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome:http://EditorConfig.org

# top-most EditorConfig file
root = true

# Don't use tabs for indentation.
[*]
indent_style = space

# (Please don't specify an indent_size here; that has too many unintended consequences.)

[*.yml]
indent_size = 2
indent_style = space

# Code files
[*.{cs,csx,vb,vbx,h,cpp,idl}]
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true

# MSBuild project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj,msbuildproj,props,targets}]
indent_size = 2

# Xml config files
[*.{ruleset,config,nuspec,resx,vsixmanifest,vsct,runsettings}]
indent_size = 2
indent_style = space

# JSON files
[*.json]
indent_size = 2
indent_style = space

[*.ps1]
indent_style = space
indent_size = 4

# Dotnet code style settings:
[*.{cs,vb}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false
dotnet_style_qualification_for_field = true:warning
dotnet_style_qualification_for_property = true:warning
dotnet_style_qualification_for_method = true:warning
dotnet_style_qualification_for_event = true:warning

# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion

# Suggest more modern language features when available
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion

# Non-private static fields are PascalCase
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style

dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field
dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected internal, private protected
dotnet_naming_symbols.non_private_static_fields.required_modifiers = static

dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case

# Constants are PascalCase
dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants
dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style

dotnet_naming_symbols.constants.applicable_kinds = field, local
dotnet_naming_symbols.constants.required_modifiers = const

dotnet_naming_style.constant_style.capitalization = pascal_case

# Static fields are camelCase
dotnet_naming_rule.static_fields_should_be_camel_case.severity = suggestion
dotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields
dotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style

dotnet_naming_symbols.static_fields.applicable_kinds = field
dotnet_naming_symbols.static_fields.required_modifiers = static

dotnet_naming_style.static_field_style.capitalization = camel_case

# Instance fields are camelCase
dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion
dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields
dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style

dotnet_naming_symbols.instance_fields.applicable_kinds = field

dotnet_naming_style.instance_field_style.capitalization = camel_case

# Locals and parameters are camelCase
dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion
dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters
dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style

dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local

dotnet_naming_style.camel_case_style.capitalization = camel_case

# Local functions are PascalCase
dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions
dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style

dotnet_naming_symbols.local_functions.applicable_kinds = local_function

dotnet_naming_style.local_function_style.capitalization = pascal_case

# By default, name items with PascalCase
dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members
dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style

dotnet_naming_symbols.all_members.applicable_kinds = *

dotnet_naming_style.pascal_case_style.capitalization = pascal_case

# CSharp code style settings:
[*.cs]
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left

# Prefer "var" everywhere
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:warning

# Prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods = false:none
csharp_style_expression_bodied_constructors = false:none
csharp_style_expression_bodied_operators = false:none

# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none

# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion

# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true

# Blocks are allowed
csharp_prefer_braces = true:silent

# SA1130: Use lambda syntax
dotnet_diagnostic.SA1130.severity = silent

# IDE1006: Naming Styles - StyleCop handles these for us
dotnet_diagnostic.IDE1006.severity = none

dotnet_diagnostic.DOC100.severity = silent
dotnet_diagnostic.DOC104.severity = warning
dotnet_diagnostic.DOC105.severity = warning
dotnet_diagnostic.DOC106.severity = warning
dotnet_diagnostic.DOC107.severity = warning
dotnet_diagnostic.DOC108.severity = warning
dotnet_diagnostic.DOC200.severity = warning
dotnet_diagnostic.DOC202.severity = warning

# CA1062: Validate arguments of public methods
dotnet_diagnostic.CA1062.severity = warning

# CA2016: Forward the CancellationToken parameter
dotnet_diagnostic.CA2016.severity = warning

[*.sln]
indent_style = tab


================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

# Ensure shell scripts use LF line endings (linux only accepts LF)
*.sh eol=lf
*.ps1 eol=lf

# The macOS codesign tool is extremely picky, and requires LF line endings.
*.plist eol=lf

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain


================================================
FILE: .github/.editorconfig
================================================
[renovate.json*]
indent_style = tab


================================================
FILE: .github/Prime-ForCopilot.ps1
================================================
if ((git -C $PSScriptRoot rev-parse --is-shallow-repository) -eq 'true')
{
    Write-Host "Shallow clone detected, disabling NBGV Git engine so the build can succeed."
    $env:NBGV_GitEngine='Disabled'
}


================================================
FILE: .github/actions/publish-artifacts/action.yaml
================================================
name: Publish artifacts
description: Publish artifacts

runs:
  using: composite
  steps:
  - name: 📥 Collect artifacts
    run: tools/artifacts/_stage_all.ps1
    shell: pwsh
    if: always()

# TODO: replace this hard-coded list with a loop that utilizes the NPM package at
# https://github.com/actions/toolkit/tree/main/packages/artifact (or similar) to push the artifacts.

  - name: 📢 Upload project.assets.json files
    if: always()
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: projectAssetsJson-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/projectAssetsJson
    continue-on-error: true
  - name: 📢 Upload variables
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: variables-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/Variables
    continue-on-error: true
  - name: 📢 Upload build_logs
    if: always()
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: build_logs-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/build_logs
    continue-on-error: true
  - name: 📢 Upload testResults
    if: always()
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: testResults-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/testResults
    continue-on-error: true
  - name: 📢 Upload coverageResults
    if: always()
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: coverageResults-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/coverageResults
    continue-on-error: true
  - name: 📢 Upload symbols
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: symbols-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/symbols
    continue-on-error: true
  - name: 📢 Upload deployables
    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
    with:
      name: deployables-${{ runner.os }}
      path: ${{ runner.temp }}/_artifacts/deployables
    if: always()


================================================
FILE: .github/copilot-instructions.md
================================================
# Copilot instructions for this repository

## High level guidance

* Review the `CONTRIBUTING.md` file for instructions to build and test the software.
* Run the `.github/Prime-ForCopilot.ps1` script (once) before running any `dotnet` or `msbuild` commands.
  If you see any build errors about not finding git objects or a shallow clone, it may be time to run this script again.

## Software Design

* Design APIs to be highly testable, and all functionality should be tested.
* Avoid introducing binary breaking changes in public APIs of projects under `src` unless their project files have `IsPackable` set to `false`.

## Testing

**IMPORTANT**: This repository uses Microsoft.Testing.Platform (MTP v2) with xunit v3. Traditional `--filter` syntax does NOT work. Use the options below instead.

* There should generally be one test project (under the `test` directory) per shipping project (under the `src` directory). Test projects are named after the project being tested with a `.Tests` suffix.
* Tests use xunit v3 with Microsoft.Testing.Platform (MTP v2). Traditional VSTest `--filter` syntax does NOT work.
* Some tests are known to be unstable. When running tests, you should skip the unstable ones by using `-- --filter-not-trait "FailsInCloudTest=true"`.

### Running Tests

**Run all tests**:
```bash
dotnet test --no-build -c Release
```

**Run tests for a specific test project**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release
```

**Run a single test method**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method ClassName.MethodName
```

**Run all tests in a test class**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-class ClassName
```

**Run tests with wildcard matching** (supports wildcards at beginning and/or end):
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method "*Pattern*"
```

**Run tests with a specific trait** (equivalent to category filtering):
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-trait "TraitName=value"
```

**Exclude tests with a specific trait** (skip unstable tests):
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-not-trait "TestCategory=FailsInCloudTest"
```

**Run tests for a specific framework only**:
```bash
dotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release --framework net9.0
```

**List all available tests without running them**:
```bash
cd test/Library.Tests
dotnet run --no-build -c Release --framework net9.0 -- --list-tests
```

**Key points about test filtering with MTP v2 / xunit v3**:
- Options after `--` are passed to the test runner, not to `dotnet test`
- Use `--filter-method`, `--filter-class`, `--filter-namespace` for simple filtering
- Use `--filter-trait` and `--filter-not-trait` for trait-based filtering (replaces `--filter "TestCategory=..."`)
- Traditional VSTest `--filter` expressions do NOT work
- Wildcards `*` are supported at the beginning and/or end of filter values
- Multiple simple filters of the same type use OR logic, different types combine with AND
- See `--help` for query filter language for advanced scenarios

## Coding style

* Honor StyleCop rules and fix any reported build warnings *after* getting tests to pass.
* In C# files, use namespace *statements* instead of namespace *blocks* for all new files.
* Add API doc comments to all new public and internal members.


================================================
FILE: .github/renovate.json
================================================
{
	"$schema": "https://docs.renovatebot.com/renovate-schema.json",
	"extends": [
		"github>microsoft/vs-renovate-presets:microbuild",
		"github>microsoft/vs-renovate-presets:vs_main_dependencies"
	],
	"packageRules": []
}


================================================
FILE: .github/skills/update-library-template/SKILL.md
================================================
---
name: update-library-template
description: Merges the latest Library.Template into this repo (at position of HEAD) and resolves conflicts.
disable-model-invocation: true
---

# Instructions

1. Run `./tools/MergeFrom-Template.ps1` from the repo root.
2. Resolve merge conflicts, taking into account conflict resolution policy below.
3. Validate the changes, as described in the validation section below.
4. Committing your changes (if applicable).

## Conflict resolution policy

There may be [special notes](template-release-notes.md) that describe special considerations for certain files or scenarios to help you resolve conflicts appropriately.
Always refer to that file before proceeding.
In particular, focus on the *incoming* part of the file, since it represents the changes from the Library.Template that you are merging into your repo.

Also consider that some repos choose to reject certain Library.Template patterns.
For example the template uses MTPv2 for test projects, but a repo might have chosen not to adopt that.
When resolving merge conflicts, consider whether it looks like the relevant code file is older than it should be given the changes the template is bringing in.
Ask the user when in doubt as to whether the conflict should be resolved in favor of 'catching up' with the template or keeping the current changes.

Use #runSubagent to analyze and resolve merge conflicts across files in parallel.

### Keep Current files

Conflicts in the following files should always be resolved by keeping the current version (i.e. discard incoming changes):

* README.md

### Deleted files

Very typically, when the incoming change is to a file that was deleted locally, the correct resolution is to re-delete the file.

In some cases however, the deleted file may have incoming changes that should be applied to other files.
The `test/Library.Tests/Library.Tests.csproj` file is very typical of this.
Changes to this file should very typically be applied to any and all test projects in the repo.
You are responsible for doing this in addition to re-deleting this template file.

## Updating package and SDK versions

After the merge, always check global.json for MSBuild Sdks with names starting with `Microsoft.VisualStudio.Internal.MicroBuild`.
These SDK versions should match the value of the `MicroBuildVersion` property found in `Directory.Packages.props`.
Always take the latest of the versions you see among these SDKs and the `MicroBuildVersion` property.

## Validation

Validate the merge result (after resolving any conflicts, if applicable).
Use #runSubagent for each step.

1. Verify that `dotnet restore` succeeds. Fix any issues that come up.
2. Verify that `dotnet build` succeeds.
3. Verify that tests succeed by running `tools/dotnet-test-cloud.ps1`.

While these validations are described using `dotnet` CLI commands, some repos require using full msbuild.exe.
You can detect this by checking the `azure-pipelines/dotnet.yml` or `.github/workflows/build.yml` files for use of one or the other tool.

You are *not* responsible for fixing issues that the merge did not cause.
If validation fails for reasons that seem unrelated to the changes brought in by the merge, advise the user and ask how they'd like you to proceed.
That said, sometimes merges will bring in SDK or dependency updates that can cause breaks in seemingly unrelated areas.
In such cases, you should investigate and solve the issues as needed.

## Committing your changes

If you have to make any changes for validations to pass, consider whether they qualify as a bad merge conflict resolution or more of a novel change that you're making to work with the Library.Template update.
Merge conflict resolution fixes ideally get amended into the merge commit, while novel changes would go into a novel commit after the merge commit.

Always author your commits using `git commit --author "🤖 Copilot <no-reply@github.com>"` (and possibly other parameters).
Describe the nature of the merge conflicts you encountered and how you resolved them in your commit message.

Later, if asked to review pull request validation breaks, always author a fresh commit with each fix that you push, unless the user directs you to do otherwise.


================================================
FILE: .github/skills/update-library-template/template-release-notes.md
================================================
# Template release notes

This file will describe significant changes in Library.Template as they are introduced, especially if they require special consideration when merging updates into existing repos.
This file is referenced by update-library-template.prompt.md and should remain in place to facilitate future merges, whether done manually or by AI.

## Solution rename

Never leave a Library.slnx file in the repository.
You might even see one there even though this particular merge didn't bring it in.
This can be an artifact of having renamed Library.sln to Library.slnx in the template repo, but ultimately the receiving repo should have only one .sln or .slnx file, with a better name than `Library`.
Delete any `Library.slnx` that you see.
Migrate an `.sln` in the repo root to `.slnx` using this command:

```ps1
dotnet solution EXISTING.sln migrate
```

This will create an EXISTING.slnx file. `git add` that file, then `git rm` the old `.sln` file.
Sometimes a repo will reference the sln filename in a script or doc somewhere.
Search the repo for such references and update them to the slnx file.


================================================
FILE: .github/workflows/copilot-setup-steps.yml
================================================
name: 💪🏼 Copilot Setup Steps

# Automatically run the setup steps when they are changed to allow for easy validation, and
# allow manual testing through the repository's "Actions" tab
on:
  workflow_dispatch:
  push:
    branches:
    - main
    paths:
    - .github/workflows/copilot-setup-steps.yml
  pull_request:
    paths:
    - .github/workflows/copilot-setup-steps.yml

jobs:
  # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
  copilot-setup-steps:
    runs-on: ubuntu-latest
    # Set the permissions to the lowest permissions possible needed for your steps.
    # Copilot will be given its own token for its operations.
    permissions:
      # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
      contents: read

    # You can define any steps you want, and they will run before the agent starts.
    # If you do not check out your code, Copilot will do this for you.
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
    - name: ⚙ Install prerequisites
      run: |
        ./init.ps1 -UpgradePrerequisites -NoNuGetCredProvider
        dotnet --info

        # Print mono version if it is present.
        if (Get-Command mono -ErrorAction SilentlyContinue) {
          mono --version
        }
      shell: pwsh


================================================
FILE: .github/workflows/docs.yml
================================================
name: 📚 Docs

on:
  push:
    branches:
    - main

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: pages
  cancel-in-progress: false

jobs:
  publish-docs:
    # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
    permissions:
      actions: read
      pages: write
      id-token: write
      contents: read
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
    - name: ⚙ Install prerequisites
      run: ./init.ps1 -UpgradePrerequisites

    - run: dotnet docfx docfx/docfx.json
      name: 📚 Generate documentation

    - name: Upload artifact
      uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
      with:
        path: docfx/_site

    - name: Deploy to GitHub Pages
      id: deployment
      uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0


================================================
FILE: .github/workflows/docs_validate.yml
================================================
name: 📃 Docfx Validate

on:
  push:
    branches:
    - main
    - microbuild
  workflow_dispatch:

jobs:
  build:
    name: 📚 Doc validation
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.
    - name: 🔗 Markup Link Checker (mlc)
      uses: becheran/mlc@7ec24825cefe0c9c8c6bac48430e1f69e3ec356e # v1.2.0
      with:
        args: --do-not-warn-for-redirect-to https://learn.microsoft.com*,https://dotnet.microsoft.com/*,https://dev.azure.com/*,https://app.codecov.io/* -p docfx -i https://aka.ms/onboardsupport,https://aka.ms/spot,https://msrc.microsoft.com/*,https://www.microsoft.com/msrc*,https://microsoft.com/msrc*,https://www.npmjs.com/package/*,https://get.dot.net/
    - name: ⚙ Install prerequisites
      run: |
        ./init.ps1 -UpgradePrerequisites
        dotnet --info
      shell: pwsh
    - name: 📚 Verify docfx build
      run: dotnet docfx docfx/docfx.json --warningsAsErrors --disableGitFeatures


================================================
FILE: .github/workflows/libtemplate-update.yml
================================================
name: ⛜ Library.Template update

# PREREQUISITE: This workflow requires the repo to be configured to allow workflows to create pull requests.
# Visit https://github.com/USER/REPO/settings/actions
# Under "Workflow permissions" check "Allow GitHub Actions to create ...pull requests"
# Click Save.

on:
  schedule:
  - cron: "0 3 * * Mon" # Sun @ 8 or 9 PM Mountain Time (depending on DST)
  workflow_dispatch:

jobs:
  merge:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.

    - name: merge
      id: merge
      shell: pwsh
      run: |
        $LibTemplateBranch = & ./tools/Get-LibTemplateBasis.ps1 -ErrorIfNotRelated
        if ($LASTEXITCODE -ne 0) {
          exit $LASTEXITCODE
        }

        git fetch https://github.com/aarnott/Library.Template $LibTemplateBranch
        if ($LASTEXITCODE -ne 0) {
          exit $LASTEXITCODE
        }
        $LibTemplateCommit = git rev-parse FETCH_HEAD
        git diff --stat ...FETCH_HEAD

        if ((git rev-list FETCH_HEAD ^HEAD --count) -eq 0) {
          Write-Host "There are no Library.Template updates to merge."
          echo "uptodate=true" >> $env:GITHUB_OUTPUT
          exit 0
        }

        # Pushing commits that add or change files under .github/workflows will cause our workflow to fail.
        # But it usually isn't necessary because the target branch already has (or doesn't have) these changes.
        # So if the merge doesn't bring in any changes to these files, try the merge locally and push that
        # to keep github happy.
        if ((git rev-list FETCH_HEAD ^HEAD --count -- .github/workflows) -eq 0) {
          # Indeed there are no changes in that area. So merge locally to try to appease GitHub.
          git checkout -b auto/libtemplateUpdate
          git config user.name "Andrew Arnott"
          git config user.email "andrewarnott@live.com"
          git merge FETCH_HEAD
          if ($LASTEXITCODE -ne 0) {
            Write-Host "Merge conflicts prevent creating the pull request. Please run tools/MergeFrom-Template.ps1 locally and push the result as a pull request."
            exit 2
          }

          git -c http.extraheader="AUTHORIZATION: bearer $env:GH_TOKEN" push origin -u HEAD
        } else {
          Write-Host "Changes to github workflows are included in this update. Please run tools/MergeFrom-Template.ps1 locally and push the result as a pull request."
          exit 1
        }
    - name: pull request
      shell: pwsh
      if: success() && steps.merge.outputs.uptodate != 'true'
      run: |
        # If there is already an active pull request, don't create a new one.
        $existingPR = gh pr list -H auto/libtemplateUpdate --json url | ConvertFrom-Json
        if ($existingPR) {
          Write-Host "::warning::Skipping pull request creation because one already exists at $($existingPR[0].url)"
          exit 0
        }

        $prTitle = "Merge latest Library.Template"
        $prBody = "This merges the latest features and fixes from [Library.Template's  branch](https://github.com/AArnott/Library.Template/tree/).

        ⚠️ Do **not** squash this pull request when completing it. You must *merge* it.

        <details>
        <summary>Merge conflicts?</summary>
        Resolve merge conflicts locally by carrying out these steps:

        ```
        git fetch
        git checkout auto/libtemplateUpdate
        git merge origin/main
        # resolve conflicts
        git commit
        git push
        ```
        </details>"

        gh pr create -H auto/libtemplateUpdate -b $prBody -t $prTitle
      env:
        GH_TOKEN: ${{ github.token }}


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
*.lutconfig
launchSettings.json

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Jetbrains Rider cache directory
.idea/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
!Directory.Build.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml
/coveragereport/

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# dotnet tool local install directory
.store/

# mac-created file to track user view preferences for a directory
.DS_Store

# Analysis results
*.sarif

# C# Dev Kit cache files
*.lscache


================================================
FILE: .vscode/extensions.json
================================================
{
  // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
  // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
  // List of extensions which should be recommended for users of this workspace.
  "recommendations": [
    "ms-azure-devops.azure-pipelines",
    "ms-dotnettools.csharp",
    "k--kato.docomment",
    "editorconfig.editorconfig",
    "esbenp.prettier-vscode",
    "pflannery.vscode-versionlens",
    "davidanson.vscode-markdownlint",
    "dotjoshjohnson.xml",
    "ms-vscode-remote.remote-containers",
    "ms-azuretools.vscode-docker",
    "tintoy.msbuild-project-tools"
  ],
  // List of extensions recommended by VS Code that should not be recommended for users of this workspace.
  "unwantedRecommendations": []
}


================================================
FILE: .vscode/launch.json
================================================
{
   // Use IntelliSense to find out which attributes exist for C# debugging
   // Use hover for the description of the existing attributes
   // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
   "version": "0.2.0",
   "configurations": [
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}


================================================
FILE: .vscode/mcp.json
================================================
{
    "servers": {
        "github": {
            "type": "http",
            "url": "https://api.githubcopilot.com/mcp/"
        },
        "azure-devops": {
            "type": "http",
            "url": "https://mcp.dev.azure.com/devdiv",
            "headers": {
                "X-MCP-Toolsets": "repos,pipelines,wit,wiki"
            }
        },
        "microsoftdocs": {
            "type": "http",
            "url": "https://learn.microsoft.com/api/mcp"
        }
    }
}


================================================
FILE: .vscode/settings.json
================================================
{
  "files.trimTrailingWhitespace": true,
  "files.insertFinalNewline": true,
  "files.trimFinalNewlines": true,
  "azure-pipelines.1ESPipelineTemplatesSchemaFile": true,
  "omnisharp.enableEditorConfigSupport": true,
  "omnisharp.enableRoslynAnalyzers": true,
  "dotnet.completion.showCompletionItemsFromUnimportedNamespaces": true,
  "editor.formatOnSave": true,
  "[xml]": {
    "editor.wordWrap": "off"
  },
  // Treat these files as Azure Pipelines files
  "files.associations": {
    "**/azure-pipelines/**/*.yml": "azure-pipelines",
    "azure-pipelines.yml": "azure-pipelines"
  },
  // Use Prettier as the default formatter for Azure Pipelines files.
  // Needs to be explicitly configured: https://github.com/Microsoft/azure-pipelines-vscode#document-formatting
  "[azure-pipelines]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": false // enable this when they conform
  },
}


================================================
FILE: .vscode/tasks.json
================================================
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        }
    ]
}


================================================
FILE: .vsts-ci.yml
================================================
trigger:
  branches:
    include:
    - main
  paths:
    exclude:
    - .github
    - doc
    - '*.md'
schedules:
- cron: "0 10 * * Sun"
  displayName: Weekly api-scan
  always: true
  branches:
    include:
    - main
parameters:
- name: RunApiScanTools
  displayName: Run API Scan?
  type: boolean
  default: false
variables:
  NugetSecurityAnalysisWarningLevel: none
  ${{ if or(eq(parameters.RunApiScanTools, 'true'), eq(variables['Build.CronSchedule.DisplayName'], 'Weekly api-scan')) }}:
    RunAPIScan: true
  ${{ else }}:
    RunAPIScan: false
  Codeql.Enabled: true
  Codeql.TSAEnabled: true
  Codeql.TSAOptionsPath: $(Build.SourcesDirectory)\azure-pipelines\TSAOptions.json

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release
extends:
  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool:
        name: VSEngSS-MicroBuild2022-1ES
        image: server2022-microbuildVS2022-1es

    pool:
      name: VSEngSS-MicroBuild2022-1ES
      image: server2022-microbuildVS2022-1es
      os: windows
    customBuildTags:
    - ES365AIMigrationTooling
    stages:
    - stage: stage
      jobs:
      - job: job
        templateContext:
          mb:
            signing:
              enabled: true
              signType: $(SignType)
              zipSources: false
          outputs:
          - output: pipelineArtifact
            displayName: 'Publish Artifact: build logs'
            condition: succeededOrFailed()
            targetPath: $(Build.ArtifactStagingDirectory)/build_logs
            artifactName: build_logs
            artifactType: Container
          - output: pipelineArtifact
            displayName: 'Publish Artifact: symbols'
            condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
            targetPath: '$(Build.ArtifactStagingDirectory)/symbols'
            artifactName: symbols
            publishLocation: Container
          - output: pipelineArtifact
            displayName: 'Publish packages'
            condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
            targetPath: $(Build.ArtifactStagingDirectory)/packages
            artifactName: packages
            artifactType: Container
          - output: nuget
            displayName: 'Publish Sdk NuGet packages to VSTS feeds'
            condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
            packageParentPath: '$(Build.ArtifactStagingDirectory)'
            searchPatternPush: 'bin/$(BuildConfiguration)/packages/*.nupkg'
            publishVstsFeed: $(feedGuid)
            allowPackageConflicts: true
        steps:
        - task: ComponentGovernanceComponentDetection@0
          inputs:
            scanType: 'Register'
            verbosity: 'Verbose'
            alertWarningLevel: 'High'
        - task: PowerShell@2
          displayName: Set VSTS variables
          inputs:
            targetType: inline
            script: |
              if ($env:SignType -eq 'Real') {
                $feedGuid = '09d8d03c-1ac8-456e-9274-4d2364527d99' ## VSIDE-RealSigned-Release
              } else {
                $feedGuid = 'da484c78-f942-44ef-b197-99e2a1bef53c' ## VSIDE-TestSigned-Release
              }
              Write-Host "##vso[task.setvariable variable=feedGuid]$feedGuid"
              $SkipPublishingNetworkArtifacts = 'true' ## Network artifacts not allowed on Scale Set Pool
              Write-Host "##vso[task.setvariable variable=SkipPublishingNetworkArtifacts]$SkipPublishingNetworkArtifacts"
              if ($env:ComputerName.StartsWith('factoryvm', [StringComparison]::OrdinalIgnoreCase)) {
                Write-Host "Running on hosted queue"
                Write-Host "##vso[task.setvariable variable=Hosted]true"
              }
        - task: CmdLine@2
          inputs:
            script: |
              del /s /q "bin"
          displayName: Purge bin
        - task: NuGetToolInstaller@0
          displayName: Pin nuget.exe version
          inputs:
            versionSpec: 6.4.0
        - task: AntiMalware@4
          displayName: 'Run MpCmdRun.exe'
          inputs:
            InputType: Basic
            ScanType: CustomScan
            FileDirPath: '$(Build.StagingDirectory)'
            DisableRemediation: false
        - task: NuGetAuthenticate@1
          displayName: 'NuGet Authenticate'
          inputs:
            forceReinstallCredentialProvider: true
        - task: VSBuild@1
          inputs:
            solution: 'src\SlowCheetah.sln'
            msbuildArgs: /t:Restore
            platform: $(BuildPlatform)
            configuration: $(BuildConfiguration)
          displayName: Restore SlowCheetah solution
        - task: VSBuild@1
          inputs:
            solution: 'src\SlowCheetah.sln'
            msbuildArgs: '/bl:"$(Build.ArtifactStagingDirectory)/build_logs/slowcheetah.binlog"'
            platform: $(BuildPlatform)
            configuration: $(BuildConfiguration)
          displayName: Build SlowCheetah solution
        - task: MicroBuildCodesignVerify@3
          inputs:
            TargetFolders: |
              $(Build.SourcesDirectory)\bin\$(BuildConfiguration)\packages
            ApprovalListPathForCerts: $(Build.SourcesDirectory)\src\build\no_authenticode.txt
            ApprovalListPathForSigs: $(Build.SourcesDirectory)\src\build\no_strongname.txt
          displayName: Verify code signing
          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
        - task: VSTest@2
          inputs:
            testFiltercriteria: TestCategory!=FailsInCloudTest
            searchFolder: $(System.DefaultWorkingDirectory)\bin\
            testAssemblyVer2: |
              $(BuildConfiguration)\**\*test*.dll
              !**\obj\**
            platform: $(BuildPlatform)
            configuration: $(BuildConfiguration)
          displayName: Run Tests
          condition: and(succeeded(), ne(variables['SignType'], 'real'))
        - task: PoliCheck@2
          displayName: 'Run PoliCheck'
          inputs:
            targetType: F
          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
        - task: ManifestGeneratorTask@0
          inputs:
            BuildDropPath: $(Build.ArtifactStagingDirectory)/build_logs
        - task: BinSkim@4
          displayName: Run BinSkim
          inputs:
            InputType: 'Basic'
            Function: 'analyze'
            TargetPattern: 'guardianGlob'
            AnalyzeTargetGlob: 'bin/$(BuildConfiguration)/net472/Microsoft.VisualStudio.SlowCheetah*.dll;'
        - task: CopyFiles@2
          displayName: 'Copy Files for APIScan'
          inputs:
            SourceFolder: 'bin/$(BuildConfiguration)/net472/'
            Contents: |
              **/Microsoft.VisualStudio.SlowCheetah*.dll
              **/Microsoft.VisualStudio.SlowCheetah*.pdb
            TargetFolder: $(Agent.TempDirectory)\APIScanFiles
          condition: and(succeeded(), eq(variables['RunAPIScan'], 'true'))
        - task: APIScan@2
          displayName: Run APIScan
          inputs:
            softwareFolder: $(Agent.TempDirectory)\APIScanFiles
            softwareName: 'Slowcheetah'
            softwareVersionNum: '$(Build.BuildId)'
            isLargeApp: false
            toolVersion: 'Latest'
          condition: and(succeeded(), eq(variables['RunAPIScan'], 'true'))
          env:
            AzureServicesAuthConnectionString: RunAs=App;AppId=$(ApiScanClientId)
        - task: PublishSecurityAnalysisLogs@3
          displayName: 'Publish Guardian Artifacts'
          inputs:
            ArtifactName: CodeAnalysisLogs
            ArtifactType: Container
            PublishProcessedResults: false
            AllTools: true
        - task: TSAUpload@2
          displayName: 'Create bugs for APIScan'
          inputs:
            GdnPublishTsaOnboard: true
            GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\azure-pipelines\TSAOptions.json'
          condition: eq(variables['RunApiScan'], 'true')
        - task: CopyFiles@1
          displayName: Collecting symbols artifacts
          inputs:
            SourceFolder: bin/$(BuildConfiguration)/net472
            Contents: |
              **/Microsoft.VisualStudio.SlowCheetah?(*.dll|*.pdb|*.xml)
              !**/*Test*
            TargetFolder: $(Build.ArtifactStagingDirectory)/symbols
          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))

        - task: MicroBuildArchiveSymbols@5
          displayName: 🔣 Archive symbols to Symweb
          inputs:
            SymbolsFeatureName: $(SymbolsFeatureName)
            SymbolsProject: VS
          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['SignType'], 'real'))
        - task: CopyFiles@1
          displayName: Collecting packages
          inputs:
            SourceFolder: bin/$(BuildConfiguration)/packages
            Contents: |
              *.nupkg
              *.vsix
            TargetFolder: $(Build.ArtifactStagingDirectory)/packages
            flattenFolders: false
          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))

================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Microsoft Open Source Code of Conduct

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).

Resources:

- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns


================================================
FILE: CONTRIBUTING.md
================================================
# Microsoft.VisualStudio.SlowCheetah

This project welcomes contributions and suggestions. Most contributions require you to
agree to a Contributor License Agreement (CLA) declaring that you have the right to,
and actually do, grant us the rights to use your contribution. For details, visit
https://cla.microsoft.com.

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.

## Pull requests

When you submit a pull request, a CLA-bot will automatically determine whether you need
to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the
instructions provided by the bot. You will only need to do this once across all repositories using our CLA.
## Prerequisites

All dependencies can be installed by running the `init.ps1` script at the root of the repository
using Windows PowerShell or [PowerShell Core][pwsh] (on any OS).
Some dependencies installed by `init.ps1` may only be discoverable from the same command line environment the init script was run from due to environment variables, so be sure to launch Visual Studio or build the repo from that same environment.
Alternatively, run `init.ps1 -InstallLocality Machine` (which may require elevation) in order to install dependencies at machine-wide locations so Visual Studio and builds work everywhere.

The only prerequisite for building, testing, and deploying from this repository
is the [.NET SDK](https://get.dot.net/).
You should install the version specified in `global.json` or a later version within
the same major.minor.Bxx "hundreds" band.
For example if 2.2.300 is specified, you may install 2.2.300, 2.2.301, or 2.2.310
while the 2.2.400 version would not be considered compatible by .NET SDK.
See [.NET Core Versioning](https://learn.microsoft.com/dotnet/core/versions/) for more information.

## Package restore

The easiest way to restore packages may be to run `init.ps1` which automatically authenticates
to the feeds that packages for this repo come from, if any.
`dotnet restore` or `nuget restore` also work but may require extra steps to authenticate to any applicable feeds.

## Building

This repository can be built on Windows, Linux, and OSX.

Building, testing, and packing this repository can be done by using the standard dotnet CLI commands (e.g. `dotnet build`, `dotnet test`, `dotnet pack`, etc.).

[pwsh]: https://learn.microsoft.com/powershell/scripting/install/installing-powershell

## Releases

Use `nbgv tag` to create a tag for a particular commit that you mean to release.
[Learn more about `nbgv` and its `tag` and `prepare-release` commands](https://dotnet.github.io/Nerdbank.GitVersioning/docs/nbgv-cli.html).

Push the tag.

### GitHub Actions

When your repo is hosted by GitHub and you are using GitHub Actions, you should create a GitHub Release using the standard GitHub UI.
Having previously used `nbgv tag` and pushing the tag will help you identify the precise commit and name to use for this release.

After publishing the release, the `.github/workflows/release.yml` workflow will be automatically triggered, which will:

1. Find the most recent `.github/workflows/build.yml` GitHub workflow run of the tagged release.
1. Upload the `deployables` artifact from that workflow run to your GitHub Release.
1. If you have `NUGET_API_KEY` defined as a secret variable for your repo or org, any nuget packages in the `deployables` artifact will be pushed to nuget.org.

### Azure Pipelines

When your repo builds with Azure Pipelines, use the `azure-pipelines/release.yml` pipeline.
Trigger the pipeline by adding the `auto-release` tag on a run of your main `azure-pipelines.yml` pipeline.

## Tutorial and API documentation

API and hand-written docs are found under the `docfx/` directory and are built by [docfx](https://dotnet.github.io/docfx/).

You can make changes and host the site locally to preview them by switching to that directory and running the `dotnet docfx --serve` command.
After making a change, you can rebuild the docs site while the localhost server is running by running `dotnet docfx` again from a separate terminal.

The `.github/workflows/docs.yml` GitHub Actions workflow publishes the content of these docs to github.io if the workflow itself and [GitHub Pages is enabled for your repository](https://docs.github.com/en/pages/quickstart).

## Updating dependencies

This repo uses Renovate to keep dependencies current.
Configuration is in the `.github/renovate.json` file.
[Learn more about configuring Renovate](https://docs.renovatebot.com/configuration-options/).

When changing the renovate.json file, follow [these validation steps](https://docs.renovatebot.com/config-validation/).

If Renovate is not creating pull requests when you expect it to, check that the [Renovate GitHub App](https://github.com/apps/renovate) is configured for your account or repo.

## Merging latest from Library.Template

### Maintaining your repo based on this template

The best way to keep your repo in sync with Library.Template's evolving features and best practices is to periodically merge the template into your repo:

```ps1
git fetch
git checkout origin/main
./tools/MergeFrom-Template.ps1
# resolve any conflicts, then commit the merge commit.
git push origin -u HEAD
```


================================================
FILE: CodeQL.yml
================================================
path_classifiers:
  library:
    - 'test/**'


================================================
FILE: Directory.Build.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <RepoRootPath>$(MSBuildThisFileDirectory)</RepoRootPath>
    <BaseIntermediateOutputPath>$(RepoRootPath)obj\$([MSBuild]::MakeRelative($(RepoRootPath), $(MSBuildProjectDirectory)))\</BaseIntermediateOutputPath>
    <BaseOutputPath Condition=" '$(BaseOutputPath)' == '' ">$(RepoRootPath)bin\$(MSBuildProjectName)\</BaseOutputPath>
    <PackageOutputPath>$(RepoRootPath)bin\Packages\$(Configuration)\NuGet\</PackageOutputPath>
    <VSIXOutputPath>$(RepoRootPath)bin\Packages\$(Configuration)\Vsix\$(Platform)\</VSIXOutputPath>
    <VSIXOutputPath Condition="'$(Platform)'=='' or '$(Platform)'=='AnyCPU'">$(RepoRootPath)bin\Packages\$(Configuration)\Vsix\</VSIXOutputPath>
    <SBOMFileDestPath>$(VSIXOutputPath)</SBOMFileDestPath>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <AnalysisLevel>latest</AnalysisLevel>
    <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <ProduceReferenceAssembly>true</ProduceReferenceAssembly>
    <RestoreEnablePackagePruning>true</RestoreEnablePackagePruning>

    <!-- https://learn.microsoft.com/en-us/dotnet/fundamentals/apicompat/package-validation/overview -->
    <EnablePackageValidation>true</EnablePackageValidation>

    <!-- https://github.com/dotnet/msbuild/blob/main/documentation/ProjectReference-Protocol.md#setplatform-negotiation -->
    <EnableDynamicPlatformResolution>true</EnableDynamicPlatformResolution>

    <!-- Opt in till https://github.com/NuGet/Home/issues/9803 makes this the default. -->
    <RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>

    <!-- This entire repo has just one version.json file, so compute the version once and share with all projects in a large build. -->
    <GitVersionBaseDirectory>$(MSBuildThisFileDirectory)</GitVersionBaseDirectory>

    <!-- Local builds should embed PDBs so we never lose them when a subsequent build occurs. -->
    <DebugType Condition=" '$(CI)' != 'true' and '$(TF_BUILD)' != 'true' ">embedded</DebugType>

    <PackageProjectUrl>https://github.com/microsoft/slow-cheetah</PackageProjectUrl>
    <Company>Microsoft</Company>
    <Authors>Microsoft</Authors>
    <Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
    <PublishRepositoryUrl>true</PublishRepositoryUrl>
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
    <IncludeSymbols Condition=" '$(DebugType)' != 'embedded' ">true</IncludeSymbols>
    <SymbolPackageFormat>snupkg</SymbolPackageFormat>
  </PropertyGroup>

  <PropertyGroup>
    <LangVersion Condition="'$(MSBuildProjectExtension)'=='.csproj'">14</LangVersion>
    <LangVersion Condition="'$(MSBuildProjectExtension)'=='.vbproj'">16.9</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <None Include="$(RepoRootPath)obj/NOTICE" Pack="true" PackagePath="" Visible="false" Condition=" Exists('$(RepoRootPath)obj/NOTICE') " />
  </ItemGroup>

  <ItemGroup>
    <AdditionalFiles Include="$(MSBuildThisFileDirectory)stylecop.json" Link="stylecop.json" />
  </ItemGroup>

  <ItemDefinitionGroup>
    <!-- We always want MSBuild properties generated that point at the restored location of each package. -->
    <PackageReference GeneratePathProperty="true" />
  </ItemDefinitionGroup>

  <Target Name="PrepareReleaseNotes" BeforeTargets="GenerateNuspec" DependsOnTargets="GetBuildVersion">
    <PropertyGroup>
      <PackageReleaseNotes Condition="'$(RepositoryUrl)'!=''">$(RepositoryUrl)/releases/tag/v$(Version)</PackageReleaseNotes>
    </PropertyGroup>
  </Target>

  <Import Project="azure-pipelines\NuGetSbom.props" />
</Project>


================================================
FILE: Directory.Build.rsp
================================================
#------------------------------------------------------------------------------
# This file contains command-line options that MSBuild will process as part of
# every build, unless the "/noautoresponse" switch is specified.
#
# MSBuild processes the options in this file first, before processing the
# options on the command line. As a result, options on the command line can
# override the options in this file. However, depending on the options being
# set, the overriding can also result in conflicts.
#
# NOTE: The "/noautoresponse" switch cannot be specified in this file, nor in
# any response file that is referenced by this file.
#------------------------------------------------------------------------------
/nr:false
/m
/verbosity:minimal
/clp:Summary;ForceNoAlign


================================================
FILE: Directory.Build.targets
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <ItemGroup>
    <!-- Avoid compile error about missing namespace when combining ImplicitUsings with .NET Framework target frameworks. -->
    <Using Remove="System.Net.Http" Condition="'$(TargetFrameworkIdentifier)'=='.NETFramework'" />
  </ItemGroup>
</Project>


================================================
FILE: Directory.Packages.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
  <!-- https://learn.microsoft.com/nuget/consume-packages/central-package-management -->
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
    <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
    <MicrosoftTestingPlatformVersion>2.2.2</MicrosoftTestingPlatformVersion>

    <MicroBuildVersion>2.0.226</MicroBuildVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="Microsoft.IO.Redist" Version="6.0.1" />
    <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
    <PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
    <PackageVersion Include="xunit" Version="2.9.2" />
    <PackageVersion Include="Microsoft.VisualStudio.SDK" Version="17.5.33428.388" />
    <PackageVersion Include="Microsoft.Web.Xdt" Version="3.1.0" />
    <PackageVersion Include="Microsoft.VisualStudio.Jdt" Version="0.9.63" />
    <PackageVersion Include="NuGet.VisualStudio" Version="17.6.0" />
    <PackageVersion Include="Microsoft.VSSDK.BuildTools" Version="17.6.2164" />
    <PackageVersion Include="EnvDTE" Version="17.6.36389" />
    <PackageVersion Include="Microsoft.Build.Utilities.Core" Version="17.12.50" />
    <PackageVersion Include="MessagePack" Version="2.5.187" />
    <PackageVersion Include="System.Text.Json" Version="8.0.5" />
  </ItemGroup>
  <ItemGroup Label="Library.Template">
    <PackageVersion Include="Microsoft.Testing.Extensions.CodeCoverage" Version="18.6.2" />
    <PackageVersion Include="Microsoft.Testing.Extensions.CrashDump" Version="$(MicrosoftTestingPlatformVersion)" />
    <PackageVersion Include="Microsoft.Testing.Extensions.HangDump" Version="$(MicrosoftTestingPlatformVersion)" />
    <PackageVersion Include="Microsoft.Testing.Extensions.TrxReport" Version="$(MicrosoftTestingPlatformVersion)" />
    <PackageVersion Include="Microsoft.VisualStudio.Internal.MicroBuild.NonShipping" Version="$(MicroBuildVersion)" />
    <PackageVersion Include="xunit.v3.mtp-v2" Version="3.2.2" />
  </ItemGroup>
  <ItemGroup>
    <!-- Put repo-specific GlobalPackageReference items in this group. -->
  </ItemGroup>
  <ItemGroup Label="Library.Template">
    <GlobalPackageReference Include="CSharpIsNullAnalyzer" Version="0.1.593" />
    <GlobalPackageReference Include="DotNetAnalyzers.DocumentationAnalyzers" Version="1.0.0-beta.59" />
    <GlobalPackageReference Include="Microsoft.VisualStudio.Internal.MicroBuild.VisualStudio" Version="$(MicroBuildVersion)" />
    <!-- The condition works around https://github.com/dotnet/sdk/issues/44951 -->
    <GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.9.50" Condition="!('$(TF_BUILD)'=='true' and '$(dotnetformat)'=='true')" />
    <GlobalPackageReference Include="PolySharp" Version="1.15.0" />
    <GlobalPackageReference Include="StyleCop.Analyzers.Unstable" Version="1.2.0.556" />
    <!--<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.1.118" />-->
  </ItemGroup>
</Project>


================================================
FILE: LICENSE
================================================
Microsoft.VisualStudio.SlowCheetah
Copyright (c) Microsoft Corporation
All rights reserved.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# slow-cheetah
[![NuGet package](https://img.shields.io/nuget/v/Microsoft.VisualStudio.SlowCheetah.svg)](https://nuget.org/packages/Microsoft.VisualStudio.SlowCheetah)
[![Build status](https://ci.appveyor.com/api/projects/status/qqvu367widkayo05/branch/master?svg=true)](https://ci.appveyor.com/project/jviau/slow-cheetah/branch/master)

Transformations for XML files (such as app.config) and JSON files.

Includes two primary components:
1. NuGet package that adds an msbuild task to perform transforms on build.
2. Visual Studio extension for generating and previewing transforms.

This project has adopted the [Microsoft Open Source Code of
Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct
FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
contact [opencode@microsoft.com](mailto:opencode@microsoft.com)
with any additional questions or comments.

## Supported Platforms
* Visual Studio 2022: [SlowCheetah VS 2022 Extension](https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms-VS2022) (version 4.x)
* Visual Studio 2015-2019: [SlowCheetah VS 2015-2019 Extension](https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms) (version 3.x)

## Supported File Types

SlowCheetah supports transformations for XML files, specified by [XDT](https://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx) and for JSON files, specified by [JDT](https://github.com/Microsoft/json-document-transforms). Transform files created by the extension follow these formats.

## Features

Perform transformations of XML and JSON files on build per configuration and publish profiles.

Quickly add and preview transformations to a file in the project.

## [How to Perform Transformations](doc/transforming_files.md)

## Trademarks

This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.


================================================
FILE: Restore.cmd
================================================
@echo off
WHERE /q msbuild
IF ERRORLEVEL 1 (
    ECHO Error: Could not find msbuild. Make sure msbuild is in the PATH and try again.
    EXIT /B %ERRORLEVEL%
)
msbuild /t:restore %~dp0\src\SlowCheetah.sln

================================================
FILE: SECURITY.md
================================================
<!-- BEGIN MICROSOFT SECURITY.MD V0.0.5 BLOCK -->

## Security

Microsoft 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/).

If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://learn.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below.

## Reporting Security Issues

**Please do not report security vulnerabilities through public GitHub issues.**

Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).

If 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://www.microsoft.com/msrc/pgp-key-msrc).

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. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).

Please 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:

  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
  * Full paths of source file(s) related to the manifestation of the issue
  * The location of the affected source code (tag/branch/commit or direct URL)
  * Any special configuration required to reproduce the issue
  * Step-by-step instructions to reproduce the issue
  * Proof-of-concept or exploit code (if possible)
  * Impact of the issue, including how an attacker might exploit the issue

This information will help us triage your report more quickly.

If 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://microsoft.com/msrc/bounty) page for more details about our active programs.

## Preferred Languages

We prefer all communications to be in English.

## Policy

Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/msrc/cvd).

<!-- END MICROSOFT SECURITY.MD BLOCK -->


================================================
FILE: SUPPORT.md
================================================
# Support

## How to file issues and get help

This project uses GitHub Issues to track bugs and feature requests.
Please search the existing issues before filing new issues to avoid duplicates.
For new issues, file your bug or feature request as a new Issue.

For help and questions about using this project, please create an issue.

## Microsoft Support Policy

Support for this **slow-cheetah** is limited to the resources listed above.


================================================
FILE: ThirdPartyNotices.txt
================================================
NOTICES AND INFORMATION
Do Not Translate or Localize

This software incorporates material from third parties.
Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com,
or you may send a check or money order for US $5.00, including the product name,
the open source component name, platform, and version number, to:

Source Code Compliance Team
Microsoft Corporation
One Microsoft Way
Redmond, WA 98052
USA

Notwithstanding any other terms, you may reverse engineer this software to the extent
required to debug changes to any libraries licensed under the GNU Lesser General Public License.

---------------------------------------------------------

StyleCop.Analyzers 1.0.0 - Apache-2.0


Copyright Sam Harwell 2015
Copyright James Newton-King 2008
GetCopyrightText copyrightText WithDocumentText
copyrightText CircularReference InvalidReference
Copyright Sam Harwell 2015 StyleCop DotNetAnalyzers Roslyn Diagnostic Analyzer

Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      

      "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

      

      "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

      

      "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

      

      "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

      

      "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

      

      "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

      

      "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

      

      "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

      

      "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

      

      "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

---------------------------------------------------------

================================================
FILE: appveyor.yml
================================================
# Notes:
#   - Minimal appveyor.yml file is an empty file. All sections are optional.
#   - Indent each level of configuration with 2 spaces. Do not use tabs!
#   - All section names are case-sensitive.
#   - Section names should be unique on each level.

#---------------------------------#
#      general configuration      #
#---------------------------------#

# version format
version: 1.0.{build}

#---------------------------------#
#    environment configuration    #
#---------------------------------#
# Build worker image (VM template)
image: Visual Studio 2017

skip_tags: true
branches:
  only:
  - master

environment:
  DeployExtension: false
  Package: true

cache:
- packages -> **\packages.config

configuration: Release

#---------------------------------#
#       build configuration       #
#---------------------------------#

before_build:
  nuget restore src

build:
  project: src\SlowCheetah.sln  # path to Visual Studio solution or project
  verbosity: normal             # MSBuild verbosity level

#---------------------------------#
#       test configuration        #
#---------------------------------#

test:
  assemblies:
  - '**\*tests.dll'

#---------------------------------#
#     artifact configuration      #
#---------------------------------#

artifacts:
- path: 'bin\**\packages\Microsoft.VisualStudio.SlowCheetah*.nupkg'
  name: Nuget Package
- path: 'bin\**\packages\Microsoft.VisualStudio.SlowCheetah*.vsix'
  name: VSIX Package


================================================
FILE: azure-pipelines/Archive-SourceCode.ps1
================================================
#Requires -PSEdition Core -Version 7
<#
.SYNOPSIS
    Submits a source archival request for this repo.
.PARAMETER Requester
    The alias for the user requesting this backup.
.PARAMETER ManagerAlias
    The alias of the manager that owns the repo.
.PARAMETER TeamAlias
    The alias of the team that owns the repo.
.PARAMETER BusinessGroupName
    A human-readable title for your team or business group.
.PARAMETER ProductionType
.PARAMETER ReleaseType
    The type of release being backed up.
.PARAMETER ReleaseDate
    The date of the release of your software. Defaults to today.
.PARAMETER OwnerAlias
    The alias of the owner.
.PARAMETER OS
.PARAMETER ProductLanguage
    One or more languages.
.PARAMETER Notes
    Any notes to record with the backup.
.PARAMETER FileCollection
    One or more collections to archive.
.PARAMETER ProductName
    The name of the product. This will default to the repository name.
.PARAMETER RepoUrl
    The URL to the repository. This will default to the repository containing this script.
.PARAMETER BackupType
    The kind of backup to be performed.
.PARAMETER ServerPath
    The UNC path to the server to be backed up (if applicable).
.PARAMETER SourceCodeArchivalUri
    The URI to POST the source code archival request to.
    This value will typically come automatically by a variable group associated with your pipeline.
    You can also look it up at https://dpsopsrequestforms.azurewebsites.net/#/help -> SCA Request Help -> SCA API Help -> Description
#>
[CmdletBinding(SupportsShouldProcess = $true, PositionalBinding = $false)]
param (
    [Parameter()]
    [string]$Requester,
    [Parameter(Mandatory = $true)]
    [string]$ManagerAlias,
    [Parameter(Mandatory = $true)]
    [string]$TeamAlias,
    [Parameter(Mandatory = $true)]
    [string]$BusinessGroupName,
    [Parameter()]
    [string]$ProductionType = 'Visual Studio',
    [Parameter()]
    [string]$ReleaseType = 'RTW',
    [Parameter()]
    [DateTime]$ReleaseDate = [DateTime]::Today,
    [Parameter()]
    [string]$OwnerAlias,
    [Parameter()]
    [ValidateSet('64-Bit Win', '32-Bit Win', 'Linux', 'Mac', '64-Bit ARM', '32-Bit ARM')]
    [string[]]$OS = @('64-Bit Win'),
    [Parameter(Mandatory = $true)]
    [ValidateSet('English', 'Chinese Simplified', 'Chinese Traditional', 'Czech', 'French', 'German', 'Italian', 'Japanese', 'Korean', 'Polish', 'Portuguese', 'Russian', 'Spanish', 'Turkish')]
    [string[]]$ProductLanguage,
    [Parameter()]
    [string]$Notes = '',
    [Parameter()]
    [ValidateSet('Binaries', 'Localization', 'Source Code')]
    [string[]]$FileCollection = @('Source Code'),
    [Parameter()]
    [string]$ProductName,
    [Parameter()]
    [Uri]$RepoUrl,
    [Parameter()]
    [ValidateSet('Server Path', 'Code Repo(Git URL/AzureDevOps)', 'Git', 'Azure Storage Account')]
    [string]$BackupType = 'Code Repo(Git URL/AzureDevOps)',
    [Parameter()]
    [string]$ServerPath = '',
    [Parameter()]
    [Uri]$SourceCodeArchivalUri = $env:SOURCECODEARCHIVALURI,
    [Parameter(Mandatory = $true)]
    [string]$AccessToken
)

function Invoke-Git() {
    # Make sure we invoke git from within the repo.
    Push-Location $PSScriptRoot
    try {
        return (git $args)
    }
    finally {
        Pop-Location
    }
}

if (!$ProductName) {
    if ($env:BUILD_REPOSITORY_NAME) {
        Write-Verbose 'Using $env:BUILD_REPOSITORY_NAME for ProductName.' # single quotes are intentional so user sees the name of env var.
        $ProductName = $env:BUILD_REPOSITORY_NAME
    }
    else {
        $originUrl = [Uri](Invoke-Git remote get-url origin)
        if ($originUrl) {
            $lastPathSegment = $originUrl.Segments[$originUrl.Segments.Length - 1]
            if ($lastPathSegment.EndsWith('.git')) {
                $lastPathSegment = $lastPathSegment.Substring(0, $lastPathSegment.Length - '.git'.Length)
            }
            Write-Verbose 'Using origin remote URL to derive ProductName.'
            $ProductName = $lastPathSegment
        }
    }

    if (!$ProductName) {
        Write-Error "Unable to determine default value for -ProductName."
    }
}

if (!$OwnerAlias) {
    if ($env:BUILD_REQUESTEDFOREMAIL) {
        Write-Verbose 'Using $env:BUILD_REQUESTEDFOREMAIL and slicing to just the alias for OwnerAlias.'
        $OwnerAlias = ($env:BUILD_REQUESTEDFOREMAIL -split '@')[0]
    } else {
        $OwnerAlias = $TeamAlias
    }

    if (!$OwnerAlias) {
        Write-Error "Unable to determine default value for -OwnerAlias."
    }
}

if (!$Requester) {
    if ($env:BUILD_REQUESTEDFOREMAIL) {
        Write-Verbose 'Using $env:BUILD_REQUESTEDFOREMAIL and slicing to just the alias for Requester.'
        $Requester = ($env:BUILD_REQUESTEDFOREMAIL -split '@')[0]
    }
    else {
        Write-Verbose 'Using $env:USERNAME for Requester.'
        $Requester = $env:USERNAME
    }
    if (!$Requester) {
        $Requester = $OwnerAlias
    }
}

if (!$RepoUrl) {
    $RepoUrl = $env:BUILD_REPOSITORY_URI
    if (!$RepoUrl) {
        $originUrl = [Uri](Invoke-Git remote get-url origin)
        if ($originUrl) {
            Write-Verbose 'Using git origin remote url for GitURL.'
            $RepoUrl = $originUrl
        }

        if (!$RepoUrl) {
            Write-Error "Unable to determine default value for -RepoUrl."
        }
    }
}

Push-Location $PSScriptRoot
$versionsObj = dotnet nbgv get-version -f json | ConvertFrom-Json
Pop-Location

$ReleaseDateString = $ReleaseDate.ToShortDateString()
$Version = $versionsObj.Version

$BackupSize = Get-ChildItem $PSScriptRoot\..\.git -Recurse -File | Measure-Object -Property Length -Sum
$DataSizeMB = [int]($BackupSize.Sum / 1mb)
$FileCount = $BackupSize.Count

$Request = @{
    "Requester"                  = $Requester
    "Manager"                    = $ManagerAlias
    "TeamAlias"                  = $TeamAlias
    "AdditionalContacts"         = $AdditionalContacts
    "BusinessGroupName"          = $BusinessGroupName
    "ProductName"                = $ProductName
    "Version"                    = $Version
    "ProductionType"             = $ProductionType
    "ReleaseType"                = $ReleaseType
    "ReleaseDateString"          = $ReleaseDateString
    "OS"                         = [string]::Join(',', $OS)
    "ProductLanguage"            = [string]::Join(',', $ProductLanguage)
    "FileCollection"             = [string]::Join(',', $FileCollection)
    "OwnerAlias"                 = $OwnerAlias
    "Notes"                      = $Notes.Trim()
    "CustomerProvidedDataSizeMB" = $DataSizeMB
    "CustomerProvidedFileCount"  = $FileCount
    "BackupType"                 = $BackupType
    "ServerPath"                 = $ServerPath
    "AzureStorageAccount"        = $AzureStorageAccount
    "AzureStorageContainer"      = $AzureStorageContainer
    "GitURL"                     = $RepoUrl
}

$RequestJson = ConvertTo-Json $Request
Write-Host "SCA request:`n$RequestJson"

if ($PSCmdlet.ShouldProcess('source archival request', 'post')) {
    if (!$SourceCodeArchivalUri) {
        Write-Error "Unable to post request without -SourceCodeArchivalUri parameter."
        exit 1
    }

    $headers = @{
        'Authorization' = "Bearer $AccessToken"
    }

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    $Response = Invoke-WebRequest -Uri $SourceCodeArchivalUri -Method POST -Headers $headers -Body $RequestJson -ContentType "application/json" -UseBasicParsing -SkipHttpErrorCheck
    Write-Host "Status Code : " -NoNewline
    if ($Response.StatusCode -eq 200) {
        Write-Host $Response.StatusCode -ForegroundColor Green
        Write-Host "Ticket ID   : " -NoNewline
        $responseContent = ConvertFrom-Json ($Response.Content)
        Write-Host $responseContent
    }
    else {
        Write-Host $Response.StatusCode -ForegroundColor Red
        try {
            $responseContent = ConvertFrom-Json $Response.Content
            Write-Host "Message     : $($responseContent.message)"
        }
        catch {
            Write-Host "JSON Parse Error: $($_.Exception.Message)"
            Write-Host "Raw response content:"
            Write-Host $Response.Content
        }

        exit 2
    }
} elseif ($SourceCodeArchivalUri) {
    Write-Host "Would have posted to $SourceCodeArchivalUri"
}


================================================
FILE: azure-pipelines/BuildStageVariables.yml
================================================
variables:
  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
  BuildConfiguration: Release
  NUGET_PACKAGES: $(Agent.TempDirectory)/.nuget/packages/


================================================
FILE: azure-pipelines/Get-InsertionPRId.ps1
================================================
<#
.SYNOPSIS
    Look up the pull request URL of the insertion PR.
#>
$stagingFolder = $env:BUILD_STAGINGDIRECTORY
if (!$stagingFolder) {
    $stagingFolder = $env:SYSTEM_DEFAULTWORKINGDIRECTORY
    if (!$stagingFolder) {
        Write-Error "This script must be run in an Azure Pipeline."
        exit 1
    }
}
$markdownFolder = Join-Path $stagingFolder (Join-Path 'MicroBuild' 'Output')
$markdownFile = Join-Path $markdownFolder 'PullRequestUrl.md'
if (!(Test-Path $markdownFile)) {
    Write-Error "This script should be run after the MicroBuildInsertVsPayload task."
    exit 2
}

$insertionPRUrl = Get-Content $markdownFile
if (!($insertionPRUrl -match 'https:.+?/pullrequest/(\d+)')) {
    Write-Error "Failed to parse pull request URL: $insertionPRUrl"
    exit 3
}

$Matches[1]


================================================
FILE: azure-pipelines/GlobalVariables.yml
================================================
variables:
  # These variables are required for MicroBuild tasks
  TeamName: VS IDE
  TeamEmail: vsidemicrobuild@microsoft.com
  # These variables influence insertion pipelines
  ContainsVsix: false # This should be true when the repo builds a VSIX that should be inserted to VS.


================================================
FILE: azure-pipelines/Merge-CodeCoverage.ps1
================================================
#!/usr/bin/env pwsh

<#
.SYNOPSIS
    Merges code coverage reports.
.PARAMETER Path
    The path(s) to search for Cobertura code coverage reports.
.PARAMETER Format
    The format for the merged result. The default is Cobertura
.PARAMETER OutputDir
    The directory the merged result will be written to. The default is `coveragereport` in the root of this repo.
#>
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true)]
    [string[]]$Path,
    [ValidateSet('Badges', 'Clover', 'Cobertura', 'CsvSummary', 'Html', 'Html_Dark', 'Html_Light', 'HtmlChart', 'HtmlInline', 'HtmlInline_AzurePipelines', 'HtmlInline_AzurePipelines_Dark', 'HtmlInline_AzurePipelines_Light', 'HtmlSummary', 'JsonSummary', 'Latex', 'LatexSummary', 'lcov', 'MarkdownSummary', 'MHtml', 'PngChart', 'SonarQube', 'TeamCitySummary', 'TextSummary', 'Xml', 'XmlSummary')]
    [string]$Format='Cobertura',
    [string]$OutputFile=("$PSScriptRoot/../coveragereport/merged.cobertura.xml")
)

$RepoRoot = [string](Resolve-Path $PSScriptRoot/..)
Push-Location $RepoRoot
try {
    Write-Verbose "Searching $Path for *.cobertura.xml files"
    $reports = Get-ChildItem -Recurse $Path -Filter *.cobertura.xml

    if ($reports) {
        $reports |% { $_.FullName } |% {
            # In addition to replacing {reporoot}, we also normalize on one kind of slash so that the report aggregates data for a file whether data was collected on Windows or not.
            Write-Verbose "Processing $_"
            $xml = [xml](Get-Content -LiteralPath $_)
            $xml.coverage.packages.package.classes.class |? { $_.filename} |% {
                $_.filename = $_.filename.Replace('{reporoot}', $RepoRoot).Replace([IO.Path]::AltDirectorySeparatorChar, [IO.Path]::DirectorySeparatorChar)
            }

            $xml.Save($_)
        }

        $Inputs = $reports |% { Resolve-Path -relative $_.FullName }

        if ((Split-Path $OutputFile) -and -not (Test-Path (Split-Path $OutputFile))) {
            New-Item -Type Directory -Path (Split-Path $OutputFile) | Out-Null
        }

        & dotnet dotnet-coverage merge $Inputs -o $OutputFile -f cobertura
    } else {
        Write-Error "No reports found to merge."
    }
} finally {
    Pop-Location
}


================================================
FILE: azure-pipelines/NuGetSbom.props
================================================
<Project>
  <PropertyGroup>
    <GenerateSBOMThisProject>true</GenerateSBOMThisProject>
    <UseMicroBuildSbomPluginVersion>2</UseMicroBuildSbomPluginVersion>
  </PropertyGroup>
</Project>


================================================
FILE: azure-pipelines/PoliCheckExclusions.xml
================================================
<PoliCheckExclusions>
    <!--Each of these exclusions is a folder name -if \[name]\exists in the file path, it will be skipped -->
    <Exclusion Type="FolderPathFull">NODE_MODULES|.STORE</Exclusion>
    <!--Each of these exclusions is a folder name -if any folder or file starts with "\[name]", it will be skipped -->
    <!-- <Exclusion Type="FolderPathStart">ABC|XYZ</Exclusion>-->
    <!--Each of these file types will be completely skipped for the entire scan -->
    <!-- <Exclusion Type="FileType">.ABC|.XYZ</Exclusion>-->
    <!--The specified file names will be skipped during the scan regardless which folder they are in -->
    <!-- <Exclusion Type="FileName">ABC.TXT|XYZ.CS</Exclusion>-->
</PoliCheckExclusions>


================================================
FILE: azure-pipelines/PostPRMessage.ps1
================================================
[CmdletBinding(SupportsShouldProcess = $true)]
param(
    [Parameter(Mandatory=$true)]
    $AccessToken,
    [Parameter(Mandatory=$true)]
    $Markdown,
    [ValidateSet('Active','ByDesign','Closed','Fixed','Pending','Unknown','WontFix')]
    $CommentState='Active'
)

# See https://learn.microsoft.com/dotnet/api/microsoft.teamfoundation.sourcecontrol.webapi.commentthreadstatus
if ($CommentState -eq 'Active') {
    $StatusCode = 1
} elseif ($CommentState -eq 'ByDesign') {
    $StatusCode = 5
} elseif ($CommentState -eq 'Closed') {
    $StatusCode = 4
} elseif ($CommentState -eq 'Fixed') {
    $StatusCode = 2
} elseif ($CommentState -eq 'Pending') {
    $StatusCode = 6
} elseif ($CommentState -eq 'Unknown') {
    $StatusCode = 0
} elseif ($CommentState -eq 'WontFix') {
    $StatusCode = 3
}

# Build the JSON body up
$body = ConvertTo-Json @{
    comments = @(@{
        parentCommentId = 0
        content = $Markdown
        commentType = 1
    })
    status = $StatusCode
}

Write-Verbose "Posting JSON payload: `n$Body"

# Post the message to the Pull Request
# https://learn.microsoft.com/rest/api/azure/devops/git/pull-request-threads
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:BUILD_REPOSITORY_NAME)/pullRequests/$($env:SYSTEM_PULLREQUEST_PULLREQUESTID)/threads?api-version=5.1"
if ($PSCmdlet.ShouldProcess($url, 'Post comment via REST call')) {
    try {
        if (!$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) {
            Write-Error "Posting to the pull request requires that the script is running in an Azure Pipelines context."
            exit 1
        }
        Write-Host "Posting PR comment to: $url"
        Invoke-RestMethod -Uri $url -Method POST -Headers @{Authorization = "Bearer $AccessToken"} -Body $Body -ContentType application/json
    }
    catch {
        Write-Error $_
        Write-Error $_.Exception.Message
        exit 2
    }
}


================================================
FILE: azure-pipelines/TSAOptions.json
================================================
{
  "tsaVersion": "TsaV2",
  "codebase": "NewOrUpdate",
  "codebaseName": "SlowCheetah",
  "tsaStamp": "DevDiv",
  "tsaEnvironment": "PROD",
  "notificationAliases": [
    "vsslnx@microsoft.com"
  ],
  "codebaseAdmins": [
    "REDMOND\\tevinstanley"
  ],
  "instanceUrl": "https://devdiv.visualstudio.com",
  "projectName": "DevDiv",
  "areaPath": "DevDiv\\VS Core\\Project\\SlowCheetah",
  "iterationPath": "DevDiv",
  "tools": [
    "APIScan",
    "CodeQL"
  ],
  "repositoryName": "SlowCheetah"
}


================================================
FILE: azure-pipelines/WIFtoPATauth.yml
================================================
parameters:
- name: deadPATServiceConnectionId # The GUID of the PAT-based service connection whose access token must be replaced.
  type: string
- name: wifServiceConnectionName # The name of the WIF service connection to use to get the access token.
  type: string
- name: resource # The scope for which the access token is requested.
  type: string
  default: 499b84ac-1321-427f-aa17-267ca6975798 # Azure Artifact feeds (any of them)

steps:
- task: AzureCLI@2
  displayName: 🔏 Authenticate with WIF service connection
  inputs:
    azureSubscription: ${{ parameters.wifServiceConnectionName }}
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
      $accessToken = az account get-access-token --query accessToken --resource '${{ parameters.resource }}' -o tsv
      # Set the access token as a secret, so it doesn't get leaked in the logs
      Write-Host "##vso[task.setsecret]$accessToken"
      # Override the apitoken of the nuget service connection, for the duration of this stage
      Write-Host "##vso[task.setendpoint id=${{ parameters.deadPATServiceConnectionId }};field=authParameter;key=apitoken]$accessToken"


================================================
FILE: azure-pipelines/apiscan.yml
================================================
parameters:
- name: windowsPool
  type: object
- name: RealSign
  type: boolean

jobs:
- job: apiscan
  displayName: APIScan
  dependsOn: Windows
  pool: ${{ parameters.windowsPool }}
  timeoutInMinutes: 120
  templateContext:
    ${{ if not(parameters.RealSign) }}:
      mb:
        signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available
          enabled: true
          zipSources: false
          signType: test
    outputs:
    - output: pipelineArtifact
      displayName: 📢 collect apiscan artifact
      targetPath: $(Pipeline.Workspace)/.gdn/.r/apiscan/001/Logs
      artifactName: apiscan-logs
      condition: succeededOrFailed()
  variables:
  - name: SymbolsFeatureName
    value: $[ dependencies.Windows.outputs['SetPipelineVariables.SymbolsFeatureName'] ]
  - name: NBGV_MajorMinorVersion
    value: $[ dependencies.Windows.outputs['nbgv.NBGV_MajorMinorVersion'] ]
  - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
    # https://dev.azure.com/devdiv/DevDiv/_wiki/wikis/DevDiv.wiki/25351/APIScan-step-by-step-guide-to-setting-up-a-Pipeline
    - group: VSEng sponsored APIScan # Expected to provide ApiScanClientId
  steps:
    # We need TSAOptions.json
  - checkout: self
    fetchDepth: 1

  - download: current
    artifact: APIScanInputs
    displayName: 🔻 Download APIScanInputs artifact

  - task: APIScan@2
    displayName: 🔍 Run APIScan
    inputs:
      softwareFolder: $(Pipeline.Workspace)/APIScanInputs
      softwareName: $(SymbolsFeatureName)
      softwareVersionNum: $(NBGV_MajorMinorVersion)
      isLargeApp: false
      toolVersion: Latest
      preserveLogsFolder: true
      azureSubscription: VSEng-APIScanSC
    env:
      AzureServicesAuthConnectionString: $(APIScanAuthConnectionString)
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

  # File bugs when APIScan finds issues
  - task: TSAUpload@2
    displayName: 🪳 TSA upload
    inputs:
      GdnPublishTsaOnboard: True
      GdnPublishTsaConfigFile: $(Build.SourcesDirectory)\azure-pipelines\TSAOptions.json
    condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))


================================================
FILE: azure-pipelines/archive-sourcecode.yml
================================================
trigger: none # We only want to trigger manually or based on resources
pr: none

# Source archival requirements come from a compliance tenet. Review a sample task here: https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1550985
# Source code should be archived within 30 days of the release date, and at least every quarter if your product is releasing more than once every 6 months.
# If your sources on GitHub are public open source project, then using GitHub Public Archive is sufficient.
schedules:
- cron: "13 13 13 */3 *" # Every three months
  displayName: Periodic source archival
  branches:
    include:
    - main

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release

parameters:
- name: notes
  displayName: Notes to include in the SCA request
  type: string
  default: ' ' # optional parameters require a non-empty default.
- name: whatif
  displayName: Only simulate the request
  type: boolean
  default: false

variables:
- group: VS Core team # Expected to provide ManagerAlias, SourceCodeArchivalUri
- template: GlobalVariables.yml

extends:
  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool: VSEng-MicroBuildVSStable

    stages:
    - stage: archive
      jobs:
      - job: archive
        pool:
          name: AzurePipelines-EO
          demands:
          - ImageOverride -equals 1ESPT-Ubuntu22.04
          os: Linux

        steps:
        - checkout: self
          clean: true
          fetchDepth: 0
        - powershell: tools/Install-DotNetSdk.ps1
          displayName: ⚙ Install .NET SDK
        - task: NuGetAuthenticate@1
          displayName: 🔏 Authenticate NuGet feeds
          inputs:
            forceReinstallCredentialProvider: true
        - script: dotnet tool restore
          displayName: ⚙️ Restore CLI tools
        - powershell: tools/variables/_define.ps1
          failOnStderr: true
          displayName: ⚙ Set pipeline variables based on source
        - task: AzureCLI@2
          displayName: 🔏 Authenticate with WIF service connection
          inputs:
            azureSubscription: VS Core Source Code Archival
            scriptType: pscore
            scriptLocation: inlineScript
            inlineScript: |
              $accessToken = az account get-access-token --query accessToken --resource api://177cf50a-4bf5-4481-8b7e-f32900dfc8e6 -o tsv
              Write-Host "##vso[task.setvariable variable=scaToken;issecret=true]$accessToken"
        - pwsh: >
            $TeamAlias = '$(TeamEmail)'.Substring(0, '$(TeamEmail)'.IndexOf('@'))

            azure-pipelines/Archive-SourceCode.ps1
            -ManagerAlias '$(ManagerAlias)'
            -TeamAlias $TeamAlias
            -BusinessGroupName '$(BusinessGroupName)'
            -ProductName '$(SymbolsFeatureName)'
            -ProductLanguage English
            -Notes '${{ parameters.notes }}'
            -AccessToken '$(scaToken)'
            -Verbose
            -WhatIf:$${{ parameters.whatif }}
          displayName: 🗃️ Submit archival request


================================================
FILE: azure-pipelines/build.yml
================================================
parameters:
##### The following parameters are not set by other YAML files that import this one,
##### but we use parameters because they support rich types and defaults.
##### Feel free to adjust their default value as needed.

# Whether this repo uses OptProf to optimize the built binaries.
# When enabling this, be sure to update these files:
# - OptProf.targets: InstallationPath and match TestCase selection with what's in the VS repo.
# - The project file(s) for the libraries to optimize must import OptProf.targets (for multi-targeted projects, only import it for ONE target).
# - OptProf.yml: Search for LibraryName (or your library's name) and verify that those names are appropriate.
# - OptProf_part2.yml: Search for LibraryName (or your library's name) and verify that those names are appropriate.
# and create pipelines for OptProf.yml, OptProf_part2.yml
- name: EnableOptProf
  type: boolean
  default: false
# Whether this repo is localized.
- name: EnableLocalization
  type: boolean
  default: false
# Whether to run `dotnet format` as part of the build to ensure code style consistency.
# This is just one of a a few mechanisms to enforce code style consistency.
- name: EnableDotNetFormatCheck
  type: boolean
  default: false
# This lists the names of the artifacts that will be published *from every OS build agent*.
# Any new tools/artifacts/*.ps1 script needs to be added to this list.
# If an artifact is only generated or collected on one OS, it should NOT be listed here,
# but should be manually added to the `outputs:` field in the appropriate OS job.
- name: artifact_names
  type: object
  default:
    - name: build_logs
    - name: coverageResults
    - name: deployables
      sbomEnabled: true
    - name: projectAssetsJson
    - name: symbols
    - name: testResults
      testOnly: true
    - name: test_symbols
      testOnly: true
    - name: Variables
# The Enable*Build parameters turn non-Windows agents on or off.
# Their default value should be based on whether the build and tests are expected/required to pass on that platform.
# Callers (e.g. Official.yml) *may* expose these parameters at queue-time in order to turn OFF optional agents.
- name: EnableLinuxBuild
  type: boolean
  default: false
- name: EnableMacOSBuild
  type: boolean
  default: false

##### 👆🏼 You MAY change the defaults above.
##### 👇🏼 You should NOT change the defaults below.

##### The following parameters are expected to be set by other YAML files that import this one.
##### Those without defaults require explicit values to be provided by our importers.

# Indicates whether the entrypoint file is 1ESPT compliant. Use this parameter to switch between publish tasks to fit 1ES or non-1ES needs.
- name: Is1ESPT
  type: boolean

# Indicates whether the 'official' 1ES PT templates are being used (as opposed to the unofficial ones).
- name: Is1ESPTOfficial
  type: boolean
  default: false

- name: RealSign
  type: boolean
  default: false

- name: RunTests
  type: boolean
  default: true

- name: PublishCodeCoverage
  type: boolean
  default: true

# Whether this is a special one-off build for inserting into VS for a validation insertion PR (that will never be merged).
- name: SkipCodesignVerify
  type: boolean
  default: false

- name: EnableAPIScan
  type: boolean
  default: false

# This parameter exists to provide a workaround to get a build out even when no OptProf profiling outputs can be found.
# Entrypoint yaml files like official.yml should expose this as a queue-time setting when EnableOptProf is true in this file.
# The OptProf.yml entrypoint sets this parameter to true so that collecting profile data isn't blocked by a prior lack of profile data.
- name: ShouldSkipOptimize
  type: boolean
  default: false

# The pool parameters are set to defaults that work in the azure-public AzDO account.
# They are overridden by callers for the devdiv AzDO account to use 1ES compliant pools.
- name: windowsPool
  type: object
  default:
    vmImage: windows-2025
- name: linuxPool
  type: object
  default:
    vmImage: ubuntu-24.04
- name: macOSPool
  type: object
  default:
    vmImage: macOS-15

jobs:
- job: Windows
  pool: ${{ parameters.windowsPool }}
  timeoutInMinutes: 180 # Give plenty of time due to real signing
  ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
    templateContext:
      mb:
        signing:
          enabled: true
          zipSources: false
          ${{ if parameters.RealSign }}:
            signType: real
            signWithProd: true
          ${{ else }}:
            signType: test
        sbom:
          enabled: true
          sbomToolVersion: 5.0.3
        localization:
          enabled: ${{ parameters.EnableLocalization }}
          ${{ if eq(variables['Build.Reason'], 'pullRequest') }}:
            languages: ENU,JPN
        optprof:
          enabled: ${{ parameters.EnableOptProf }}
          ProfilingInputsDropName: $(ProfilingInputsDropName)
          GeneratePropsFile: true
          PropsPath: $(Build.ArtifactStagingDirectory)/InsertionOutputs/$(ProfilingInputsPropsName)
          OptimizationInputsLookupMethod: GitTagRepo
          GitTagProject: DevDiv
          GitTagRepo: VS
          ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
          AccessToken: $(System.AccessToken)
        mbpresteps:
        - checkout: self
          fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
          clean: true
        - ${{ if parameters.EnableOptProf }}:
          - powershell: |
              Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)"
              Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSPROPSNAME]$(tools/variables/ProfilingInputsPropsName.ps1)"
            displayName: ⚙ Setting variables for optprof
      sdl:
        binskim:
          analyzeTargetGlob: $(Build.ArtifactStagingDirectory)\symbols-Windows\**

      outputParentDirectory: $(Build.ArtifactStagingDirectory)
      outputs:
      - ${{ each artifact in parameters.artifact_names }}:
        - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
          - output: pipelineArtifact
            displayName: 📢 Publish ${{ artifact.name }}-Windows
            targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Windows
            artifactName: ${{ artifact.name }}-Windows
            ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
              sbomEnabled: true
          - output: pipelineArtifact
            displayName: 📢 Publish ${{ artifact.name }}-Windows (for failed attempts)
            targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Windows
            artifactName: ${{ artifact.name }}-Windows-$(System.PhaseAttempt)
            ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
              sbomEnabled: true
            condition: failed()
      - output: pipelineArtifact
        displayName: 📢 Publish VSInsertion-Windows
        targetPath: $(Build.ArtifactStagingDirectory)/VSInsertion-Windows
        artifactName: VSInsertion-Windows
      - ${{ if parameters.EnableLocalization }}:
        - output: pipelineArtifact
          displayName: 📢 Publish LocBin-Windows
          targetPath: $(Build.ArtifactStagingDirectory)/LocBin-Windows
          artifactName: LocBin-Windows
      - ${{ if parameters.EnableAPIScan }}:
        - output: pipelineArtifact
          displayName: 📢 Publish APIScanInputs
          targetPath: $(Build.ArtifactStagingDirectory)/APIScanInputs-Windows
          artifactName: APIScanInputs
      - ${{ if parameters.EnableOptProf }}:
        - output: artifactsDrop
          displayName: 📢 Publish to Artifact Services - ProfilingInputs
          dropServiceURI: https://devdiv.artifacts.visualstudio.com
          buildNumber: $(ProfilingInputsDropName)
          sourcePath: $(Build.ArtifactStagingDirectory)\OptProf\ProfilingInputs
          toLowerCase: false
          retentionDays: 500
          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
  steps:
  - ${{ if not(parameters.Is1ESPT) }}:
    - checkout: self
      fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
      clean: true
    - ${{ if parameters.EnableOptProf }}:
      - powershell: Write-Host "##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)"
        displayName: ⚙ Set ProfilingInputsDropName for optprof

  - template: install-dependencies.yml

  - script: dotnet nbgv cloud -ca
    displayName: ⚙ Set build number
    name: nbgv

  - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
    - template: microbuild.before.yml
      parameters:
        EnableLocalization: ${{ parameters.EnableLocalization }}
        ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
        RealSign: ${{ parameters.RealSign }}

  - template: dotnet.yml
    parameters:
      Is1ESPT: ${{ parameters.Is1ESPT }}
      RunTests: ${{ parameters.RunTests }}

  - ${{ if and(parameters.EnableDotNetFormatCheck, not(parameters.EnableLinuxBuild)) }}:
    - script: dotnet format --verify-no-changes --no-restore src
      displayName: 💅 Verify formatted code
      env:
        dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951

  - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
    - template: microbuild.after.yml
      parameters:
        SkipCodesignVerify: ${{ parameters.SkipCodesignVerify }}

- ${{ if parameters.EnableLinuxBuild }}:
  - job: Linux
    pool: ${{ parameters.linuxPool }}
    ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
      templateContext:
        mb:
          ${{ if parameters.RealSign }}:
            signing:
              enabled: false # enable when building unique artifacts on this agent that must be signed
              signType: real
              signWithProd: true
        outputParentDirectory: $(Build.ArtifactStagingDirectory)
        outputs:
        - ${{ each artifact in parameters.artifact_names }}:
          - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
            - output: pipelineArtifact
              displayName: 📢 Publish ${{ artifact.name }}-Linux
              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
              artifactName: ${{ artifact.name }}-Linux
              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
                sbomEnabled: true
            - output: pipelineArtifact
              displayName: 📢 Publish ${{ artifact.name }}-Linux (for failed attempts)
              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux
              artifactName: ${{ artifact.name }}-Linux-$(System.PhaseAttempt)
              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
                sbomEnabled: true
              condition: failed()
    steps:
    - checkout: self
      fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
      clean: true
    - template: install-dependencies.yml
    - template: dotnet.yml
      parameters:
        Is1ESPT: ${{ parameters.Is1ESPT }}
        RunTests: ${{ parameters.RunTests }}
        BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
    - ${{ if parameters.EnableDotNetFormatCheck }}:
      - script: dotnet format --verify-no-changes
        displayName: 💅 Verify formatted code
        env:
          dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951
    - template: expand-template.yml

- ${{ if parameters.EnableMacOSBuild }}:
  - job: macOS
    pool: ${{ parameters.macOSPool }}
    ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
      templateContext:
        mb:
          ${{ if parameters.RealSign }}:
            signing:
              enabled: false # enable when building unique artifacts on this agent that must be signed
              signType: real
              signWithProd: true
        outputParentDirectory: $(Build.ArtifactStagingDirectory)
        outputs:
        - ${{ each artifact in parameters.artifact_names }}:
          - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:
            - output: pipelineArtifact
              displayName: 📢 Publish ${{ artifact.name }}-macOS
              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-macOS
              artifactName: ${{ artifact.name }}-macOS
              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
                sbomEnabled: true
            - output: pipelineArtifact
              displayName: 📢 Publish ${{ artifact.name }}-macOS (for failed attempts)
              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-macOS
              artifactName: ${{ artifact.name }}-macOS-$(System.PhaseAttempt)
              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:
                sbomEnabled: true
              condition: failed()
    steps:
    - checkout: self
      fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
      clean: true
    - template: install-dependencies.yml
    - template: dotnet.yml
      parameters:
        Is1ESPT: ${{ parameters.Is1ESPT }}
        RunTests: ${{ parameters.RunTests }}
        BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign
    - template: expand-template.yml

- job: WrapUp
  dependsOn:
  - Windows
  - ${{ if parameters.EnableLinuxBuild }}:
    - Linux
  - ${{ if parameters.EnableMacOSBuild }}:
    - macOS
  pool: ${{ parameters.windowsPool }} # Use Windows agent because PublishSymbols task requires it (https://github.com/microsoft/azure-pipelines-tasks/issues/13821).
  condition: succeededOrFailed()
  variables:
    ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build jobs, we don't need it here
  ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
    templateContext:
      ${{ if not(parameters.RealSign) }}:
        mb:
          signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available
            enabled: true
            zipSources: false
            signType: test
      outputParentDirectory: $(Build.ArtifactStagingDirectory)
      outputs:
        - output: pipelineArtifact
          displayName: 📢 Publish symbols-legacy
          targetPath: $(Build.ArtifactStagingDirectory)/symbols-legacy
          artifactName: symbols-legacy
          condition: succeededOrFailed()
  steps:
  - checkout: self
    fetchDepth: 0 # avoid shallow clone so nbgv can do its work.
    clean: true
  - template: install-dependencies.yml
    parameters:
      initArgs: -NoRestore
  - template: publish-symbols.yml
    parameters:
      EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
      EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
  - ${{ if and(parameters.RunTests, parameters.PublishCodeCoverage) }}:
    - template: publish-codecoverage.yml
      parameters:
        EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}
        EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}

- ${{ if parameters.EnableAPIScan }}:
  - template: apiscan.yml
    parameters:
      windowsPool: ${{ parameters.windowsPool }}
      RealSign: ${{ parameters.RealSign }}


================================================
FILE: azure-pipelines/dotnet.yml
================================================
parameters:
- name: RunTests
- name: Is1ESPT
  type: boolean
- name: BuildRequiresAccessToken
  type: boolean
  default: false

steps:


- task: VSBuild@1
  inputs:
    solution: src/SlowCheetah.sln
    msbuildArgs: /t:build,pack /bl:"$(Build.ArtifactStagingDirectory)/build_logs/build.binlog"
    configuration: $(BuildConfiguration)
  displayName: 🛠 Build

- powershell: tools/dotnet-test-cloud.ps1 -Configuration $(BuildConfiguration) -Agent $(Agent.JobName) -PublishResults
  displayName: 🧪 dotnet test
  condition: and(succeeded(), ${{ parameters.RunTests }})

- powershell: tools/variables/_define.ps1
  failOnStderr: true
  displayName: ⚙ Update pipeline variables based on build outputs
  condition: succeededOrFailed()

- ${{ if parameters.Is1ESPT }}:
  - powershell: azure-pipelines/publish_artifacts.ps1 -StageOnly -AvoidSymbolicLinks -ArtifactNameSuffix "-$(Agent.JobName)" -Verbose
    failOnStderr: true
    displayName: 📢 Stage artifacts
    condition: succeededOrFailed()
- ${{ else }}:
  - powershell: azure-pipelines/publish_artifacts.ps1 -ArtifactNameSuffix "-$(Agent.JobName)" -Verbose
    failOnStderr: true
    displayName: 📢 Publish artifacts
    condition: succeededOrFailed()

- ${{ if parameters.RunTests }}:
  - powershell: |
      $ArtifactStagingFolder = & "tools/Get-ArtifactsStagingDirectory.ps1"
      $CoverageResultsFolder = Join-Path $ArtifactStagingFolder "coverageResults-$(Agent.JobName)"
      tools/publish-CodeCov.ps1 -CodeCovToken "$(CODECOV_TOKEN)" -PathToCodeCoverage "$CoverageResultsFolder" -Name "$(Agent.JobName) Coverage Results" -Flags "$(Agent.JobName)"
    displayName: 📢 Publish code coverage results to codecov.io
    timeoutInMinutes: 3
    continueOnError: true
    # Set the CODECOV_TOKEN variable in your Azure Pipeline to enable code coverage reporting
    # Get a token from https://codecov.io/
    condition: and(succeeded(), ne(variables['CODECOV_TOKEN'], ''))


================================================
FILE: azure-pipelines/falsepositives.gdnsuppress
================================================
{
  "version": "latest",
  "suppressionSets": {
    "falsepositives": {
      "name": "falsepositives",
      "createdDate": "2021-12-03 00:23:08Z",
      "lastUpdatedDate": "2021-12-03 00:23:08Z"
    }
  },
  "results": {
  }
}


================================================
FILE: azure-pipelines/install-dependencies.yml
================================================
parameters:
- name: initArgs
  type: string
  default: ''
- name: needsAzurePublicFeeds
  type: boolean
  default: true # If nuget.config pulls from the azure-public account, we need to authenticate when building on the devdiv account.

steps:
- ${{ if and(parameters.needsAzurePublicFeeds, eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9')) }}:
  - template: WIFtoPATauth.yml
    parameters:
      wifServiceConnectionName: azure-public/vside package pull
      deadPATServiceConnectionId: 0ae39abc-4d06-4436-a7b5-865833df49db # azure-public/msft_consumption

- task: NuGetAuthenticate@1
  displayName: 🔏 Authenticate NuGet feeds
  inputs:
    ${{ if and(parameters.needsAzurePublicFeeds, eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9')) }}:
      nuGetServiceConnections: azure-public/msft_consumption

- powershell: |
    $AccessToken = '$(System.AccessToken)' # Avoid specifying the access token directly on the init.ps1 command line to avoid it showing up in errors
    .\init.ps1 -AccessToken $AccessToken ${{ parameters['initArgs'] }} -UpgradePrerequisites -NoNuGetCredProvider
    dotnet --info

    # Print mono version if it is present.
    if (Get-Command mono -ErrorAction SilentlyContinue) {
      mono --version
    }
  displayName: ⚙ Install prerequisites

- powershell: tools/variables/_define.ps1
  failOnStderr: true
  displayName: ⚙ Set pipeline variables based on source
  name: SetPipelineVariables


================================================
FILE: azure-pipelines/libtemplate-update.yml
================================================
# This pipeline schedules regular merges of Library.Template into a repo that is based on it.
# Only Azure Repos are supported. GitHub support comes via a GitHub Actions workflow.

trigger: none
pr: none
schedules:
- cron: "0 3 * * Mon" # Sun @ 8 or 9 PM Mountain Time (depending on DST)
  displayName: Weekly trigger
  branches:
    include:
    - main
  always: true

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release

parameters:
- name: AutoComplete
  displayName: Auto-complete pull request
  type: boolean
  default: false

variables:
- template: GlobalVariables.yml

extends:
  template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool:
        name: AzurePipelines-EO
        demands:
        - ImageOverride -equals 1ESPT-Windows2022
      credscan:
        enabled: false

    stages:
    - stage: Merge
      jobs:
      - job: merge
        pool:
          name: AzurePipelines-EO
          demands:
          - ImageOverride -equals 1ESPT-Ubuntu22.04
          os: Linux
        steps:
        - checkout: self
          fetchDepth: 0
          clean: true
        - pwsh: |
            $LibTemplateBranch = & ./tools/Get-LibTemplateBasis.ps1 -ErrorIfNotRelated
            if ($LASTEXITCODE -ne 0) {
              exit $LASTEXITCODE
            }

            git fetch https://github.com/aarnott/Library.Template $LibTemplateBranch
            if ($LASTEXITCODE -ne 0) {
              exit $LASTEXITCODE
            }
            $LibTemplateCommit = git rev-parse FETCH_HEAD

            if ((git rev-list FETCH_HEAD ^HEAD --count) -eq 0) {
              Write-Host "There are no Library.Template updates to merge."
              exit 0
            }

            $UpdateBranchName = 'auto/libtemplateUpdate'
            git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" push origin -f FETCH_HEAD:refs/heads/$UpdateBranchName

            Write-Host "Creating pull request"
            $contentType = 'application/json';
            $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
            $rawRequest = @{
              sourceRefName = "refs/heads/$UpdateBranchName";
              targetRefName = "refs/heads/main";
              title = 'Merge latest Library.Template';
              description = "This merges the latest features and fixes from [Library.Template's $LibTemplateBranch branch](https://github.com/AArnott/Library.Template/tree/$LibTemplateBranch).";
            }
            $request = ConvertTo-Json $rawRequest

            $prApiBaseUri = '$(System.TeamFoundationCollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/pullrequests'
            $prCreationUri = $prApiBaseUri + "?api-version=6.0"
            Write-Host "POST $prCreationUri"
            Write-Host $request

            $prCreationResult = Invoke-RestMethod -uri $prCreationUri -method POST -Headers $headers -ContentType $contentType -Body $request
            $prUrl = "$($prCreationResult.repository.webUrl)/pullrequest/$($prCreationResult.pullRequestId)"
            Write-Host "Pull request: $prUrl"
            $prApiBaseUri += "/$($prCreationResult.pullRequestId)"

            $SummaryPath = Join-Path '$(Agent.TempDirectory)' 'summary.md'
            Set-Content -Path $SummaryPath -Value "[Insertion pull request]($prUrl)"
            Write-Host "##vso[task.uploadsummary]$SummaryPath"

            # Tag the PR
            $tagUri = "$prApiBaseUri/labels?api-version=7.0"
            $rawRequest = @{
              name = 'auto-template-merge';
            }
            $request = ConvertTo-Json $rawRequest
            Invoke-RestMethod -uri $tagUri -method POST -Headers $headers -ContentType $contentType -Body $request | Out-Null

            # Add properties to the PR that we can programatically parse later.
            Function Set-PRProperties($properties) {
              $rawRequest = $properties.GetEnumerator() |% {
                @{
                  op = 'add'
                  path = "/$($_.key)"
                  from = $null
                  value = $_.value
                }
              }
              $request = ConvertTo-Json $rawRequest
              $setPrPropertyUri = "$prApiBaseUri/properties?api-version=7.0"
              Write-Debug "$request"
              $setPrPropertyResult = Invoke-RestMethod -uri $setPrPropertyUri -method PATCH -Headers $headers -ContentType 'application/json-patch+json' -Body $request -StatusCodeVariable setPrPropertyStatus -SkipHttpErrorCheck
              if ($setPrPropertyStatus -ne 200) {
                Write-Host "##vso[task.logissue type=warning]Failed to set pull request properties. Result: $setPrPropertyStatus. $($setPrPropertyResult.message)"
              }
            }
            Write-Host "Setting pull request properties"
            Set-PRProperties @{
              'AutomatedMerge.SourceBranch' = $LibTemplateBranch
              'AutomatedMerge.SourceCommit' = $LibTemplateCommit
            }

            # Add an *active* PR comment to warn users to *merge* the pull request instead of squash it.
            $request = ConvertTo-Json @{
              comments = @(
                @{
                  parentCommentId = 0
                  content = "Do **not** squash this pull request when completing it. You must *merge* it."
                  commentType = 'system'
                }
              )
              status = 'active'
            }
            $result = Invoke-RestMethod -uri "$prApiBaseUri/threads?api-version=7.1" -method POST -Headers $headers -ContentType $contentType -Body $request -StatusCodeVariable addCommentStatus -SkipHttpErrorCheck
            if ($addCommentStatus -ne 200) {
              Write-Host "##vso[task.logissue type=warning]Failed to post comment on pull request. Result: $addCommentStatus. $($result.message)"
            }

            # Set auto-complete on the PR
            if ('${{ parameters.AutoComplete }}' -eq 'True') {
              Write-Host "Setting auto-complete"
              $mergeMessage = "Merged PR $($prCreationResult.pullRequestId): " + $commitMessage
              $rawRequest = @{
                autoCompleteSetBy = @{
                  id = $prCreationResult.createdBy.id
                };
                completionOptions = @{
                  deleteSourceBranch = $true;
                  mergeCommitMessage = $mergeMessage;
                  mergeStrategy = 'noFastForward';
                };
              }
              $request = ConvertTo-Json $rawRequest
              Write-Host $request
              $uri = "$($prApiBaseUri)?api-version=6.0"
              $result = Invoke-RestMethod -uri $uri -method PATCH -Headers $headers -ContentType $contentType -Body $request -StatusCodeVariable autoCompleteStatus -SkipHttpErrorCheck
              if ($autoCompleteStatus -ne 200) {
                Write-Host "##vso[task.logissue type=warning]Failed to set auto-complete on pull request. Result: $autoCompleteStatus. $($result.message)"
              }
            }

          displayName: Create pull request


================================================
FILE: azure-pipelines/microbuild.after.yml
================================================
parameters:
- name: SkipCodesignVerify
  type: boolean

steps:
- ${{ if not(parameters.SkipCodesignVerify) }}:
  - task: MicroBuildCodesignVerify@3
    displayName: 🔍 Verify Signed Files
    inputs:
      ApprovalListPathForSigs: $(Build.SourcesDirectory)\azure-pipelines\no_strongname.txt
      ApprovalListPathForCerts: $(Build.SourcesDirectory)\azure-pipelines\no_authenticode.txt
      TargetFolders: |
        $(Build.SourcesDirectory)/bin/Packages/$(BuildConfiguration)
    condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))


================================================
FILE: azure-pipelines/microbuild.before.yml
================================================
parameters:
- name: EnableLocalization
  type: boolean
  default: false
- name: ShouldSkipOptimize
  type: boolean
  default: false
- name: RealSign
  type: boolean

steps:
- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:
  # notice@0 requires CG detection to run first, and non-default branches don't inject it automatically.
  # default branch injection (main) is happening too late for notice@0 to run successfully. Adding this as a workaround.
  - task: ComponentGovernanceComponentDetection@0
    displayName: 🔍 Component Detection

  - task: notice@0
    displayName: 🛠️ Generate NOTICE file
    inputs:
      outputfile: $(System.DefaultWorkingDirectory)/obj/NOTICE
      outputformat: text
    retryCountOnTaskFailure: 10 # fails when the cloud service is overloaded
    continueOnError: ${{ not(parameters.RealSign) }} # Tolerate failures when we're not building something that may ship.


================================================
FILE: azure-pipelines/no_authenticode.txt
================================================
bin\packages\release\vsix\_manifest\manifest.cat,sbom signed
bin\packages\release\vsix\_manifest\spdx_2.2\manifest.cat,sbom signed


================================================
FILE: azure-pipelines/no_strongname.txt
================================================


================================================
FILE: azure-pipelines/official.yml
================================================
trigger:
  branches:
    include:
    - main

schedules:
# Monthly compliance sweep: runs at 03:00 UTC (8 PM PST previous day) on the 1st of every month.
# `always: true` ensures it runs even if there have been no code changes since the last successful build,
# so we can detect regressions in compliance tooling (APIScan, PoliCheck, CodeSignValidation, etc.).
- cron: "0 3 1 * *"
  displayName: Monthly compliance sweep
  branches:
    include:
    - main
  always: true


parameters:
# As an entrypoint pipeline yml file, all parameters here show up in the Queue Run dialog.
# If any paramaters should NOT be queue-time options, they should be removed from here
# and references to them in this file replaced with hard-coded values.
# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.
#   displayName: Skip OptProf optimization
#   type: boolean
#   default: false
- name: EnableMacOSBuild
  displayName: Build on macOS
  type: boolean
  default: false # macOS is often bogged down in Azure Pipelines
- name: RunTests
  displayName: Run tests
  type: boolean
  default: true
- name: EnableAPIScan
  displayName: Include APIScan with compliance tools
  type: boolean
  default: true # enable in individual repos only AFTER updating TSAOptions.json with your own values
- name: PublishCodeCoverage
  displayName: Publish code coverage
  type: boolean
  default: true

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release

variables:
- template: GlobalVariables.yml

extends:
  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool: VSEng-MicroBuildVSStable
      codeSignValidation:
        enabled: true
        break: true
        additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|LocBin-*\**;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**;-|$(Build.ArtifactStagingDirectory)\VSInsertion-Windows\vs-insertion-script.ps1
      policheck:
        enabled: true
        exclusionsFile: $(System.DefaultWorkingDirectory)\azure-pipelines\PoliCheckExclusions.xml
      suppression:
        suppressionFile: $(System.DefaultWorkingDirectory)\azure-pipelines\falsepositives.gdnsuppress
      sbom:
        enabled: false # Skip 1ES SBOM because microbuild has our own sbom system
    stages:
    - stage: Build
      variables:
      - template: /azure-pipelines/BuildStageVariables.yml@self
      jobs:
      - template: /azure-pipelines/build.yml@self
        parameters:
          Is1ESPT: true
          Is1ESPTOfficial: true
          RealSign: true
          # ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
          EnableAPIScan: ${{ parameters.EnableAPIScan }}
          windowsPool: VSEng-MicroBuildVSStable
          linuxPool:
            name: AzurePipelines-EO
            demands:
            - ImageOverride -equals 1ESPT-Ubuntu22.04
            os: Linux
          macOSPool:
            name: Azure Pipelines
            vmImage: macOS-15
            os: macOS
          EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
          RunTests: ${{ parameters.RunTests }}
          PublishCodeCoverage: ${{ parameters.PublishCodeCoverage }}
    - template: /azure-pipelines/prepare-insertion-stages.yml@self
      parameters:
        RealSign: true


================================================
FILE: azure-pipelines/prepare-insertion-stages.yml
================================================
parameters:
- name: ArchiveSymbols
  type: boolean
  default: true
- name: RealSign
  displayName: Real sign?
  type: boolean
- name: PackagePush
  type: boolean
  default: false # Switch to true to enable the push job below

stages:
- ${{ if or(parameters.ArchiveSymbols, parameters.PackagePush) }}:
  - stage: release
    displayName: Publish
    jobs:
    - ${{ if parameters.ArchiveSymbols }}:
      - job: symbol_archive
        displayName: Archive symbols
        pool: VSEng-MicroBuildVSStable
        variables:
          ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here
        steps:
        - checkout: none
        - download: current
          artifact: Variables-Windows
          displayName: 🔻 Download Variables-Windows artifact
        - powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1
          displayName: ⚙️ Set pipeline variables based on artifacts
        - download: current
          artifact: symbols-legacy
          displayName: 🔻 Download symbols-legacy artifact
        - task: MicroBuildArchiveSymbols@6
          displayName: 🔣 Archive symbols to Symweb
          inputs:
            SymbolsFeatureName: $(SymbolsFeatureName)
            SymbolsProject: VS
            SymbolsAgentPath: $(Pipeline.Workspace)/symbols-legacy
            azureSubscription: Vseng-SymbolsUpload
          env:
            SYSTEM_ACCESSTOKEN: $(System.AccessToken)

    - ${{ if parameters.PackagePush }}:
      - job: push
        ${{ if parameters.RealSign }}:
          displayName: azure-public/vs-impl feed
        ${{ else }}:
          displayName: devdiv/vs-impl feed # Leave this as-is, since non-signed builds must not be pushed to public feeds.
        ${{ if parameters.ArchiveSymbols }}:
          dependsOn: symbol_archive
        pool:
          name: AzurePipelines-EO
          demands:
          - ImageOverride -equals 1ESPT-Ubuntu22.04
          os: Linux
        templateContext:
          outputs:
          - output: nuget
            displayName: 📦 Push nuget packages
            packagesToPush: '$(Pipeline.Workspace)/deployables-Windows/NuGet/*.nupkg'
            packageParentPath: $(Pipeline.Workspace)/deployables-Windows/NuGet
            allowPackageConflicts: true
            ${{ if parameters.RealSign }}:
              nuGetFeedType: external
              publishFeedCredentials: azure-public/vs-impl
            ${{ else }}:
              nuGetFeedType: internal
              publishVstsFeed: vs-impl # Leave this as-is, since non-signed builds must not be pushed to public feeds.
        variables:
          ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here
        steps:
        - checkout: none
        - download: current
          artifact: Variables-Windows
          displayName: 🔻 Download Variables-Windows artifact
        - powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1
          displayName: ⚙️ Set pipeline variables based on artifacts
        - download: current
          artifact: deployables-Windows
          displayName: 🔻 Download deployables-Windows artifact
        - ${{ if parameters.RealSign }}:
          - template: WIFtoPATauth.yml
            parameters:
              wifServiceConnectionName: azure-public/vside package push
              deadPATServiceConnectionId: 207efd62-fd0f-43e7-aeae-17c4febcc660 # azure-public/vs-impl


================================================
FILE: azure-pipelines/publish-codecoverage.yml
================================================
parameters:
- name: EnableMacOSBuild
  type: boolean
- name: EnableLinuxBuild
  type: boolean

steps:
- download: current
  artifact: coverageResults-Windows
  displayName: 🔻 Download Windows code coverage results
  continueOnError: true
- ${{ if parameters.EnableLinuxBuild }}:
  - download: current
    artifact: coverageResults-Linux
    displayName: 🔻 Download Linux code coverage results
    continueOnError: true
- ${{ if parameters.EnableMacOSBuild }}:
  - download: current
    artifact: coverageResults-macOS
    displayName: 🔻 Download macOS code coverage results
    continueOnError: true
- powershell: azure-pipelines/Merge-CodeCoverage.ps1 -Path '$(Pipeline.Workspace)' -OutputFile coveragereport/merged.cobertura.xml -Format Cobertura -Verbose
  displayName: ⚙ Merge coverage
- task: PublishCodeCoverageResults@2
  displayName: 📢 Publish code coverage results to Azure DevOps
  inputs:
    summaryFileLocation: coveragereport/merged.cobertura.xml
    failIfCoverageEmpty: true


================================================
FILE: azure-pipelines/publish-symbols.yml
================================================
parameters:
- name: EnableMacOSBuild
  type: boolean
- name: EnableLinuxBuild
  type: boolean

steps:
- task: DownloadPipelineArtifact@2
  inputs:
    artifact: symbols-Windows
    path: $(Pipeline.Workspace)/symbols/Windows
  displayName: 🔻 Download Windows symbols
  continueOnError: true
- ${{ if parameters.EnableLinuxBuild }}:
  - task: DownloadPipelineArtifact@2
    inputs:
      artifact: symbols-Linux
      path: $(Pipeline.Workspace)/symbols/Linux
    displayName: 🔻 Download Linux symbols
    continueOnError: true
- ${{ if parameters.EnableMacOSBuild }}:
  - task: DownloadPipelineArtifact@2
    inputs:
      artifact: symbols-macOS
      path: $(Pipeline.Workspace)/symbols/macOS
    displayName: 🔻 Download macOS symbols
    continueOnError: true

- task: DownloadPipelineArtifact@2
  inputs:
    artifact: test_symbols-Windows
    path: $(Pipeline.Workspace)/test_symbols/Windows
  displayName: 🔻 Download Windows test symbols
  continueOnError: true
- ${{ if parameters.EnableLinuxBuild }}:
  - task: DownloadPipelineArtifact@2
    inputs:
      artifact: test_symbols-Linux
      path: $(Pipeline.Workspace)/test_symbols/Linux
    displayName: 🔻 Download Linux test symbols
    continueOnError: true
- ${{ if parameters.EnableMacOSBuild }}:
  - task: DownloadPipelineArtifact@2
    inputs:
      artifact: test_symbols-macOS
      path: $(Pipeline.Workspace)/test_symbols/macOS
    displayName: 🔻 Download macOS test symbols
    continueOnError: true

- task: PublishSymbols@2
  inputs:
    SymbolsFolder: $(Pipeline.Workspace)/symbols
    SearchPattern: '**/*.pdb'
    IndexSources: false
    SymbolServerType: TeamServices
  displayName: 📢 Publish symbols

- task: PublishSymbols@2
  inputs:
    SymbolsFolder: $(Pipeline.Workspace)/test_symbols
    SearchPattern: '**/*.pdb'
    IndexSources: false
    SymbolServerType: TeamServices
  displayName: 📢 Publish test symbols

- powershell: tools/Prepare-Legacy-Symbols.ps1 -Path $(Pipeline.Workspace)/symbols/Windows
  displayName: ⚙ Prepare symbols for symbol archival


================================================
FILE: azure-pipelines/publish_artifacts.ps1
================================================
<#
.SYNOPSIS
    This script translates all the artifacts described by _all.ps1
    into commands that instruct Azure Pipelines to actually collect those artifacts.
#>

[CmdletBinding()]
param (
    [string]$ArtifactNameSuffix,
    [switch]$StageOnly,
    [switch]$AvoidSymbolicLinks
)

Function Set-PipelineVariable($name, $value) {
    if ((Test-Path "Env:\$name") -and (Get-Item "Env:\$name").Value -eq $value) {
        return # already set
    }

    #New-Item -LiteralPath "Env:\$name".ToUpper() -Value $value -Force | Out-Null
    Write-Host "##vso[task.setvariable variable=$name]$value"
}

Function Test-ArtifactUploaded($artifactName) {
    $varName = "ARTIFACTUPLOADED_$($artifactName.ToUpper())"
    Test-Path "env:$varName"
}

& "$PSScriptRoot/../tools/artifacts/_stage_all.ps1" -ArtifactNameSuffix $ArtifactNameSuffix -AvoidSymbolicLinks:$AvoidSymbolicLinks |% {
    # Set a variable which will out-live this script so that a subsequent attempt to collect and upload artifacts
    # will skip this one from a check in the _all.ps1 script.
    Set-PipelineVariable "ARTIFACTSTAGED_$($_.Name.ToUpper())" 'true'
    Write-Host "Staged artifact $($_.Name) to $($_.Path)"

    if (!$StageOnly) {
        if (Test-ArtifactUploaded $_.Name) {
            Write-Host "Skipping $($_.Name) because it has already been uploaded." -ForegroundColor DarkGray
        } else {
            Write-Host "##vso[artifact.upload containerfolder=$($_.Name);artifactname=$($_.Name);]$($_.Path)"

            # Set a variable which will out-live this script so that a subsequent attempt to collect and upload artifacts
            # will skip this one from a check in the _all.ps1 script.
            Set-PipelineVariable "ARTIFACTUPLOADED_$($_.Name.ToUpper())" 'true'
        }
    }
}


================================================
FILE: azure-pipelines/release-deployment-prep.yml
================================================
steps:
- download: CI
  artifact: Variables-Windows
  displayName: 🔻 Download Variables-Windows artifact
- powershell: $(Pipeline.Workspace)/CI/Variables-Windows/_define.ps1
  displayName: ⚙️ Set pipeline variables based on artifacts


================================================
FILE: azure-pipelines/release.yml
================================================
trigger: none # We only want to trigger manually or based on resources
pr: none

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release
  pipelines:
  - pipeline: CI
    source: slow-cheetah-ci
    trigger:
      tags:
      - auto-release

variables:
- template: GlobalVariables.yml

extends:
  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool: VSEng-MicroBuildVSStable

    stages:
    - stage: release
      jobs:
      - job: nuget
        displayName: 📦 Push nuget.org packages
        pool:
          name: AzurePipelines-EO
          demands:
          - ImageOverride -equals 1ESPT-Ubuntu22.04
          os: Linux
        templateContext:
          outputs:
          - output: nuget
            displayName: 📦 Push packages to nuget.org
            packagesToPush: '$(Pipeline.Workspace)/CI/deployables-Windows/NuGet/*.nupkg'
            packageParentPath: $(Pipeline.Workspace)/CI/deployables-Windows/NuGet
            allowPackageConflicts: true
            nuGetFeedType: external
            publishFeedCredentials: VisualStudioExtensibility (nuget.org)
        steps:
        - checkout: none
        - download: CI
          artifact: deployables-Windows
          displayName: 🔻 Download deployables-Windows artifact
          patterns: 'NuGet/*'
      - job: github
        displayName: 📢 GitHub release
        dependsOn: nuget
        pool:
          name: AzurePipelines-EO
          demands:
          - ImageOverride -equals 1ESPT-Ubuntu22.04
          os: Linux
        templateContext:
          type: releaseJob
          isProduction: true
          inputs:
          - input: pipelineArtifact
            pipeline: CI
            artifactName: deployables-Windows
            targetPath: $(Pipeline.Workspace)/CI/deployables-Windows
        steps:
        - checkout: none
        - powershell: |
            Write-Host "##vso[build.updatebuildnumber]$(resources.pipeline.CI.runName)"
            if ('$(resources.pipeline.CI.runName)'.Contains('-')) {
              Write-Host "##vso[task.setvariable variable=IsPrerelease]true"
            } else {
              Write-Host "##vso[task.setvariable variable=IsPrerelease]false"
            }
          displayName: ⚙ Set up pipeline
        - task: GitHubRelease@1
          displayName: 📢 GitHub release (create)
          inputs:
            gitHubConnection: ttstanley # service connection
            repositoryName: $(Build.Repository.Name)
            target: $(resources.pipeline.CI.sourceCommit)
            tagSource: userSpecifiedTag
            tag: v$(resources.pipeline.CI.runName)
            title: v$(resources.pipeline.CI.runName)
            isDraft: true # After running this step, visit the new draft release, edit, and publish.
            isPreRelease: $(IsPrerelease)
            assets: $(Pipeline.Workspace)/CI/deployables-Windows/NuGet/*.nupkg
            changeLogCompareToRelease: lastNonDraftRelease
            changeLogType: issueBased
            changeLogLabels: |
              [
                { "label" : "breaking change", "displayName" : "Breaking changes", "state" : "closed" },
                { "label" : "bug", "displayName" : "Fixes", "state" : "closed" },
                { "label" : "enhancement", "displayName": "Enhancements", "state" : "closed" }
              ]


================================================
FILE: azure-pipelines/unofficial.yml
================================================
trigger:
  batch: true
  branches:
    include:
    - main
    - microbuild
    - 'validate/*'
  paths:
    exclude:
    - doc/
    - '*.md'
    - .vscode/
    - azure-pipelines/release.yml
    - azure-pipelines/vs-insertion.yml

parameters:
# As an entrypoint pipeline yml file, all parameters here show up in the Queue Run dialog.
# If any paramaters should NOT be queue-time options, they should be removed from here
# and references to them in this file replaced with hard-coded values.
# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.
#   displayName: Skip OptProf optimization
#   type: boolean
#   default: false
- name: EnableMacOSBuild
  displayName: Build on macOS
  type: boolean
  default: false # macOS is often bogged down in Azure Pipelines
- name: RunTests
  displayName: Run tests
  type: boolean
  default: true
- name: EnableAPIScan
  displayName: Include APIScan with compliance tools
  type: boolean
  default: false
- name: EnableProductionSDL
  displayName: Enable Production SDL
  type: boolean
  default: false
- name: PublishCodeCoverage
  displayName: Publish code coverage
  type: boolean
  default: true

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release

variables:
- template: GlobalVariables.yml

extends:
  template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool: VSEng-MicroBuildVSStable
      credscan:
        enabled: false
      suppression:
        suppressionFile: $(System.DefaultWorkingDirectory)\azure-pipelines\falsepositives.gdnsuppress
      enableProductionSDL: ${{ parameters.EnableProductionSDL }}
      codeSignValidation:
        enabled: ${{ parameters.EnableProductionSDL }}
        break: true
        additionalTargetsGlobPattern: -|Variables-*\*.ps1;-|APIScanInputs-*\**;-|test_symbols-*\**;-|MicroBuild\**;-|$(Build.ArtifactStagingDirectory)\VSInsertion-Windows\vs-insertion-script.ps1
        policyFile: $(MBSIGN_APPFOLDER)\CSVTestSignPolicy.xml
      policheck:
        enabled: ${{ parameters.EnableProductionSDL }}
        exclusionsFile: $(System.DefaultWorkingDirectory)\azure-pipelines\PoliCheckExclusions.xml
      sbom:
        enabled: false # Skip 1ES SBOM because microbuild has our own sbom system
    stages:
    - stage: Build
      variables:
      - template: /azure-pipelines/BuildStageVariables.yml@self
      jobs:
      - template: /azure-pipelines/build.yml@self
        parameters:
          Is1ESPT: true
          RealSign: false
          # ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
          EnableAPIScan: ${{ parameters.EnableAPIScan }}
          windowsPool: VSEng-MicroBuildVSStable
          linuxPool:
            name: AzurePipelines-EO
            demands:
            - ImageOverride -equals 1ESPT-Ubuntu22.04
            os: Linux
          macOSPool:
            name: Azure Pipelines
            vmImage: macOS-15
            os: macOS
          EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
          RunTests: ${{ parameters.RunTests }}
          PublishCodeCoverage: ${{ parameters.PublishCodeCoverage }}


================================================
FILE: azure-pipelines/vs-insertion-script.ps1
================================================
# List of build artifact files [Source => Destination] to be committed into the VS repo.
$FilesToCommit = @{
    "$env:PROFILINGINPUTSPROPSNAME" = "src/Tests/config/runsettings/Official/OptProf/External/$env:PROFILINGINPUTSPROPSNAME";
}

foreach ($File in $FilesToCommit.GetEnumerator()) {
    $SourcePath = Join-Path $PSScriptRoot $File.Key
    if (Test-Path $SourcePath) {
        $DestinationPath = Join-Path (Get-Location) $File.Value
        Write-Host "Copying $SourcePath to $DestinationPath"
        Copy-Item -Path $SourcePath -Destination $DestinationPath
        git add $DestinationPath
    }
    else {
        Write-Host "$SourcePath is not present, skipping"
    }
}


================================================
FILE: azure-pipelines/vs-insertion.yml
================================================
trigger: none # We only want to trigger manually or based on resources
pr: none

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release
  pipelines:
  - pipeline: CI
    source: Library # TODO: This should match the name of your CI pipeline
    tags:
    - Real signed
    trigger:
      tags:
      - Real signed

variables:
- template: GlobalVariables.yml

extends:
  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool: VSEng-MicroBuildVSStable
      sbom:
        enabled: false

    stages:
    - stage: insertion
      jobs:
      - job: insertion
        displayName: VS insertion
        pool: VSEng-MicroBuildVSStable
        templateContext:
          outputParentDirectory: $(Pipeline.Workspace)/CI
        steps:
        - checkout: none
        - powershell: Write-Host "##vso[build.updatebuildnumber]$(resources.pipeline.CI.runName)"
          displayName: ⚙️ Set pipeline name
        - template: azure-pipelines/release-deployment-prep.yml@self
        - download: CI
          artifact: VSInsertion-Windows
          displayName: 🔻 Download VSInsertion-Windows artifact
        - ${{ if eq(variables['ContainsVsix'], 'true') }}:
          - task: 1ES.MicroBuildVstsDrop@1
            displayName: 🔺 Upload VSTS Drop
            inputs:
              dropFolder: $(Pipeline.Workspace)/CI/VSInsertion-windows/Vsix
              dropName: $(VstsDropNames)
              accessToken: $(System.AccessToken)
        - task: 1ES.PublishNuget@1
          displayName: 📦 Push VS-repo packages to VS feed
          inputs:
            packagesToPush: '$(Pipeline.Workspace)/CI/VSInsertion-Windows/*.nupkg'
            packageParentPath: $(Pipeline.Workspace)/CI/VSInsertion-Windows
            allowPackageConflicts: true
            publishVstsFeed: VS
        - task: MicroBuildInsertVsPayload@5
          displayName: 🏭 Insert VS Payload
          inputs:
            TeamName: $(TeamName)
            TeamEmail: $(TeamEmail)
            InsertionPayloadName: $(Build.Repository.Name) $(Build.BuildNumber)
            InsertionBuildPolicies: Request Perf DDRITs
            InsertionReviewers: $(Build.RequestedFor) # Append `,Your team name` (without quotes)
            CustomScriptExecutionCommand: $(Pipeline.Workspace)\CI\VSInsertion-Windows\vs-insertion-script.ps1
            AutoCompletePR: true
            AutoCompleteMergeStrategy: Squash
            ShallowClone: true
            ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
              ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'
          env:
            SYSTEM_ACCESSTOKEN: $(System.AccessToken)

        - powershell: |
            $contentType = 'application/json';
            $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
            $rawRequest = @{ daysValid = 365 * 2; definitionId = $(resources.pipeline.CI.pipelineID); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(resources.pipeline.CI.runId) };
            $request = ConvertTo-Json @($rawRequest);
            Write-Host $request
            $uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
            Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;
          displayName: 🗻 Retain inserted builds


================================================
FILE: azure-pipelines/vs-validation.yml
================================================
# This is a top-level pipeline file, which is designed to be added as an optional PR build policy
# so that a VS insertion and all the validation that entails can be done before ever merging the PR
# in its original repo.

trigger: none # We only want to trigger manually or based on resources
pr: none

# parameters:
# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.
#   displayName: Skip OptProf optimization
#   type: boolean
#   default: false

resources:
  repositories:
  - repository: MicroBuildTemplate
    type: git
    name: 1ESPipelineTemplates/MicroBuildTemplate
    ref: refs/tags/release

variables:
- template: GlobalVariables.yml
- name: MicroBuild_NuPkgSigningEnabled
  value: false # test-signed nuget packages fail to restore in the VS insertion PR validations. Just don't sign them *at all*.

extends:
  template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate
  parameters:
    sdl:
      sourceAnalysisPool: VSEng-MicroBuildVSStable
      credscan:
        enabled: false

    stages:
    - stage: Build
      variables:
      - template: /azure-pipelines/BuildStageVariables.yml@self
      - name: SkipCodesignVerify
        value: true

      jobs:
      - template: /azure-pipelines/build.yml@self
        parameters:
          Is1ESPT: true
          RealSign: false
          # ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}
          windowsPool: VSEng-MicroBuildVSStable
          linuxPool:
            name: AzurePipelines-EO
            demands:
            - ImageOverride -equals 1ESPT-Ubuntu22.04
            os: Linux
          macOSPool:
            name: Azure Pipelines
            vmImage: macOS-15
            os: macOS
          EnableMacOSBuild: false
          RunTests: false
          SkipCodesignVerify: true

    - template: /azure-pipelines/prepare-insertion-stages.yml@self
      parameters:
        ArchiveSymbols: false
        RealSign: false

    - stage: insertion
      displayName: VS insertion
      jobs:
      - job: insertion
        displayName: VS insertion
        pool: VSEng-MicroBuildVSStable
        steps:
        - checkout: self
          clean: true
          fetchDepth: 1
        - download: current
          artifact: Variables-Windows
          displayName: 🔻 Download Variables-Windows artifact
        - powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1
          displayName: ⚙️ Set pipeline variables based on artifacts
        - download: current
          artifact: VSInsertion-Windows
          displayName: 🔻 Download VSInsertion-Windows artifact
        - ${{ if eq(variables['ContainsVsix'], 'true') }}:
          - task: 1ES.MicroBuildVstsDrop@1
            displayName: 🔺 Upload VSTS Drop
            inputs:
              dropFolder: $(Pipeline.Workspace)/VSInsertion-windows/Vsix
              dropName: $(VstsDropNames)
              accessToken: $(System.AccessToken)
        - task: 1ES.PublishNuget@1
          displayName: 📦 Push VS-repo packages to VS feed
          inputs:
            packagesToPush: '$(Pipeline.Workspace)/VSInsertion-Windows/*.nupkg'
            packageParentPath: $(Pipeline.Workspace)/VSInsertion-Windows
            allowPackageConflicts: true
            publishVstsFeed: VS
        - task: MicroBuildInsertVsPayload@5
          displayName: 🏭 Insert VS Payload
          inputs:
            TeamName: $(TeamName)
            TeamEmail: $(TeamEmail)
            InsertionPayloadName: $(Build.Repository.Name) VALIDATION BUILD $(Build.BuildNumber) ($(Build.SourceBranch)) [Skip-SymbolCheck] [Skip-HashCheck] [Skip-SignCheck]
            InsertionDescription: |
              This PR is for **validation purposes only** for !$(System.PullRequest.PullRequestId). **Do not complete**.
            CustomScriptExecutionCommand: $(Pipeline.Workspace)\VSInsertion-Windows\vs-insertion-script.ps1; src\VSSDK\NuGet\AllowUnstablePackages.ps1
            InsertionBuildPolicies: Request Perf DDRITs
            InsertionReviewers: $(Build.RequestedFor)
            DraftPR: false # set to true and update InsertionBuildPolicy when we can specify all the validations we want to run (https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2224288)
            AutoCompletePR: false
            ShallowClone: true
            ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:
              ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'
          env:
            SYSTEM_ACCESSTOKEN: $(System.AccessToken)
        - powershell: |
            $insertionPRId = azure-pipelines/Get-InsertionPRId.ps1
            $Markdown = @"
            Validation insertion pull request created: !$insertionPRId
            Please check status there before proceeding to merge this PR.
            Remember to Abandon and (if allowed) to Delete Source Branch on that insertion PR when validation is complete.
            "@
            azure-pipelines/PostPRMessage.ps1 -AccessToken '$(System.AccessToken)' -Markdown $Markdown -Verbose
          displayName: ✏️ Comment on pull request
          condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))


================================================
FILE: azure-pipelines.yml
================================================
trigger:
  batch: true
  branches:
    include:
    - main
    - 'v*.*'
    - microbuild
    - 'validate/*'
  paths:
    exclude:
    - doc/
    - '*.md'
    - .vscode/
    - .github/
    - azure-pipelines/release.yml

parameters:
- name: EnableMacOSBuild
  displayName: Build on macOS
  type: boolean
  default: false # macOS is often bogged down in Azure Pipelines
- name: RunTests
  displayName: Run tests
  type: boolean
  default: true

variables:
- template: /azure-pipelines/BuildStageVariables.yml@self

jobs:
- template: azure-pipelines/build.yml
  parameters:
    Is1ESPT: false
    EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}
    RunTests: ${{ parameters.RunTests }}


================================================
FILE: doc/targets.md
================================================
# SlowCheetah Build Targets

### Summary
SlowCheetah alters the build process for projects to ensure that the transformations are executed in the correct order and that the transformed files are used properly. To allow users to extend the behavior for their own build process, this document outlines all the native targets for SlowCheetah, including properties and items that can be modified to alter existing target behavior.

## Main

### Targets

**ScCollectTransformFiles**: Collects all the files with *TransformOnBuild* true and adds them to *ScFilesToTransform*, with the necessary metadata for transformation. Runs before *ScApplyTransforms*.

**ScApplyTransforms**: First creates the destination directory for all the transformations that will occur. Then, applies the transform task to each item of *ScFilesToTransform* per their metadata. Runs after *CopyFilesToOutputDirectory*.

### Properties

**ScAllowReferencedConfig**: Whether config files from referenced projects are allowed when resolving references. Defaults to true.

**BuildDependsOn**: List of targets that should be run as part of the build process. *ScApplyTransforms* get appended to this.

### ItemGroups

**ScFilesToTransform**: Populated in ScCollectTransformationFiles. Contains all the data for files that should be transformed. Metadata:

- *SourceFile*: Transformation source.

- *TransformFile*: Transformation input.

- *DestinationFile*: Output file of transformation. The directory for this file is created in case it does not previously exist.

## App

### Targets

**ScCollectAppFiles**: Removes the app.config file from *ScFilesToTransform* and adds it to ScAppConfigToTransform for separate transformation. Copies the original app.config to *ScIntermediateAppConfig*. Depends on *ScCollectTransformFiles*. Runs before *ScApplyTransforms*.

**ScTransformAppConfig**: Performs transformations on *ScIntermediateAppConfig*. Replaces the app config location before it is copied to the output. Depends on *ScCollectAppFiles*. Runs before *_CopyAppConfig*.

### Properties

**ScIsApp**: Whether the project is an application. Used in *SetupProject* and *ClickOnce* targets. If *ScIsWap* is true, sets to false. Defaults to true.

**ScAppConfigName**: Name of the application configuration file that should be especially transformed. Defaults to “app.config”.

### Item Groups

**ScAppConfigToTransform**: Populated in *ScCollectAppFiles*. Contains data for application configuration files that should be transformed. For metadata, see *ScFilesToTransform*.

## Web

### Targets

**ScCollectWebFiles**: Gets the publish configuration and adds publish transformation data to ScFilesToTransform. Depends on *ScCollectTransformFiles*. Runs before *ScApplyWebTransforms*.

**ScApplyWebTransforms**: Inserted into the deploy pipeline. Depends on *ScApplyTransforms*.

### Properties

**ScIsWap**: Whether the project is a web application. Verifies the project GUIDs. Defaults to false.

**ScAppConfigName**: Changed to “web.config”.

### ItemGroups

**ScFilesToTransform**: Adds publish transform metadata:
- *PublishDestinationFile*: Location of the temporary directory used to publish from
- *PublishTransformFile*: Location of the publish profile transform file.

## Additional Targets

### SetupProject

Ensures a Setup Project uses the correct location for copying output files. Enabled if *ScEnableSetupProjects* is true (default is true).

### ClickOnce

Ensures that the published files are extracted from the correct location for Click Once publishing.

================================================
FILE: doc/transforming_files.md
================================================
# Transforming Files with SlowCheetah

## Summary
The [SlowCheetah Visual Studio extension](https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms) allows you to add and preview transformation to files in your project.

The [SlowCheetah NuGet package](https://www.nuget.org/packages/Microsoft.VisualStudio.SlowCheetah) is required for build-time transformations, which are discussed in more detail below.

## Getting Started

Once the SlowCheetah extension has been installed, transformations are added by right-clicking a file. If the file type is supported, the `Add Transform` option should be visible.

![Add Transform](AddTransforms.png)

Selecting this option will add transform files according to your project's [build configurations](https://docs.microsoft.com/en-us/visualstudio/ide/understanding-build-configurations). If the project has any publish profiles, transform files are also created for them.

![Transform files](TransformFiles.png)

To quickly preview the transformations, right-click any of the transform files and select the `Preview Transform` option.

![Transform files](PreviewTransform.png)

![Transform files](PreviewDiff.png)

## Executing Build-Time Transformations

The SlowCheetah NuGet package adds transformations logic to the build process of the project. By adding transforms using the extension and having the package installed to the project, transformations will be executed on build.

It is possible to perform build-time transformation using only the NuGet package. Files that should be transformed require the `TransformOnBuild` metadata set to true. Files that specify the transformations should have the `IsTransformFile` metadata set to true. If your project supports the `DependentUpon` metadata, add that to the transform files, specifying the original file. The resulting project file would look similar to this:

``` xml
<None Include="App.config">
    <TransformOnBuild>true</TransformOnBuild>
</None>
<None Include="App.Debug.config">
    <DependentUpon>App.config</DependentUpon>
    <IsTransformFile>True</IsTransformFile>
</None>
<None Include="App.Release.config">
    <DependentUpon>App.config</DependentUpon>
    <IsTransformFile>True</IsTransformFile>
</None>
```


================================================
FILE: doc/update.md
================================================
# SlowCheetah in VS 2017 

We have made significant changes to the SlowCheetah extension and NuGet package. This is because the old version had the following limitations:
- Installation methods were inconsistent throughout versions, mixing VS extensions with NuGet packages
- Build tools were installed directly to the local app data
- Users' project files were manually edited to include SC files
- Unnecessary files were imported into the project

To fix these issues, the new version includes the following: 
- Support for Visual Studio 2015 and 2017 
- A VS extension that assists with adding and previewing transform 
- A NuGet package that handles all the build and transformation logic 

To use this new version, the older one must be manually removed from your project before installing the new version. From here on, all updates to the extension and NuGet packages will be handled by their respective platform.  

## Instructions 

If SlowCheetah has never been installed on your computer or used in any of your projects, simply install the latest Nuget package [here](https://www.nuget.org/packages/Microsoft.VisualStudio.SlowCheetah/).

Version 3.0.61 and higher of the SlowCheetah Extension should prompt the user to automatically remove any present older installations. If you have issues with this, the following instructions guide you through manually updating your project.

If you have used SlowCheetah before, remove the following lines from your project file. 

First, a PropertyGroup that looks like this:

``` XML
<PropertyGroup Label="SlowCheetah">
  <SlowCheetahToolsPath>$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\..\packages\SlowCheetah.2.5.15\tools\))</SlowCheetahToolsPath>
  <SlowCheetah_EnableImportFromNuGet Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='' ">true</SlowCheetah_EnableImportFromNuGet>
  <SlowCheetah_NuGetImportPath Condition=" '$(SlowCheetah_NuGetImportPath)'=='' ">$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\Properties\SlowCheetah\SlowCheetah.Transforms.targets ))</SlowCheetah_NuGetImportPath>
  <SlowCheetahTargets Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='true' and Exists('$(SlowCheetah_NuGetImportPath)') ">$(SlowCheetah_NuGetImportPath)</SlowCheetahTargets>
</PropertyGroup>
```
Then, remove an import that looks like this:

``` XML
<Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" Label="SlowCheetah" />
```

Lastly, remove the following includes:

``` XML
<None Include="packageRestore.proj" />
<None Include="Properties\SlowCheetah\SlowCheetah.Transforms.targets" />
```

Also, delete the `Properties\SlowCheetah` folder and the `packageRestore.proj` file from your project if they are present. If there are any other lines in the project file or any items in the project tree related to SlowCheetah, those should also be removed. All SlowCheetah related lines that  should be present are the transformation files which are marked with `<IsTransformFile>true</IsTransformFile>` on the project file.

Now, install or update to the latest SlowCheetah package through the NuGet package manager and download the latest extension from the Visual Studio extension gallery.

Optionally, if you no longer plan on using the older version of SlowCheetah on any projects, you may safely delete the `%LocalAppData%\Microsoft\MSBuild\SlowCheetah` folder.


================================================
FILE: docfx/.gitignore
================================================
_site/
api/


================================================
FILE: docfx/docfx.json
================================================
{
    "metadata": [
        {
            "src": [
                {
                    "src": "../src/Library",
                    "files": [
                        "**/*.csproj"
                    ]
                }
            ],
            "dest": "api"
        }
    ],
    "build": {
        "content": [
            {
                "files": [
                    "**/*.{md,yml}"
                ],
                "exclude": [
                    "_site/**"
                ]
            }
        ],
        "resource": [
            {
                "files": [
                    "images/**"
                ]
            }
        ],
        "xref": [
            "https://learn.microsoft.com/en-us/dotnet/.xrefmap.json"
        ],
        "output": "_site",
        "template": [
            "default",
            "modern"
        ],
        "globalMetadata": {
            "_appName": "Library",
            "_appTitle": "Library",
            "_enableSearch": true,
            "pdf": false
        }
    }
}


================================================
FILE: docfx/docs/features.md
================================================
# Features

TODO


================================================
FILE: docfx/docs/getting-started.md
================================================
# Getting Started

## Installation

Consume this library via its NuGet Package.
Click on the badge to find its latest version and the instructions for consuming it that best apply to your project.

[![NuGet package](https://img.shields.io/nuget/v/Library.svg)](https://nuget.org/packages/Library)

## Usage

TODO


================================================
FILE: docfx/docs/toc.yml
================================================
items:
- name: Features
  href: features.md
- name: Getting Started
  href: getting-started.md


================================================
FILE: docfx/index.md
================================================
---
_layout: landing
---

# Overview

This is your docfx landing page.

Click "Docs" across the top to get started.


================================================
FILE: docfx/toc.yml
================================================
items:
- name: Docs
  href: docs/
- name: API
  href: api/


================================================
FILE: global.json
================================================
{
  "sdk": {
    "version": "10.0.204",
    "rollForward": "patch",
    "allowPrerelease": false
  },
  "msbuild-sdks": {
    "Microsoft.Build.NoTargets": "3.7.56",
    "Microsoft.Build.Traversal": "3.1.6"
  }
}


================================================
FILE: init.cmd
================================================
@echo off
SETLOCAL
set PS1UnderCmd=1

:: Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%
set CmdEnvScriptPath=%temp%\envvarscript_%_my_datetime%.cmd

powershell.exe -NoProfile -NoLogo -ExecutionPolicy bypass -Command "try { & '%~dpn0.ps1' %*; exit $LASTEXITCODE } catch { write-host $_; exit 1 }"

:: Set environment variables in the parent cmd.exe process.
IF EXIST "%CmdEnvScriptPath%" (
    ENDLOCAL
    CALL "%CmdEnvScriptPath%"
    DEL "%CmdEnvScriptPath%"
)


================================================
FILE: init.ps1
================================================
#!/usr/bin/env pwsh

<#
.SYNOPSIS
    Installs dependencies required to build and test the projects in this repository.
.DESCRIPTION
    This MAY not require elevation, as the SDK and runtimes are installed to a per-user location,
    unless the `-InstallLocality` switch is specified directing to a per-repo or per-machine location.
    See detailed help on that switch for more information.

    The CmdEnvScriptPath environment variable may be optionally set to a path to a cmd shell script to be created (or appended to if it already exists) that will set the environment variables in cmd.exe that are set within the PowerShell environment.
    This is used by init.cmd in order to reapply any new environment variables to the parent cmd.exe process that were set in the powershell child process.
.PARAMETER InstallLocality
    A value indicating whether dependencies should be installed locally to the repo or at a per-user location.
    Per-user allows sharing the installed dependencies across repositories and allows use of a shared expanded package cache.
    Visual Studio will only notice and use these SDKs/runtimes if VS is launched from the environment that runs this script.
    Per-repo allows for high isolation, allowing for a more precise recreation of the environment within an Azure Pipelines build.
    When using 'repo', environment variables are set to cause the locally installed dotnet SDK to be used.
    Per-repo can lead to file locking issues when dotnet.exe is left running as a build server and can be mitigated by running `dotnet build-server shutdown`.
    Per-machine requires elevation and will download and install all SDKs and runtimes to machine-wide locations so all applications can find it.
.PARAMETER NoPrerequisites
    Skips the installation of prerequisite software (e.g. SDKs, tools).
.PARAMETER NoNuGetCredProvider
    Skips the installation of the NuGet credential provider. Useful in pipelines with the `NuGetAuthenticate` task, as a workaround for https://github.com/microsoft/artifacts-credprovider/issues/244.
    This switch is ignored and installation is skipped when -NoPrerequisites is specified.
.PARAMETER UpgradePrerequisites
    Takes time to install prerequisites even if they are already present in case they need to be upgraded.
    No effect if -NoPrerequisites is specified.
.PARAMETER NoRestore
    Skips the package restore step.
.PARAMETER NoToolRestore
    Skips the dotnet tool restore step.
.PARAMETER Signing
    Install the MicroBuild signing plugin for building test-signed builds on desktop machines.
.PARAMETER Localization
    Install the MicroBuild localization plugin for building loc builds on desktop machines.
    The environment is configured to build pseudo-loc for JPN only, but may be used to build
    all languages with shipping-style loc by using the `/p:loctype=full,loclanguages=vs`
    when building.
.PARAMETER Setup
    Install the MicroBuild setup plugin for building VSIXv3 packages.
.PARAMETER OptProf
    Install the MicroBuild OptProf plugin for building optimized assemblies on desktop machines.
.PARAMETER Sbom
    Install the MicroBuild SBOM plugin.
.PARAMETER AccessToken
    An optional access token for authenticating to Azure Artifacts authenticated feeds.
.PARAMETER Interactive
    Runs NuGet restore in interactive mode. This can turn authentication failures into authentication challenges.
#>
[CmdletBinding(SupportsShouldProcess = $true)]
Param (
    [ValidateSet('repo', 'user', 'machine')]
    [string]$InstallLocality = 'user',
    [Parameter()]
    [switch]$NoPrerequisites,
    [Parameter()]
    [switch]$NoNuGetCredProvider,
    [Parameter()]
    [switch]$UpgradePrerequisites,
    [Parameter()]
    [switch]$NoRestore,
    [Parameter()]
    [switch]$NoToolRestore,
    [Parameter()]
    [switch]$Signing,
    [Parameter()]
    [switch]$Localization,
    [Parameter()]
    [switch]$Setup,
    [Parameter()]
    [switch]$OptProf,
    [Parameter()]
    [switch]$SBOM,
    [Parameter()]
    [string]$AccessToken,
    [Parameter()]
    [switch]$Interactive
)

$EnvVars = @{}
$PrependPath = @()

if (!$NoPrerequisites) {
    if (!$NoNuGetCredProvider) {
        & "$PSScriptRoot\tools\Install-NuGetCredProvider.ps1" -AccessToken $AccessToken -Force:$UpgradePrerequisites
    }

    & "$PSScriptRoot\tools\Install-DotNetSdk.ps1" -InstallLocality $InstallLocality
    if ($LASTEXITCODE -eq 3010) {
        Exit 3010
    }

    # The procdump tool and env var is required for dotnet test to collect hang/crash dumps of tests.
    # But it only works on Windows.
    if ($env:OS -eq 'Windows_NT') {
        $EnvVars['PROCDUMP_PATH'] = & "$PSScriptRoot\tools\Get-ProcDump.ps1"
    }
}

# Workaround nuget credential provider bug that causes very unreliable package restores on Azure Pipelines
$env:NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS = 20
$env:NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS = 20

Push-Location $PSScriptRoot
try {
    $HeaderColor = 'Green'

    $RestoreArguments = @()
    if ($Interactive) {
        $RestoreArguments += '--interactive'
    }

    if (!$NoRestore -and $PSCmdlet.ShouldProcess("NuGet packages", "Restore")) {
        Write-Host "Restoring NuGet packages" -ForegroundColor $HeaderColor
        dotnet restore @RestoreArguments src
        if ($lastexitcode -ne 0) {
            throw "Failure while restoring packages."
        }
    }

    if (!$NoToolRestore -and $PSCmdlet.ShouldProcess("dotnet tool", "restore")) {
        dotnet tool restore @RestoreArguments
        if ($lastexitcode -ne 0) {
            throw "Failure while restoring dotnet CLI tools."
        }
    }

    $InstallNuGetPkgScriptPath = "$PSScriptRoot\tools\Install-NuGetPackage.ps1"
    $nugetVerbosity = 'quiet'
    if ($Verbose) { $nugetVerbosity = 'normal' }
    $MicroBuildPackageSource = 'https://pkgs.dev.azure.com/devdiv/_packaging/MicroBuildToolset%40Local/nuget/v3/index.json'
    if ($Signing) {
        Write-Host "Installing MicroBuild signing plugin" -ForegroundColor $HeaderColor
        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.Signing -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
        $EnvVars['SignType'] = "Test"
    }

    if ($Setup) {
        Write-Host "Installing MicroBuild SwixBuild plugin..." -ForegroundColor $HeaderColor
        & $InstallNuGetPkgScriptPath Microsoft.VisualStudioEng.MicroBuild.Plugins.SwixBuild -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
    }

    if ($OptProf) {
        Write-Host "Installing MicroBuild OptProf plugin" -ForegroundColor $HeaderColor
        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.OptProf -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
        $EnvVars['OptProfEnabled'] = '1'
    }

    if ($Localization) {
        Write-Host "Installing MicroBuild localization plugin" -ForegroundColor $HeaderColor
        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.Localization -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
        $EnvVars['LocType'] = "Pseudo"
        $EnvVars['LocLanguages'] = "JPN"
    }

    if ($SBOM) {
        Write-Host "Installing MicroBuild SBOM plugin" -ForegroundColor $HeaderColor
        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.Sbom -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
        # The feed with the latest versions of the tool is at 'https://1essharedassets.pkgs.visualstudio.com/1esPkgs/_packaging/SBOMTool/nuget/v3/index.json',
        # but we'll use the feed that the SBOM task itself uses to install the tool for consistency.
        $PkgMicrosoft_ManifestTool_CrossPlatform = & $InstallNuGetPkgScriptPath Microsoft.ManifestTool.CrossPlatform -source $MicroBuildPackageSource -Verbosity $nugetVerbosity
        $EnvVars['GenerateSBOM'] = "true"
        $EnvVars['PkgMicrosoft_ManifestTool_CrossPlatform'] = $PkgMicrosoft_ManifestTool_CrossPlatform
    }

    & "$PSScriptRoot/tools/Set-EnvVars.ps1" -Variables $EnvVars -PrependPath $PrependPath | Out-Null
}
catch {
    Write-Error $error[0]
    exit $lastexitcode
}
finally {
    Pop-Location
}


================================================
FILE: nuget.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositorypath" value="packages" />
  </config>
  <packageSources>
    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
    <clear />
    <add key="msft_consumption" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/msft_consumption/nuget/v3/index.json" />
    <!-- <add key="msft_consumption" value="https://pkgs.dev.azure.com/devdiv/DevDiv/_packaging/VS-Platform/nuget/v3/index.json" /> -->
  </packageSources>
  <disabledPackageSources>
    <!-- Defend against user or machine level disabling of sources that we list in this file. -->
    <clear />
  </disabledPackageSources>
</configuration>

================================================
FILE: samples/FSharpDemo/FSharpDemo.fsproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{85361198-db0e-4528-a513-80e025de74a0}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <RootNamespace>FSharpDemo</RootNamespace>
    <AssemblyName>FSharpDemo</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
    <Name>FSharpDemo</Name>
    <SccProjectName>
    </SccProjectName>
    <SccProvider>
    </SccProvider>
    <SccAuxPath>
    </SccAuxPath>
    <SccLocalPath>
    </SccLocalPath>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <Tailcalls>false</Tailcalls>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <WarningLevel>3</WarningLevel>
    <PlatformTarget>x86</PlatformTarget>
    <DocumentationFile>bin\Debug\FSharpDemo.XML</DocumentationFile>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <Tailcalls>true</Tailcalls>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <WarningLevel>3</WarningLevel>
    <PlatformTarget>x86</PlatformTarget>
    <DocumentationFile>bin\Release\FSharpDemo.XML</DocumentationFile>
  </PropertyGroup>
  <PropertyGroup>
    <SlowCheetahTargets Condition=" '$(SlowCheetahTargets)'=='' ">$(LOCALAPPDATA)\Microsoft\MSBuild\SlowCheetah\v1\SlowCheetah.Transforms.targets</SlowCheetahTargets>
  </PropertyGroup>
  <PropertyGroup>
    <MinimumVisualStudioVersion Condition="'$(MinimumVisualStudioVersion)' == ''">11</MinimumVisualStudioVersion>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets" Condition="Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')" />
  <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition="(!Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')) And (Exists('$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets'))" />
  <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="(!Exists('$(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets')) And (!Exists('$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets')) And (Exists('$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets'))" />
  <ItemGroup>
    <Compile Include="Program.fs" />
    <None Include="app.config">
      <TransformOnBuild>true</TransformOnBuild>
    </None>
    <None Include="app.Debug.config">
      <IsTransformFile>True</IsTransformFile>
    </None>
    <None Include="app.Release.config">
      <IsTransformFile>True</IsTransformFile>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Reference Include="mscorlib" />
    <Reference Include="FSharp.Core" />
    <Reference Include="System" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Core" />
    <Reference Include="System.Numerics" />
  </ItemGroup>
  <Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
	     Other similar extension points exist, see Microsoft.Common.targets.
	<Target Name="BeforeBuild">
	</Target>
	<Target Name="AfterBuild">
	</Target>
	-->
</Project>

================================================
FILE: samples/FSharpDemo/Program.fs
================================================
// Learn more about F# at http://fsharp.net
let settingOne = System.Configuration.ConfigurationManager.AppSettings.["settingOne"];
let settingTwo = System.Configuration.ConfigurationManager.AppSettings.["settingTwo"];
let settingthree = System.Configuration.ConfigurationManager.AppSettings.["settingThree"];


printfn "settingOne: %s" settingOne
printfn "settingTwo: %s" settingTwo
printfn "settingThree: %s" settingthree

printfn " "
printfn "Press any key to close"
System.Console.ReadKey(true)

================================================
FILE: samples/FSharpDemo/app.Debug.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations 
     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings>
    <add key="settingOne" value="one Debug"
         xdt:Locator="Match(key)" xdt:Transform="Replace" />
    
    <add key="settingTwo" value="two Debug"
         xdt:Locator="Match(key)" xdt:Transform="Replace" />
    
    <add key="settingThree" value="three Debug"
         xdt:Locator="Match(key)" xdt:Transform="Replace" />
  </appSettings>
</configuration>

================================================
FILE: samples/FSharpDemo/app.Release.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations 
     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings>
    <add key="settingOne" value="one Release"
         xdt:Locator="Match(key)" xdt:Transform="Replace" />

    <add key="settingTwo" value="two Release"
         xdt:Locator="Match(key)" xdt:Transform="Replace" />

    <add key="settingThree" value="three Release"
         xdt:Locator="Match(key)" xdt:Transform="Replace" />
  </appSettings>
</configuration>

================================================
FILE: samples/FSharpDemo/app.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="settingOne" value="one default value"/>
    <add key="settingTwo" value="two default value"/>
    <add key="settingThree" value="three default value"/>
  </appSettings>
</configuration>


================================================
FILE: samples/Linked-files/connectionStrings.Debug.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<!-- For more information on using transformations 
     see the we
Download .txt
gitextract_7_2kiagc/

├── .azuredevops/
│   └── dependabot.yml
├── .config/
│   └── dotnet-tools.json
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── .editorconfig
│   ├── Prime-ForCopilot.ps1
│   ├── actions/
│   │   └── publish-artifacts/
│   │       └── action.yaml
│   ├── copilot-instructions.md
│   ├── renovate.json
│   ├── skills/
│   │   └── update-library-template/
│   │       ├── SKILL.md
│   │       └── template-release-notes.md
│   └── workflows/
│       ├── copilot-setup-steps.yml
│       ├── docs.yml
│       ├── docs_validate.yml
│       └── libtemplate-update.yml
├── .gitignore
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── mcp.json
│   ├── settings.json
│   └── tasks.json
├── .vsts-ci.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CodeQL.yml
├── Directory.Build.props
├── Directory.Build.rsp
├── Directory.Build.targets
├── Directory.Packages.props
├── LICENSE
├── README.md
├── Restore.cmd
├── SECURITY.md
├── SUPPORT.md
├── ThirdPartyNotices.txt
├── appveyor.yml
├── azure-pipelines/
│   ├── Archive-SourceCode.ps1
│   ├── BuildStageVariables.yml
│   ├── Get-InsertionPRId.ps1
│   ├── GlobalVariables.yml
│   ├── Merge-CodeCoverage.ps1
│   ├── NuGetSbom.props
│   ├── PoliCheckExclusions.xml
│   ├── PostPRMessage.ps1
│   ├── TSAOptions.json
│   ├── WIFtoPATauth.yml
│   ├── apiscan.yml
│   ├── archive-sourcecode.yml
│   ├── build.yml
│   ├── dotnet.yml
│   ├── falsepositives.gdnsuppress
│   ├── install-dependencies.yml
│   ├── libtemplate-update.yml
│   ├── microbuild.after.yml
│   ├── microbuild.before.yml
│   ├── no_authenticode.txt
│   ├── no_strongname.txt
│   ├── official.yml
│   ├── prepare-insertion-stages.yml
│   ├── publish-codecoverage.yml
│   ├── publish-symbols.yml
│   ├── publish_artifacts.ps1
│   ├── release-deployment-prep.yml
│   ├── release.yml
│   ├── unofficial.yml
│   ├── vs-insertion-script.ps1
│   ├── vs-insertion.yml
│   └── vs-validation.yml
├── azure-pipelines.yml
├── doc/
│   ├── targets.md
│   ├── transforming_files.md
│   └── update.md
├── docfx/
│   ├── .gitignore
│   ├── docfx.json
│   ├── docs/
│   │   ├── features.md
│   │   ├── getting-started.md
│   │   └── toc.yml
│   ├── index.md
│   └── toc.yml
├── global.json
├── init.cmd
├── init.ps1
├── nuget.config
├── samples/
│   ├── FSharpDemo/
│   │   ├── FSharpDemo.fsproj
│   │   ├── Program.fs
│   │   ├── app.Debug.config
│   │   ├── app.Release.config
│   │   └── app.config
│   ├── Linked-files/
│   │   ├── connectionStrings.Debug.config
│   │   ├── connectionStrings.Release.config
│   │   └── connectionStrings.config
│   ├── SlowCheetah.Samples.sln
│   ├── TransformSetupProject/
│   │   ├── .gitignore
│   │   └── TransformSetupProject.vdproj
│   ├── WebDemo/
│   │   ├── Default.aspx
│   │   ├── Default.aspx.cs
│   │   ├── Default.aspx.designer.cs
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── Web.Debug.config
│   │   ├── Web.Release.config
│   │   ├── Web.config
│   │   ├── WebDemo.csproj
│   │   ├── connectionStrings.Debug.config
│   │   ├── connectionStrings.Release.config
│   │   ├── connectionStrings.ToPkg.config
│   │   └── connectionStrings.config
│   ├── WindowsAzure1/
│   │   ├── ServiceConfiguration.Cloud.cscfg
│   │   ├── ServiceConfiguration.Local.cscfg
│   │   ├── ServiceDefinition.csdef
│   │   └── WindowsAzure1.ccproj
│   ├── WorkerRole1/
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── WorkerRole.cs
│   │   ├── WorkerRole1.csproj
│   │   ├── XMLFile1.xml
│   │   ├── app.Debug.config
│   │   ├── app.Release.config
│   │   ├── app.config
│   │   ├── contacts.Debug.xml
│   │   ├── contacts.Release.xml
│   │   ├── contacts.xml
│   │   └── packages.config
│   └── Wpf.Transform/
│       ├── App.xaml
│       ├── App.xaml.cs
│       ├── Assets/
│       │   └── BureauBlue.xaml
│       ├── MainWindow.xaml
│       ├── MainWindow.xaml.cs
│       ├── Properties/
│       │   ├── AssemblyInfo.cs
│       │   ├── Resources.Designer.cs
│       │   ├── Resources.resx
│       │   ├── Settings.Designer.cs
│       │   └── Settings.settings
│       ├── TransformModel.cs
│       ├── Wpf.Transform.csproj
│       ├── app.Debug.config
│       ├── app.Release.config
│       ├── app.config
│       ├── connectionStrings.Debug.config
│       ├── connectionStrings.Release.config
│       ├── connectionStrings.config
│       ├── contacts.Debug.xml
│       ├── contacts.Release.xml
│       └── contacts.xml
├── src/
│   ├── .editorconfig
│   ├── AssemblyInfo.cs
│   ├── AssemblyInfo.vb
│   ├── Directory.Build.props
│   ├── Directory.Build.targets
│   ├── Microsoft.VisualStudio.SlowCheetah/
│   │   ├── Build/
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.App.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.SetupProject.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.Web.targets
│   │   │   ├── Microsoft.VisualStudio.SlowCheetah.targets
│   │   │   ├── TransformTask.cs
│   │   │   └── readme.txt
│   │   ├── Exceptions/
│   │   │   └── TransformFailedException.cs
│   │   ├── Logging/
│   │   │   ├── ITransformationLogger.cs
│   │   │   ├── JsonShimLogger.cs
│   │   │   ├── TransformationTaskLogger.cs
│   │   │   └── XmlShimLogger.cs
│   │   ├── Microsoft.VisualStudio.SlowCheetah.csproj
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── Resources/
│   │   │   ├── Resources.Designer.cs
│   │   │   └── Resources.resx
│   │   └── Transformer/
│   │       ├── ITransformer.cs
│   │       ├── JsonTransformer.cs
│   │       ├── TransformUtilities.cs
│   │       ├── TransformerFactory.cs
│   │       └── XmlTransformer.cs
│   ├── Microsoft.VisualStudio.SlowCheetah.Tests/
│   │   ├── App.config
│   │   ├── BaseTest.cs
│   │   ├── BuildTests/
│   │   │   ├── ConfigTransformTestsBase.cs
│   │   │   ├── ConsoleAppTests.cs
│   │   │   ├── TestProjects/
│   │   │   │   ├── ConsoleApp/
│   │   │   │   │   ├── App.Debug.config
│   │   │   │   │   ├── App.Release.config
│   │   │   │   │   ├── App.config
│   │   │   │   │   ├── ConsoleApp.csproj
│   │   │   │   │   ├── Other.Debug.config
│   │   │   │   │   ├── Other.Release.config
│   │   │   │   │   ├── Other.config
│   │   │   │   │   ├── Program.cs
│   │   │   │   │   └── Properties/
│   │   │   │   │       └── AssemblyInfo.cs
│   │   │   │   ├── Directory.Build.props
│   │   │   │   ├── Directory.Build.targets
│   │   │   │   └── WebApplication/
│   │   │   │       ├── Other.Debug.config
│   │   │   │       ├── Other.Release.config
│   │   │   │       ├── Other.config
│   │   │   │       ├── Properties/
│   │   │   │       │   └── AssemblyInfo.cs
│   │   │   │       ├── Web.Debug.config
│   │   │   │       ├── Web.Release.config
│   │   │   │       ├── Web.config
│   │   │   │       └── WebApplication.csproj
│   │   │   └── WebAppTests.cs
│   │   ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj
│   │   ├── TestUtilities.cs
│   │   ├── TransformTest.cs
│   │   └── example.txt
│   ├── Microsoft.VisualStudio.SlowCheetah.VS/
│   │   ├── Directory.Build.targets
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.csproj
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.pkgdef
│   │   ├── NugetHandler/
│   │   │   ├── PackageHandlers/
│   │   │   │   ├── BackgroundInstallationHandler.cs
│   │   │   │   ├── BasePackageHandler.cs
│   │   │   │   ├── DialogInstallationHandler.cs
│   │   │   │   ├── EmptyHandler.cs
│   │   │   │   ├── IPackageHandler.cs
│   │   │   │   ├── NuGetUninstaller.cs
│   │   │   │   ├── NugetInstaller.cs
│   │   │   │   ├── TargetsUninstaller.cs
│   │   │   │   └── UserInstallationHandler.cs
│   │   │   ├── SlowCheetahNuGetManager.cs
│   │   │   └── VsProjectTypes.cs
│   │   ├── Options/
│   │   │   ├── AdvancedOptionsDialogPage.cs
│   │   │   ├── AdvancedOptionsUserControl.Designer.cs
│   │   │   ├── AdvancedOptionsUserControl.cs
│   │   │   ├── AdvancedOptionsUserControl.resx
│   │   │   ├── BaseOptionsDialogPage.cs
│   │   │   ├── OptionsDialogPage.cs
│   │   │   ├── OptionsUserControl.Designer.cs
│   │   │   ├── OptionsUserControl.cs
│   │   │   └── OptionsUserControl.resx
│   │   ├── Package/
│   │   │   ├── AddTransformCommand.cs
│   │   │   ├── BaseCommand.cs
│   │   │   ├── PackageSolutionEvents.cs
│   │   │   ├── PreviewTransformCommand.cs
│   │   │   └── SlowCheetahPackageLogger.cs
│   │   ├── Resources/
│   │   │   ├── Guids.cs
│   │   │   ├── PkgCmdID.cs
│   │   │   ├── Resources.Designer.cs
│   │   │   └── Resources.resx
│   │   ├── SlowCheetah.vsct
│   │   ├── SlowCheetahPackage.cs
│   │   ├── TransformationPreviewLogger.cs
│   │   ├── Utilities/
│   │   │   ├── PackageUtilities.cs
│   │   │   └── ProjectUtilities.cs
│   │   ├── VSPackage.Designer.cs
│   │   ├── VSPackage.resx
│   │   └── source.extension.vsixmanifest
│   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/
│   │   ├── App.config
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj
│   │   ├── PackageUtilitiesTest.cs
│   │   └── xunit.runner.json
│   ├── Microsoft.VisualStudio.SlowCheetah.Vsix/
│   │   └── Microsoft.VisualStudio.SlowCheetah.Vsix.csproj
│   ├── OptProf.targets
│   ├── SlowCheetah.sln
│   └── build/
│       ├── no_authenticode.txt
│       └── no_strongname.txt
├── stylecop.json
├── test/
│   ├── .editorconfig
│   ├── Directory.Build.props
│   ├── Directory.Build.targets
│   ├── Microsoft.VisualStudio.SlowCheetah.Tests/
│   │   ├── App.config
│   │   ├── BaseTest.cs
│   │   ├── BuildTests/
│   │   │   ├── ConfigTransformTestsBase.cs
│   │   │   ├── ConsoleAppTests.cs
│   │   │   ├── TestProjects/
│   │   │   │   ├── ConsoleApp/
│   │   │   │   │   ├── App.Debug.config
│   │   │   │   │   ├── App.Release.config
│   │   │   │   │   ├── App.config
│   │   │   │   │   ├── ConsoleApp.csproj
│   │   │   │   │   ├── Other.Debug.config
│   │   │   │   │   ├── Other.Release.config
│   │   │   │   │   ├── Other.config
│   │   │   │   │   ├── Program.cs
│   │   │   │   │   └── Properties/
│   │   │   │   │       └── AssemblyInfo.cs
│   │   │   │   ├── Directory.Build.props
│   │   │   │   ├── Directory.Build.targets
│   │   │   │   └── WebApplication/
│   │   │   │       ├── Other.Debug.config
│   │   │   │       ├── Other.Release.config
│   │   │   │       ├── Other.config
│   │   │   │       ├── Web.Debug.config
│   │   │   │       ├── Web.Release.config
│   │   │   │       ├── Web.config
│   │   │   │       └── WebApplication.csproj
│   │   │   └── WebAppTests.cs
│   │   ├── Microsoft.VisualStudio.SlowCheetah.Tests.csproj
│   │   ├── TestUtilities.cs
│   │   ├── TransformTest.cs
│   │   └── example.txt
│   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests/
│   │   ├── App.config
│   │   ├── Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj
│   │   └── PackageUtilitiesTest.cs
│   └── dirs.proj
├── tools/
│   ├── Check-DotNetRuntime.ps1
│   ├── Check-DotNetSdk.ps1
│   ├── Convert-PDB.ps1
│   ├── Download-NuGetPackage.ps1
│   ├── Get-ArtifactsStagingDirectory.ps1
│   ├── Get-CodeCovTool.ps1
│   ├── Get-ExternalSymbolFiles.ps1
│   ├── Get-LibTemplateBasis.ps1
│   ├── Get-NuGetTool.ps1
│   ├── Get-ProcDump.ps1
│   ├── Get-SymbolFiles.ps1
│   ├── Get-TempToolsPath.ps1
│   ├── Install-DotNetSdk.ps1
│   ├── Install-NuGetCredProvider.ps1
│   ├── Install-NuGetPackage.ps1
│   ├── MergeFrom-Template.ps1
│   ├── Prepare-Legacy-Symbols.ps1
│   ├── Set-EnvVars.ps1
│   ├── artifacts/
│   │   ├── APIScanInputs.ps1
│   │   ├── LocBin.ps1
│   │   ├── VSInsertion.ps1
│   │   ├── Variables.ps1
│   │   ├── _all.ps1
│   │   ├── _stage_all.ps1
│   │   ├── build_logs.ps1
│   │   ├── coverageResults.ps1
│   │   ├── deployables.ps1
│   │   ├── projectAssetsJson.ps1
│   │   ├── symbols.ps1
│   │   ├── testResults.ps1
│   │   └── test_symbols.ps1
│   ├── dotnet-test-cloud.ps1
│   ├── publish-CodeCov.ps1
│   ├── test.runsettings
│   └── variables/
│       ├── BusinessGroupName.ps1
│       ├── DotNetSdkVersion.ps1
│       ├── InsertJsonValues.ps1
│       ├── InsertPropsValues.ps1
│       ├── InsertTargetBranch.ps1
│       ├── InsertVersionsValues.ps1
│       ├── LocLanguages.ps1
│       ├── ProfilingInputsDropName.ps1
│       ├── ProfilingInputsPropsName.ps1
│       ├── SymbolsFeatureName.ps1
│       ├── VstsDropNames.ps1
│       ├── _all.ps1
│       └── _define.ps1
└── version.json
Download .txt
SYMBOL INDEX (297 symbols across 67 files)

FILE: samples/WebDemo/Default.aspx.cs
  class Default (line 10) | public partial class Default : System.Web.UI.Page
    method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)

FILE: samples/WebDemo/Default.aspx.designer.cs
  class Default (line 13) | public partial class Default {

FILE: samples/WorkerRole1/WorkerRole.cs
  class WorkerRole (line 14) | public class WorkerRole : RoleEntryPoint {
    method Run (line 15) | public override void Run() {
    method OnStart (line 29) | public override bool OnStart() {

FILE: samples/Wpf.Transform/App.xaml.cs
  class App (line 12) | public partial class App : Application {

FILE: samples/Wpf.Transform/MainWindow.xaml.cs
  class MainWindow (line 19) | public partial class MainWindow : Window {
    method MainWindow (line 20) | public MainWindow() {
    method WindowOnLoad (line 25) | private void WindowOnLoad(object sender, RoutedEventArgs e) {
    method ApplyTransformModel (line 29) | private void ApplyTransformModel(TransformModel transformModel) {
    method BuildStringFrom (line 39) | private string BuildStringFrom(IDictionary<string, string> dictionary) {
    method ButtonCloseClick (line 50) | private void ButtonCloseClick(object sender, RoutedEventArgs e) {

FILE: samples/Wpf.Transform/Properties/Resources.Designer.cs
  class Resources (line 21) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Resources (line 30) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: samples/Wpf.Transform/Properties/Settings.Designer.cs
  class Settings (line 14) | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

FILE: samples/Wpf.Transform/TransformModel.cs
  class TransformModel (line 9) | public class TransformModel {
    method TransformModel (line 10) | public TransformModel() {
    method BuildFromCurrent (line 19) | public static TransformModel BuildFromCurrent() {

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs
  class BaseTest (line 18) | public class BaseTest : IDisposable
    method Dispose (line 28) | public void Dispose()
    method WriteTextToTempFile (line 53) | protected virtual string WriteTextToTempFile(string content)
    method GetTempFilename (line 70) | protected virtual string GetTempFilename(bool ensureFileDoesntExist)

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs
  class ConfigTransformTestsBase (line 22) | public abstract class ConfigTransformTestsBase : IDisposable
    method BuildProject (line 65) | public void BuildProject(string projectName)
    method GetAppSettingValue (line 126) | public string GetAppSettingValue(string configFilePath, string appSett...
    method GetConfigNodeValue (line 141) | public string GetConfigNodeValue(string configFilePath, string nodeName)
    method Dispose (line 150) | public void Dispose()

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs
  class ConsoleAppTests (line 17) | [Collection("BuildTests")]
    method ConsoleApp_AppConfig_IsTransformed (line 23) | [Fact]
    method ConsoleApp_OtherConfig_IsTransformed (line 39) | [Fact]

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs
  class Program (line 9) | class Program
    method Main (line 11) | static void Main(string[] args)

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs
  class WebAppTests (line 17) | [Collection("BuildTests")]
    method WebApp_OtherConfig_IsTransformed (line 23) | [Fact]

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs
  class TestUtilities (line 14) | public static class TestUtilities

FILE: src/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs
  class TransformTest (line 17) | public class TransformTest : BaseTest
    method TestXmlTransform (line 22) | [Fact]

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS.Tests/PackageUtilitiesTest.cs
  class PackageUtilitiesTest (line 12) | public class PackageUtilitiesTest
    method IsFileTransformWithNullArguments (line 22) | [Theory]
    method IsFileTransformWithValidArguments (line 39) | [Theory]
    method IsFileTransformWithInvalidArguments (line 54) | [Theory]
    method IsFileTransformWithDottedConfigsAndValidNames (line 69) | [Theory]
    method IsFileTransformWithDottedConfigsAndInvalidNames (line 87) | [Theory]
    method IsFileGenericTransformWithInvalidArguments (line 105) | [Theory]
    method IsFileGenericTransformWithValidArguments (line 121) | [Theory]

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BackgroundInstallationHandler.cs
  class BackgroundInstallationHandler (line 18) | internal class BackgroundInstallationHandler : UserInstallationHandler
    method BackgroundInstallationHandler (line 27) | public BackgroundInstallationHandler(IPackageHandler successor)
    method ExecuteAsync (line 38) | public override async TPL.Task ExecuteAsync(Project project)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BasePackageHandler.cs
  class BasePackageHandler (line 14) | internal abstract class BasePackageHandler : IPackageHandler
    method BasePackageHandler (line 20) | protected BasePackageHandler(IPackageHandler successor)
    method ExecuteAsync (line 42) | public abstract TPL.Task ExecuteAsync(Project project);

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/DialogInstallationHandler.cs
  class DialogInstallationHandler (line 13) | internal class DialogInstallationHandler : UserInstallationHandler
    method DialogInstallationHandler (line 19) | public DialogInstallationHandler(IPackageHandler successor)
    method ExecuteAsync (line 25) | public override async TPL.Task ExecuteAsync(Project project)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/EmptyHandler.cs
  class EmptyHandler (line 14) | internal class EmptyHandler : IPackageHandler
    method EmptyHandler (line 20) | public EmptyHandler(AsyncPackage package)
    method ExecuteAsync (line 29) | public TPL.Task ExecuteAsync(Project project)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/IPackageHandler.cs
  type IPackageHandler (line 13) | internal interface IPackageHandler
    method ExecuteAsync (line 25) | TPL.Task ExecuteAsync(Project project);

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/NuGetUninstaller.cs
  class NuGetUninstaller (line 15) | internal class NuGetUninstaller : BasePackageHandler
    method NuGetUninstaller (line 21) | public NuGetUninstaller(IPackageHandler successor)
    method ExecuteAsync (line 27) | public override async TPL.Task ExecuteAsync(Project project)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/NugetInstaller.cs
  class NugetInstaller (line 14) | internal class NugetInstaller : BasePackageHandler
    method NugetInstaller (line 20) | public NugetInstaller(IPackageHandler successor)
    method ExecuteAsync (line 26) | public override async TPL.Task ExecuteAsync(Project project)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/TargetsUninstaller.cs
  class TargetsUninstaller (line 14) | internal class TargetsUninstaller : BasePackageHandler
    method TargetsUninstaller (line 20) | public TargetsUninstaller(IPackageHandler successor)
    method ExecuteAsync (line 26) | public override async TPL.Task ExecuteAsync(Project project)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/UserInstallationHandler.cs
  class UserInstallationHandler (line 14) | internal abstract class UserInstallationHandler : BasePackageHandler
    method UserInstallationHandler (line 20) | public UserInstallationHandler(IPackageHandler successor)
    method HasUserAcceptedWarningMessageAsync (line 31) | protected async Task<bool> HasUserAcceptedWarningMessageAsync(string t...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/SlowCheetahNuGetManager.cs
  class SlowCheetahNuGetManager (line 19) | public class SlowCheetahNuGetManager
    method SlowCheetahNuGetManager (line 62) | public SlowCheetahNuGetManager(AsyncPackage package)
    method ProjectSupportsNuget (line 75) | public bool ProjectSupportsNuget(IVsHierarchy hierarchy)
    method CheckSlowCheetahInstallationAsync (line 116) | public async TPL.Task CheckSlowCheetahInstallationAsync(IVsHierarchy h...
    method GetInstallerServices (line 170) | private static IVsPackageInstallerServices GetInstallerServices(IServi...
    method IsOldSlowCheetahInstalled (line 177) | private static bool IsOldSlowCheetahInstalled(IVsBuildPropertyStorage ...
    method SupportsINugetProjectSystem (line 194) | private static bool SupportsINugetProjectSystem(IVsHierarchy hierarchy)
    method IsPackageInstalled (line 217) | private bool IsPackageInstalled(Project project, string packageName)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/VsProjectTypes.cs
  class VsProjectTypes (line 9) | [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.Docume...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsDialogPage.cs
  class AdvancedOptionsDialogPage (line 16) | internal class AdvancedOptionsDialogPage : BaseOptionsDialogPage
    method AdvancedOptionsDialogPage (line 25) | public AdvancedOptionsDialogPage()
    method SaveSettingsToXml (line 52) | public override void SaveSettingsToXml(IVsSettingsWriter writer)
    method LoadSettingsFromXml (line 69) | public override void LoadSettingsFromXml(IVsSettingsReader reader)
    method LoadSettingsFromStorage (line 94) | public override void LoadSettingsFromStorage()
    method SaveSettingsToStorage (line 127) | public override void SaveSettingsToStorage()
    method InitializeDefaults (line 148) | private void InitializeDefaults()

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.Designer.cs
  class AdvancedOptionsUserControl (line 3) | partial class AdvancedOptionsUserControl
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.cs
  class AdvancedOptionsUserControl (line 12) | public partial class AdvancedOptionsUserControl : UserControl
    method AdvancedOptionsUserControl (line 19) | public AdvancedOptionsUserControl()
    method Initialize (line 28) | internal void Initialize(AdvancedOptionsDialogPage advancedOptionsPage)
    method PreviewToolPathTextbox_Leave (line 35) | private void PreviewToolPathTextbox_Leave(object sender, System.EventA...
    method PreviewToolCommandLineTextbox_Leave (line 43) | private void PreviewToolCommandLineTextbox_Leave(object sender, System...
    method OpenToolFileDialogButton_Click (line 51) | private void OpenToolFileDialogButton_Click(object sender, System.Even...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/BaseOptionsDialogPage.cs
  class BaseOptionsDialogPage (line 11) | internal abstract class BaseOptionsDialogPage : DialogPage

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsDialogPage.cs
  class OptionsDialogPage (line 17) | [System.Runtime.InteropServices.Guid("01B6BAC2-0BD6-4ead-95AE-6D6DE30A62...
    method OptionsDialogPage (line 27) | public OptionsDialogPage()
    method SaveSettingsToXml (line 54) | public override void SaveSettingsToXml(IVsSettingsWriter writer)
    method LoadSettingsFromXml (line 71) | public override void LoadSettingsFromXml(IVsSettingsReader reader)
    method LoadSettingsFromStorage (line 97) | public override void LoadSettingsFromStorage()
    method SaveSettingsToStorage (line 130) | public override void SaveSettingsToStorage()
    method OnDeactivate (line 153) | protected override void OnDeactivate(CancelEventArgs e)
    method InitializeDefaults (line 160) | private void InitializeDefaults()

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.Designer.cs
  class OptionsUserControl (line 3) | partial class OptionsUserControl
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.cs
  class OptionsUserControl (line 12) | public partial class OptionsUserControl : UserControl
    method OptionsUserControl (line 19) | public OptionsUserControl()
    method Initialize (line 28) | internal void Initialize(OptionsDialogPage optionsPage)
    method EnablePreviewCheckbox_CheckedChanged (line 35) | private void EnablePreviewCheckbox_CheckedChanged(object sender, Event...
    method AddDepentUponCheckbox_CheckedChanged (line 43) | private void AddDepentUponCheckbox_CheckedChanged(object sender, Event...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/AddTransformCommand.cs
  class AddTransformCommand (line 23) | public class AddTransformCommand : BaseCommand
    method AddTransformCommand (line 35) | public AddTransformCommand(SlowCheetahPackage package, SlowCheetahNuGe...
    method OnChange (line 47) | protected override void OnChange(object sender, EventArgs e)
    method OnBeforeQueryStatus (line 52) | protected override void OnBeforeQueryStatus(object sender, EventArgs e)
    method OnInvoke (line 84) | protected override void OnInvoke(object sender, EventArgs e)
    method AddTransformFile (line 187) | private void AddTransformFile(
    method ItemSupportsTransforms (line 246) | private bool ItemSupportsTransforms(IVsProject project, uint itemid)
    method GetPublishProfileTransforms (line 280) | private IEnumerable<string> GetPublishProfileTransforms(IVsHierarchy h...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/BaseCommand.cs
  class BaseCommand (line 13) | public abstract class BaseCommand
    method BaseCommand (line 19) | public BaseCommand(AsyncPackage package)
    method RegisterCommandAsync (line 38) | public async System.Threading.Tasks.Task RegisterCommandAsync()
    method OnChange (line 57) | protected abstract void OnChange(object sender, EventArgs e);
    method OnBeforeQueryStatus (line 65) | protected abstract void OnBeforeQueryStatus(object sender, EventArgs e);
    method OnInvoke (line 72) | protected abstract void OnInvoke(object sender, EventArgs e);

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PackageSolutionEvents.cs
  class PackageSolutionEvents (line 13) | public class PackageSolutionEvents : IVsUpdateSolutionEvents, IDisposable
    method PackageSolutionEvents (line 22) | public PackageSolutionEvents(AsyncPackage asyncPackage, ErrorListProvi...
    method UpdateSolution_Begin (line 33) | public int UpdateSolution_Begin(ref int pfCancelUpdate)
    method UpdateSolution_Done (line 39) | public int UpdateSolution_Done(int fSucceeded, int fModified, int fCan...
    method UpdateSolution_StartUpdate (line 45) | public int UpdateSolution_StartUpdate(ref int pfCancelUpdate)
    method UpdateSolution_Cancel (line 53) | public int UpdateSolution_Cancel()
    method OnActiveProjectCfgChange (line 59) | public int OnActiveProjectCfgChange(IVsHierarchy pIVsHierarchy)
    method RegisterEventsAsync (line 68) | public async System.Threading.Tasks.Task RegisterEventsAsync()
    method Dispose (line 79) | public void Dispose()

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PreviewTransformCommand.cs
  class PreviewTransformCommand (line 24) | public class PreviewTransformCommand : BaseCommand, IDisposable
    method PreviewTransformCommand (line 33) | public PreviewTransformCommand(
    method Dispose (line 61) | public void Dispose()
    method OnChange (line 80) | protected override void OnChange(object sender, EventArgs e)
    method OnBeforeQueryStatus (line 85) | protected override void OnBeforeQueryStatus(object sender, EventArgs e)
    method OnInvoke (line 118) | protected override void OnInvoke(object sender, EventArgs e)
    method PreviewTransform (line 178) | private void PreviewTransform(IVsHierarchy hier, string sourceFile, st...
    method TryGetFileToTransform (line 282) | private bool TryGetFileToTransform(IVsHierarchy hierarchy, uint parent...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Package/SlowCheetahPackageLogger.cs
  class SlowCheetahPackageLogger (line 14) | public class SlowCheetahPackageLogger
    method SlowCheetahPackageLogger (line 22) | public SlowCheetahPackageLogger(IServiceProvider package)
    method LogMessage (line 32) | public void LogMessage(string message, params object[] args)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Guids.cs
  class Guids (line 16) | public static class Guids

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/PkgCmdID.cs
  class PkgCmdID (line 14) | public static class PkgCmdID

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Resources.Designer.cs
  class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/SlowCheetahPackage.cs
  class SlowCheetahPackage (line 38) | [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoa...
    method SlowCheetahPackage (line 71) | public SlowCheetahPackage()
    method ProjectSupportsTransforms (line 102) | public bool ProjectSupportsTransforms(IVsProject project)
    method IsItemTransformItem (line 113) | public bool IsItemTransformItem(IVsProject vsProject, uint itemid)
    method InitializeAsync (line 143) | protected override async System.Threading.Tasks.Task InitializeAsync(C...
    method Dispose (line 162) | protected override void Dispose(bool disposing)

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/TransformationPreviewLogger.cs
  class TransformationPreviewLogger (line 20) | public class TransformationPreviewLogger : ITransformationLogger
    method TransformationPreviewLogger (line 30) | public TransformationPreviewLogger(ErrorListProvider errorListProvider...
    method LogError (line 37) | public void LogError(string message, params object[] messageArgs)
    method LogError (line 43) | public void LogError(string file, int lineNumber, int linePosition, st...
    method LogErrorFromException (line 49) | public void LogErrorFromException(Exception ex)
    method LogErrorFromException (line 55) | public void LogErrorFromException(Exception ex, string file, int lineN...
    method LogMessage (line 61) | public void LogMessage(LogMessageImportance importance, string message...
    method LogWarning (line 70) | public void LogWarning(string message, params object[] messageArgs)
    method LogWarning (line 76) | public void LogWarning(string file, int lineNumber, int linePosition, ...
    method AddError (line 81) | private void AddError(TaskErrorCategory errorCategory, string text, st...
    method AddError (line 86) | private void AddError(Exception ex, TaskErrorCategory errorCategory, s...
    method ShowError (line 91) | private void ShowError(ErrorTask newError, TaskErrorCategory errorCate...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Utilities/PackageUtilities.cs
  class PackageUtilities (line 22) | public class PackageUtilities
    method IsExtensionSupportedForFile (line 70) | public static bool IsExtensionSupportedForFile(string filePath)
    method GetTempFilename (line 91) | public static string GetTempFilename(bool ensureFileDoesntExist, strin...
    method IsFileTransformForBuildConfiguration (line 125) | public static bool IsFileTransformForBuildConfiguration(string documen...
    method IsGenericFileTransform (line 149) | public static bool IsGenericFileTransform(string documentName, string ...
    method IsPathValid (line 159) | public static bool IsPathValid(string path)
    method GetAutomationFromHierarchy (line 177) | public static T GetAutomationFromHierarchy<T>(IVsHierarchy pHierarchy,...
    method TryGetFileTransform (line 186) | private static bool TryGetFileTransform(string documentName, string tr...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/Utilities/ProjectUtilities.cs
  class ProjectUtilities (line 22) | public static class ProjectUtilities
    method GetDTE (line 34) | public static DTE GetDTE()
    method IsSingleProjectItemSelection (line 45) | public static bool IsSingleProjectItemSelection(out IVsHierarchy hiera...
    method GetProjectConfigurations (line 119) | public static IEnumerable<string> GetProjectConfigurations(Project pro...
    method GetProjectConfigurations (line 143) | public static IEnumerable<string> GetProjectConfigurations(IVsHierarch...
    method GetSupportedProjectExtensions (line 154) | public static IEnumerable<string> GetSupportedProjectExtensions(IVsSet...
    method GetSupportedItemExtensions (line 169) | public static IEnumerable<string> GetSupportedItemExtensions(IVsSettin...
    method IsProjectWebApp (line 185) | public static bool IsProjectWebApp(IVsProject project)
    method GetSupportedExtensions (line 211) | private static IEnumerable<string> GetSupportedExtensions(IVsSettingsM...

FILE: src/Microsoft.VisualStudio.SlowCheetah.VS/VSPackage.Designer.cs
  class VSPackage (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method VSPackage (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Build/TransformTask.cs
  class TransformTask (line 11) | public class TransformTask : Microsoft.Build.Utilities.Task
    method Execute (line 32) | public override bool Execute()

FILE: src/Microsoft.VisualStudio.SlowCheetah/Exceptions/TransformFailedException.cs
  class TransformFailedException (line 16) | [Serializable]
    method TransformFailedException (line 23) | public TransformFailedException(string message)
    method TransformFailedException (line 33) | public TransformFailedException(string message, Exception inner)
    method TransformFailedException (line 43) | protected TransformFailedException(

FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/ITransformationLogger.cs
  type LogMessageImportance (line 11) | public enum LogMessageImportance
  type ITransformationLogger (line 32) | public interface ITransformationLogger
    method LogError (line 39) | void LogError(string message, params object[] messageArgs);
    method LogError (line 49) | void LogError(string file, int lineNumber, int linePosition, string me...
    method LogErrorFromException (line 55) | void LogErrorFromException(Exception ex);
    method LogErrorFromException (line 64) | void LogErrorFromException(Exception ex, string file, int lineNumber, ...
    method LogMessage (line 72) | void LogMessage(LogMessageImportance importance, string message, param...
    method LogWarning (line 79) | void LogWarning(string message, params object[] messageArgs);
    method LogWarning (line 89) | void LogWarning(string file, int lineNumber, int linePosition, string ...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/JsonShimLogger.cs
  class JsonShimLogger (line 12) | public class JsonShimLogger : IJsonTransformationLogger
    method JsonShimLogger (line 20) | public JsonShimLogger(ITransformationLogger logger)
    method LogError (line 26) | public void LogError(string message)
    method LogError (line 32) | public void LogError(string message, string fileName, int lineNumber, ...
    method LogErrorFromException (line 38) | public void LogErrorFromException(Exception ex)
    method LogErrorFromException (line 44) | public void LogErrorFromException(Exception ex, string fileName, int l...
    method LogMessage (line 50) | public void LogMessage(string message)
    method LogMessage (line 56) | public void LogMessage(string message, string fileName, int lineNumber...
    method LogWarning (line 62) | public void LogWarning(string message)
    method LogWarning (line 68) | public void LogWarning(string message, string fileName)
    method LogWarning (line 74) | public void LogWarning(string message, string fileName, int lineNumber...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/TransformationTaskLogger.cs
  class TransformationTaskLogger (line 14) | public class TransformationTaskLogger : ITransformationLogger
    method TransformationTaskLogger (line 22) | public TransformationTaskLogger(TaskLoggingHelper logger)
    method LogError (line 28) | public void LogError(string message, params object[] messageArgs)
    method LogError (line 34) | public void LogError(string file, int lineNumber, int linePosition, st...
    method LogErrorFromException (line 40) | public void LogErrorFromException(Exception ex)
    method LogErrorFromException (line 46) | public void LogErrorFromException(Exception ex, string file, int lineN...
    method LogMessage (line 52) | public void LogMessage(LogMessageImportance type, string message, para...
    method LogWarning (line 76) | public void LogWarning(string message, params object[] messageArgs)
    method LogWarning (line 82) | public void LogWarning(string file, int lineNumber, int linePosition, ...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Logging/XmlShimLogger.cs
  class XmlShimLogger (line 14) | public class XmlShimLogger : IXmlTransformationLogger
    method XmlShimLogger (line 29) | public XmlShimLogger(ITransformationLogger logger, bool useSections)
    method LogError (line 50) | public void LogError(string message, params object[] messageArgs)
    method LogError (line 56) | public void LogError(string file, string message, params object[] mess...
    method LogError (line 62) | public void LogError(string file, int lineNumber, int linePosition, st...
    method LogErrorFromException (line 68) | public void LogErrorFromException(Exception ex)
    method LogErrorFromException (line 74) | public void LogErrorFromException(Exception ex, string file)
    method LogErrorFromException (line 80) | public void LogErrorFromException(Exception ex, string file, int lineN...
    method LogMessage (line 86) | public void LogMessage(string message, params object[] messageArgs)
    method LogMessage (line 97) | public void LogMessage(MessageType type, string message, params object...
    method LogWarning (line 123) | public void LogWarning(string message, params object[] messageArgs)
    method LogWarning (line 129) | public void LogWarning(string file, string message, params object[] me...
    method LogWarning (line 135) | public void LogWarning(string file, int lineNumber, int linePosition, ...
    method StartSection (line 141) | public void StartSection(string message, params object[] messageArgs)
    method StartSection (line 147) | public void StartSection(MessageType type, string message, params obje...
    method EndSection (line 157) | public void EndSection(string message, params object[] messageArgs)
    method EndSection (line 163) | public void EndSection(MessageType type, string message, params object...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.Designer.cs
  class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/ITransformer.cs
  type ITransformer (line 9) | public interface ITransformer
    method WithLogger (line 16) | ITransformer WithLogger(ITransformationLogger logger);
    method Transform (line 25) | bool Transform(string sourcePath, string transformPath, string destina...
    method IsFileSupported (line 32) | bool IsFileSupported(string filePath);
    method CreateTransformFile (line 40) | void CreateTransformFile(string sourcePath, string transformPath, bool...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/JsonTransformer.cs
  class JsonTransformer (line 13) | public class JsonTransformer : ITransformer
    method JsonTransformer (line 23) | public JsonTransformer()
    method JsonTransformer (line 31) | public JsonTransformer(ITransformationLogger logger)
    method CreateTransformFile (line 42) | public void CreateTransformFile(string sourcePath, string transformPat...
    method IsFileSupported (line 68) | public bool IsFileSupported(string filePath)
    method Transform (line 84) | public bool Transform(string sourcePath, string transformPath, string ...
    method WithLogger (line 128) | public ITransformer WithLogger(ITransformationLogger logger)
    method TrySaveToFile (line 144) | private bool TrySaveToFile(Stream result, string sourceFile, string de...

FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformUtilities.cs
  class TransformUtilities (line 13) | public static class TransformUtilities
    method GetEncoding (line 21) | public static Encoding GetEncoding(string filename)
    method GetEncoding (line 40) | public static Encoding GetEncoding(Stream stream)

FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformerFactory.cs
  class TransformerFactory (line 15) | public static class TransformerFactory
    method GetTransformer (line 29) | public static ITransformer GetTransformer(string source, ITransformati...
    method IsSupportedFile (line 45) | public static bool IsSupportedFile(string filePath)

FILE: src/Microsoft.VisualStudio.SlowCheetah/Transformer/XmlTransformer.cs
  class XmlTransformer (line 14) | public class XmlTransformer : ITransformer
    method XmlTransformer (line 24) | public XmlTransformer()
    method XmlTransformer (line 32) | public XmlTransformer(ITransformationLogger logger)
    method CreateTransformFile (line 43) | public void CreateTransformFile(string sourcePath, string transformPat...
    method IsFileSupported (line 80) | public bool IsFileSupported(string filePath)
    method Transform (line 110) | public bool Transform(string sourcePath, string transformPath, string ...
    method WithLogger (line 155) | public ITransformer WithLogger(ITransformationLogger logger)

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs
  class BaseTest (line 18) | public class BaseTest : IDisposable
    method Dispose (line 28) | public void Dispose()
    method WriteTextToTempFile (line 53) | protected virtual string WriteTextToTempFile(string content)
    method GetTempFilename (line 70) | protected virtual string GetTempFilename(bool ensureFileDoesntExist)

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs
  class ConfigTransformTestsBase (line 22) | public abstract class ConfigTransformTestsBase : IDisposable
    method BuildProject (line 53) | public void BuildProject(string projectName)
    method GetAppSettingValue (line 103) | public string GetAppSettingValue(string configFilePath, string appSett...
    method GetConfigNodeValue (line 118) | public string GetConfigNodeValue(string configFilePath, string nodeName)
    method Dispose (line 127) | public void Dispose()
    method ResolveMSBuildExePath (line 135) | private static string ResolveMSBuildExePath()

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs
  class ConsoleAppTests (line 17) | [Collection("BuildTests")]
    method ConsoleApp_AppConfig_IsTransformed (line 23) | [Fact]
    method ConsoleApp_OtherConfig_IsTransformed (line 39) | [Fact]

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs
  class Program (line 9) | class Program
    method Main (line 11) | static void Main(string[] args)

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs
  class WebAppTests (line 17) | [Collection("BuildTests")]
    method WebApp_OtherConfig_IsTransformed (line 23) | [Fact]

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs
  class TestUtilities (line 14) | public static class TestUtilities

FILE: test/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs
  class TransformTest (line 17) | public class TransformTest : BaseTest
    method TestXmlTransform (line 22) | [Fact]

FILE: test/Microsoft.VisualStudio.SlowCheetah.VS.Tests/PackageUtilitiesTest.cs
  class PackageUtilitiesTest (line 12) | public class PackageUtilitiesTest
    method IsFileTransformWithNullArguments (line 22) | [Theory]
    method IsFileTransformWithValidArguments (line 39) | [Theory]
    method IsFileTransformWithInvalidArguments (line 54) | [Theory]
    method IsFileTransformWithDottedConfigsAndValidNames (line 69) | [Theory]
    method IsFileTransformWithDottedConfigsAndInvalidNames (line 87) | [Theory]
    method IsFileGenericTransformWithInvalidArguments (line 105) | [Theory]
    method IsFileGenericTransformWithValidArguments (line 121) | [Theory]
Condensed preview — 328 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,093K chars).
[
  {
    "path": ".azuredevops/dependabot.yml",
    "chars": 231,
    "preview": "# Please see the documentation for all configuration options:\n# https://eng.ms/docs/products/dependabot/configuration/ve"
  },
  {
    "path": ".config/dotnet-tools.json",
    "chars": 839,
    "preview": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"powershell\": {\n      \"version\": \"7.6.1\",\n      \"commands\": [\n     "
  },
  {
    "path": ".editorconfig",
    "chars": 7237,
    "preview": "# EditorConfig is awesome:http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Don't use tabs for indent"
  },
  {
    "path": ".gitattributes",
    "chars": 2700,
    "preview": "###############################################################################\n# Set default behavior to automatically "
  },
  {
    "path": ".github/.editorconfig",
    "chars": 36,
    "preview": "[renovate.json*]\nindent_style = tab\n"
  },
  {
    "path": ".github/Prime-ForCopilot.ps1",
    "chars": 205,
    "preview": "if ((git -C $PSScriptRoot rev-parse --is-shallow-repository) -eq 'true')\n{\n    Write-Host \"Shallow clone detected, disab"
  },
  {
    "path": ".github/actions/publish-artifacts/action.yaml",
    "chars": 2188,
    "preview": "name: Publish artifacts\ndescription: Publish artifacts\n\nruns:\n  using: composite\n  steps:\n  - name: 📥 Collect artifacts\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 3646,
    "preview": "# Copilot instructions for this repository\n\n## High level guidance\n\n* Review the `CONTRIBUTING.md` file for instructions"
  },
  {
    "path": ".github/renovate.json",
    "chars": 222,
    "preview": "{\n\t\"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n\t\"extends\": [\n\t\t\"github>microsoft/vs-renovate-presets"
  },
  {
    "path": ".github/skills/update-library-template/SKILL.md",
    "chars": 4231,
    "preview": "---\nname: update-library-template\ndescription: Merges the latest Library.Template into this repo (at position of HEAD) a"
  },
  {
    "path": ".github/skills/update-library-template/template-release-notes.md",
    "chars": 1112,
    "preview": "# Template release notes\n\nThis file will describe significant changes in Library.Template as they are introduced, especi"
  },
  {
    "path": ".github/workflows/copilot-setup-steps.yml",
    "chars": 1609,
    "preview": "name: 💪🏼 Copilot Setup Steps\n\n# Automatically run the setup steps when they are changed to allow for easy validation, an"
  },
  {
    "path": ".github/workflows/docs.yml",
    "chars": 1272,
    "preview": "name: 📚 Docs\n\non:\n  push:\n    branches:\n    - main\n\n# Allow only one concurrent deployment, skipping runs queued between"
  },
  {
    "path": ".github/workflows/docs_validate.yml",
    "chars": 1068,
    "preview": "name: 📃 Docfx Validate\n\non:\n  push:\n    branches:\n    - main\n    - microbuild\n  workflow_dispatch:\n\njobs:\n  build:\n    n"
  },
  {
    "path": ".github/workflows/libtemplate-update.yml",
    "chars": 3829,
    "preview": "name: ⛜ Library.Template update\n\n# PREREQUISITE: This workflow requires the repo to be configured to allow workflows to "
  },
  {
    "path": ".gitignore",
    "chars": 6200,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 797,
    "preview": "{\n  // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n  // Extension ident"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 485,
    "preview": "{\n   // Use IntelliSense to find out which attributes exist for C# debugging\n   // Use hover for the description of the "
  },
  {
    "path": ".vscode/mcp.json",
    "chars": 484,
    "preview": "{\n    \"servers\": {\n        \"github\": {\n            \"type\": \"http\",\n            \"url\": \"https://api.githubcopilot.com/mcp"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 927,
    "preview": "{\n  \"files.trimTrailingWhitespace\": true,\n  \"files.insertFinalNewline\": true,\n  \"files.trimFinalNewlines\": true,\n  \"azur"
  },
  {
    "path": ".vscode/tasks.json",
    "chars": 411,
    "preview": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n      "
  },
  {
    "path": ".vsts-ci.yml",
    "chars": 9331,
    "preview": "trigger:\n  branches:\n    include:\n    - main\n  paths:\n    exclude:\n    - .github\n    - doc\n    - '*.md'\nschedules:\n- cro"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 444,
    "preview": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://op"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5519,
    "preview": "# Microsoft.VisualStudio.SlowCheetah\n\nThis project welcomes contributions and suggestions. Most contributions require yo"
  },
  {
    "path": "CodeQL.yml",
    "chars": 45,
    "preview": "path_classifiers:\n  library:\n    - 'test/**'\n"
  },
  {
    "path": "Directory.Build.props",
    "chars": 3829,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == "
  },
  {
    "path": "Directory.Build.rsp",
    "chars": 776,
    "preview": "#------------------------------------------------------------------------------\n# This file contains command-line option"
  },
  {
    "path": "Directory.Build.targets",
    "chars": 314,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <ItemGroup>\n    <!-- Avoid compile error about missing namespace when"
  },
  {
    "path": "Directory.Packages.props",
    "chars": 3055,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <!-- https://learn.microsoft.com/nuget/consume-packages/central-packa"
  },
  {
    "path": "LICENSE",
    "chars": 1129,
    "preview": "Microsoft.VisualStudio.SlowCheetah\nCopyright (c) Microsoft Corporation\nAll rights reserved.\n\nMIT License\n\nPermission is "
  },
  {
    "path": "README.md",
    "chars": 2361,
    "preview": "# slow-cheetah\n[![NuGet package](https://img.shields.io/nuget/v/Microsoft.VisualStudio.SlowCheetah.svg)](https://nuget.o"
  },
  {
    "path": "Restore.cmd",
    "chars": 204,
    "preview": "@echo off\nWHERE /q msbuild\nIF ERRORLEVEL 1 (\n    ECHO Error: Could not find msbuild. Make sure msbuild is in the PATH an"
  },
  {
    "path": "SECURITY.md",
    "chars": 2763,
    "preview": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.5 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products an"
  },
  {
    "path": "SUPPORT.md",
    "chars": 440,
    "preview": "# Support\n\n## How to file issues and get help\n\nThis project uses GitHub Issues to track bugs and feature requests.\nPleas"
  },
  {
    "path": "ThirdPartyNotices.txt",
    "chars": 11476,
    "preview": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft "
  },
  {
    "path": "appveyor.yml",
    "chars": 1474,
    "preview": "# Notes:\n#   - Minimal appveyor.yml file is an empty file. All sections are optional.\n#   - Indent each level of configu"
  },
  {
    "path": "azure-pipelines/Archive-SourceCode.ps1",
    "chars": 8306,
    "preview": "#Requires -PSEdition Core -Version 7\n<#\n.SYNOPSIS\n    Submits a source archival request for this repo.\n.PARAMETER Reques"
  },
  {
    "path": "azure-pipelines/BuildStageVariables.yml",
    "chars": 141,
    "preview": "variables:\n  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true\n  BuildConfiguration: Release\n  NUGET_PACKAGES: $(Agent.TempDirecto"
  },
  {
    "path": "azure-pipelines/Get-InsertionPRId.ps1",
    "chars": 787,
    "preview": "<#\n.SYNOPSIS\n    Look up the pull request URL of the insertion PR.\n#>\n$stagingFolder = $env:BUILD_STAGINGDIRECTORY\nif (!"
  },
  {
    "path": "azure-pipelines/GlobalVariables.yml",
    "chars": 280,
    "preview": "variables:\n  # These variables are required for MicroBuild tasks\n  TeamName: VS IDE\n  TeamEmail: vsidemicrobuild@microso"
  },
  {
    "path": "azure-pipelines/Merge-CodeCoverage.ps1",
    "chars": 2219,
    "preview": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Merges code coverage reports.\n.PARAMETER Path\n    The path(s) to search for Cobert"
  },
  {
    "path": "azure-pipelines/NuGetSbom.props",
    "chars": 189,
    "preview": "<Project>\n  <PropertyGroup>\n    <GenerateSBOMThisProject>true</GenerateSBOMThisProject>\n    <UseMicroBuildSbomPluginVers"
  },
  {
    "path": "azure-pipelines/PoliCheckExclusions.xml",
    "chars": 725,
    "preview": "<PoliCheckExclusions>\n    <!--Each of these exclusions is a folder name -if \\[name]\\exists in the file path, it will be "
  },
  {
    "path": "azure-pipelines/PostPRMessage.ps1",
    "chars": 1936,
    "preview": "[CmdletBinding(SupportsShouldProcess = $true)]\nparam(\n    [Parameter(Mandatory=$true)]\n    $AccessToken,\n    [Parameter("
  },
  {
    "path": "azure-pipelines/TSAOptions.json",
    "chars": 500,
    "preview": "{\n  \"tsaVersion\": \"TsaV2\",\n  \"codebase\": \"NewOrUpdate\",\n  \"codebaseName\": \"SlowCheetah\",\n  \"tsaStamp\": \"DevDiv\",\n  \"tsaE"
  },
  {
    "path": "azure-pipelines/WIFtoPATauth.yml",
    "chars": 1152,
    "preview": "parameters:\n- name: deadPATServiceConnectionId # The GUID of the PAT-based service connection whose access token must be"
  },
  {
    "path": "azure-pipelines/apiscan.yml",
    "chars": 2187,
    "preview": "parameters:\n- name: windowsPool\n  type: object\n- name: RealSign\n  type: boolean\n\njobs:\n- job: apiscan\n  displayName: API"
  },
  {
    "path": "azure-pipelines/archive-sourcecode.yml",
    "chars": 3154,
    "preview": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\n# Source archival requirements come fro"
  },
  {
    "path": "azure-pipelines/build.yml",
    "chars": 15798,
    "preview": "parameters:\n##### The following parameters are not set by other YAML files that import this one,\n##### but we use parame"
  },
  {
    "path": "azure-pipelines/dotnet.yml",
    "chars": 1923,
    "preview": "parameters:\n- name: RunTests\n- name: Is1ESPT\n  type: boolean\n- name: BuildRequiresAccessToken\n  type: boolean\n  default:"
  },
  {
    "path": "azure-pipelines/falsepositives.gdnsuppress",
    "chars": 229,
    "preview": "{\n  \"version\": \"latest\",\n  \"suppressionSets\": {\n    \"falsepositives\": {\n      \"name\": \"falsepositives\",\n      \"createdDa"
  },
  {
    "path": "azure-pipelines/install-dependencies.yml",
    "chars": 1476,
    "preview": "parameters:\n- name: initArgs\n  type: string\n  default: ''\n- name: needsAzurePublicFeeds\n  type: boolean\n  default: true "
  },
  {
    "path": "azure-pipelines/libtemplate-update.yml",
    "chars": 7238,
    "preview": "# This pipeline schedules regular merges of Library.Template into a repo that is based on it.\n# Only Azure Repos are sup"
  },
  {
    "path": "azure-pipelines/microbuild.after.yml",
    "chars": 549,
    "preview": "parameters:\n- name: SkipCodesignVerify\n  type: boolean\n\nsteps:\n- ${{ if not(parameters.SkipCodesignVerify) }}:\n  - task:"
  },
  {
    "path": "azure-pipelines/microbuild.before.yml",
    "chars": 906,
    "preview": "parameters:\n- name: EnableLocalization\n  type: boolean\n  default: false\n- name: ShouldSkipOptimize\n  type: boolean\n  def"
  },
  {
    "path": "azure-pipelines/no_authenticode.txt",
    "chars": 131,
    "preview": "bin\\packages\\release\\vsix\\_manifest\\manifest.cat,sbom signed\nbin\\packages\\release\\vsix\\_manifest\\spdx_2.2\\manifest.cat,s"
  },
  {
    "path": "azure-pipelines/no_strongname.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "azure-pipelines/official.yml",
    "chars": 3420,
    "preview": "trigger:\n  branches:\n    include:\n    - main\n\nschedules:\n# Monthly compliance sweep: runs at 03:00 UTC (8 PM PST previou"
  },
  {
    "path": "azure-pipelines/prepare-insertion-stages.yml",
    "chars": 3427,
    "preview": "parameters:\n- name: ArchiveSymbols\n  type: boolean\n  default: true\n- name: RealSign\n  displayName: Real sign?\n  type: bo"
  },
  {
    "path": "azure-pipelines/publish-codecoverage.yml",
    "chars": 991,
    "preview": "parameters:\n- name: EnableMacOSBuild\n  type: boolean\n- name: EnableLinuxBuild\n  type: boolean\n\nsteps:\n- download: curren"
  },
  {
    "path": "azure-pipelines/publish-symbols.yml",
    "chars": 2039,
    "preview": "parameters:\n- name: EnableMacOSBuild\n  type: boolean\n- name: EnableLinuxBuild\n  type: boolean\n\nsteps:\n- task: DownloadPi"
  },
  {
    "path": "azure-pipelines/publish_artifacts.ps1",
    "chars": 1777,
    "preview": "<#\n.SYNOPSIS\n    This script translates all the artifacts described by _all.ps1\n    into commands that instruct Azure Pi"
  },
  {
    "path": "azure-pipelines/release-deployment-prep.yml",
    "chars": 234,
    "preview": "steps:\n- download: CI\n  artifact: Variables-Windows\n  displayName: 🔻 Download Variables-Windows artifact\n- powershell: $"
  },
  {
    "path": "azure-pipelines/release.yml",
    "chars": 3460,
    "preview": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\nresources:\n  repositories:\n  - reposito"
  },
  {
    "path": "azure-pipelines/unofficial.yml",
    "chars": 3270,
    "preview": "trigger:\n  batch: true\n  branches:\n    include:\n    - main\n    - microbuild\n    - 'validate/*'\n  paths:\n    exclude:\n   "
  },
  {
    "path": "azure-pipelines/vs-insertion-script.ps1",
    "chars": 682,
    "preview": "# List of build artifact files [Source => Destination] to be committed into the VS repo.\n$FilesToCommit = @{\n    \"$env:P"
  },
  {
    "path": "azure-pipelines/vs-insertion.yml",
    "chars": 3516,
    "preview": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\nresources:\n  repositories:\n  - reposito"
  },
  {
    "path": "azure-pipelines/vs-validation.yml",
    "chars": 5209,
    "preview": "# This is a top-level pipeline file, which is designed to be added as an optional PR build policy\n# so that a VS inserti"
  },
  {
    "path": "azure-pipelines.yml",
    "chars": 687,
    "preview": "trigger:\n  batch: true\n  branches:\n    include:\n    - main\n    - 'v*.*'\n    - microbuild\n    - 'validate/*'\n  paths:\n   "
  },
  {
    "path": "doc/targets.md",
    "chars": 3542,
    "preview": "# SlowCheetah Build Targets\n\n### Summary\nSlowCheetah alters the build process for projects to ensure that the transforma"
  },
  {
    "path": "doc/transforming_files.md",
    "chars": 2251,
    "preview": "# Transforming Files with SlowCheetah\n\n## Summary\nThe [SlowCheetah Visual Studio extension](https://marketplace.visualst"
  },
  {
    "path": "doc/update.md",
    "chars": 3384,
    "preview": "# SlowCheetah in VS 2017 \n\nWe have made significant changes to the SlowCheetah extension and NuGet package. This is beca"
  },
  {
    "path": "docfx/.gitignore",
    "chars": 12,
    "preview": "_site/\napi/\n"
  },
  {
    "path": "docfx/docfx.json",
    "chars": 1033,
    "preview": "{\n    \"metadata\": [\n        {\n            \"src\": [\n                {\n                    \"src\": \"../src/Library\",\n      "
  },
  {
    "path": "docfx/docs/features.md",
    "chars": 17,
    "preview": "# Features\n\nTODO\n"
  },
  {
    "path": "docfx/docs/getting-started.md",
    "chars": 313,
    "preview": "# Getting Started\n\n## Installation\n\nConsume this library via its NuGet Package.\nClick on the badge to find its latest ve"
  },
  {
    "path": "docfx/docs/toc.yml",
    "chars": 95,
    "preview": "items:\n- name: Features\n  href: features.md\n- name: Getting Started\n  href: getting-started.md\n"
  },
  {
    "path": "docfx/index.md",
    "chars": 116,
    "preview": "---\n_layout: landing\n---\n\n# Overview\n\nThis is your docfx landing page.\n\nClick \"Docs\" across the top to get started.\n"
  },
  {
    "path": "docfx/toc.yml",
    "chars": 59,
    "preview": "items:\n- name: Docs\n  href: docs/\n- name: API\n  href: api/\n"
  },
  {
    "path": "global.json",
    "chars": 212,
    "preview": "{\n  \"sdk\": {\n    \"version\": \"10.0.204\",\n    \"rollForward\": \"patch\",\n    \"allowPrerelease\": false\n  },\n  \"msbuild-sdks\": "
  },
  {
    "path": "init.cmd",
    "chars": 646,
    "preview": "@echo off\nSETLOCAL\nset PS1UnderCmd=1\n\n:: Get the datetime in a format that can go in a filename.\nset _my_datetime=%date%"
  },
  {
    "path": "init.ps1",
    "chars": 8067,
    "preview": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Installs dependencies required to build and test the projects in this repository.\n"
  },
  {
    "path": "nuget.config",
    "chars": 725,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <config>\n    <add key=\"repositorypath\" value=\"packages\" />\n  <"
  },
  {
    "path": "samples/FSharpDemo/FSharpDemo.fsproj",
    "chars": 4049,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "samples/FSharpDemo/Program.fs",
    "chars": 498,
    "preview": "// Learn more about F# at http://fsharp.net\nlet settingOne = System.Configuration.ConfigurationManager.AppSettings.[\"se"
  },
  {
    "path": "samples/FSharpDemo/app.Debug.config",
    "chars": 637,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/FSharpDemo/app.Release.config",
    "chars": 635,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/FSharpDemo/app.config",
    "chars": 273,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"settingOne\" value=\"one default va"
  },
  {
    "path": "samples/Linked-files/connectionStrings.Debug.config",
    "chars": 465,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/Linked-files/connectionStrings.Release.config",
    "chars": 647,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/Linked-files/connectionStrings.config",
    "chars": 209,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n  <clear />\n  <add name=\"RecordsDb\" connectionString=\".\\SQLE"
  },
  {
    "path": "samples/SlowCheetah.Samples.sln",
    "chars": 6999,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2012\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C"
  },
  {
    "path": "samples/TransformSetupProject/.gitignore",
    "chars": 32,
    "preview": "# Folders\nDebug\nRelease\n\n# Files"
  },
  {
    "path": "samples/TransformSetupProject/TransformSetupProject.vdproj",
    "chars": 28534,
    "preview": "\"DeployProject\"\n{\n\"VSVersion\" = \"3:800\"\n\"ProjectType\" = \"8:{978C614F-708E-4E1A-B201-565925725DBA}\"\n\"IsWebType\" = \"8:FAL"
  },
  {
    "path": "samples/WebDemo/Default.aspx",
    "chars": 348,
    "preview": "<%@ Page Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"WebDemo.Default\" %>\n\n<!DOCTYPE htm"
  },
  {
    "path": "samples/WebDemo/Default.aspx.cs",
    "chars": 310,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System."
  },
  {
    "path": "samples/WebDemo/Default.aspx.designer.cs",
    "chars": 433,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "samples/WebDemo/Properties/AssemblyInfo.cs",
    "chars": 1347,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "samples/WebDemo/Web.Debug.config",
    "chars": 1255,
    "preview": "<?xml version=\"1.0\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlin"
  },
  {
    "path": "samples/WebDemo/Web.Release.config",
    "chars": 1315,
    "preview": "<?xml version=\"1.0\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlin"
  },
  {
    "path": "samples/WebDemo/Web.config",
    "chars": 294,
    "preview": "<?xml version=\"1.0\"?>\n\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://"
  },
  {
    "path": "samples/WebDemo/WebDemo.csproj",
    "chars": 6040,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "samples/WebDemo/connectionStrings.Debug.config",
    "chars": 465,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/WebDemo/connectionStrings.Release.config",
    "chars": 647,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/WebDemo/connectionStrings.ToPkg.config",
    "chars": 568,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations\n     see the web.config examp"
  },
  {
    "path": "samples/WebDemo/connectionStrings.config",
    "chars": 209,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n  <clear />\n  <add name=\"RecordsDb\" connectionString=\".\\SQLE"
  },
  {
    "path": "samples/WindowsAzure1/ServiceConfiguration.Cloud.cscfg",
    "chars": 492,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceConfiguration serviceName=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft"
  },
  {
    "path": "samples/WindowsAzure1/ServiceConfiguration.Local.cscfg",
    "chars": 492,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceConfiguration serviceName=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft"
  },
  {
    "path": "samples/WindowsAzure1/ServiceDefinition.csdef",
    "chars": 343,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceDefinition name=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft.com/Serv"
  },
  {
    "path": "samples/WindowsAzure1/WindowsAzure1.ccproj",
    "chars": 2751,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "samples/WorkerRole1/Properties/AssemblyInfo.cs",
    "chars": 1395,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "samples/WorkerRole1/WorkerRole.cs",
    "chars": 1315,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Net;\nusing Sys"
  },
  {
    "path": "samples/WorkerRole1/WorkerRole1.csproj",
    "chars": 4284,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "samples/WorkerRole1/XMLFile1.xml",
    "chars": 42,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n"
  },
  {
    "path": "samples/WorkerRole1/app.Debug.config",
    "chars": 378,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/WorkerRole1/app.Release.config",
    "chars": 383,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/WorkerRole1/app.config",
    "chars": 580,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"one\" value=\"default\"/>\n  </appSet"
  },
  {
    "path": "samples/WorkerRole1/contacts.Debug.xml",
    "chars": 335,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/WorkerRole1/contacts.Release.xml",
    "chars": 337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/WorkerRole1/contacts.xml",
    "chars": 113,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<Contacts>\n  <Contact FirstName=\"Sayed\" LastName=\"Hashimi\"/>\n</Contacts>"
  },
  {
    "path": "samples/WorkerRole1/packages.config",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\""
  },
  {
    "path": "samples/Wpf.Transform/App.xaml",
    "chars": 367,
    "preview": "<Application x:Class=\"Wpf.Transform.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\""
  },
  {
    "path": "samples/Wpf.Transform/App.xaml.cs",
    "chars": 293,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing"
  },
  {
    "path": "samples/Wpf.Transform/Assets/BureauBlue.xaml",
    "chars": 279148,
    "preview": "<!--\n// (c) Copyright Microsoft Corporation.\n// This source is subject to Microsoft Public License (Ms-PL).\n// Please s"
  },
  {
    "path": "samples/Wpf.Transform/MainWindow.xaml",
    "chars": 3311,
    "preview": "<Window\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.micro"
  },
  {
    "path": "samples/Wpf.Transform/MainWindow.xaml.cs",
    "chars": 1898,
    "preview": "namespace Wpf.Transform {\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Syst"
  },
  {
    "path": "samples/Wpf.Transform/Properties/AssemblyInfo.cs",
    "chars": 2241,
    "preview": "using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropSer"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Resources.Designer.cs",
    "chars": 2701,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Resources.resx",
    "chars": 5494,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Settings.Designer.cs",
    "chars": 1042,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Settings.settings",
    "chars": 193,
    "preview": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    "
  },
  {
    "path": "samples/Wpf.Transform/TransformModel.cs",
    "chars": 1278,
    "preview": "namespace Wpf.Transform {\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using Syst"
  },
  {
    "path": "samples/Wpf.Transform/Wpf.Transform.csproj",
    "chars": 9071,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "samples/Wpf.Transform/app.Debug.config",
    "chars": 610,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.comfig exam"
  },
  {
    "path": "samples/Wpf.Transform/app.Release.config",
    "chars": 609,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.comfig exam"
  },
  {
    "path": "samples/Wpf.Transform/app.config",
    "chars": 348,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"appName\" value=\"WPF Demo-Debug-de"
  },
  {
    "path": "samples/Wpf.Transform/connectionStrings.Debug.config",
    "chars": 465,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/Wpf.Transform/connectionStrings.Release.config",
    "chars": 647,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/Wpf.Transform/connectionStrings.config",
    "chars": 209,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n  <clear />\n  <add name=\"RecordsDb\" connectionString=\".\\SQLE"
  },
  {
    "path": "samples/Wpf.Transform/contacts.Debug.xml",
    "chars": 594,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/Wpf.Transform/contacts.Release.xml",
    "chars": 600,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "samples/Wpf.Transform/contacts.xml",
    "chars": 236,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<contacts>\n  <default>\n    <add firstName=\"one\" value=\"one-default\" />\n    <add"
  },
  {
    "path": "src/.editorconfig",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/AssemblyInfo.cs",
    "chars": 280,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the "
  },
  {
    "path": "src/AssemblyInfo.vb",
    "chars": 279,
    "preview": "' Copyright (c) Microsoft Corporation. All rights reserved.\n' Licensed under the MIT license. See LICENSE file in the pr"
  },
  {
    "path": "src/Directory.Build.props",
    "chars": 510,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <!-- Include and reference README in nuget package, if a README is in"
  },
  {
    "path": "src/Directory.Build.targets",
    "chars": 403,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <ItemGroup>\n    <Compile Include=\"$(MSBuildThisFileDirectory)Assembly"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.App.targets",
    "chars": 4938,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets",
    "chars": 1374,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.SetupProject.targets",
    "chars": 3497,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.Web.targets",
    "chars": 4680,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.targets",
    "chars": 6941,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n**************************************************************************"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/TransformTask.cs",
    "chars": 1612,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/readme.txt",
    "chars": 367,
    "preview": "SlowCheetah\n===========\n\nTransformations for XML files (such as app.config) and JSON files.\n\n## Visual Studio Extension\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Exceptions/TransformFailedException.cs",
    "chars": 2148,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/ITransformationLogger.cs",
    "chars": 3598,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/JsonShimLogger.cs",
    "chars": 2489,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/TransformationTaskLogger.cs",
    "chars": 3185,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/XmlShimLogger.cs",
    "chars": 5774,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Microsoft.VisualStudio.SlowCheetah.csproj",
    "chars": 2935,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>library</OutputType>\n    <TargetFramework>net472</T"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Properties/AssemblyInfo.cs",
    "chars": 236,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.Designer.cs",
    "chars": 4986,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.resx",
    "chars": 6830,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/ITransformer.cs",
    "chars": 2018,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/JsonTransformer.cs",
    "chars": 5686,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformUtilities.cs",
    "chars": 2698,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformerFactory.cs",
    "chars": 2101,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/XmlTransformer.cs",
    "chars": 5759,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/App.config",
    "chars": 156,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"xunit.shadowCopy\" value=\"false\" /"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs",
    "chars": 2883,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs",
    "chars": 6230,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs",
    "chars": 1717,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Debug.config",
    "chars": 407,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Release.config",
    "chars": 409,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.config",
    "chars": 253,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Default\"/>\n  "
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/ConsoleApp.csproj",
    "chars": 3140,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Debug.config",
    "chars": 319,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Release.config",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.config",
    "chars": 95,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n  <TestNode>default</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs",
    "chars": 233,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Properties/AssemblyInfo.cs",
    "chars": 1388,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.props",
    "chars": 11,
    "preview": "<Project />"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.targets",
    "chars": 11,
    "preview": "<Project />"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Debug.config",
    "chars": 319,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Release.config",
    "chars": 321,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config exam"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.config",
    "chars": 95,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n  <TestNode>default</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Properties/AssemblyInfo.cs",
    "chars": 1361,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Debug.config",
    "chars": 1272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.mi"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Release.config",
    "chars": 1332,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.mi"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.config",
    "chars": 1366,
    "preview": "<?xml version=\"1.0\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  https://"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/WebApplication.csproj",
    "chars": 5981,
    "preview": "<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Imp"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs",
    "chars": 1200,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/Microsoft.VisualStudio.SlowCheetah.Tests.csproj",
    "chars": 2739,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net472</TargetFramework>\n    <IsPackable>fals"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs",
    "chars": 2090,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs",
    "chars": 1607,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE fil"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/example.txt",
    "chars": 479,
    "preview": "Running msbuild.exe C:\\src\\libtempslowcheetah\\bin\\Microsoft.VisualStudio.SlowCheetah.Tests\\Debug\\net472\\..\\..\\..\\..\\test"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Directory.Build.targets",
    "chars": 812,
    "preview": "<Project>\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"Exists('$(VSToolsPath)\\VSSDK\\Micro"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Microsoft.VisualStudio.SlowCheetah.VS.csproj",
    "chars": 4356,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFramework>net472</"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BackgroundInstallationHandler.cs",
    "chars": 4103,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BasePackageHandler.cs",
    "chars": 1434,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the"
  }
]

// ... and 128 more files (download for full content)

About this extraction

This page contains the full source code of the Microsoft/slow-cheetah GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 328 files (999.6 KB), approximately 243.6k tokens, and a symbol index with 297 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!