public/Get-LodPxLabSessionDetail.ps1
<#############################################################################
TBD Copyright 2015-2017 Kirk Munro 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. See the License for the specific language governing permissions and limitations under the License. #############################################################################> function Get-LodPxLabSessionDetail { [CmdletBinding()] [OutputType('LabOnDemand.Session#Detail')] param( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [ValidateRange(1,[System.UInt64]::MaxValue)] [System.UInt64] [Alias('LabInstanceId')] $Id, [Parameter(Mandatory=$true)] [ValidateScript({ if ($_ -eq [System.Guid]::Empty) { throw 'An empty guid is not a valid API key.' } $true })] [System.Guid] $ApiKey, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $ServerAddress ) process { try { #region Identify any pass-through parameters that will be used for splatting. $passThruParameters = @{} foreach ($passThruParameterName in 'ApiKey','ServerAddress') { if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey($passThruParameterName)) { $passThruParameters[$passThruParameterName] = $PSCmdlet.MyInvocation.BoundParameters[$passThruParameterName] } } #endregion #region Build a collection of request parameters. $parameters = [ordered]@{ labInstanceId = $Id } #endregion #region Get the lab instance details. $results = Invoke-LodPxWebMethod -Name details -Parameters $parameters @passThruParameters #endregion #region Check the results for error. $errorCodes = @{ 0 = 'Error' } if ([int]$results.Status -ne 1) { if ($errorCodes.Keys -contains [int]$results.Status) { throw "$($errorCodes[[int]$results.Status]). Error message: $($results.Error)." } else { throw "The server returned an undocumented error code. Error code: $($results.Status). Error message: $($results.Error)." } } #endregion #region Return the lab session details to the caller. $labSessionDetail = [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail' MonitorUrl = $results.MonitorUrl Errors = $results.Errors LabInstanceId = $results.Id Expires = ConvertFrom-UnixEpochTime -Value $results.Expires LabSeriesId = $results.SeriesId LabSeriesName = $results.SeriesName LabProfileId = $results.LabProfileId LabProfileName = $results.LabProfileName UserId = $results.UserId UserFirstName = $results.UserFirstName UserLastName = $results.UserLastName ClassId = $results.ClassId ClassName = $results.ClassName Location = [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.Location' PlatformId = $results.PlatformId LabHostName = $results.LabHostName VMPoolMemberName = $results.PoolMemberName } Start = ConvertFrom-UnixEpochTime -Value $results.Start End = $(if ($results.End -ne $null) {ConvertFrom-UnixEpochTime -Value $results.End}) LastActivity = $(if ($results.LastActivity -ne $null) {ConvertFrom-UnixEpochTime -Value $results.LastActivity}) LastSave = $(if ($results.LastSave -ne $null) {ConvertFrom-UnixEpochTime -Value $results.LastSave}) SaveExpires = $(if ($results.SaveExpires -ne $null) {ConvertFrom-UnixEpochTime -Value $results.SaveExpires}) State = $results.State StatusMessage = $results.CompletionStatus # Assigned directly because this API returns a string instead of an integer value RemoteController = $results.RemoteController BrowserUserAgent = $results.BrowserUserAgent LastLatency = $results.LastLatency LastSaveTriggerType = $results.LastSaveTriggerType TotalRunTime = New-TimeSpan -Seconds $results.TotalRunTime TimeInSession = New-TimeSpan -Seconds $results.TimeInSession TimeRemaining = New-TimeSpan -Seconds $results.TimeRemaining InstructorName = $results.InstructorName StartupDuration = $(if ($results.StartupDuration -ne $null) {New-TimeSpan -Seconds $results.StartupDuration}) Progress = $null Exam = $null Snapshots = @() SessionHistory = @() PublicIPAddresses = @() CloudCredentials = @() } if ($results.HasContent -eq $true) { $labSessionDetail.Progress = [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.Progress' Exercise = $results.Exercise Task = $results.Task CompletedTaskCount = $results.NumCompletedTasks TotalTaskCount = $results.NumTasks PercentComplete = $results.TaskCompletePercent } } if ($results.IsExam -eq $true) { $labSessionDetail.Exam = [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.Exam' Passed = $results.ExamPassed Score = $results.ExamScore PerfectScore = $results.ExamMaxPossibleScore PassingScore = $results.ExamPassingScore ScoredById = $results.ExamScoredById ScoredByName = $results.ExamScoredByName ScoredTime = $(if ($results.ExamScoredTime -ne $null) {ConvertFrom-UnixEpochTime -Value $results.ExamScoredTime}) } } foreach ($snapshot in $results.Snapshots) { $labSessionDetail.Snapshots += [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.Snapshot' Name = $snapshot.Name Timestamp = ConvertFrom-UnixEpochTime -Value $snapshot.Time } } foreach ($session in $results.Sessions) { $sessionHistoryRecord = [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.History' Start = ConvertFrom-UnixEpochTime -Value $session.Start End = $(if ($session.End -ne $null) {ConvertFrom-UnixEpochTime -Value $session.End}) Duration = $null } if ($sessionHistoryRecord.End -ne $null) { $sessionHistoryRecord.Duration = $sessionHistoryRecord.End - $sessionHistoryRecord.Start } $labSessionDetail.SessionHistory += $sessionHistoryRecord } foreach ($publicIpAddress in $results.PublicIPAddresses) { $labSessionDetail.PublicIPAddresses += [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.IpAddressInfo' IPAddress = [System.Net.IPAddress]$publicIpAddress.IpAddress MacAddress = $publicIpAddress.MacAddress VMInstanceName = $publicIpAddress.MachineInstanceName } } foreach ($cloudCredential in $results.CloudCredentials) { $labSessionDetail.CloudCredentials += [pscustomobject]@{ PSTypeName = 'LabOnDemand.Session#Detail.CloudCredential' DisplayName = $cloudCredential.DisplayName Expires = ConvertFrom-UnixEpochTime -Value $cloudCredential.End Properties = ConvertFrom-Json -InputObject $cloudCredential.PropertiesJson } } $labSessionDetail #endregion } catch { $PSCmdlet.ThrowTerminatingError($_) } } } Export-ModuleMember -Function Get-LodPxLabSessionDetail # SIG # Begin signature block # MIIX0AYJKoZIhvcNAQcCoIIXwTCCF70CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUMJHwwRDx0ZCJ0GwjvgZ34fij # WL6gghMDMIID7jCCA1egAwIBAgIQfpPr+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 # ggUwMIIEGKADAgECAhAECRgbX9W7ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9v # dCBDQTAeFw0xMzEwMjIxMjAwMDBaFw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNp # Z25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4R # r2d3B9MLMUkZz9D7RZmxOttE9X/lqJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrw # nIal2CWsDnkoOn7p0WfTxvspJ8fTeyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnC # wlLyFGeKiUXULaGj6YgsIJWuHEqHCN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8 # y5Kh5TsxHM/q8grkV7tKtel05iv+bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM # 0SAlI+sIZD5SlsHyDxL0xY4PwaLoLFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6f # pjOp/RnfJZPRAgMBAAGjggHNMIIByTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGsw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcw # AoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElE # Um9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNl # cnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDov # L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBP # BgNVHSAESDBGMDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93 # d3cuZGlnaWNlcnQuY29tL0NQUzAKBghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoK # o6XqcQPAYPkt9mV1DlgwHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8w # DQYJKoZIhvcNAQELBQADggEBAD7sDVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+ # C2D9wz0PxK+L/e8q3yBVN7Dh9tGSdQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119E # efM2FAaK95xGTlz/kLEbBw6RFfu6r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR # 4pwUR6F6aGivm6dcIFzZcbEMj7uo+MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4v # cn4c10lFluhZHen6dGRrsutmQ9qzsIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwH # gfqL2vmCSfdibqFT+hKUGIUukpHqaGxEMrJmoecYpJpkUe8wggUyMIIEGqADAgEC # AhABcG33bGmgMXqaPDxFxG7xMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVT # MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j # b20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25p # bmcgQ0EwHhcNMTYxMTAzMDAwMDAwWhcNMTcxMTIyMTIwMDAwWjBvMQswCQYDVQQG # EwJDQTEWMBQGA1UECBMNTmV3IEJydW5zd2ljazEQMA4GA1UEBxMHU2hlZGlhYzEa # MBgGA1UEChMRS2lyayBBbmRyZXcgTXVucm8xGjAYBgNVBAMTEUtpcmsgQW5kcmV3 # IE11bnJvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3v9YwSFN4+E6 # izQlYrpVQXBSIKWt8L0QhxmkWwrSqQWe0mX8UsTKwVK5db+q2e0KtossjPG3T5go # rn1C9DUXp1SeIEfP6N6n+6ZMJd4m3v2I9gVXVQ5PwBgo8np92O4fduz8SV3T8vnl # VJL1CnTkQO4IW4CICUf7N6tSSYAZI7dzdPQ+GM1L22DS41ZWkaOnpQGu1oXf2Vw3 # DwJgCkT5WPho/7cVSrqc7Xg7scn7XUxXHD/Zu2lNKhjpGYTc9nYU//vXUHuAm06A # rTMxcImGpNGfgtK+T3r/7DMZGCEfmmdb2khRNuqBPJCi++JovAfpP7/Vtd5IHe1r # 5HvEfmSrtQIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoKo6XqcQPAYPkt # 9mV1DlgwHQYDVR0OBBYEFE17ULqi4+fU2lXCUQc55Iu7bHw7MA4GA1UdDwEB/wQE # AwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWgM6Axhi9odHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDA1oDOg # MYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5j # cmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcCARYcaHR0cHM6 # Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsGAQUFBwEBBHgw # djAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME4GCCsGAQUF # BzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyQXNz # dXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0B # AQsFAAOCAQEAsjePAnvbVwZQ3W1h2rm/0nheYHeOz6Uz2lOLAsSlCnL2Dhcl4jJR # Tn+VR4hdAVFYa0Lo87UAG9Cy4GjSNnWqj9AHs9rO0dIlEgks3Ov40XC8zbM5td9j # /2fwXMccLagqkNHjvng3f5ap2kfy7KgwgSA+uL5pXXhnRYvKtmenIU5GvivxLx3n # DffGTlI9Ny51yXpOrTL1+cs4tC6dzJfo3c2CD0M8mrHlJqUHC+6Hg3SPRWdRJZGo # 8+h2nH7F2/Al4JxgkoHuqznwF1W4AfRqF/lkjyDXHMwm5NPnCw4YCUv2s6PvUS08 # SWLSWo/5nh2DXynXQPY0RsH79Sx+/FrVJTGCBDcwggQzAgEBMIGGMHIxCzAJBgNV # BAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp # Y2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2Rl # IFNpZ25pbmcgQ0ECEAFwbfdsaaAxepo8PEXEbvEwCQYFKw4DAhoFAKB4MBgGCisG # AQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFLhY # FeQxtkWxtj4YXzD3FJeUf+qpMA0GCSqGSIb3DQEBAQUABIIBALxQ6IBnPSZ1FL+c # iqOHOHTSS0Jl7GyGnm1L1gIqKH0zP/ncqAvVe2pmlyJnjDPCcunc6DxHRg7FEQKU # RnGmLG2ZMoESp5Cq6stX617lNnlRrm2CVQp4STsu5at0pqk6DD8LqDpGn+2JNBPN # CeH7uMIr3FFkzBlY5k+ISTMsazIoOzQGmF2Bj3nEBpGUsVtpQ7oAgpyxrZygZ/N0 # EEM26d4wO7JAoD7Fz7BvgFyTjiQLaagaE7nXdB78nmIU0L6BiARKi5DLQzDJnxaw # l6j/pfl7OK8SC1GQXj0lhjzZyv4Z5/Wz2R+NMwC/jTT7nnAL2m8EAEfMgGVFf++N # YZAwKcShggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQG # EwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5 # bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVu # BNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc # BgkqhkiG9w0BCQUxDxcNMTcwNjE5MTY0MDA2WjAjBgkqhkiG9w0BCQQxFgQUuqQJ # S8bDMDSPxz22kkEEK9WAD7MwDQYJKoZIhvcNAQEBBQAEggEAKwaz+cnrfquvtHqp # jKHeXbuUQv+ySPYp0OWPZFTpVa6JFbye4VNYgVigDaeMAIgD17vCtLWB/MzpwESt # rWE/WZcvibwWlobvC3do1gkDtwnX3lafd6guPv+5Prss3/Zf93P9lBO96iS1xoQo # muhEhxQOZ8PCc3bARBYn8phuN4M3L2rtvA9othMm792esyfON+mHSFBcqCQDpfyK # Y9pmRSIZlBbD+haIPjrYWZ26Uq+vIzQ8tMyQ2z2BRJyPOt6qxmBmPi37zK508ZTI # GZ5ya3d0nq1vbCSI1BoDLupxrpmGlTDH7TqxLZ6/r7V7Kxgp6PgOBWbtiAgXHdC5 # mivOCA== # SIG # End signature block |