Src/Public/Get-LabStatus.ps1
function Get-LabStatus { <# .SYNOPSIS Queries computers' LCM state to determine whether an existing DSC configuration has applied. .EXAMPLE Get-LabStatus -ComputerName CONTROLLER, XENAPP Queries the CONTROLLER and XENAPP computers' LCM state using the current user credential. .EXAMPLE Get-LabStatus -ComputerName CONTROLLER, EXCHANGE -Credential (Get-Credential) Prompts for credentials to connect to the CONTROLLER and EXCHANGE computers to query the LCM state. .EXAMPLE Get-LabStatus -ConfigurationData .\TestLabGuide.psd1 -Credential (Get-Credential) Prompts for credentials to connect to the computers defined in the DSC configuration document (.psd1) and query the LCM state. .EXAMPLE Get-LabStatus -ConfigurationData .\TestLabGuide.psd1 -PreferNodeProperty IPAddress -Credential (Get-Credential) Prompts for credentials to connect to the computers by their IPAddress node property as defined in the DSC configuration document (.psd1) and query the LCM state. #> [CmdletBinding()] param ( ## Connect to the computer name(s) specified. [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'ComputerName')] [System.String[]] $ComputerName, ## Connect to all nodes defined in the a Desired State Configuration (DSC) configuration (.psd1) document. [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'ConfigurationData')] [System.Collections.Hashtable] [Microsoft.PowerShell.DesiredStateConfiguration.ArgumentToConfigurationDataTransformationAttribute()] $ConfigurationData, ## Use an alternative property for the computer name to connect to. Use this option when a configuration document's ## node name does not match the computer name, e.g. use the IPAddress property instead of the NodeName property. [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'ConfigurationData')] [System.String] $PreferNodeProperty, ## Specifies the application name in the connection. The default value of the ApplicationName parameter is WSMAN. ## The complete identifier for the remote endpoint is in the following format: ## ## <transport>://<server>:<port>/<ApplicationName> ## ## For example: `http://server01:8080/WSMAN` ## ## Internet Information Services (IIS), which hosts the session, forwards requests with this endpoint to the ## specified application. This default setting of WSMAN is appropriate for most uses. This parameter is designed ## to be used if many computers establish remote connections to one computer that is running Windows PowerShell. ## In this case, IIS hosts Web Services for Management (WS-Management) for efficiency. [Parameter(ValueFromPipelineByPropertyName)] [System.String] $ApplicationName, ## Specifies the authentication mechanism to be used at the server. The acceptable values for this parameter are: ## ## - Basic. Basic is a scheme in which the user name and password are sent in clear text to the server or proxy. ## - Default. Use the authentication method implemented by the WS-Management protocol. This is the default. - ## Digest. Digest is a challenge-response scheme that uses a server-specified data string for the challenge. - ## Kerberos. The client computer and the server mutually authenticate by using Kerberos certificates. - ## Negotiate. Negotiate is a challenge-response scheme that negotiates with the server or proxy to determine the ## scheme to use for authentication. For example, this parameter value allows for negotiation to determine ## whether the Kerberos protocol or NTLM is used. - CredSSP. Use Credential Security Support Provider (CredSSP) ## authentication, which lets the user delegate credentials. This option is designed for commands that run on one ## remote computer but collect data from or run additional commands on other remote computers. ## ## Caution: CredSSP delegates the user credentials from the local computer to a remote computer. This practice ## increases the security risk of the remote operation. If the remote computer is compromised, when credentials ## are passed to it, the credentials can be used to control the network session. ## ## Important: If you do not specify the Authentication parameter,, the Test-WSMan request is sent to the remote ## computer anonymously, without using authentication. If the request is made anonymously, it returns no ## information that is specific to the operating-system version. Instead, this cmdlet displays null values for ## the operating system version and service pack level (OS: 0.0.0 SP: 0.0). [Parameter(ValueFromPipelineByPropertyName)] [ValidateSet('None','Default','Digest','Negotiate','Basic','Kerberos','ClientCertificate','Credssp')] [System.String] $Authentication = 'Default', ## Specifies the digital public key certificate (X509) of a user account that has permission to perform this ## action. Enter the certificate thumbprint of the certificate. ## ## Certificates are used in client certificate-based authentication. They can be mapped only to local user ## accounts; they do not work with domain accounts. ## ## To get a certificate thumbprint, use the Get-Item or Get-ChildItem command in the Windows PowerShell Cert: ## drive. [Parameter(ValueFromPipelineByPropertyName)] [System.String] $CertificateThumbprint, ## Specifies the port to use when the client connects to the WinRM service. When the transport is HTTP, the ## default port is 80. When the transport is HTTPS, the default port is 443. ## ## When you use HTTPS as the transport, the value of the ComputerName parameter must match the server's ## certificate common name (CN). [Parameter(ValueFromPipelineByPropertyName)] [System.Int32] $Port, ## Specifies that the Secure Sockets Layer (SSL) protocol is used to establish a connection to the remote ## computer. By default, SSL is not used. ## ## WS-Management encrypts all the Windows PowerShell content that is transmitted over the network. The UseSSL ## parameter lets you specify the additional protection of HTTPS instead of HTTP. If SSL is not available on the ## port that is used for the connection, and you specify this parameter, the command fails. [Parameter(ValueFromPipelineByPropertyName)] [System.Management.Automation.SwitchParameter] $UseSSL, ## Credential used to connect to the remote computer. [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [System.Management.Automation.PSCredential] [System.Management.Automation.CredentialAttribute()] $Credential ) begin { ## Authentication might not be explicitly passed, add it so it gets splatted $PSBoundParameters['Authentication'] = $Authentication; } process { if ($PSCmdlet.ParameterSetName -eq 'ConfigurationData') { $nodes = $ConfigurationData.AllNodes | Where-Object { $_.NodeName -ne '*' }; foreach ($node in $nodes) { $nodeName = $node.NodeName; if (($PSBoundParameters.ContainsKey('PreferNodeProperty')) -and (-not [System.String]::IsNullOrEmpty($node[$PreferNodeProperty]))) { $nodeName = $node[$PreferNodeProperty]; } $ComputerName += $nodeName; } } $sessions = Get-PSSession; $activeSessions = @(); $inactiveSessions = @(); ## Remove parameters that aren't supported by Get-PSSession, Test-WSMan and New-PSSession [ref] $null = $PSBoundParameters.Remove('ComputerName'); [ref] $null = $PSBoundParameters.Remove('ConfigurationData'); [ref] $null = $PSBoundParameters.Remove('PreferNodeProperty'); [ref] $null = $PSBoundParameters.Remove('ErrorAction'); foreach ($computer in $ComputerName) { $session = $sessions | Where-Object { $_.ComputerName -eq $computer -and $_.State -eq 'Opened' } | Select-Object -First 1; if (-not $session) { Write-Verbose -Message ($localized.TestingWinRMConnection -f $computer); try { if (Test-WSMan -ComputerName $computer -ErrorAction Stop @PSBoundParameters) { ## WSMan is up so we should be able to connect, if not throw.. Write-Verbose -Message ($localized.ConnectingRemoteSession -f $computer); $activeSessions += New-PSSession -ComputerName $computer -ErrorAction Stop @PSBoundParameters; } } catch { $inactiveSessions += $computer; Write-Error $_; } } else { Write-Verbose -Message ($localized.ReusingExistingRemoteSession -f $computer); $activeSessions += $session } } #end foreach computer if ($activeSessions.Count -gt 0) { Write-Verbose -Message ($localized.QueryingActiveSessions -f ($activeSessions.ComputerName -join "','")); $results = Invoke-Command -Session $activeSessions -ScriptBlock { Get-DscLocalConfigurationManager | Select-Object -Property LCMVersion, LCMState; }; } foreach ($computer in $ComputerName) { if ($computer -in $inactiveSessions) { $labState = [PSCustomObject] @{ ComputerName = $computer; LCMVersion = ''; LCMState = 'Unknown'; Completed = $false; } Write-Output -InputObject $labState; } else { $result = $results | Where-Object { $_.PSComputerName -eq $computer }; $labState = [PSCustomObject] @{ ComputerName = $result.PSComputerName; LCMVersion = $result.LCMVersion; LCMState = $result.LCMState; Completed = $result.LCMState -eq 'Idle'; } Write-Output -InputObject $labState; } } #end foreach computer } #end process } #end function # SIG # Begin signature block # MIIZhAYJKoZIhvcNAQcCoIIZdTCCGXECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUx/aqwYSjVV0AkDv1O/f6muVF # IzygghSSMIIE/jCCA+agAwIBAgIQDUJK4L46iP9gQCHOFADw3TANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4XDTIxMDEwMTAwMDAwMFoXDTMxMDEw # NjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu # MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMTCCASIwDQYJKoZIhvcN # AQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1DQikRcpja1HXOhFCvQp1dU2UtAxQ # tSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4/2cLnGP9NmqB+in43Stwhd4CGPN4 # bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT0dHTWjaPxqPhLxs6t2HWc+xObTOK # fF1FLUuxUOZBOjdWhtyTI433UCXoZObd048vV7WHIOsOjizVI9r0TXhG4wODMSlK # XAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j6BqrW7EdMMKbaYK02/xWVLwfoYer # vnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4Gdb+DUmEvQECAwEAAaOCAbgwggG0 # MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG # AQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9bAcBMCkwJwYIKwYBBQUHAgEWG2h0 # dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAfBgNVHSMEGDAWgBT0tuEgHf4prtLk # YaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6sGa+vCgtHUQ23eNqerwwcQYDVR0f # BGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl # ZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz # c3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6 # Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRFRpbWVzdGFtcGluZ0NB # LmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzctemaI7znGucgDo5nRv1CclF0CiNH # o6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZO73+RAJmTe1ppA/2uHDPYuj1UUp4 # eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO/PT+t2R3Y18jUmmDgvoaU+2QzI2h # F3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUIAHa8gQ74wOFcz8QRcucbZEnYIpp1 # FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahzQ1HavWPWH1ub9y4bTxMd90oNcX6X # t/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5nePk2mOHLKNpbh6aKLzCCBSMwggQL # oAMCAQICEALG08WuKukUkZsdIZFconEwDQYJKoZIhvcNAQELBQAwcjELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUg # U2lnbmluZyBDQTAeFw0xOTA3MDMwMDAwMDBaFw0yMTExMDMxMjAwMDBaMGAxCzAJ # BgNVBAYTAkdCMQ8wDQYDVQQHEwZMb25kb24xHzAdBgNVBAoTFlZpcnR1YWwgRW5n # aW5lIExpbWl0ZWQxHzAdBgNVBAMTFlZpcnR1YWwgRW5naW5lIExpbWl0ZWQwggEi # MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCf7ODTBCSwNQI4uBByfObsMhBA # HqZ3WJ9V/KUZxpDpU81RyEwHh+wUJ3oY2zcAo+zB1D00jM0rnF4cn2jGbYQjWLbo # MmdrlOLlYwdX98XZl1xV/mrpDGIApNWUBW0DAam80WOApQ8JSzRlRIwyXiwVC+nI # iBE6g3Nu2C4O+9li6bryF53tdxGFzeNtmPN10ahDH+L/Ut/fEvDEZOanWrEbcWGW # OhnImWUJwC/1zm6VwzN7QxYHELshnGbbUbl1WVxI/ppWPIFCM5EidGiZ9aVVU7Gv # rQrwGbiTCcHT4cjOzVGu2LJu5/anRewb3K1gZmmEXw8smpS8EaDnCNh1aHV/AgMB # AAGjggHFMIIBwTAfBgNVHSMEGDAWgBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAdBgNV # HQ4EFgQUgxVl5e9BY1X5fCAcAE6ROOqrxngwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMHcGA1UdHwRwMG4wNaAzoDGGL2h0dHA6Ly9jcmwzLmRp # Z2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8v # Y3JsNC5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDBMBgNVHSAE # RTBDMDcGCWCGSAGG/WwDATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdp # Y2VydC5jb20vQ1BTMAgGBmeBDAEEATCBhAYIKwYBBQUHAQEEeDB2MCQGCCsGAQUF # BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUHMAKGQmh0dHA6 # Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1cmVkSURDb2Rl # U2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCd # VWWTTAMvCskCwasEVgFg6nDsY1ZcuhUyHqjtv7pfaxGJvAfZjcetPwC/k2021MAc # 4mtqcAbiIp+9HgpWRxbLb0HAEgWwdJNeEf67Po3rLXxUZq7BM9u9jznOr7CnHt0z # pagXNq7b1crlD0byNskJtVmE6ToEJ56d4sdiwXfn4EQDbD/crq75xnRBRc06BQ1x # VZBRwUPT6+bQG+Iu2ZEhQudgbQezVbqIh/N5cdO0soyMVNdRCxA2QaTtx4k7E824 # TwBMOAj/vjjSvH4nlmXrwyvQxRIjSAtIFi/wx9fnO3ooTqCXSakQE/cJADCI3LJG # eSzmxrzLLf4asAXsKS82MIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDAN # BgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg # SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2Vy # dCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIw # MDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A # MIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUu # t4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5 # oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrE # sq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1 # TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNz # QYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/ # BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMw # eQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy # dC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0 # dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j # cmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3Vy # ZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYB # BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMw # HQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0 # ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8 # JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4k # gU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscn # KqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESl # E/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6Z # MWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSa # ZFHvMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXaNpfCFTANBgkqhkiG9w0BAQsF # ADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL # ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElE # IFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEwMTA3MTIwMDAwWjByMQswCQYD # VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln # aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgVGlt # ZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvdAy # 7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1NaH7ntqD0jbOI5Je/YyGQmL8T # vFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vjRkcGGlV+Cyd+wKL1oODeIj8O # /36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOoCXFr4M8iEA91z3FyTgqt30A6 # XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe/WZuVmEnKYmEUeaC50ZQ/ZQq # LKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG7z3N1k3vBkL9olMqT4UdxB08 # r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYDVR0OBBYEFPS24SAd/imu0uRh # pbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMBIGA1Ud # EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF # BwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln # aWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j # b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4MDqgOKA2 # hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 # Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB # c3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcwOAYKYIZIAYb9bAACBDAqMCgG # CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAsGCWCGSAGG # /WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGHVmnN793afKpjerN4zwY3QITv # S4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqumfgnoma/Capg33akOpMP+LLR # 2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuByx5jWPGTlH0gQGF+JOGFNYkYk # h2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraSZ/tTYYmo9WuWwPRYaQ18yAGx # uSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh5Fhgm7oMLSttosR+u8QlK0cC # CHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2skuiSpXY9aaOUjGCBFwwggRY # AgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAX # BgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIg # QXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEALG08WuKukUkZsdIZFconEwCQYF # Kw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkD # MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJ # KoZIhvcNAQkEMRYEFHKUw2CL/KlSfFGGiznD4p8qVbfSMA0GCSqGSIb3DQEBAQUA # BIIBAFMt6ZordydJMiWyAFU0olvx/R9PVmXWap+hNuFVZ+g0Kfn+AqEfdLprKrPY # bgKoA0tMTX8tAm8VWkctH0YCdXgoX+8cYgYlVxIUXgsiHTSAU6OiPeM78urLjo82 # SI4KwEX3SesHLf0QEAbC9jmsj/7XRkvVj8IXybPyqHM16R3tjxSQhgqQP6uNzXHW # CIklm+0FJQSI6lFQypEOuH9vegCfFMqbsQevD4uDwT8qh6FWKiIFM8MZAKnAWvs6 # Whdq+6DLlECi7nj3uZqyGc9lXB3BpucXwLW19Hi/ezxUzSunmWQTSMxKPnosZ02x # swE7s3PPPvcA2ohp19GOyMtLLrChggIwMIICLAYJKoZIhvcNAQkGMYICHTCCAhkC # AQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG # A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBB # c3N1cmVkIElEIFRpbWVzdGFtcGluZyBDQQIQDUJK4L46iP9gQCHOFADw3TANBglg # hkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN # AQkFMQ8XDTIxMDQyMjExNDA1OFowLwYJKoZIhvcNAQkEMSIEIM9rwFK0CVgiR7O5 # yTUX+LngMttW3GaVcgumakGHc+KeMA0GCSqGSIb3DQEBAQUABIIBAC22efnFsJ2y # qwyodyTkDTF0Cst3pUKrQF2391TSNBuahTIeVIrMtHi0mCPajB19fLGkMflTbDWr # rSzrM2o7pqy8gaHfOVPDrT9OyJ10VqkpZoT5Cq4zbuHSHmawaPPtrlDz0qgHRX7S # CN0xhZZxy8gxBgR8QiWJTeWRrgvG2pp3phe8w0javp6oSBogRtQGdIOHW2kjTSuU # k41vju+2RRYMsubwJGx7NhG7ICLWHubPJBJAUxuvzjPQvrOltna2xhJuXt3WJtZX # QZBbS3UgBD+kOuslBcww/KbBYiWHe9FWa9f6BJ5RBq3uClDHnxRStTfQcqXGJykT # At8QGDYOtd8= # SIG # End signature block |