| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777 | 
							- # 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.MigrationsPendingException',
 
-     'System.Data.Entity.Migrations.ProjectTypeNotSupportedException'
 
- )
 
- <#
 
- .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 ommitted, automatic migrations will be disabled.
 
- .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 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.
 
- #>
 
- function Enable-Migrations
 
- {
 
-     [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')] 
 
-     param (
 
-         [string] $ContextTypeName,
 
-         [alias('Auto')]
 
-         [switch] $EnableAutomaticMigrations,
 
-         [string] $ProjectName,
 
-         [string] $StartUpProjectName,
 
-         [parameter(ParameterSetName = 'ConnectionStringName')]
 
-         [string] $ConnectionStringName,
 
-         [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
 
-             Mandatory = $true)]
 
-         [string] $ConnectionString,
 
-         [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
 
-             Mandatory = $true)]
 
-         [string] $ConnectionProviderName,
 
-         [switch] $Force
 
-     )
 
-     $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConnectionStringName $ConnectionString $ConnectionProviderName
 
-     try
 
-     {
 
-         Invoke-RunnerCommand $runner System.Data.Entity.Migrations.EnableMigrationsCommand @( $EnableAutomaticMigrations.IsPresent, $Force.IsPresent ) @{ 'ContextTypeName' = $ContextTypeName }
 
-         $error = Get-RunnerError $runner
 
-         
 
-         if ($error)
 
-         {
 
-             if ($knownExceptions -notcontains $error.TypeName)
 
-             {
 
-                 Write-Host $error.StackTrace
 
-             }
 
-             throw $error.Message
 
-         }
 
-     }
 
-     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 ommitted, 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.
 
- #>
 
- 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)
 
-     $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName
 
-     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
 
-             }
 
-             throw $error.Message
 
-         }
 
-     }
 
-     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 ommitted, 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
 
-     ommitted, 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 ommitted, 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.
 
- #>
 
- 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)
 
-     $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName
 
-     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
 
-             }
 
-             throw $error.Message
 
-         }
 
-     }
 
-     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 ommitted, 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.
 
- #>
 
- 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)
 
-     $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName
 
-     try
 
-     {
 
-         Invoke-RunnerCommand $runner System.Data.Entity.Migrations.GetMigrationsCommand
 
-         $error = Get-RunnerError $runner
 
-         
 
-         if ($error)
 
-         {
 
-             if ($knownExceptions -notcontains $error.TypeName)
 
-             {
 
-                 Write-Host $error.StackTrace
 
-             }
 
-             throw $error.Message
 
-         }
 
-     }
 
-     finally
 
-     {
 
-         Remove-Runner $runner
 
-     }
 
- }
 
- function New-MigrationsRunner($ProjectName, $StartUpProjectName, $ConfigurationTypeName, $ConnectionStringName, $ConnectionString, $ConnectionProviderName)
 
- {
 
-     $startUpProject = Get-MigrationsStartUpProject $StartUpProjectName $ProjectName
 
-     Build-Project $startUpProject
 
-     $project = Get-MigrationsProject $ProjectName
 
-     Build-Project $project
 
-     $installPath = Get-EntityFrameworkInstallPath $project
 
-     $toolsPath = Join-Path $installPath tools
 
-     $info = New-Object System.AppDomainSetup -Property @{
 
-             ShadowCopyFiles = 'true';
 
-             ApplicationBase = $installPath;
 
-             PrivateBinPath = 'tools'
 
-         }
 
-     $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'
 
-         $dteVersion = [System.Text.RegularExpressions.Regex]::Match($DTE.Version, '^(?<version>\d{1,2}(\.\d{1,2})?)( \(.+\))?$').Groups['version'].Value
 
-         if ((New-Object Version $dteVersion) -lt (New-Object Version @( 11, 0 )))
 
-         {
 
-             $info.ConfigurationFile = Join-Path $toolsPath 'Redirect.config'
 
-         }
 
-         else
 
-         {
 
-             $info.ConfigurationFile = Join-Path $toolsPath 'Redirect.VS11.config'
 
-         }
 
-     }
 
-     else
 
