Application/Application.ps1
#region Copyright & License # Copyright © 2012 - 2020 François Chabot # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.u # See the License for the specific language governing permissions and # limitations under the License. #endregion using namespace Microsoft.BizTalk.ExplorerOM using namespace Microsoft.BizTalk.Operations Set-StrictMode -Version Latest <# .SYNOPSIS Asserts the existence of a Microsoft BizTalk Server Application. .DESCRIPTION This command will throw if the Microsoft BizTalk Server Application does not exist and will silently complete otherwise. .PARAMETER Name The name of the Microsoft BizTalk Server Application. .PARAMETER References The name of the Microsoft BizTalk Server Applications that are to be referenced by the one whose existence is tested. .PARAMETER ManagementDatabaseServer The name of the SQL server hosting the management database; it defaults to MSBTS_GroupSetting.MgmtDbServerName. .PARAMETER ManagementDatabaseName The name of the management database; it defaults to MSBTS_GroupSetting.MgmtDbName. .EXAMPLE PS> Assert-BizTalkApplication .EXAMPLE PS> Assert-BizTalkApplication -Name 'BizTalk.System' .NOTES © 2020 be.stateless. #> function Assert-BizTalkApplication { [CmdletBinding()] [OutputType([void])] param( [Parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $Name, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [string[]] $References, [Parameter(Position = 1, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseServer = (Get-BizTalGroupMgmtDbServer), [Parameter(Position = 2, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseName = (Get-BizTalGroupMgmtDbName) ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState if (-not(Test-BizTalkApplication @PSBoundParameters)) { if ($References | Test-None) { throw "Microsoft BizTalk Server Application '$Name' does not exist." } else { throw "Microsoft BizTalk Server Application '$Name' does not exist or some the required application refereces '$($References -join ''', ''')' are missing." } } Write-Verbose "Microsoft BizTalk Server Application '$Name' exists." } <# .SYNOPSIS Gets the Microsoft BizTalk Server Applications. .DESCRIPTION Gets either one or all of the Microsoft BizTalk Server Applications as Microsoft.BizTalk.ExplorerOM.Application objects. .PARAMETER Name The name of the Microsoft BizTalk Server Application. .PARAMETER ManagementDatabaseServer The name of the SQL server hosting the management database; it defaults to MSBTS_GroupSetting.MgmtDbServerName. .PARAMETER ManagementDatabaseName The name of the management database; it defaults to MSBTS_GroupSetting.MgmtDbName. .OUTPUTS Returns the Microsoft BizTalk Server Applications. .EXAMPLE PS> Get-BizTalkApplication .EXAMPLE PS> Get-BizTalkApplication -Name 'BizTalk.System' .NOTES © 2020 be.stateless. #> function Get-BizTalkApplication { [CmdletBinding()] [OutputType([Microsoft.BizTalk.ExplorerOM.Application[]])] param( [Parameter(Position = 0, Mandatory = $false)] [AllowEmptyString()] [AllowNull()] [string] $Name, [Parameter(Position = 1, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseServer = (Get-BizTalGroupMgmtDbServer), [Parameter(Position = 2, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseName = (Get-BizTalGroupMgmtDbName) ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState Use-Object ($catalog = Get-BizTalkCatalog $ManagementDatabaseServer $ManagementDatabaseName) { if ([string]::IsNullOrWhiteSpace($Name)) { $catalog.Applications } else { $catalog.Applications[$Name] } } } function New-BizTalkApplication { [CmdletBinding(SupportsShouldProcess = $true)] [OutputType([void])] param( [Parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $Name, [Parameter(Position = 1, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $Description, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [string[]] $References ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState if (Test-BizTalkApplication -Name $Name) { Write-Information "`t Microsoft BizTalk Server Application '$Name' has already been created." } elseif ($PsCmdlet.ShouldProcess("Microsoft BizTalk Server Group", "Creating application '$Name'")) { Write-Information "`t Creating Microsoft BizTalk Server Application '$Name'..." Use-Object ($catalog = Get-BizTalkCatalog ) { try { $application = $catalog.AddNewApplication() $application.Name = $Name if (![string]::IsNullOrWhiteSpace($Description)) { $application.Description = $Description } if ($References | Test-Any) { $References | ForEach-Object -Process { Assert-BizTalkApplication -Name $_ $dependantApplication = $catalog.Applications[$_] Write-Information -MessageData "`t Adding Reference to Microsoft BizTalk Server Application '$_' from Microsoft BizTalk Server Application '$Name'." $application.AddReference($dependantApplication) } } $catalog.SaveChanges() } catch { $catalog.DiscardChanges() throw } } Write-Information "`t Microsoft BizTalk Server Application '$Name' has been created." } } function Remove-BizTalkApplication { [CmdletBinding(SupportsShouldProcess = $true)] [OutputType([void])] param( [Parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $Name ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState if (-not(Test-BizTalkApplication -Name $Name)) { Write-Information "`t Microsoft BizTalk Server Application '$Name' has already been removed." } elseif ($PsCmdlet.ShouldProcess("Microsoft BizTalk Server Group", "Removing application '$Name'")) { Write-Information "`t Removing Microsoft BizTalk Server Application '$Name'..." Invoke-Tool -Command { BTSTask RemoveApp -ApplicationName:"$Name" } Write-Information "`t Microsoft BizTalk Server Application '$Name' has been removed." } } function Start-BizTalkApplication { [CmdletBinding()] [OutputType([void])] param( [Parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $Name, [Parameter(Position = 1, Mandatory = $false)] [ApplicationStartOption] $StartOptions = ( [ApplicationStartOption]::StartAllOrchestrations -bor [ApplicationStartOption]::StartAllSendPorts -bor [ApplicationStartOption]::StartAllSendPortGroups -bor [ApplicationStartOption]::EnableAllReceiveLocations -bor [ApplicationStartOption]::DeployAllPolicies ), [Parameter(Position = 3, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseServer = (Get-BizTalGroupMgmtDbServer), [Parameter(Position = 4, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseName = (Get-BizTalGroupMgmtDbName) ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState Use-Object ($catalog = Get-BizTalkCatalog $ManagementDatabaseServer $ManagementDatabaseName) { $application = $catalog.Applications[$Name] try { $application.Start($StartOptions) $catalog.SaveChanges() } catch { $catalog.DiscardChanges() throw } } } function Stop-BizTalkApplication { [CmdletBinding()] [OutputType([void])] param( [Parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $Name, [Parameter(Position = 1, Mandatory = $false)] [ApplicationStopOption] $StopOptions = ( [ApplicationStopOption]::UnenlistAllOrchestrations -bor [ApplicationStopOption]::UnenlistAllSendPorts -bor [ApplicationStopOption]::UnenlistAllSendPortGroups -bor [ApplicationStopOption]::DisableAllReceiveLocations -bor [ApplicationStopOption]::UndeployAllPolicies ), [Parameter(Position = 2, Mandatory = $false)] [switch] $TerminateServiceInstances, [Parameter(Position = 3, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseServer = (Get-BizTalGroupMgmtDbServer), [Parameter(Position = 4, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseName = (Get-BizTalGroupMgmtDbName) ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState Use-Object ($controller = Get-BizTalkController $ManagementDatabaseServer $ManagementDatabaseName) { if ($TerminateServiceInstances) { $controller.GetServiceInstances() | ForEach-Object -Process { $_ -as [MessageBoxServiceInstance] } | Where-Object -FilterScript { $_.Application -eq $Name -and ($_.InstanceStatus -band ([InstanceStatus]::RunningAll -bor [InstanceStatus]::SuspendedAll)) } | ForEach-Object -Process { Write-Information "Terminating service instance ['$($_.Class)', '$($_.ID)']." result = $controller.TerminateInstance($_.ID) if (result -ne [CompletionStatus]::Succeeded -and $_.Class -ne [ServiceClass::RoutingFailure]) { throw "Cannot stop application '$Name': failed to terminate service instance ['$($_.Class)', '$($_.ID)']." } } } $hasInstance = $controller.GetServiceInstances() | ForEach-Object -Process { $_ -as [MessageBoxServiceInstance] } | Where-Object -FilterScript { $_.Application -eq $Name } | Test-Any if ($hasInstance) { throw "Cannot stop application '$Name' because it has running service intances." } } Use-Object ($catalog = Get-BizTalkCatalog $ManagementDatabaseServer $ManagementDatabaseName) { $application = $catalog.Applications[$Name] try { $application.Stop($StopOptions) $catalog.SaveChanges() } catch { $catalog.DiscardChanges() throw } } } <# .SYNOPSIS Tests the existence of a Microsoft BizTalk Server Application. .DESCRIPTION Tests the existence of a Microsoft BizTalk Server Application. .PARAMETER Name The name of the Microsoft BizTalk Server Application. .PARAMETER References The name of the Microsoft BizTalk Server Applications that are to be referenced by the one whose existence is tested. .PARAMETER ManagementDatabaseServer The name of the SQL server hosting the management database; it defaults to MSBTS_GroupSetting.MgmtDbServerName. .PARAMETER ManagementDatabaseName The name of the management database; it defaults to MSBTS_GroupSetting.MgmtDbName. .OUTPUTS Returns $true if the Microsoft BizTalk Server Application exists; $false otherwise. .EXAMPLE PS> Test-BizTalkApplication .EXAMPLE PS> Test-BizTalkApplication -Name 'BizTalk.System' .NOTES © 2020 be.stateless. #> function Test-BizTalkApplication { [CmdletBinding()] [OutputType([bool])] param( [Parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $Name, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [string[]] $References, [Parameter(Position = 1, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseServer = (Get-BizTalGroupMgmtDbServer), [Parameter(Position = 2, Mandatory = $false)] [ValidateNotNullOrEmpty()] [string] $ManagementDatabaseName = (Get-BizTalGroupMgmtDbName) ) Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState Use-Object ($catalog = Get-BizTalkCatalog $ManagementDatabaseServer $ManagementDatabaseName) { $application = $catalog.Applications[$Name] if ($null -ne $application) { if ($References | Test-Any) { $actualReferences = @($application.References | ForEach-Object -Process { $_.Name }) $References | Where-Object -FilterScript { $_ -notin $actualReferences } | Test-None } else { $true } } else { $false } } } # SIG # Begin signature block # MIITugYJKoZIhvcNAQcCoIITqzCCE6cCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUMDnzdpw4Q7sFIAjDTDZA9qQN # cnaggg46MIID7jCCA1egAwIBAgIQfpPr+3zGTlnqS5p31Ab8OzANBgkqhkiG9w0B # AQUFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIG # A1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhh # d3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg # Q0EwHhcNMTIxMjIxMDAwMDAwWhcNMjAxMjMwMjM1OTU5WjBeMQswCQYDVQQGEwJV # UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFu # dGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMjCCASIwDQYJKoZIhvcN # AQEBBQADggEPADCCAQoCggEBALGss0lUS5ccEgrYJXmRIlcqb9y4JsRDc2vCvy5Q # WvsUwnaOQwElQ7Sh4kX06Ld7w3TMIte0lAAC903tv7S3RCRrzV9FO9FEzkMScxeC # i2m0K8uZHqxyGyZNcR+xMd37UWECU6aq9UksBXhFpS+JzueZ5/6M4lc/PcaS3Er4 # ezPkeQr78HWIQZz/xQNRmarXbJ+TaYdlKYOFwmAUxMjJOxTawIHwHw103pIiq8r3 # +3R8J+b3Sht/p8OeLa6K6qbmqicWfWH3mHERvOJQoUvlXfrlDqcsn6plINPYlujI # fKVOSET/GeJEB5IL12iEgF1qeGRFzWBGflTBE3zFefHJwXECAwEAAaOB+jCB9zAd # BgNVHQ4EFgQUX5r1blzMzHSa1N197z/b7EyALt0wMgYIKwYBBQUHAQEEJjAkMCIG # CCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMBIGA1UdEwEB/wQIMAYB # Af8CAQAwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC50aGF3dGUuY29tL1Ro # YXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNV # HQ8BAf8EBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0y # MDQ4LTEwDQYJKoZIhvcNAQEFBQADgYEAAwmbj3nvf1kwqu9otfrjCR27T4IGXTdf # plKfFo3qHJIJRG71betYfDDo+WmNI3MLEm9Hqa45EfgqsZuwGsOO61mWAK3ODE2y # 0DGmCFwqevzieh1XTKhlGOl5QGIllm7HxzdqgyEIjkHq3dlXPx13SYcqFgZepjhq # IhKjURmDfrYwggSjMIIDi6ADAgECAhAOz/Q4yP6/NW4E2GqYGxpQMA0GCSqGSIb3 # DQEBBQUAMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh # dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD # QSAtIEcyMB4XDTEyMTAxODAwMDAwMFoXDTIwMTIyOTIzNTk1OVowYjELMAkGA1UE # BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTQwMgYDVQQDEytT # eW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIFNpZ25lciAtIEc0MIIBIjAN # BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomMLOUS4uyOnREm7Dv+h8GEKU5Ow # mNutLA9KxW7/hjxTVQ8VzgQ/K/2plpbZvmF5C1vJTIZ25eBDSyKV7sIrQ8Gf2Gi0 # jkBP7oU4uRHFI/JkWPAVMm9OV6GuiKQC1yoezUvh3WPVF4kyW7BemVqonShQDhfu # ltthO0VRHc8SVguSR/yrrvZmPUescHLnkudfzRC5xINklBm9JYDh6NIipdC6Anqh # d5NbZcPuF3S8QYYq3AhMjJKMkS2ed0QfaNaodHfbDlsyi1aLM73ZY8hJnTrFxeoz # C9Lxoxv0i77Zs1eLO94Ep3oisiSuLsdwxb5OgyYI+wu9qU+ZCOEQKHKqzQIDAQAB # o4IBVzCCAVMwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAO # BgNVHQ8BAf8EBAMCB4AwcwYIKwYBBQUHAQEEZzBlMCoGCCsGAQUFBzABhh5odHRw # Oi8vdHMtb2NzcC53cy5zeW1hbnRlYy5jb20wNwYIKwYBBQUHMAKGK2h0dHA6Ly90 # cy1haWEud3Muc3ltYW50ZWMuY29tL3Rzcy1jYS1nMi5jZXIwPAYDVR0fBDUwMzAx # oC+gLYYraHR0cDovL3RzLWNybC53cy5zeW1hbnRlYy5jb20vdHNzLWNhLWcyLmNy # bDAoBgNVHREEITAfpB0wGzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMjAdBgNV # HQ4EFgQURsZpow5KFB7VTNpSYxc/Xja8DeYwHwYDVR0jBBgwFoAUX5r1blzMzHSa # 1N197z/b7EyALt0wDQYJKoZIhvcNAQEFBQADggEBAHg7tJEqAEzwj2IwN3ijhCcH # bxiy3iXcoNSUA6qGTiWfmkADHN3O43nLIWgG2rYytG2/9CwmYzPkSWRtDebDZw73 # BaQ1bHyJFsbpst+y6d0gxnEPzZV03LZc3r03H0N45ni1zSgEIKOq8UvEiCmRDoDR # EfzdXHZuT14ORUZBbg2w6jiasTraCXEQ/Bx5tIB7rGn0/Zy2DBYr8X9bCT2bW+IW # yhOBbQAuOA2oKY8s4bL0WqkBrxWcLC9JG9siu8P+eJRRw4axgohd8D20UaF5Mysu # e7ncIAkTcetqGVvP6KUwVyyJST+5z3/Jvz4iaGNTmr1pdKzFHTx/kuDDvBzYBHUw # ggWdMIIDUaADAgECAhAoE4COAwM7nkDtQn+T+DmdMEEGCSqGSIb3DQEBCjA0oA8w # DQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIB # IDAmMSQwIgYDVQQDDBtpY3JhZnRzb2Z0d2FyZUBzdGF0ZWxlc3MuYmUwHhcNMjAw # NjIzMTE0MzU2WhcNMjEwNjIzMTIwMzU2WjAmMSQwIgYDVQQDDBtpY3JhZnRzb2Z0 # d2FyZUBzdGF0ZWxlc3MuYmUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC # AQCZBxvQbCUEcEcEln280zwR7A3tP6eGxZVTRYGhacjDpQBP31HD3HlFx85BTaHG # oqZHWT6IjoH6p12lMLdUtIKED+aHU/ikIMOxl7JH/Sef+v8N7OEN7zHmNySNHzwp # JFyAOiHSQuOB+tOgOnH0S8FzBeY0koPAEha7lIG+TTht5Thc7s4eMGiDSQxofEJl # z0dxZ93MF58/59tXO7p/WPVaASpmf2yvUwva6UdF27br7nrEar1FkYm9fJjWZj4r # maoFwRP7VtXalmcGszcZz+GWa9OTCsLRkYEAstlZmqqktWsMJjl6gc/DYLSQDgnM # rhDWjbXyz7Bdu4NyNhEhmoFLAjx+LNH/gNL7p0SN9reTOzbP8yuQk6SEnTq2IxJG # vnm1fUNHw3BUt2I2pli+zjM/Zk1Ewwjy4UKOQ/9afWF8Gv4ZI+WB0urZMWKyFjam # Pk7VaUT+0LP4HRguE9Z19tUSnyQHd8YGxV/u7DhJMr/AMDUxhEgeKS3D4r2C11/R # 4hH11hf0IzCgM3ZM0srq+cJYyvNYV7kQ5Tf+iWNQGTJBPzfxrkDrAy5wZ67sLCN2 # KDKW3tQtpOCUvs5EjJpFvOSW3F37WhpDbWSOXh5/RkPaBYuPtvCtlH4pYJ+ZocWh # mVVEo0+1Jy7I6eKU8YZnpPtI27BXFJcVG1un5xB5rhTHFQIDAQABo18wXTAOBgNV # HQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwFwYDVR0RBBAwDoIMc3Rh # dGVsZXNzLmJlMB0GA1UdDgQWBBSriwKgTYio3gri7A26JuOp3nI01DBBBgkqhkiG # 9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFl # AwQCAQUAogMCASADggIBAFH3xqYukA0oWVzuY+WRpXhm1La5OZsnp06rPJYonbJO # a/tT3Krw90Qf2Y8mXFi8bI2DGoeihwq/VJ2OBiHbtIzykOex9TY2kRHor/ewgLLo # 6uH2+EL5TXwGn3dagsR7OiVoFwXRyjf+j4drM6+z/bMEU40UcyR5/3/cGKmbSx33 # m14ejne8spWIduNKagbFiy8kmJghMHhl6jrGBQCbBxSkvVOjrYtvdE8IMsplDmHw # ivTuedxXgcur7SoXf4b1jQhccm/pByv9dNMujQnzvsdGpLftYlyAXz7adtluo701 # W+nXgDidOql4MWbN7ANTfeGJm/O4scGP/86AuAZn2Uk/EK7S1XF8VZkg0eDVgene # UxoDDTRDe1v++FzmQToqXsWdedROy7iP69ShoUxaFh7OjKf2bisP7E1EhOtss9l1 # YBm9U4nx6GazBGF+IxnWenBuuTspTVROyYxLs8dERZLJQzbxaUwV/aK63xOVj8xX # 9p1QavYamoFaHGnkNGB+XW5qYqbbAWUKtrf+RF5WVCAL8Fuh3Yk6Ala3zMJs7icn # H58ljAz1EbvSH9Oa6rM/y4KGwe0pyCzZi1eZKbXYllqRdjgh+Uicjul10MSz1Q5+ # xZcOyqm+YVBlvCAZ414Sw+TcV2bUzMO1L08FcyTiMYZc3MSxVSDB/jbYe4NZ5f/i # MYIE6jCCBOYCAQEwOjAmMSQwIgYDVQQDDBtpY3JhZnRzb2Z0d2FyZUBzdGF0ZWxl # c3MuYmUCECgTgI4DAzueQO1Cf5P4OZ0wCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcC # AQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYB # BAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFLUXp0RRdYj2 # f/8XjUlB7dDehWFpMA0GCSqGSIb3DQEBAQUABIICAIdUIlhDym9Z5bs4nGQhiVn4 # T7+PVAJBnL1P2cRdowTRmTeQ+/qgPjuOVgUTMIU5CtTMXWgiAtBK+i4oUq69DgL6 # 0D5x0OKyZhtUPS4fPyHUjNUchzYVFvzmlBH8AN8lLSJfKPXcOvteCgb7Xc3GnOVn # zHwiFqxgxii78LQpjeGciF3+MyRBbFcNi1lACkqJDu6dqVx8oez/keQkJn2njRBc # 3efaWeAKCBude1ztiDND+CkD9eRO48adhOc4ohp8WKZRBkqqyZZ7D0ofOPMXR4qE # PlMCx/kEer/BqBc+y2WbS7H/Yw9xnXStAo0F2MUKq+6UwxefM/Tvd1qtttVoEcVU # lP4IDlgX30flMErBAiQ+5AE38onHWaQBJ0tGQg80fdqbGWjflOPLqC2VX1kqUF8G # S2n76vw6u7HPeu3up7rFBNvQ0KrhS8gvtKNj+0UkAc3uFWdVGkjLoICQMEK1NODM # 8mCkTDA3C4uh46R16kQr5RgZrq0yjGPXz2JiAuM6H8IXKnW/+W0TetBgzsJiTLjd # xPcOCp1auUGcCVxZ0sHAUR8OfUqvxND5nKR7OOLTISbI++Vt1AIWqmzcweyoWFHV # b4CFJy6xCXwQkf6xp1GUvgZEv16+tv6Jg55VkX02AoTUVoAWddIy7Dwp2KFjWLFy # fSypmxWc8EPilbdxd0UqoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0AgEBMHIw # XjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAw # LgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIC # EA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkq # hkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIwMTIyNDEwMTAxMVowIwYJKoZIhvcN # AQkEMRYEFOFhPriHKIMuRQhFj5zFmQfLxvD8MA0GCSqGSIb3DQEBAQUABIIBAFRl # iqMinerrKBEyKTlRxgnAJdy+t7OziFihGjl8On032mVChTGfIOjPxQutFf9SaFoO # UwXkbK0Vl/eHNdUsv3og/MCfTcWvavNjKZpkOJrCYI1rN4dlF+omB0Ja9FtfpCik # ITIy0fPKdHmA1lI4+jeHwbvI0cJfk2UTnuM+e53NqU7t3M4am4ENjf2IkSVb6jAy # Wptk/cqm3XjbT1JIHBn6G0OITxGG92J6UcCN7rVz6Jmu0QgIvIsNUy+olxn0WdN/ # U469F2XCRKIP1nrlBCICXipPKNnf8f1WjJW25V7sREyoTiVtYxXjyqSHQIkAuoeX # cZ/QOkncglvfi0TP4g0= # SIG # End signature block |