| # Copyright (c) Microsoft Corporation. All rights reserved. | |
| $InitialDatabase = '0' | |
| $knownExceptions = @( | |
| 'System.Data.Entity.Migrations.Infrastructure.MigrationsException', | |
| 'System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException', | |
| 'System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException', | |
| 'System.Data.Entity.Migrations.Infrastructure.MigrationsPendingException', | |
| 'System.Data.Entity.Migrations.ProjectTypeNotSupportedException' | |
| ) | |
| <# | |
| .SYNOPSIS | |
| Adds or updates an Entity Framework provider entry in the project config | |
| file. | |
| .DESCRIPTION | |
| Adds an entry into the 'entityFramework' section of the project config | |
| file for the specified provider invariant name and provider type. If an | |
| entry for the given invariant name already exists, then that entry is | |
| updated with the given type name, unless the given type name already | |
| matches, in which case no action is taken. The 'entityFramework' | |
| section is added if it does not exist. The config file is automatically | |
| saved if and only if a change was made. | |
| This command is typically used only by Entity Framework provider NuGet | |
| packages and is run from the 'install.ps1' script. | |
| .PARAMETER Project | |
| The Visual Studio project to update. When running in the NuGet install.ps1 | |
| script the '$project' variable provided as part of that script should be | |
| used. | |
| .PARAMETER InvariantName | |
| The provider invariant name that uniquely identifies this provider. For | |
| example, the Microsoft SQL Server provider is registered with the invariant | |
| name 'System.Data.SqlClient'. | |
| .PARAMETER TypeName | |
| The assembly-qualified type name of the provider-specific type that | |
| inherits from 'System.Data.Entity.Core.Common.DbProviderServices'. For | |
| example, for the Microsoft SQL Server provider, this type is | |
| 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'. | |
| #> | |
| function Add-EFProvider | |
| { | |
| param ( | |
| [parameter(Position = 0, | |
| Mandatory = $true)] | |
| $Project, | |
| [parameter(Position = 1, | |
| Mandatory = $true)] | |
| [string] $InvariantName, | |
| [parameter(Position = 2, | |
| Mandatory = $true)] | |
| [string] $TypeName | |
| ) | |
| if (!(Check-Project $project)) | |
| { | |
| return | |
| } | |
| $runner = New-EFConfigRunner $Project | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.AddProviderCommand @( $InvariantName, $TypeName ) | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| <# | |
| .SYNOPSIS | |
| Adds or updates an Entity Framework default connection factory in the | |
| project config file. | |
| .DESCRIPTION | |
| Adds an entry into the 'entityFramework' section of the project config | |
| file for the connection factory that Entity Framework will use by default | |
| when creating new connections by convention. Any existing entry will be | |
| overridden if it does not match. The 'entityFramework' section is added if | |
| it does not exist. The config file is automatically saved if and only if | |
| a change was made. | |
| This command is typically used only by Entity Framework provider NuGet | |
| packages and is run from the 'install.ps1' script. | |
| .PARAMETER Project | |
| The Visual Studio project to update. When running in the NuGet install.ps1 | |
| script the '$project' variable provided as part of that script should be | |
| used. | |
| .PARAMETER TypeName | |
| The assembly-qualified type name of the connection factory type that | |
| implements the 'System.Data.Entity.Infrastructure.IDbConnectionFactory' | |
| interface. For example, for the Microsoft SQL Server Express provider | |
| connection factory, this type is | |
| 'System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework'. | |
| .PARAMETER ConstructorArguments | |
| An optional array of strings that will be passed as arguments to the | |
| connection factory type constructor. | |
| #> | |
| function Add-EFDefaultConnectionFactory | |
| { | |
| param ( | |
| [parameter(Position = 0, | |
| Mandatory = $true)] | |
| $Project, | |
| [parameter(Position = 1, | |
| Mandatory = $true)] | |
| [string] $TypeName, | |
| [string[]] $ConstructorArguments | |
| ) | |
| if (!(Check-Project $project)) | |
| { | |
| return | |
| } | |
| $runner = New-EFConfigRunner $Project | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.AddDefaultConnectionFactoryCommand @( $TypeName, $ConstructorArguments ) | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| <# | |
| .SYNOPSIS | |
| Initializes the Entity Framework section in the project config file | |
| and sets defaults. | |
| .DESCRIPTION | |
| Creates the 'entityFramework' section of the project config file and sets | |
| the default connection factory to use SQL Express if it is running on the | |
| machine, or LocalDb otherwise. Note that installing a different provider | |
| may change the default connection factory. The config file is | |
| automatically saved if and only if a change was made. | |
| In addition, any reference to 'System.Data.Entity.dll' in the project is | |
| removed. | |
| This command is typically used only by Entity Framework provider NuGet | |
| packages and is run from the 'install.ps1' script. | |
| .PARAMETER Project | |
| The Visual Studio project to update. When running in the NuGet install.ps1 | |
| script the '$project' variable provided as part of that script should be | |
| used. | |
| #> | |
| function Initialize-EFConfiguration | |
| { | |
| param ( | |
| [parameter(Position = 0, | |
| Mandatory = $true)] | |
| $Project | |
| ) | |
| if (!(Check-Project $project)) | |
| { | |
| return | |
| } | |
| $runner = New-EFConfigRunner $Project | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.InitializeEntityFrameworkCommand | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| <# | |
| .SYNOPSIS | |
| Enables Code First Migrations in a project. | |
| .DESCRIPTION | |
| Enables Migrations by scaffolding a migrations configuration class in the project. If the | |
| target database was created by an initializer, an initial migration will be created (unless | |
| automatic migrations are enabled via the EnableAutomaticMigrations parameter). | |
| .PARAMETER ContextTypeName | |
| Specifies the context to use. If omitted, migrations will attempt to locate a | |
| single context type in the target project. | |
| .PARAMETER EnableAutomaticMigrations | |
| Specifies whether automatic migrations will be enabled in the scaffolded migrations configuration. | |
| If omitted, automatic migrations will be disabled. | |
| .PARAMETER MigrationsDirectory | |
| Specifies the name of the directory that will contain migrations code files. | |
| If omitted, the directory will be named "Migrations". | |
| .PARAMETER ProjectName | |
| Specifies the project that the scaffolded migrations configuration class will | |
| be added to. If omitted, the default project selected in package manager | |
| console is used. | |
| .PARAMETER StartUpProjectName | |
| Specifies the configuration file to use for named connection strings. If | |
| omitted, the specified project's configuration file is used. | |
| .PARAMETER ContextProjectName | |
| Specifies the project which contains the DbContext class to use. If omitted, | |
| the context is assumed to be in the same project used for migrations. | |
| .PARAMETER ConnectionStringName | |
| Specifies the name of a connection string to use from the application's | |
| configuration file. | |
| .PARAMETER ConnectionString | |
| Specifies the the connection string to use. If omitted, the context's | |
| default connection will be used. | |
| .PARAMETER ConnectionProviderName | |
| Specifies the provider invariant name of the connection string. | |
| .PARAMETER Force | |
| Specifies that the migrations configuration be overwritten when running more | |
| than once for a given project. | |
| .PARAMETER ContextAssemblyName | |
| Specifies the name of the assembly which contains the DbContext class to use. Use this | |
| parameter instead of ContextProjectName when the context is contained in a referenced | |
| assembly rather than in a project of the solution. | |
| .PARAMETER AppDomainBaseDirectory | |
| Specifies the directory to use for the app-domain that is used for running Migrations | |
| code such that the app-domain is able to find all required assemblies. This is an | |
| advanced option that should only be needed if the solution contains several projects | |
| such that the assemblies needed for the context and configuration are not all | |
| referenced from either the project containing the context or the project containing | |
| the migrations. | |
| .EXAMPLE | |
| Enable-Migrations | |
| # Scaffold a migrations configuration in a project with only one context | |
| .EXAMPLE | |
| Enable-Migrations -Auto | |
| # Scaffold a migrations configuration with automatic migrations enabled for a project | |
| # with only one context | |
| .EXAMPLE | |
| Enable-Migrations -ContextTypeName MyContext -MigrationsDirectory DirectoryName | |
| # Scaffold a migrations configuration for a project with multiple contexts | |
| # This scaffolds a migrations configuration for MyContext and will put the configuration | |
| # and subsequent configurations in a new directory called "DirectoryName" | |
| #> | |
| function Enable-Migrations | |
| { | |
| [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')] | |
| param ( | |
| [string] $ContextTypeName, | |
| [alias('Auto')] | |
| [switch] $EnableAutomaticMigrations, | |
| [string] $MigrationsDirectory, | |
| [string] $ProjectName, | |
| [string] $StartUpProjectName, | |
| [string] $ContextProjectName, | |
| [parameter(ParameterSetName = 'ConnectionStringName')] | |
| [string] $ConnectionStringName, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionString, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionProviderName, | |
| [switch] $Force, | |
| [string] $ContextAssemblyName, | |
| [string] $AppDomainBaseDirectory | |
| ) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ContextProjectName $null $ConnectionStringName $ConnectionString $ConnectionProviderName $ContextAssemblyName $AppDomainBaseDirectory | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.Migrations.EnableMigrationsCommand @( $EnableAutomaticMigrations.IsPresent, $Force.IsPresent ) @{ 'ContextTypeName' = $ContextTypeName; 'MigrationsDirectory' = $MigrationsDirectory } | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show() | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| <# | |
| .SYNOPSIS | |
| Scaffolds a migration script for any pending model changes. | |
| .DESCRIPTION | |
| Scaffolds a new migration script and adds it to the project. | |
| .PARAMETER Name | |
| Specifies the name of the custom script. | |
| .PARAMETER Force | |
| Specifies that the migration user code be overwritten when re-scaffolding an | |
| existing migration. | |
| .PARAMETER ProjectName | |
| Specifies the project that contains the migration configuration type to be | |
| used. If omitted, the default project selected in package manager console | |
| is used. | |
| .PARAMETER StartUpProjectName | |
| Specifies the configuration file to use for named connection strings. If | |
| omitted, the specified project's configuration file is used. | |
| .PARAMETER ConfigurationTypeName | |
| Specifies the migrations configuration to use. If omitted, migrations will | |
| attempt to locate a single migrations configuration type in the target | |
| project. | |
| .PARAMETER ConnectionStringName | |
| Specifies the name of a connection string to use from the application's | |
| configuration file. | |
| .PARAMETER ConnectionString | |
| Specifies the the connection string to use. If omitted, the context's | |
| default connection will be used. | |
| .PARAMETER ConnectionProviderName | |
| Specifies the provider invariant name of the connection string. | |
| .PARAMETER IgnoreChanges | |
| Scaffolds an empty migration ignoring any pending changes detected in the current model. | |
| This can be used to create an initial, empty migration to enable Migrations for an existing | |
| database. N.B. Doing this assumes that the target database schema is compatible with the | |
| current model. | |
| .PARAMETER AppDomainBaseDirectory | |
| Specifies the directory to use for the app-domain that is used for running Migrations | |
| code such that the app-domain is able to find all required assemblies. This is an | |
| advanced option that should only be needed if the solution contains several projects | |
| such that the assemblies needed for the context and configuration are not all | |
| referenced from either the project containing the context or the project containing | |
| the migrations. | |
| .EXAMPLE | |
| Add-Migration First | |
| # Scaffold a new migration named "First" | |
| .EXAMPLE | |
| Add-Migration First -IgnoreChanges | |
| # Scaffold an empty migration ignoring any pending changes detected in the current model. | |
| # This can be used to create an initial, empty migration to enable Migrations for an existing | |
| # database. N.B. Doing this assumes that the target database schema is compatible with the | |
| # current model. | |
| #> | |
| function Add-Migration | |
| { | |
| [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')] | |
| param ( | |
| [parameter(Position = 0, | |
| Mandatory = $true)] | |
| [string] $Name, | |
| [switch] $Force, | |
| [string] $ProjectName, | |
| [string] $StartUpProjectName, | |
| [string] $ConfigurationTypeName, | |
| [parameter(ParameterSetName = 'ConnectionStringName')] | |
| [string] $ConnectionStringName, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionString, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionProviderName, | |
| [switch] $IgnoreChanges, | |
| [string] $AppDomainBaseDirectory) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName $null $AppDomainBaseDirectory | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.Migrations.AddMigrationCommand @( $Name, $Force.IsPresent, $IgnoreChanges.IsPresent ) | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show() | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| <# | |
| .SYNOPSIS | |
| Applies any pending migrations to the database. | |
| .DESCRIPTION | |
| Updates the database to the current model by applying pending migrations. | |
| .PARAMETER SourceMigration | |
| Only valid with -Script. Specifies the name of a particular migration to use | |
| as the update's starting point. If omitted, the last applied migration in | |
| the database will be used. | |
| .PARAMETER TargetMigration | |
| Specifies the name of a particular migration to update the database to. If | |
| omitted, the current model will be used. | |
| .PARAMETER Script | |
| Generate a SQL script rather than executing the pending changes directly. | |
| .PARAMETER Force | |
| Specifies that data loss is acceptable during automatic migration of the | |
| database. | |
| .PARAMETER ProjectName | |
| Specifies the project that contains the migration configuration type to be | |
| used. If omitted, the default project selected in package manager console | |
| is used. | |
| .PARAMETER StartUpProjectName | |
| Specifies the configuration file to use for named connection strings. If | |
| omitted, the specified project's configuration file is used. | |
| .PARAMETER ConfigurationTypeName | |
| Specifies the migrations configuration to use. If omitted, migrations will | |
| attempt to locate a single migrations configuration type in the target | |
| project. | |
| .PARAMETER ConnectionStringName | |
| Specifies the name of a connection string to use from the application's | |
| configuration file. | |
| .PARAMETER ConnectionString | |
| Specifies the the connection string to use. If omitted, the context's | |
| default connection will be used. | |
| .PARAMETER ConnectionProviderName | |
| Specifies the provider invariant name of the connection string. | |
| .PARAMETER AppDomainBaseDirectory | |
| Specifies the directory to use for the app-domain that is used for running Migrations | |
| code such that the app-domain is able to find all required assemblies. This is an | |
| advanced option that should only be needed if the solution contains several projects | |
| such that the assemblies needed for the context and configuration are not all | |
| referenced from either the project containing the context or the project containing | |
| the migrations. | |
| .EXAMPLE | |
| Update-Database | |
| # Update the database to the latest migration | |
| .EXAMPLE | |
| Update-Database -TargetMigration Second | |
| # Update database to a migration named "Second" | |
| # This will apply migrations if the target hasn't been applied or roll back migrations | |
| # if it has | |
| .EXAMPLE | |
| Update-Database -Script | |
| # Generate a script to update the database from it's current state to the latest migration | |
| .EXAMPLE | |
| Update-Database -Script -SourceMigration Second -TargetMigration First | |
| # Generate a script to migrate the database from a specified start migration | |
| # named "Second" to a specified target migration named "First" | |
| .EXAMPLE | |
| Update-Database -Script -SourceMigration $InitialDatabase | |
| # Generate a script that can upgrade a database currently at any version to the latest version. | |
| # The generated script includes logic to check the __MigrationsHistory table and only apply changes | |
| # that haven't been previously applied. | |
| .EXAMPLE | |
| Update-Database -TargetMigration $InitialDatabase | |
| # Runs the Down method to roll-back any migrations that have been applied to the database | |
| #> | |
| function Update-Database | |
| { | |
| [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')] | |
| param ( | |
| [string] $SourceMigration, | |
| [string] $TargetMigration, | |
| [switch] $Script, | |
| [switch] $Force, | |
| [string] $ProjectName, | |
| [string] $StartUpProjectName, | |
| [string] $ConfigurationTypeName, | |
| [parameter(ParameterSetName = 'ConnectionStringName')] | |
| [string] $ConnectionStringName, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionString, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionProviderName, | |
| [string] $AppDomainBaseDirectory) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName $null $AppDomainBaseDirectory | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.Migrations.UpdateDatabaseCommand @( $SourceMigration, $TargetMigration, $Script.IsPresent, $Force.IsPresent, $Verbose.IsPresent ) | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show() | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| <# | |
| .SYNOPSIS | |
| Displays the migrations that have been applied to the target database. | |
| .DESCRIPTION | |
| Displays the migrations that have been applied to the target database. | |
| .PARAMETER ProjectName | |
| Specifies the project that contains the migration configuration type to be | |
| used. If omitted, the default project selected in package manager console | |
| is used. | |
| .PARAMETER StartUpProjectName | |
| Specifies the configuration file to use for named connection strings. If | |
| omitted, the specified project's configuration file is used. | |
| .PARAMETER ConfigurationTypeName | |
| Specifies the migrations configuration to use. If omitted, migrations will | |
| attempt to locate a single migrations configuration type in the target | |
| project. | |
| .PARAMETER ConnectionStringName | |
| Specifies the name of a connection string to use from the application's | |
| configuration file. | |
| .PARAMETER ConnectionString | |
| Specifies the the connection string to use. If omitted, the context's | |
| default connection will be used. | |
| .PARAMETER ConnectionProviderName | |
| Specifies the provider invariant name of the connection string. | |
| .PARAMETER AppDomainBaseDirectory | |
| Specifies the directory to use for the app-domain that is used for running Migrations | |
| code such that the app-domain is able to find all required assemblies. This is an | |
| advanced option that should only be needed if the solution contains several projects | |
| such that the assemblies needed for the context and configuration are not all | |
| referenced from either the project containing the context or the project containing | |
| the migrations. | |
| #> | |
| function Get-Migrations | |
| { | |
| [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')] | |
| param ( | |
| [string] $ProjectName, | |
| [string] $StartUpProjectName, | |
| [string] $ConfigurationTypeName, | |
| [parameter(ParameterSetName = 'ConnectionStringName')] | |
| [string] $ConnectionStringName, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionString, | |
| [parameter(ParameterSetName = 'ConnectionStringAndProviderName', | |
| Mandatory = $true)] | |
| [string] $ConnectionProviderName, | |
| [string] $AppDomainBaseDirectory) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName $null $AppDomainBaseDirectory | |
| try | |
| { | |
| Invoke-RunnerCommand $runner System.Data.Entity.Migrations.GetMigrationsCommand | |
| $error = Get-RunnerError $runner | |
| if ($error) | |
| { | |
| if ($knownExceptions -notcontains $error.TypeName) | |
| { | |
| Write-Host $error.StackTrace | |
| } | |
| else | |
| { | |
| Write-Verbose $error.StackTrace | |
| } | |
| throw $error.Message | |
| } | |
| } | |
| finally | |
| { | |
| Remove-Runner $runner | |
| } | |
| } | |
| function New-MigrationsRunner($ProjectName, $StartUpProjectName, $ContextProjectName, $ConfigurationTypeName, $ConnectionStringName, $ConnectionString, $ConnectionProviderName, $ContextAssemblyName, $AppDomainBaseDirectory) | |
| { | |
| $startUpProject = Get-MigrationsStartUpProject $StartUpProjectName $ProjectName | |
| Build-Project $startUpProject | |
| $project = Get-MigrationsProject $ProjectName | |
| Build-Project $project | |
| $contextProject = $project | |
| if ($ContextProjectName) | |
| { | |
| $contextProject = Get-SingleProject $ContextProjectName | |
| Build-Project $contextProject | |
| } | |
| $installPath = Get-EntityFrameworkInstallPath $project | |
| $toolsPath = Join-Path $installPath tools | |
| $info = New-AppDomainSetup $project $installPath | |
| $domain = [AppDomain]::CreateDomain('Migrations', $null, $info) | |
| $domain.SetData('project', $project) | |
| $domain.SetData('contextProject', $contextProject) | |
| $domain.SetData('startUpProject', $startUpProject) | |
| $domain.SetData('configurationTypeName', $ConfigurationTypeName) | |
| $domain.SetData('connectionStringName', $ConnectionStringName) | |
| $domain.SetData('connectionString', $ConnectionString) | |
| $domain.SetData('connectionProviderName', $ConnectionProviderName) | |
| $domain.SetData('contextAssemblyName', $ContextAssemblyName) | |
| $domain.SetData('appDomainBaseDirectory', $AppDomainBaseDirectory) | |
| $dispatcher = New-DomainDispatcher $toolsPath | |
| $domain.SetData('efDispatcher', $dispatcher) | |
| return @{ | |
| Domain = $domain; | |
| ToolsPath = $toolsPath | |
| } | |
| } | |
| function New-EFConfigRunner($Project) | |
| { | |
| $installPath = Get-EntityFrameworkInstallPath $Project | |
| $toolsPath = Join-Path $installPath tools | |
| $info = New-AppDomainSetup $Project $installPath | |
| $domain = [AppDomain]::CreateDomain('EFConfig', $null, $info) | |
| $domain.SetData('project', $Project) | |
| $dispatcher = New-DomainDispatcher $toolsPath | |
| $domain.SetData('efDispatcher', $dispatcher) | |
| return @{ | |
| Domain = $domain; | |
| ToolsPath = $toolsPath | |
| } | |
| } | |
| function New-AppDomainSetup($Project, $InstallPath) | |
| { | |
| $info = New-Object System.AppDomainSetup -Property @{ | |
| ShadowCopyFiles = 'true'; | |
| ApplicationBase = $InstallPath; | |
| PrivateBinPath = 'tools'; | |
| ConfigurationFile = ([AppDomain]::CurrentDomain.SetupInformation.ConfigurationFile) | |
| } | |
| $targetFrameworkVersion = (New-Object System.Runtime.Versioning.FrameworkName ($Project.Properties.Item('TargetFrameworkMoniker').Value)).Version | |
| if ($targetFrameworkVersion -lt (New-Object Version @( 4, 5 ))) | |
| { | |
| $info.PrivateBinPath += ';lib\net40' | |
| } | |
| else | |
| { | |
| $info.PrivateBinPath += ';lib\net45' | |
| } | |
| return $info | |
| } | |
| function New-DomainDispatcher($ToolsPath) | |
| { | |
| $utilityAssembly = [System.Reflection.Assembly]::LoadFrom((Join-Path $ToolsPath EntityFramework.PowerShell.Utility.dll)) | |
| $dispatcher = $utilityAssembly.CreateInstance( | |
| 'System.Data.Entity.Migrations.Utilities.DomainDispatcher', | |
| $false, | |
| [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::Public, | |
| $null, | |
| $PSCmdlet, | |
| $null, | |
| $null) | |
| return $dispatcher | |
| } | |
| function Remove-Runner($runner) | |
| { | |
| [AppDomain]::Unload($runner.Domain) | |
| } | |
| function Invoke-RunnerCommand($runner, $command, $parameters, $anonymousArguments) | |
| { | |
| $domain = $runner.Domain | |
| if ($anonymousArguments) | |
| { | |
| $anonymousArguments.GetEnumerator() | %{ | |
| $domain.SetData($_.Name, $_.Value) | |
| } | |
| } | |
| $domain.CreateInstanceFrom( | |
| (Join-Path $runner.ToolsPath EntityFramework.PowerShell.dll), | |
| $command, | |
| $false, | |
| 0, | |
| $null, | |
| $parameters, | |
| $null, | |
| $null) | Out-Null | |
| } | |
| function Get-RunnerError($runner) | |
| { | |
| $domain = $runner.Domain | |
| if (!$domain.GetData('wasError')) | |
| { | |
| return $null | |
| } | |
| return @{ | |
| Message = $domain.GetData('error.Message'); | |
| TypeName = $domain.GetData('error.TypeName'); | |
| StackTrace = $domain.GetData('error.StackTrace') | |
| } | |
| } | |
| function Get-MigrationsProject($name, $hideMessage) | |
| { | |
| if ($name) | |
| { | |
| return Get-SingleProject $name | |
| } | |
| $project = Get-Project | |
| $projectName = $project.Name | |
| if (!$hideMessage) | |
| { | |
| Write-Verbose "Using NuGet project '$projectName'." | |
| } | |
| return $project | |
| } | |
| function Get-MigrationsStartUpProject($name, $fallbackName) | |
| { | |
| $startUpProject = $null | |
| if ($name) | |
| { | |
| $startUpProject = Get-SingleProject $name | |
| } | |
| else | |
| { | |
| $startupProjectPaths = $DTE.Solution.SolutionBuild.StartupProjects | |
| if ($startupProjectPaths) | |
| { | |
| if ($startupProjectPaths.Length -eq 1) | |
| { | |
| $startupProjectPath = $startupProjectPaths[0] | |
| if (!(Split-Path -IsAbsolute $startupProjectPath)) | |
| { | |
| $solutionPath = Split-Path $DTE.Solution.Properties.Item('Path').Value | |
| $startupProjectPath = Join-Path $solutionPath $startupProjectPath -Resolve | |
| } | |
| $startupProject = Get-SolutionProjects | ?{ | |
| try | |
| { | |
| $fullName = $_.FullName | |
| } | |
| catch [NotImplementedException] | |
| { | |
| return $false | |
| } | |
| if ($fullName -and $fullName.EndsWith('\')) | |
| { | |
| $fullName = $fullName.Substring(0, $fullName.Length - 1) | |
| } | |
| return $fullName -eq $startupProjectPath | |
| } | |
| } | |
| else | |
| { | |
| Write-Verbose 'More than one start-up project found.' | |
| } | |
| } | |
| else | |
| { | |
| Write-Verbose 'No start-up project found.' | |
| } | |
| } | |
| if (!($startUpProject -and (Test-StartUpProject $startUpProject))) | |
| { | |
| $startUpProject = Get-MigrationsProject $fallbackName $true | |
| $startUpProjectName = $startUpProject.Name | |
| Write-Warning "Cannot determine a valid start-up project. Using project '$startUpProjectName' instead. Your configuration file and working directory may not be set as expected. Use the -StartUpProjectName parameter to set one explicitly. Use the -Verbose switch for more information." | |
| } | |
| else | |
| { | |
| $startUpProjectName = $startUpProject.Name | |
| Write-Verbose "Using StartUp project '$startUpProjectName'." | |
| } | |
| return $startUpProject | |
| } | |
| function Get-SolutionProjects() | |
| { | |
| $projects = New-Object System.Collections.Stack | |
| $DTE.Solution.Projects | %{ | |
| $projects.Push($_) | |
| } | |
| while ($projects.Count -ne 0) | |
| { | |
| $project = $projects.Pop(); | |
| # NOTE: This line is similar to doing a "yield return" in C# | |
| $project | |
| if ($project.ProjectItems) | |
| { | |
| $project.ProjectItems | ?{ $_.SubProject } | %{ | |
| $projects.Push($_.SubProject) | |
| } | |
| } | |
| } | |
| } | |
| function Get-SingleProject($name) | |
| { | |
| $project = Get-Project $name | |
| if ($project -is [array]) | |
| { | |
| throw "More than one project '$name' was found. Specify the full name of the one to use." | |
| } | |
| return $project | |
| } | |
| function Test-StartUpProject($project) | |
| { | |
| if ($project.Kind -eq '{cc5fd16d-436d-48ad-a40c-5a424c6e3e79}') | |
| { | |
| $projectName = $project.Name | |
| Write-Verbose "Cannot use start-up project '$projectName'. The Windows Azure Project type isn't supported." | |
| return $false | |
| } | |
| return $true | |
| } | |
| function Build-Project($project) | |
| { | |
| $configuration = $DTE.Solution.SolutionBuild.ActiveConfiguration.Name | |
| $DTE.Solution.SolutionBuild.BuildProject($configuration, $project.UniqueName, $true) | |
| if ($DTE.Solution.SolutionBuild.LastBuildInfo) | |
| { | |
| $projectName = $project.Name | |
| throw "The project '$projectName' failed to build." | |
| } | |
| } | |
| function Get-EntityFrameworkInstallPath($project) | |
| { | |
| $package = Get-Package -ProjectName $project.FullName | ?{ $_.Id -eq 'EntityFramework' } | |
| if (!$package) | |
| { | |
| $projectName = $project.Name | |
| throw "The EntityFramework package is not installed on project '$projectName'." | |
| } | |
| return Get-PackageInstallPath $package | |
| } | |
| function Get-PackageInstallPath($package) | |
| { | |
| $componentModel = Get-VsComponentModel | |
| $packageInstallerServices = $componentModel.GetService([NuGet.VisualStudio.IVsPackageInstallerServices]) | |
| $vsPackage = $packageInstallerServices.GetInstalledPackages() | ?{ $_.Id -eq $package.Id -and $_.Version -eq $package.Version } | |
| return $vsPackage.InstallPath | |
| } | |
| function Check-Project($project) | |
| { | |
| if (!$project.FullName) | |
| { | |
| throw "The Project argument must refer to a Visual Studio project. Use the '`$project' variable provided by NuGet when running in install.ps1." | |
| } | |
| return $project.CodeModel | |
| } | |
| Export-ModuleMember @( 'Enable-Migrations', 'Add-Migration', 'Update-Database', 'Get-Migrations', 'Add-EFProvider', 'Add-EFDefaultConnectionFactory', 'Initialize-EFConfiguration') -Variable InitialDatabase | |
| # SIG # Begin signature block | |
| # MIIa4AYJKoZIhvcNAQcCoIIa0TCCGs0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB | |
| # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR | |
| # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU3poUYDlTlwf2GyqxNJ7CRJO4 | |
| # tk2gghWCMIIEwzCCA6ugAwIBAgITMwAAAEyh6E3MtHR7OwAAAAAATDANBgkqhkiG | |
| # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G | |
| # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw | |
| # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTMxMTExMjIxMTMx | |
| # WhcNMTUwMjExMjIxMTMxWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp | |
| # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw | |
| # b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO | |
| # OkMwRjQtMzA4Ni1ERUY4MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT | |
| # ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdj6GwYrd6jk | |
| # lF18D+Z6ppLuilQdpPmEdYWXzMtcltDXdS3ZCPtb0u4tJcY3PvWrfhpT5Ve+a+i/ | |
| # ypYK3EbxWh4+AtKy4CaOAGR7vjyT+FgyeYfSGl0jvJxRxA8Q+gRYtRZ2buy8xuW+ | |
| # /K2swUHbqs559RyymUGneiUr/6t4DVg6sV5Q3mRM4MoVKt+m6f6kZi9bEAkJJiHU | |
| # Pw0vbdL4d5ADbN4UEqWM5zYf9IelsEEXb+NNdGbC/aJxRjVRzGsXUWP6FZSSml9L | |
| # KLrmFkVJ6Sy1/ouHr/ylbUPcpjD6KSjvmw0sXIPeEo1qtNtx71wUWiojKP+BcFfx | |
| # jAeaE9gqUwIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFLkNrbNN9NqfGrInJlUNIETY | |
| # mOL0MB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw | |
| # SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz | |
| # L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG | |
| # AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv | |
| # c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI | |
| # hvcNAQEFBQADggEBAAmKTgav6O2Czx0HftcqpyQLLa+aWyR/lHEMVYgkGlIVY+KQ | |
| # TQVKmEqc++GnbWhVgrkp6mmpstXjDNrR1nolN3hnHAz72ylaGpc4KjlWRvs1gbnk | |
| # PUZajuT8dTdYWUmLTts8FZ1zUkvreww6wi3Bs5tSLeA1xbnBV7PoPaE8RPIjFh4K | |
| # qlk3J9CVUl6ofz9U8IHh3Jq9ZdV49vdMObvd4NY3DpGah4xz53FkUvc+A9jGzXK4 | |
| # NDSYW4zT9Qim63jGUaANDm/0azxAGmAWLKkGUp0cE5DObwIe6nucs/b4l2DyZdHR | |
| # H4c6wXXwQo167Yxysnv7LIq0kUdU4i5pzBZUGlkwggTsMIID1KADAgECAhMzAAAA | |
| # ymzVMhI1xOFVAAEAAADKMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw | |
| # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN | |
| # aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp | |
| # Z25pbmcgUENBMB4XDTE0MDQyMjE3MzkwMFoXDTE1MDcyMjE3MzkwMFowgYMxCzAJ | |
| # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k | |
| # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx | |
| # HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB | |
| # BQADggEPADCCAQoCggEBAJZxXe0GRvqEy51bt0bHsOG0ETkDrbEVc2Cc66e2bho8 | |
| # P/9l4zTxpqUhXlaZbFjkkqEKXMLT3FIvDGWaIGFAUzGcbI8hfbr5/hNQUmCVOlu5 | |
| # WKV0YUGplOCtJk5MoZdwSSdefGfKTx5xhEa8HUu24g/FxifJB+Z6CqUXABlMcEU4 | |
| # LYG0UKrFZ9H6ebzFzKFym/QlNJj4VN8SOTgSL6RrpZp+x2LR3M/tPTT4ud81MLrs | |
| # eTKp4amsVU1Mf0xWwxMLdvEH+cxHrPuI1VKlHij6PS3Pz4SYhnFlEc+FyQlEhuFv | |
| # 57H8rEBEpamLIz+CSZ3VlllQE1kYc/9DDK0r1H8wQGcCAwEAAaOCAWAwggFcMBMG | |
| # A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBQfXuJdUI1Whr5KPM8E6KeHtcu/ | |
| # gzBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr | |
| # YjQyMThmMTMtNmZjYS00OTBmLTljNDctM2ZjNTU3ZGZjNDQwMB8GA1UdIwQYMBaA | |
| # FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j | |
| # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w | |
| # OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6 | |
| # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx | |
| # LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQB3XOvXkT3NvXuD2YWpsEOdc3wX | |
| # yQ/tNtvHtSwbXvtUBTqDcUCBCaK3cSZe1n22bDvJql9dAxgqHSd+B+nFZR+1zw23 | |
| # VMcoOFqI53vBGbZWMrrizMuT269uD11E9dSw7xvVTsGvDu8gm/Lh/idd6MX/YfYZ | |
| # 0igKIp3fzXCCnhhy2CPMeixD7v/qwODmHaqelzMAUm8HuNOIbN6kBjWnwlOGZRF3 | |
| # CY81WbnYhqgA/vgxfSz0jAWdwMHVd3Js6U1ZJoPxwrKIV5M1AHxQK7xZ/P4cKTiC | |
| # 095Sl0UpGE6WW526Xxuj8SdQ6geV6G00DThX3DcoNZU6OJzU7WqFXQ4iEV57MIIF | |
| # vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm | |
| # iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD | |
| # EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx | |
| # MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK | |
| # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 | |
| # IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD | |
| # QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC | |
| # mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw | |
| # aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy | |
| # c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ | |
| # +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP | |
| # Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf | |
| # A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS | |
| # tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB | |
| # MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3 | |
| # FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk | |
| # pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp | |
| # L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE | |
| # SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl | |
| # cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+ | |
| # fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6 | |
| # oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW | |
| # 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb | |
| # 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu | |
| # 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ | |
| # NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB | |
| # 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord | |
| # EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t | |
| # s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh | |
| # rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I | |
| # ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0 | |
| # AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX | |
| # BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290 | |
| # IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx | |
| # MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD | |
| # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf | |
| # BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB | |
| # BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn | |
| # 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0 | |
| # Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n | |
| # rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR | |
| # JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54 | |
| # QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G | |
| # A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG | |
| # A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg | |
| # QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG | |
| # CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg | |
| # Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ | |
| # MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 | |
| # Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB | |
| # BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z | |
| # b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB | |
| # BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i | |
| # uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r | |
| # kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct | |
| # xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F | |
| # NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo | |
| # nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0 | |
| # NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp | |
| # K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J | |
| # oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0 | |
| # eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng | |
| # 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBMgwggTE | |
| # AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD | |
| # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh | |
| # BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAAAymzVMhI1xOFV | |
| # AAEAAADKMAkGBSsOAwIaBQCggeEwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw | |
| # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFFEE | |
| # zHuXOuYUdMMU6ccXv39TiFxTMIGABgorBgEEAYI3AgEMMXIwcKBSgFAARQBuAHQA | |
| # aQB0AHkAIABGAHIAYQBtAGUAdwBvAHIAawAgAFQAbwBvAGwAcwAgAGYAbwByACAA | |
| # VgBpAHMAdQBhAGwAIABTAHQAdQBkAGkAb6EagBhodHRwOi8vbXNkbi5jb20vZGF0 | |
| # YS9lZiAwDQYJKoZIhvcNAQEBBQAEggEAR3k8SG1VrB6fEey5RJts5SABW4Y6eVWN | |
| # robw7m7cjm8Bxaom1uo4pSRdz0fEBQyC7lwL+j2fwDssXtPnGm2JddzFRF97h+Z4 | |
| # kr2OjP9c9HCVgs56/Of0ZF9ZJsn8C1I6eOPU8oK1DxJmrzyIqcnxKuMoXg27dNBH | |
| # /BVH+TdJTQfzRGbiVIl2300vGRiWNpTy+iVdUO/1KjEOWmWQZ149JsNTHc9YPvLl | |
| # RV4dv3hn5pDyn8W6+dyNqst558uE7AQV8lGEIq+h+DDbMmoDer6bja6K47Sd2pvK | |
| # nwdVzqRwxS6NL//15i+cs/tRjUCl+IEtE+ASBMZLH+yg4japcOMeJKGCAigwggIk | |
| # BgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB3MQswCQYDVQQGEwJVUzETMBEGA1UE | |
| # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z | |
| # b2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQ | |
| # Q0ECEzMAAABMoehNzLR0ezsAAAAAAEwwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJ | |
| # AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE0MDYxMTAwMjcxNFowIwYJ | |
| # KoZIhvcNAQkEMRYEFBdWBgmKyJtrdu8d4bEXOhxqvBK/MA0GCSqGSIb3DQEBBQUA | |
| # BIIBABQ25xAuAH0x0hJ3WkuCWxjySDZEyhIUfDWuXFHgBCbGK4sXOjt+ENph7spQ | |
| # NVhRpnoT1N/qpOZCoLekbfCOJp/jnVqBFETqX7opELQKeVyX/+z0RrdWa0oM05sT | |
| # QJI6h3Zt/BY7y/t2VT5pU+5OQkPJtJQsz/DALOcO6vHmq4MvLeh+CuKU8VHKTEWk | |
| # gv+wnSO5zzKUEqV0cNM/2KAU4KzvxHjj2eVF3MHUbY8wqhnep8XW0AQLa4Py7fX3 | |
| # Tqryia0vimh1SyjXUhxpk5TjEkSxVJkXqsM2h+6Rz5dbfc+xI4Nls5MplLij8uP8 | |
| # W9vx21Sqq//hMEaoOEYJbZjS72I= | |
| # SIG # End signature block | |