-     {
 
-         $info.PrivateBinPath += ';lib\net45'
 
-         $info.ConfigurationFile = [AppDomain]::CurrentDomain.SetupInformation.ConfigurationFile
 
-     }
 
-     $domain = [AppDomain]::CreateDomain('Migrations', $null, $info)
 
-     $domain.SetData('project', $project)
 
-     $domain.SetData('startUpProject', $startUpProject)
 
-     $domain.SetData('configurationTypeName', $ConfigurationTypeName)
 
-     $domain.SetData('connectionStringName', $ConnectionStringName)
 
-     $domain.SetData('connectionString', $ConnectionString)
 
-     $domain.SetData('connectionProviderName', $ConnectionProviderName)
 
-     
 
-     [AppDomain]::CurrentDomain.SetShadowCopyFiles()
 
-     $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)        
 
-     $domain.SetData('efDispatcher', $dispatcher)
 
-     return @{
 
-         Domain = $domain;
 
-         ToolsPath = $toolsPath
 
-     }
 
- }
 
- 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
 
- }
 
- Export-ModuleMember @( 'Enable-Migrations', 'Add-Migration', 'Update-Database', 'Get-Migrations' ) -Variable InitialDatabase
 
- # SIG # Begin signature block
 
- # MIIaRgYJKoZIhvcNAQcCoIIaNzCCGjMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
 
- # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
 
- # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUc46O5H/xCa1Zd+kKsDgAx0de
 
- # pNmgghUtMIIEoDCCA4igAwIBAgIKYRnMkwABAAAAZjANBgkqhkiG9w0BAQUFADB5
 
- # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
 
- # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
 
- # aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQTAeFw0xMTEwMTAyMDMyMjVaFw0xMzAx
 
- # MTAyMDMyMjVaMIGDMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
 
- # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
 
- # MQ0wCwYDVQQLEwRNT1BSMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w
 
- # ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDuW759ESTjhgbgZv9ItRe9
 
- # AuS0DDLwcj59LofXTqGxp0Mv92WeMeEyMUWu18EkhCHXLrWEfvo101Mc17ZRHk/O
 
- # ZrnrtwwC/SlcraiH9soitNW/CHX1inCPY9fvih7pj0MkZFrTh32QbTusds1XNn3o
 
- # vBBWrJjwiV0uZMavJgleHmMV8T2/Fo+ZiALDMLfBC2AfD3LM1reoNRKGm6ELCuaT
 
- # W476VJzB8xlfQo0Snx0/kLcnE4MZMoId89mH1CGyPKK2B0/XJKrujfWz2fr5OU+n
 
- # 6fKvWVL03EGbLxFwY93q3qrxbSEEEFMzu7JPxeFTskFlR2439rzpmxZBkWsuWzDD
 
- # AgMBAAGjggEdMIIBGTATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUG1IO
 
- # 8xEqt8CJwxGBPdSWWLmjU24wDgYDVR0PAQH/BAQDAgeAMB8GA1UdIwQYMBaAFMsR
 
- # 6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
 
- # bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8wOC0z
 
- # MS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
 
- # d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMxLTIw
 
- # MTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQClWzZsrU6baRLjb4oCm2l3w2xkciiI
 
- # 2T1FbSwYe9QoLxPiWWobwgs0t4r96rmU7Acx5mr0dQTTp9peOgaeEP2pDb2cUUNv
 
- # /2eUnOHPfPAksDXMg13u2sBvNknAWgpX9nPhnvPjCEw7Pi/M0s3uTyJw9wQfAqZL
 
- # m7iPXIgONpRsMwe4qa1RoNDC3I4iEr3D34LXVqH33fClIFcQEJ3urIZ0bHGbwfDy
 
- # wnBep9ttTTdYmU15QNA0XVolrmfrG05GBrCMKR+jEI+lM58j1fi1Rn3g7mOYkEs+
 
- # BagvsBizWaSvQVOOCAUQLSrJOgZMHC6pMVFWZKyazKyXmCmKl5CH6p22MIIEujCC
 
- # A6KgAwIBAgIKYQUZlgAAAAAAGzANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJV
 
- # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
 
- # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGlt
 
