NetOwls.NuCommandSet.psm1
# ----------------------------------------------------------------------------------------------------- # FEATURE: 提供了与 NUGET 命令行相关的脚本模块。 # AUTHOR: WANG YUCAI # CREATED TIME: 2018/11/26 10:58 # CODE FILE: NETOWLS.NUCOMMANDSET.PSM1 # E-MAIL ADDRESS: NETOWLS@OUTLOOK.COM # COPYRIGHT © 2006 - 2018 WANG YUCAI. ALL RIGHTS RESERVED. # ----------------------------------------------------------------------------------------------------- data LocalizationData { ConvertFrom-StringData @' NuCliNotExistPromptMessage=The nuget command-line tool not exists. We will download it. Please wait several minutes. VSProjectPathNotFound=The VisualStudio Project was not found: {0} '@ } # 资源引入 Import-LocalizedData LocalizationData -FileName "NuCommandSetResources" # NuGet 命令行工具路径。 $NuRootDir = ".\NuGet" # NuGet 命令行工具下载地址模板。 $NuCliUriTemplate = "https://dist.nuget.org/win-x86-commandline/{0}/nuget.exe" <# .SYNOPSIS 从官网下载指定版本的 NuGet 命令行工具。 .DESCRIPTION 从官网下载指定版本的 NuGet 命令行工具。 .PARAMETER LastestVersion 是否需要下载最新版本的 NuGet 命令行工具。默认为 True。 .PARAMETER VersionNumber 指定的 NuGet 命令行工具版本号数字。此参数仅当 LastestVersion 等于 False 时有效。 #> function InternalGet-NuCommandLineTools { [CmdletBinding(HelpUri = 'https://github.com/NetOwls/PowerShell-ToolSet/blob/master/docs/Modules/NuCommandSet.md')] param ( [Parameter(Mandatory = $false, ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false, Position = 0, HelpMessage = '是否需要下载最新版本的 NuGet 命令行工具。默认为 True。')] [Alias('Lastest')] [bool]$LastestVersion = $true, [Parameter(Mandatory = $false, ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false, Position = 1, HelpMessage = '指定的 NuGet 命令行工具版本号数字。此参数仅当 LastestVersion 等于 False 时有效。')] [Alias('Ver')] [string]$VersionNumber ) $TargetUri = $NuCliUriTemplate If (($LastestVersion) -or ([string]::IsNullOrWhiteSpace($VersionNumber))) { $TargetUri = $TargetUri -f "latest" } Else { $TargetUri = $TargetUri -f $VersionNumber } If (-not (Test-Path -Path $NuRootDir)) { mkdir -Path $NuRootDir } If (-not (Test-Path -Path ("{0}\nuget.exe" -f $NuRootDir))) { Log-Warning -Message ("{0} (URI: {1})" -f $LocalizationData.NuCliNotExistPromptMessage, $TargetUri) wget -Uri $TargetUri -OutFile ("{0}\nuget.exe" -f $NuRootDir) } } <# .SYNOPSIS 从 NuGet.org 官网下载指定版本的命令行工具。 .DESCRIPTION 从 NuGet.org 官网下载指定版本的命令行工具。 .PARAMETER LastestRelease 仅需要下载最新的版本。默认为 True。 .PARAMETER SpecialVersionNumber 指定的版本号。此参数仅在 LastestRelease 等于 False 启用。 #> function Get-NuCommandLineTools { [CmdletBinding(HelpUri = 'https://github.com/NetOwls/PowerShell-ToolSet/blob/master/docs/Modules/NuCommandSet.md')] param ( [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0, HelpMessage = '仅需要下载最新的版本。默认为 True。')] [Alias('Lastest')] [bool]$LastestRelease = $true, [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 1, HelpMessage = '指定的版本号。此参数仅在 LastestRelease 等于 False 启用。')] [Alias('Version')] [string]$SpecialVersionNumber = "lastest" ) InternalGet-NuCommandLineTools -Lastest $LastestRelease -VersionNumber $SpecialVersionNumber } Export-ModuleMember -Function Get-NuCommandLineTools # Optional commands to create a public alias for the function New-Alias -Name wget-nucli -Value Get-NuCommandLineTools Export-ModuleMember -Alias wget-nucli <# .SYNOPSIS 调用 NuGet.exe 命令行工具,为指定项目创建 NuGet Special 文件 (*.nuspec)。 .DESCRIPTION 调用 NuGet.exe 命令行工具,为指定项目创建 NuGet Special 文件 (*.nuspec)。 .PARAMETER ProjectFilePath 指定的 Visual Studio 项目文件路径。 .NOTES Additional information about the function. #> function Create-NuSpecials { [CmdletBinding(HelpUri = 'https://github.com/NetOwls/PowerShell-ToolSet/blob/master/docs/Modules/NuCommandSet.md')] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0, HelpMessage = '指定的 Visual Studio 项目文件路径。')] [Alias('Proj')] [string]$ProjectFilePath ) InternalGet-NuCommandLineTools -LastestVersion $true If (-not [string]::IsNullOrWhiteSpace($ProjectFilePath)) { If (Test-Path -Path $ProjectFilePath) { . ("{0}\nuget.exe" -f $NuRootDir) "spec" $ProjectFilePath "-Force" } Else { Log-Error -Message ($LocalizationData.VSProjectPathNotFound -f $ProjectFilePath) } } } Export-ModuleMember -Function Create-NuSpecials # Optional commands to create a public alias for the function New-Alias -Name nu-spec -Value Create-NuSpecials Export-ModuleMember -Alias nu-spec <# .SYNOPSIS 创建一个 NuGet 包。 .DESCRIPTION 创建一个 NuGet 包。 .PARAMETER ProjectBasePath Visual Studio 项目(或者 *.nuspec 文件)的基础路径。 .PARAMETER Suffix 是否使用 Debug 版本进行打包。 .PARAMETER OutputDirectory NuGet 包输出路径。 .PARAMETER UseDebug 使用 Debug 版本。 .PARAMETER Surfix 包的后缀。 #> function Create-NuPackage { [CmdletBinding(HelpUri = 'https://github.com/NetOwls/PowerShell-ToolSet/blob/master/docs/Modules/NuCommandSet.md')] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0, HelpMessage = 'Visual Studio 项目(或者 *.nuspec 文件)的基础路径。')] [Alias('BasePath')] [string]$ProjectBasePath, [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 1, HelpMessage = '是否使用 Debug 版本进行打包。')] [ValidateSet('None', 'Debug', 'RC', 'Alpha', 'Beta', 'Develop', 'Nightly', 'Daily', 'Weekly', IgnoreCase = $false)] [string]$Suffix = "None", [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 3, HelpMessage = 'NuGet 包输出路径。')] [Alias('OutDir')] [string]$OutputDirectory, [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 2, HelpMessage = '使用 Debug 版本。')] [switch]$UseDebug ) If ([string]::IsNullOrWhiteSpace($OutputDirectory)) { $OutputDirectory = ".\" } If (-not (Test-Path -Path $OutputDirectory)) { mkdir -Path $OutputDirectory } If ($UseDebug.ToBool()) { . ("{0}\nuget.exe" -f $NuRootDir) "pack" "-IncludeReferencedProjects" "-Properties" "Configuration=Debug" "-Suffix" "Debug" "-OutputDirectory" $OutputDirectory } Else { switch ($Suffix) { "None" { . ("{0}\nuget.exe" -f $NuRootDir) "pack" "-IncludeReferencedProjects" "-Properties" "Configuration=Release" "-OutputDirectory" $OutputDirectory } default { . ("{0}\nuget.exe" -f $NuRootDir) "pack" "-IncludeReferencedProjects" "-Properties" "Configuration=Release" "-Suffix" $Suffix "-OutputDirectory" $OutputDirectory } } } } Export-ModuleMember -Function Create-NuPackage # Optional commands to create a public alias for the function New-Alias -Name nu-pack -Value Create-NuPackage Export-ModuleMember -Alias nu-pack <# .SYNOPSIS 发布一个 NuGet 包到指定的源。 .DESCRIPTION 发布一个 NuGet 包到指定的源。 .PARAMETER PackageName 指定的包文件(*.nupkg)名称。 .PARAMETER ApiKey NuGet 服务所需的标识。 .PARAMETER SourceUris 发布到的源地址。 #> function Publish-NuPackage { [CmdletBinding(HelpUri = 'https://github.com/NetOwls/PowerShell-ToolSet/blob/master/docs/Modules/NuCommandSet.md')] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0, HelpMessage = '指定的包文件(*.nupkg)名称。')] [Alias('NuPkgFile')] [string]$PackageName, [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 1, HelpMessage = 'NuGet 服务所需的标识。')] [string]$ApiKey, [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 2, HelpMessage = '发布到的源地址。')] [Alias('Sources')] [string[]]$SourceUris ) If ((-not [string]::IsNullOrWhiteSpace($PackageName)) -and (Test-Path -Path $PackageName)) { InternalGet-NuCommandLineTools -LastestVersion $true If ($SourceUris -eq $null) { $SourceUris = @() } If ($SourceUris.Length -eq 0) { $SourceUris += "https://api.nuget.org/v3/index.json" } If ([string]::IsNullOrWhiteSpace($ApiKey)) { foreach ($item in $SourceUris) { . ("{0}\nuget.exe" -f $NuRootDir) "push" $PackageName "-Source" $item } } else { foreach ($item in $SourceUris) { . ("{0}\nuget.exe" -f $NuRootDir) "push" $PackageName "-Source" $item "-ApiKey" $ApiKey } } } } Export-ModuleMember -Function Publish-NuPackage # Optional commands to create a public alias for the function New-Alias -Name nu-push -Value Publish-NuPackage Export-ModuleMember -Alias nu-push # SIG # Begin signature block # MIIWFgYJKoZIhvcNAQcCoIIWBzCCFgMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU16fjebQ4NN0GH7cvkRy74O03 # RQSggg9bMIIEFDCCAvygAwIBAgILBAAAAAABL07hUtcwDQYJKoZIhvcNAQEFBQAw # VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV # BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0 # MTMxMDAwMDBaFw0yODAxMjgxMjAwMDBaMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQK # ExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRpbWVzdGFt # cGluZyBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlO9l # +LVXn6BTDTQG6wkft0cYasvwW+T/J6U00feJGr+esc0SQW5m1IGghYtkWkYvmaCN # d7HivFzdItdqZ9C76Mp03otPDbBS5ZBb60cO8eefnAuQZT4XljBFcm05oRc2yrmg # jBtPCBn2gTGtYRakYua0QJ7D/PuV9vu1LpWBmODvxevYAll4d/eq41JrUJEpxfz3 # zZNl0mBhIvIG+zLdFlH6Dv2KMPAXCae78wSuq5DnbN96qfTvxGInX2+ZbTh0qhGL # 2t/HFEzphbLswn1KJo/nVrqm4M+SU4B09APsaLJgvIQgAIMboe60dAXBKY5i0Eex # +vBTzBj5Ljv5cH60JQIDAQABo4HlMIHiMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB # Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTBHBgNV # HSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFs # c2lnbi5jb20vcmVwb3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2Ny # bC5nbG9iYWxzaWduLm5ldC9yb290LmNybDAfBgNVHSMEGDAWgBRge2YaRQ2XyolQ # L30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEATl5WkB5GtNlJMfO7FzkoG8IW # 3f1B3AkFBJtvsqKa1pkuQJkAVbXqP6UgdtOGNNQXzFU6x4Lu76i6vNgGnxVQ380W # e1I6AtcZGv2v8Hhc4EvFGN86JB7arLipWAQCBzDbsBJe/jG+8ARI9PBw+DpeVoPP # PfsNvPTF7ZedudTbpSeE4zibi6c1hkQgpDttpGoLoYP9KOva7yj2zIhd+wo7AKvg # IeviLzVsD440RZfroveZMzV+y5qKu0VN5z+fwtmK+mWybsd+Zf/okuEsMaL3sCc2 # SI8mbzvuTXYfecPlf5Y1vC0OzAGwjn//UYCAp5LUs0RGZIyHTxZjBzFLY7Df8zCC # BJ8wggOHoAMCAQICEhEh1pmnZJc+8fhCfukZzFNBFDANBgkqhkiG9w0BAQUFADBS # MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEoMCYGA1UE # AxMfR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBHMjAeFw0xNjA1MjQwMDAw # MDBaFw0yNzA2MjQwMDAwMDBaMGAxCzAJBgNVBAYTAlNHMR8wHQYDVQQKExZHTU8g # R2xvYmFsU2lnbiBQdGUgTHRkMTAwLgYDVQQDEydHbG9iYWxTaWduIFRTQSBmb3Ig # TVMgQXV0aGVudGljb2RlIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQCwF66i07YEMFYeWA+x7VWk1lTL2PZzOuxdXqsl/Tal+oTDYUDFRrVZUjtC # oi5fE2IQqVvmc9aSJbF9I+MGs4c6DkPw1wCJU6IRMVIobl1AcjzyCXenSZKX1GyQ # oHan/bjcs53yB2AsT1iYAGvTFVTg+t3/gCxfGKaY/9Sr7KFFWbIub2Jd4NkZrItX # nKgmK9kXpRDSRwgacCwzi39ogCq1oV1r3Y0CAikDqnw3u7spTj1Tk7Om+o/SWJMV # TLktq4CjoyX7r/cIZLB6RA9cENdfYTeqTmvT0lMlnYJz+iz5crCpGTkqUPqp0Dw6 # yuhb7/VfUfT5CtmXNd5qheYjBEKvAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMC # B4AwTAYDVR0gBEUwQzBBBgkrBgEEAaAyAR4wNDAyBggrBgEFBQcCARYmaHR0cHM6 # Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADAWBgNV # HSUBAf8EDDAKBggrBgEFBQcDCDBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY3Js # Lmdsb2JhbHNpZ24uY29tL2dzL2dzdGltZXN0YW1waW5nZzIuY3JsMFQGCCsGAQUF # BwEBBEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNv # bS9jYWNlcnQvZ3N0aW1lc3RhbXBpbmdnMi5jcnQwHQYDVR0OBBYEFNSihEo4Whh/ # uk8wUL2d1XqH1gn3MB8GA1UdIwQYMBaAFEbYPv/c477/g+b0hZuw3WrWFKnBMA0G # CSqGSIb3DQEBBQUAA4IBAQCPqRqRbQSmNyAOg5beI9Nrbh9u3WQ9aCEitfhHNmmO # 4aVFxySiIrcpCcxUWq7GvM1jjrM9UEjltMyuzZKNniiLE0oRqr2j79OyNvy0oXK/ # bZdjeYxEvHAvfvO83YJTqxr26/ocl7y2N5ykHDC8q7wtRzbfkiAD6HHGWPZ1BZo0 # 8AtZWoJENKqA5C+E9kddlsm2ysqdt6a65FDT1De4uiAO0NOSKlvEWbuhbds8zkSd # wTgqreONvc0JdxoQvmcKAjZkiLmzGybu555gxEaovGEzbM9OuZy5avCfN/61PU+a # 003/3iCOTpem/Z8JvE3KGHbJsE2FUPKA0h0G9VgEB7EYMIIGnDCCBISgAwIBAgIB # bzANBgkqhkiG9w0BAQ0FADCB1zELMAkGA1UEBhMCQ0gxEDAOBgNVBAgTB0JlaWpp # bmcxEDAOBgNVBAcTB0hhaWRpYW4xETAPBgNVBAoTCFBlcnNvbmFsMRIwEAYDVQQL # EwlXYW5nWXVjYWkxIjAgBgkqhkiG9w0BCQEWE05ldE93bHNAb3V0bG9vay5jb20x # GzAZBgNVBAUTEjExMDIyMTE5ODMwOTE1ODMxMTEXMBUGA1UEDBMOLk5FVCBEZXZl # bG9wZXIxDjAMBgNVBAQTBVl1Y2FpMRMwEQYDVQQpEwpXYW5nIFl1Y2FpMB4XDTE4 # MDkxNDA1MjEwMFoXDTIwMDkxNDA1MjEwMFowgdcxCzAJBgNVBAYTAkNIMRAwDgYD # VQQIEwdCZWlqaW5nMRAwDgYDVQQHEwdIYWlkaWFuMREwDwYDVQQKEwhQZXJzb25h # bDESMBAGA1UECxMJV2FuZ1l1Y2FpMSIwIAYJKoZIhvcNAQkBFhNOZXRPd2xzQG91 # dGxvb2suY29tMRswGQYDVQQFExIxMTAyMjExOTgzMDkxNTgzMTExFzAVBgNVBAwT # Di5ORVQgRGV2ZWxvcGVyMQ4wDAYDVQQEEwVZdWNhaTETMBEGA1UEKRMKV2FuZyBZ # dWNhaTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMIZsqv4W1xxyimF # 3Rs3a7gbo38NktB59MJAPUDFezw+hCvVr6jZNW2sMKq/lZNScVSKEOPAPHFAq2Db # hUcThdmwzexyD0T1VwDZwtpetibUZ34LWjdDLmoYOmLbd9M//x9tkoE4sEaT/DBq # mbS6YWWLsWmWvpGyYNFv5pWM+p2mMULlPwX5SSY/rbgCwLcWknQQFl6ZOCmp0JW1 # ozxpwEv6iF75gfIL69CXZRKdjf1wmMC2hlAKfPSm1kGcXzce1CVowAqj0Pc2wa1I # cXz+z/CcGt0TuIcKkmtHxJDbBPZTfkGI/Emkva/mtHUPTZaTM9yfD1uBUJaMb/xE # RLg5TdxdkzWjfCc7n1ZGSmedg6UWJQVLywU+tBuO4ggR7iIpEA3z7YjrlkIS2xPn # UXoWQs1okqJBpemeNMG1suc4gS3pHObtbsR+avjM2bNN2xTOzWYi4OyegS0rpVDp # vEGMSAtQXe9j10W9CHxZhrOcBdRzwcpdMT34MjG7p9cxDmbsA/K0YsAQmroPfQ1b # BaD5CCpo+xsbipI5NPPxPIr079bmJBIeAQQX29waMRVfoHiP4zsdq6f5YQ0FVXnb # cIsUJtDZvZWGB5NlNeva22F+9AAnTCWolz6X/D9bO3963Yd9g484InnmJmjqmaow # H7gKZ7ZNu4qh6MW9fnIa85G2BLZJAgMBAAGjcTBvMAwGA1UdEwQFMAMBAf8wDwYD # VR0PAQH/BAUDAwcBgDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIB # FQYKKwYBBAGCNwIBFjAeBglghkgBhvhCAQ0EERYPeGNhIGNlcnRpZmljYXRlMA0G # CSqGSIb3DQEBDQUAA4ICAQCzJcuYq20ELsCgWQF4O3YHrltZ+2jzFySNhHgd1D/l # S+s//aNztHqiUXgTMCOHnKN8vl60mUMloPDP6mb0fgUPZxM4L6T1aiuH63kvHXLZ # 5VMdJ6L1l0qu2hXUyP7y0ap3tlgM6NyYwkUWTeKydYNZQZg7lJ9D1BBEoaGj95WM # Cs9sAm9eX53ZX5eJOuhhjUAU2lqY9cTUqTq2FHwSpzqJ/KoOA2bg9d/Zr1lZU18Z # ASN+PND34Ri+EPRFuKPWdXomt1YLMewuEJ/C4IOvjxbKMbCERG/UAvJz+TZfOqrn # Dqn4O52y+iVPnWxalolU2b1VWzq35tGvJKO8SWMxvDtr39lUauxmdZ3xc1Sbp80O # xa2Bzb10mr0a8YzL8pGTq9fBxV/6A8OPdJVKqw+vgwRofT0cYkh4O3YwNxawdGqS # mrpTefIg8PGOLqlPquUVjvgiYNTo8m3chzaFAuVP92o/QlUX+CEr+fvjgU+wxjJX # w8rhPXpdz9nGRuq1+6FFFggK+Lid5uTVP4BwKaxSy+4Zmir6LZUOVk7GmkDor8Jp # oxgpV4dkI6E/063g1Ti2yjNxyG8IFhHPwH5asNkMDeeJcbHJdxVniO/7BlghtLgF # uQp5IZeEe0kBuLmsm41+RaeRWzdCHJyuAb4q15SpB6VMby1AEicb/ju2VGN9CJXo # HDGCBiUwggYhAgEBMIHdMIHXMQswCQYDVQQGEwJDSDEQMA4GA1UECBMHQmVpamlu # ZzEQMA4GA1UEBxMHSGFpZGlhbjERMA8GA1UEChMIUGVyc29uYWwxEjAQBgNVBAsT # CVdhbmdZdWNhaTEiMCAGCSqGSIb3DQEJARYTTmV0T3dsc0BvdXRsb29rLmNvbTEb # MBkGA1UEBRMSMTEwMjIxMTk4MzA5MTU4MzExMRcwFQYDVQQMEw4uTkVUIERldmVs # b3BlcjEOMAwGA1UEBBMFWXVjYWkxEzARBgNVBCkTCldhbmcgWXVjYWkCAW8wCQYF # Kw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkD # MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARYwIwYJ # KoZIhvcNAQkEMRYEFBWyBpb8M369e7SVCqmK2o3l1u77MA0GCSqGSIb3DQEBAQUA # BIICAJiXAPao9bfM4EGMzaBEDv4dc9Y7NHwxoiyo2RqQZQP2YcU90ZtawPSeqzBw # j8nNBMs+uc1oukgBqyNKGY0Stkhwo4wAo/8g1E9GjifEZS8HZJwJDwbkkkDf4zaq # r7jNZJdASyD5M7QXX6mo0M4dyMTkXa59QpT0wUD5uY3i8boEnmN9voNKwyuL1oct # UiHHmfztxcf48pxi3gujx/Qyn9wTsks8J6Ldum20VYlkYr9aMt4mdKsztvSsYCDZ # ljMdoym5HSf3pnYCg1UQj/ARUXrH723VXNp8NnEZJp0ZSiL96c4w2n39op46PD4h # lxas3YQ3z7CqEXPpOVFu+DkC/knQLdNcKKHcO7Qzc4y55jYUrfT5R1R6kBNdnwKU # g66Aov4lTtVRFwYg03P4V+Sppk/caseMDci3uGwgnHPM1895vthwtBOUPDnSzHx1 # IzHTwMd7oylHGl0dLOMPqLjGxJ8VUliL3Waa2CoTolDKIRxEAAwwwk0oMsq7HaVo # YrYtPczLtJ93zdwEkcQE+koSb6a1h73JltWyJLXGbmwa/Gb2OwhfpgJezGeqacT1 # ksQLhivmcaQhQ4I2b2aRuWeQlKbqIW9PPcyRbdOB8f7Z28kmVDqyRfLFW+VdmCJO # 3PNEeXZebpMqzO/9pYzqbT7XPpTTKgjYydiHc8RRDPs2sTJNoYICojCCAp4GCSqG # SIb3DQEJBjGCAo8wggKLAgEBMGgwUjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEds # b2JhbFNpZ24gbnYtc2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5n # IENBIC0gRzICEhEh1pmnZJc+8fhCfukZzFNBFDAJBgUrDgMCGgUAoIH9MBgGCSqG # SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4MTEyNjA4NDcz # MlowIwYJKoZIhvcNAQkEMRYEFMcFNP9jmVEA+ESETPVOsqrzH/0NMIGdBgsqhkiG # 9w0BCRACDDGBjTCBijCBhzCBhAQUY7gvq2H1g5CWlQULACScUCkz7HkwbDBWpFQw # UjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKDAmBgNV # BAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzICEhEh1pmnZJc+8fhC # fukZzFNBFDANBgkqhkiG9w0BAQEFAASCAQBeyQVv0t33f73skhtX7oiWWgTpoWzj # kz148quDO+iysjvegEOj5t4XDhI4VubwZgi6AR5JBR+41zYmZxLtl5a0OyjgjoFQ # nr6XTJwzRnwFQxk6w9YC3iL6ONgoq4VcEU1p57RddR2zu1A4gvQTBkEf/pYFg1NS # D875F4hm01o2nNDMvtxo2pHfWyvEkc0qrItJCXPjxCrooCdMxZMP037KPCMhpTeu # LgrZYCBTjpFEowNYiqnRNxa/33l9M7zox0ajMs5VLnZdtA7aak4kuUrpEp24Mb0Q # mBa+FO3BsMzw0BoTS/LAMBmHypafuU7dLxrRYCwA/j5AwbG1aLNJsXSP # SIG # End signature block |