- # ZS1TdGFtcCBQQ0EwHhcNMTEwNzI1MjA0MjE5WhcNMTIxMDI1MjA0MjE5WjCBszEL
 
- # MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
 
- # bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
 
- # UjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNOOjlFNzgtODY0Qi0wMzlEMSUwIwYD
 
- # VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B
 
- # AQEFAAOCAQ8AMIIBCgKCAQEA08s7U6KfRKN6q01WcVOKd6o3k34BPv2rAqNTqf/R
 
- # sSLFAJDndW7uGOiBDhPF2GEAvh+gdjsEDQTFBKCo/ENTBqEEBLkLkpgCYjjv1DMS
 
- # 9ys9e++tRVeFlSCf12M0nGJGjr6u4NmeOfapVf3P53fmNRPvXOi/SJNPGkMHWDiK
 
- # f4UUbOrJ0Et6gm7L0xVgCBSJlKhbPzrJPyB9bS9YGn3Kiji8w8I5aNgtWBoj7SoQ
 
- # CFogjIKl7dGXRZKFzMM3g98NmHzF07bgmVPYeAj15SMhB2KGWmppGf1w+VM0gfcl
 
- # MRmGh4vAVZr9qkw1Ff1b6ZXJq1OYKV8speElD2TF8rAndQIDAQABo4IBCTCCAQUw
 
- # HQYDVR0OBBYEFHkj56ENvlUsaBgpYoJn1vPhNjhaMB8GA1UdIwQYMBaAFCM0+NlS
 
- # RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj
 
- # cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD
 
- # QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p
 
- # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw
 
- # EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBAEfCdoFbMd1v
 
- # 0zyZ8npsfpcTUCwFFxsQuEShtYz0Vs+9sCG0ZG1hHNju6Ov1ku5DohhEw/r67622
 
- # XH+XbUu1Q/snYXgIVHyx+a+YCrR0xKroLVDEff59TqGZ1icot67Y37GPgyKOzvN5
 
- # /GEUbb/rzISw36O7WwW36lT1Yh1sJ6ZjS/rjofq734WWZWlTsLZxmGQmZr3F8Vxi
 
- # vJH0PZxLQgANzzgFFCZa3CoFS39qmTjY3XOZos6MUCSepOv1P4p4zFSZXSVmpEEG
 
- # KK9JxLRSlOzeAoNk/k3U/0ui/CmA2+4/qzztM4jKvyJg0Fw7BLAKtJhtPKc6T5rR
 
- # ARYRYopBdqAwggW8MIIDpKADAgECAgphMyYaAAAAAAAxMA0GCSqGSIb3DQEBBQUA
 
- # MF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNyb3Nv
 
- # ZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
 
- # eTAeFw0xMDA4MzEyMjE5MzJaFw0yMDA4MzEyMjI5MzJaMHkxCzAJBgNVBAYTAlVT
 
- # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
 
- # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2Rl
 
- # IFNpZ25pbmcgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsnJZ
 
- # XBkwZL8dmmAgIEKZdlNsPhvWb8zL8epr/pcWEODfOnSDGrcvoDLs/97CQk4j1XIA
 
- # 2zVXConKriBJ9PBorE1LjaW9eUtxm0cH2v0l3511iM+qc0R/14Hb873yNqTJXEXc
 
- # r6094CholxqnpXJzVvEXlOT9NZRyoNZ2Xx53RYOFOBbQc1sFumdSjaWyaS/aGQv+
 
- # knQp4nYvVN0UMFn40o1i/cvJX0YxULknE+RAMM9yKRAoIsc3Tj2gMj2QzaE4BoVc
 
- # TlaCKCoFMrdL109j59ItYvFFPeesCAD2RqGe0VuMJlPoeqpK8kbPNzw4nrR3XKUX
 
- # no3LEY9WPMGsCV8D0wIDAQABo4IBXjCCAVowDwYDVR0TAQH/BAUwAwEB/zAdBgNV
 
- # HQ4EFgQUyxHoytK0FlgByTcuMxYWuUyaCh8wCwYDVR0PBAQDAgGGMBIGCSsGAQQB
 
- # gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFP3RMU7TJoqV4ZhgO6gxb6Y8vNgt
 
- # MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFA6sgmBAVieX
 
- # 5SUT/CrhClOVWeSkMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9z
 
- # b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBU
 
- # BggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0
 
- # LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MA0GCSqGSIb3DQEB
 
- # BQUAA4ICAQBZOT5/Jkav629AsTK1ausOL26oSffrX3XtTDst10OtC/7L6S0xoyPM
 
- # fFCYgCFdrD0vTLqiqFac43C7uLT4ebVJcvc+6kF/yuEMF2nLpZwgLfoLUMRWzS3j
 
- # StK8cOeoDaIDpVbguIpLV/KVQpzx8+/u44YfNDy4VprwUyOFKqSCHJPilAcd8uJO
 
- # +IyhyugTpZFOyBvSj3KVKnFtmxr4HPBT1mfMIv9cHc2ijL0nsnljVkSiUc356aNY
 
- # Vt2bAkVEL1/02q7UgjJu/KSVE+Traeepoiy+yCsQDmWOmdv1ovoSJgllOJTxeh9K
 
- # u9HhVujQeJYYXMk1Fl/dkx1Jji2+rTREHO4QFRoAXd01WyHOmMcJ7oUOjE9tDhNO
 
- # PXwpSJxy0fNsysHscKNXkld9lI2gG0gDWvfPo2cKdKU27S0vF8jmcjcS9G+xPGeC
 
- # +VKyjTMWZR4Oit0Q3mT0b85G1NMX6XnEBLTT+yzfH4qerAr7EydAreT54al/RrsH
 
- # YEdlYEBOsELsTu2zdnnYCjQJbRyAMR/iDlTd5aH75UcQrWSY/1AWLny/BSF64pVB
 
- # J2nDk4+VyY3YmyGuDVyc8KKuhmiDDGotu3ZrAB2WrfIWe/YWgyS5iM9qqEcxL5rc
 
- # 43E91wB+YkfRzojJuBj6DnKNwaM9rwJAav9pm5biEKgQtDdQCNbDPTCCBgcwggPv
 
- # oAMCAQICCmEWaDQAAAAAABwwDQYJKoZIhvcNAQEFBQAwXzETMBEGCgmSJomT8ixk
 
- # ARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWlj
 
- # cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA3MDQwMzEyNTMw
 
- # OVoXDTIxMDQwMzEzMDMwOVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
 
- # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
 
- # b3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBMIIBIjAN
 
- # BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/bSJIqfGsuGeG94uPFmVEj
 
- # UK3O3RhOJA/u0afRTK10MCAR6wfVVJUVSZQbQpKumFwwJtoAa+h7veyJBw/3DgSY
 
- # 8InMH8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J0F6v0LBCBKL5pmyTZ9co
 
- # 3EZTsIbQ5ShGLieshk9VUgzkAyz7apCQMG6H81kwnfp+1pez6CGXfvjSE/MIt1Nt
 
- # UrRFkJ9IAEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4TtVXj+AZodUAiFABAwRu23
 
- # 3iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1HQ2x/PebsgHOIktU//kFw8IgCwIDAQAB
 
- # o4IBqzCCAacwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUIzT42VJGcArtQPt2
 
- # +7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMIGYBgNVHSME
 
- # gZAwgY2AFA6sgmBAVieX5SUT/CrhClOVWeSkoWOkYTBfMRMwEQYKCZImiZPyLGQB
 
- # GRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRNaWNy
 
- # b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCEHmtFqFKoKWtTHNY9AcT
 
- # LmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
 
- # aS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEB
 
- # BEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
 
- # ZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgw
 
- # DQYJKoZIhvcNAQEFBQADggIBABCXisNcA0Q23em0rXfbznlRTQGxLnRxW20ME6vO
 
- # vnuPuC7UEqKMbWK4VwLLTiATUJndekDiV7uvWJoc4R0Bhqy7ePKL0Ow7Ae7ivo8K
 
- # BciNSOLwUxXdT6uS5OeNatWAweaU8gYvhQPpkSokInD79vzkeJkuDfcH4nC8GE6d
 
- # jmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy+cwxSnYxPStyC8jqcD3/hQoT38IK
 
- # YY7w17gX606Lf8U1K16jv+u8fQtCe9RTciHuMMq7eGVcWwEXChQO0toUmPU8uWZY
 
- # sy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76KbKTQGdxpiyT0ebR+C8AvHLLvP
 
- # Q7Pl+ex9teOkqHQ1uE7FcSMSJnYLPFKMcVpGQxS8s7OwTWfIn0L/gHkhgJ4VMGbo
 
- # QhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m3pmdyjpvvYEndAYR7nYh
 
- # v5uCwSdUtrFqPYmhdmG0bqETpr+qR/ASb/2KMmyy/t9RyIwjyWa9nR2HEmQCPS2v
 
- # WY+45CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocTdSIvMqgIbqBbjCW/oO+E
 
- # yiHW6x5PyZruSeD3AWVviQt9yGnI5m7qp5fOMSn/DsVbXNhNG6HY+i+ePy5VFmvJ
 
- # E6P9MYIEgzCCBH8CAQEwgYcweTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
 
- # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
 
- # b3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0ECCmEZ
 
- # zJMAAQAAAGYwCQYFKw4DAhoFAKCBsDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
 
- # BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU
 
- # SDInMyiqV3LEzPhzf6mjYJvp5qAwUAYKKwYBBAGCNwIBDDFCMECgIoAgAEUAbgB0
 
- # AGkAdAB5ACAARgByAGEAbQBlAHcAbwByAGuhGoAYaHR0cDovL21zZG4uY29tL2Rh
 
- # dGEvZWYgMA0GCSqGSIb3DQEBAQUABIIBAMTy2exDNM/cRmGrhj6rawr6XoQp77kh
 
- # +WOMUmSG5U4qSlP8g3fVFH030Xsxz5d8TunxEzRUyDhYHh3mQ56x4RCVJU/fdl8Q
 
- # dhXwn4VfV84G3+mIHVRCo8+8hm/o1l1K0sHhLCaPSoZht1bcKH09gK1VxoNhBt78
 
- # BFUHLTWw0sRwrEJRW1xZPwOoh2rv1cnYi7GPKFHiYrCV3NSHRkSJZmA42UYA1iZv
 
- # 3fF9QCQNlTDY4jiC2vsa/eWt0qhups1gQXdqg8y/Zvc5cEYxF+ByataJ6fI4w5HP
 
- # 5WNzsVl1O+6VFlj1qjMzOyVlsHWCOIfFfc8iLoWWy+A4W00yEeHIMT2hggIdMIIC
 
- # GQYJKoZIhvcNAQkGMYICCjCCAgYCAQEwgYUwdzELMAkGA1UEBhMCVVMxEzARBgNV
 
- # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
 
- # c29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAg
 
- # UENBAgphBRmWAAAAAAAbMAcGBSsOAwIaoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3
 
- # DQEHATAcBgkqhkiG9w0BCQUxDxcNMTIwNjI4MjA0MzM5WjAjBgkqhkiG9w0BCQQx
 
- # FgQU2luimdNA+66F/z6ooEia0K5OZC8wDQYJKoZIhvcNAQEFBQAEggEAPUTPALhi
 
- # x8qJIn6WmeZTiazQRH4/TVQHCJPDxhlaMgDUDsPwwmjrAfL/UnMz+TVi5ltSM0Hb
 
- # jGLfhTbaw/YcLUqztgxNq/vm0cFqU3n+rIGUBXFUwDoS6Ol6UTSoXkJVHyiOxHuU
 
- # Fdh33QDv9EVBbr1CQJLTs02d31Uwjg8vUt9+LDSYQWFlZH0+xsy1wStReGX4DSRz
 
- # QneatHmqk+Vej4/3iFKBlCJO1SPlXQLaFAUFsZr6yl6oTrpfatG6sA16/e8jjW4u
 
- # Kz0GzJYJ4DMVdSVGpsvVWMADsbEsjlr6yesOrN4ZDEBdv7Y3P518wK/iJ1/WdgRc
 
- # SA474q5bExc5pA==
 
- # SIG # End signature block
 
 
  |