Private/ApiClient.ps1
# # Runtime for VMware Infrastructure SDK # No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # Version: 1.0 # Contact: powercli@vmware.com # Generated by OpenAPI Generator: https://openapi-generator.tech # # Define Custom Type Exception to wrap WebException with serialized JSON server errors $InvocationExceptionSource = @" using System; public class InvocationException : Exception { object _serverError; public InvocationException(Exception exception, object serverError) : base(exception.Message, exception) { _serverError = serverError; } public object ServerError { get { return _serverError; } } public InvocationException(string message, Exception exception, object serverError) : base(message, exception) { _serverError = serverError; } } "@ Add-Type $InvocationExceptionSource function Invoke-ApiClient { [OutputType('System.Collections.Hashtable')] [CmdletBinding()] Param( [Parameter(Mandatory)] [string]$Product, [Parameter(Mandatory)] [string]$Uri, [Parameter(Mandatory)] [AllowEmptyCollection()] [string[]]$Accepts, [Parameter(Mandatory)] [AllowEmptyCollection()] [string[]]$ContentTypes, [Parameter(Mandatory)] [hashtable]$HeaderParameters, [Parameter(Mandatory)] [hashtable]$FormParameters, [Parameter(Mandatory)] [hashtable]$QueryParameters, [Parameter(Mandatory)] [hashtable]$CookieParameters, [Parameter(Mandatory)] [AllowEmptyString()] [string]$Body, [Parameter(Mandatory)] [string]$Method, [Parameter(Mandatory)] [AllowEmptyString()] [string]$ReturnType, [Parameter(Mandatory)] [bool]$IsBodyNullable, [Parameter(Mandatory)] [hashtable] $InvocationInfo, [Parameter()] [PSTypeName('ServerConfiguration')] $Server ) 'Calling method: Invoke-ApiClient' | Write-Debug $PSBoundParameters | Out-DebugParameter | Write-Debug $ServerConfigurations = Get-ServerConfiguration -Product $Product if ($null -ne $Server) { $ServerConfigurations = $Server } if ($null -eq $ServerConfigurations) { throw "There are no Server Configurations for product '$Product'. Please add at least one server configuration first using the Add-ServerConfiguration cmdlet." } foreach ($Configuration in $ServerConfigurations) { # vSphere API Patch for mandatory Query Params # vSphere API Specs host multiple operations on same Uri # adding different mandatory query params to distinguish them # Their OpenAPI Specs provide wrong paths for those operations # Replacing '?' in path with mandatory query param with '__' # Assume '__' in path is that case and fix the Uri here if ($Uri.Indexof("__") -ge 0) { $Uri = $Uri.Replace("__", "?") } $BaseUrl = $Configuration.BaseUrl if ([string]::IsNullOrEmpty($BaseUrl)) { throw "Server configuration has no BaseUrl. Please set your server configuration first using the Set-ServerConfiguration cmdlet." } $RequestUri = $BaseUrl + $Uri # cookie parameters foreach ($Parameter in $Configuration.Authorization.Cookies.GetEnumerator()) { if ($Parameter.Name -eq "cookieAuth") { $HeaderParameters["Cookie"] = $Parameter.Value } else { $HeaderParameters[$Parameter.Name] = $Parameter.Value } } # accept, content-type headers $Accept = SelectHeaders -Headers $Accepts if ($Accept) { $HeaderParameters['Accept'] = $Accept } $ContentType = SelectHeaders -Headers $ContentTypes if ($ContentType) { $HeaderParameters['Content-Type'] = $ContentType } # add default headers if any foreach ($header in $Configuration.DefaultHeaders.GetEnumerator()) { $HeaderParameters[$header.Name] = $header.Value } if ($Configuration.Username -and $Configuration.Password) { $Password = Get-PlainTextPassword -Password $Configuration.Password $LocalVarBytes = [System.Text.Encoding]::UTF8.GetBytes($Configuration.Username + ":" + $Password) $LocalVarBase64Text =[Convert]::ToBase64String($LocalVarBytes) $HeaderParameters['Authorization'] = "Basic " + $LocalVarBase64Text Write-Verbose ("Using HTTP basic authentication in {0}" -f $MyInvocation.MyCommand) } # add headers from authorization if any foreach ($header in $Configuration.Authorization.Headers.GetEnumerator()) { $HeaderParameters[$header.Name] = $header.Value } $SerializeNulls = $Configuration.SerializeNulls $HttpValues = [System.Web.HttpUtility]::ParseQueryString([String]::Empty) # add query parameters from authorization if any foreach ($queryParam in $Configuration.Authorization.QueryParameters.GetEnumerator()) { AddQueryParameter -HttpValues $HttpValues -ParameterKey $queryParam.Name -ParameterValue $queryParam.Value -SerializeNulls $SerializeNulls } # constrcut URL query string foreach ($Parameter in $QueryParameters.GetEnumerator()) { if ($Parameter.Value -is [System.Management.Automation.PSCustomObject]) { $ParameterProperties = Get-Member -InputObject $Parameter.Value -MemberType NoteProperty foreach ($ParameterProperty in $ParameterProperties) { $ParameterKey = $ParameterProperty.Name $ParameterValue = $Parameter.Value.$ParameterKey AddQueryParameter -HttpValues $HttpValues -ParameterKey $ParameterKey -ParameterValue $ParameterValue -SerializeNulls $SerializeNulls } } else { AddQueryParameter -HttpValues $HttpValues -ParameterKey $Parameter.Key -ParameterValue $Parameter.Value -SerializeNulls $SerializeNulls } } # Build the request and load it with the query string. $UriBuilder = [System.UriBuilder]($RequestUri) <# [System.Web.HttpUtility]::ParseQueryString always encodes special characters to unicode, so the string 'local-1 (1)' is encoded to 'local-1+(1)'. The [System.UriBuilder].Query internally encodes the provided query string, so before being passed as the value of the Query property, the string should be decoded so that 'local-1+(1)' has its original value: 'local-1 (1)' which is than internally encoded to 'local-1%20(1)'. #> $QueryParamsString = $HttpValues.ToString() if (![string]::IsNullOrEmpty($QueryParamsString)) { $UriBuilder.Query = [System.Web.HttpUtility]::UrlDecode($QueryParamsString) } # include form parameters in the request body $RequestBody = $null if ($FormParameters -and $FormParameters.Count -gt 0) { $RequestBody = $FormParameters } if ($Body -or $IsBodyNullable) { if ($null -eq $Body) { $RequestBody = $Body } else { $BodyWithoutNullValues = GetBodyWithoutNullValues -Body (ConvertFrom-JsonX -InputObject $Body) -SerializeNulls $SerializeNulls $RequestBody = ($BodyWithoutNullValues | ConvertTo-Json -Depth 100).ToString() } if ([string]::IsNullOrEmpty($RequestBody) -and $IsBodyNullable -eq $true) { $RequestBody = "null" } } $Credential = $null if ($Configuration.Username -and $Configuration.Password) { $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Configuration.Username, $Configuration.Password } $invokeParams = @{ 'Uri' = $UriBuilder.Uri 'Method' = $Method 'Headers' = $HeaderParameters 'Body' = $RequestBody 'ErrorAction' = 'Stop' 'UseBasicParsing' = $true 'Credential' = $Credential } if ($null -ne $Configuration.Proxy) { $invokeParams['Proxy'] = $Configuration.ProxyUri $invokeParams['ProxyUseDefaultCredentials'] = $true } if ($null -ne $Configuration.WebOperationTimeoutSeconds -and $Configuration.WebOperationTimeoutSeconds -gt 0) { $invokeParams['TimeoutSec'] = $Configuration.WebOperationTimeoutSeconds } if ($PSBoundParameters.ContainsKey('Debug')) { $invokeParams['Debug'] = $Debug } if ($PSBoundParameters.ContainsKey('Verbose')) { $invokeParams['Verbose'] = $Verbose } if ($PSBoundParameters.ContainsKey('WarningAction')) { $invokeParams['WarningAction'] = $PSBoundParameters.WarningAction } $SkipCertificateCheck = $Configuration.SkipCertificateCheck try { $InvokeWebRequestXParams = @{ 'InvokeParams' = $invokeParams 'SkipCertificateCheck' = ([bool] $SkipCertificateCheck) } $Response = $null $Response = Invoke-WebRequestX @InvokeWebRequestXParams } catch { if ($null -ne $_.Exception.Response) { $ExceptionResponse = $_.Exception.Response $ServerError = $_.ToString() # Serialize JSON body if ($Global:PSVersionTable.PSEdition -eq 'Core' -and $_.Exception -is [System.Net.Http.HttpRequestException]) { if ( $ExceptionResponse -ne $null -and $ExceptionResponse.Content -ne $null -and $ExceptionResponse.Content.Headers -ne $null -and $ExceptionResponse.Content.Headers.Key -eq 'Content-Type' -and ($ExceptionResponse.Content.Headers.Value | ForEach-Object -Process { IsJsonMIME $_ }) ) { $ServerError = ConvertFrom-JsonX -InputObject $ServerError } } elseif ($Global:PSVersionTable.PSEdition -eq 'Desktop' -and $_.Exception -is [System.Net.WebException]) { if ( $ExceptionResponse -ne $null -and $ExceptionResponse.Headers -ne $null -and $ExceptionResponse.Headers.Keys -Contains 'Content-Type' -and (IsJsonMIME -MIME $ExceptionResponse.Headers['Content-Type']) ) { try { $StreamReader = [System.IO.StreamReader]::new($ExceptionResponse.GetResponseStream()) $SerializedServerError = $StreamReader.ReadToEnd() | ConvertFrom-JsonX if ($null -eq $SerializedServerError){ try { $SerializedServerError = ConvertFrom-JsonX -InputObject $_.ToString() -ErrorAction Stop } catch { } } if ($null -ne $SerializedServerError) { $ServerError = $SerializedServerError } } finally { $StreamReader.Close() } } } $InvocationException = New-Object InvocationException -ArgumentList $_.Exception, $ServerError if ($ErrorActionPreference -eq 'Stop') { throw $InvocationException } else { Write-Error $InvocationException } } else { Write-Error $_ } $Response = $null } finally { Submit-FeatureUsage -InvocationInfo $InvocationInfo } if ($null -ne $Response) { $ResponseContentTypes = $Response.Headers["Content-Type"] if ($null -eq $ResponseContentTypes) { $ResponseContentTypes = @() } $responseObject = DeserializeResponse -Response $Response -ReturnType $ReturnType -ContentTypes $ResponseContentTypes # Add GetServer Script Method to the result objects $responseObject | Foreach-Object { if ($null -ne $_ -and $null -ne $_.PSObject) { # Store Server Name in the PSObject TypeNames to preserve result object type and public properties # Add GetServer method to retrieve the server from PSObject type names # This each object carries the information obout the server from which it is retrieved preserving the # type and data for serialization when it is passed to the Invoke functions # E.g. Weh an API returns string, string type will be preserved and its ps custom object # will carry the server information in the custom type names and user is able to retrieve it through # GetServer method. $_.PSObject.TypeNames.Add("Server:$($Configuration.Product):$($Configuration.ToString())") $_ = $_ | Add-Member -MemberType ScriptMethod -Name GetServer -Value { # The Server Type Name is in Format <Server>:<Product>:<ServerConfiguration.ToString()> $productServerString = ($this.PSObject.TypeNames | Where-Object { $_.StartsWith('Server:')}).SubString(7) $productSeparatorIndex = $productServerString.IndexOf(':') $product = $productServerString.Substring(0, $productSeparatorIndex) $server = $productServerString.Substring($productSeparatorIndex + 1, $productServerString.Length - $productSeparatorIndex - 1) # result Get-ServerConfiguration -Product $product | Where-Object { $_.ToString() -eq $server } } -Force -PassThru # Store information that the object comes from the server in the PSObject TypeNames. $_.PSObject.TypeNames.Add("ServerObject") } } # result @{ Response = $responseObject StatusCode = $Response.StatusCode Headers = $Response.Headers } } } } # Select JSON MIME if present, otherwise choose the first one if available function SelectHeaders { Param( [Parameter(Mandatory)] [AllowEmptyCollection()] [String[]]$Headers ) foreach ($Header in $Headers) { if (IsJsonMIME -MIME $Header) { return $Header } } if (!($Headers) -or $Headers.Count -eq 0) { return $null } else { return $Headers[0] # return the first one } } function IsJsonMIME { Param( [Parameter(Mandatory)] [string]$MIME ) if ($MIME -match "(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$") { return $true } else { return $false } } function AddQueryParameter { Param ( [Parameter(Mandatory = $true)] [PSObject] $HttpValues, [Parameter(Mandatory = $true)] [string] $ParameterKey, [Parameter(Mandatory = $true)] [AllowNull()] [PSObject] $ParameterValue, [Parameter(Mandatory = $true)] [bool] $SerializeNulls ) if ($ParameterValue.Count -gt 1) { foreach ($Value in $ParameterValue) { if ($null -ne $Value -or $SerializeNulls) { $HttpValues.Add($ParameterKey, $Value) } } } else { if ($null -ne $ParameterValue -or $SerializeNulls) { $HttpValues.Add($ParameterKey, $ParameterValue) } } } function GetBodyWithoutNullValues { Param ( [Parameter(Mandatory = $true)] [AllowNull()] [PSObject] $Body, [Parameter(Mandatory = $true)] [bool] $SerializeNulls ) $FilteredBody = $null if ($Body -is [System.Management.Automation.PSCustomObject]) { $FilteredBody = [PSCustomObject] @{} $BodyProperties = Get-Member -InputObject $Body -MemberType NoteProperty foreach ($BodyProperty in $BodyProperties) { $PropertyKey = $BodyProperty.Name $PropertyValue = $Body.$PropertyKey if ($null -ne $PropertyValue -or $SerializeNulls) { $FilteredBody | Add-Member -MemberType NoteProperty -Name $PropertyKey -Value $null if ($PropertyValue -is [System.Management.Automation.PSCustomObject]) { $FilteredBody.$PropertyKey = GetBodyWithoutNullValues -Body $PropertyValue -SerializeNulls $SerializeNulls } else { $FilteredBody.$PropertyKey = $PropertyValue } } } } else { $FilteredBody = $Body } $FilteredBody } function DeserializeResponse { Param( [Parameter(Mandatory)] [AllowEmptyString()] [string]$ReturnType, [Parameter(Mandatory)] [AllowEmptyString()] [string]$Response, [Parameter(Mandatory)] [AllowEmptyCollection()] [string[]]$ContentTypes ) $result = $null If ([string]::IsNullOrEmpty($ReturnType) -and $ContentTypes.Count -eq 0) { # void response $result = $Response } Elseif ($ReturnType -match '\[\]$') { # array $result = ConvertFrom-JsonX $Response } Elseif (@("System.DateTime") -contains $ReturnType) { # datetime $result = $Response } Else { # others (e.g. model, file) if ($ContentTypes) { $ContentType = $null if ($ContentTypes.Count -gt 1) { $ContentType = SelectHeaders -Headers $ContentTypes } else { $ContentType = $ContentTypes[0] } if (IsJsonMIME -MIME $ContentType) { # JSON $result = ConvertFrom-JsonX $Response } } else { # no content type in response header, returning raw response $result = $Response } } if ($result -eq [String]::Empty) { $result = $null } return $result } function Submit-FeatureUsage { Param ( [Parameter(Mandatory = $true)] [hashtable] $InvocationInfo ) $participateInCEIP = [VMware.VimAutomation.ViCore.Util10.SettingsManager]::ActualParticipateInCEIP if ($participateInCEIP) { $cmdletFeatureId = "$($InvocationInfo.ModuleName)\\$($InvocationInfo.CmdletName)" $cmdletFeatureName = $InvocationInfo.CmdletName $cmdletFeature = [VMware.VimAutomation.Ceip.CmdletFeature]::new($cmdletFeatureId, $cmdletFeatureName) $componentFeature = [VMware.VimAutomation.Ceip.ComponentFeature]::new($InvocationInfo.ModuleName, $InvocationInfo.ModuleName) [VMware.VimAutomation.Ceip.CeipManager]::ReportFeatureUse($cmdletFeature) [VMware.VimAutomation.Ceip.CeipManager]::ReportFeatureUse($componentFeature) } } # SIG # Begin signature block # MIIpzwYJKoZIhvcNAQcCoIIpwDCCKbwCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA92tDRFLSesXom # LcNPgcLZmayAjvZYchoh8AI6JhiMSaCCDrwwggawMIIEmKADAgECAhAIrUCyYNKc # TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z # NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 # JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr # Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF # LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F # LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh # 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ # wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay # g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI # YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp # QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro # OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB # WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ # YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P # AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC # hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED # MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql # +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF # UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h # mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw # YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld # AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw # 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP # LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE # QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn # KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji # WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq # yK+p/pQd52MbOoZWeE4wgggEMIIF7KADAgECAhAIV5dCqVO62Q1CN6Pz44xeMA0G # CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwNTA0MDAwMDAwWhcNMjQwNTA0 # MjM1OTU5WjCBxTETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgEC # EwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNV # BAUTBzI4NTM4OTQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRIw # EAYDVQQHEwlQYWxvIEFsdG8xFTATBgNVBAoTDFZNd2FyZSwgSW5jLjEVMBMGA1UE # AxMMVk13YXJlLCBJbmMuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA # 6kAACeNtbODhaayXmhKLpjNsCENWh3WTl/NOvObo1Prl949C6y2EU9zMsfYuODNI # Tv2OoByT3nBCXk3G1gzanGscaUDgr18pzf77Og4ArUHNzil6aX7uAlvKRBPl+6Hv # wpSMtyK0D6J79UKfYqztvf/9YOFJLGCiq7Dw8932vg0ijcH7sLGgoSjH6+jqBwTT # suOav1lyiAxE4Q6r8KyDNjg6mYu2uu1TALU4B7/OX/zBIadArVgPHRurud9SSGPq # itFCgd2OuY0r81Jr0LRxOnwWHLqPOwuSmsnxw7ZaQJCz7FY3oxiES8mbA+VV6zN8 # 18/s2v5htLd3SRrE5n4mhzGyXAVkqIILKiSppibj59dEc5voQ/1MXJ25W1kSy2MX # B8XjI9j64JzcpjW5YPs2M+BR4mIEC5i2mURO/u3HGG9prRTPOv2MN1WzbLLUG98O # sqLTrUTQtdvpcWizS1c6m9IFY14fj1OeagnUwY3W0THEloNKC1WZoe+5Oxq/NRxO # Bz4N4fzCsqc44TBUWmHSqBVOV8PpmQ8xVrfj+aLdk40naf/cf9cdvqslsrKtzkvL # b+ohLCvqymua9GLNmUbY2EyrOogMseRX8y0awJS4cWRLl9c1O7j7q31GwfX+ozEI # h1z4pBNATaZSbTTsMi4eKMCzsU/QiDM/iCaZbWL6VgsCAwEAAaOCAkkwggJFMB8G # A1UdIwQYMBaAFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB0GA1UdDgQWBBRS+9+VGnhS # 2uj4hRdXRyZkmfv5GzBCBgNVHREEOzA5gRJub3JlcGx5QHZtd2FyZS5jb22gIwYI # KwYBBQUHCAOgFzAVDBNVUy1ERUxBV0FSRS0yODUzODk0MA4GA1UdDwEB/wQEAwIH # gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu # Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB # Mzg0MjAyMUNBMS5jcmwwPQYDVR0gBDYwNDAyBgVngQwBAzApMCcGCCsGAQUFBwIB # FhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGE # MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUH # MAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH # NENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQC # MAAwDQYJKoZIhvcNAQELBQADggIBANPAhp5gl2m66jB8Ft1vCSC2ij4PKMQ3Mwkv # 1gtZoMKnS/NCi9jl8WpooSMth39ze0LyDrQY8nUO6CPX/LDGkWuf/f+HUoRNw2wS # seCFw/yvQJBzmmTRzuQqdhkAIM99kD6RCo60WQxskrhOCqx8LNFl3pcsIqonSvok # /GC1+KmwUKdV5Wuag3jkH1LLOJ5x8CnyTmMWSPsx9aVY+mIzvYuLuZIdAybGYUW7 # sOLRTzhUiGBLlxL56n1dFqzF6IgPePpZHWMwyhIKQLgbkkYNFectTeTehws5v1YZ # f/tjw2TsVJFEB4UIS1mHnBPiCNMt+/f33jH8vfT6fxVV5FIBXqvr0ruDVseZb/Jm # xdBfjt2AzMHk3d3l2Ar+06vo4gAFbLFtULTjV9d3jjP4YCGix5Q2UwHvkBjfB46e # ChIEjkbWnjmkFdZPpvILRVL9lhTa1kKwBzbTnW5KSnxA5CtB3gShY7U8rYmZfPrS # 4gBBTutdhD8nd4roDdlJZPVMIvcqeRrdb2cx8WGohV8/MCOPeEUvsMiuOwFroreG # 6ecUwbdjCNkzx2o3hXaHyfolUj4n+iQuealnn4KKfDp7eYDabu9zWbv6UN3D//Ug # DlYdiQWzsKF0GqJQeqeq0Lga63zr7nOSPzn82AF7QfdYkccoLnD3y2iJObDrAsY0 # KjiW7SylMYIaaTCCGmUCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln # aUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBT # aWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAIV5dCqVO62Q1CN6Pz44xe # MA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkD # MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ # KoZIhvcNAQkEMSIEIJHeqyTZT2p/565mEpfRl2ha8r95RDAKsbyPWCDs6gijMA0G # CSqGSIb3DQEBAQUABIICAGiU1jsezzscocydVVF0vZ3qwTfz1Z2KhpMcm16HiWP7 # pXUrqDuYa5hHL7FsM0w52YdcT3uXDHmC3DdFJREXfZ5qYw3ISyQ9yfD75Ubp/S0D # tgroJkDgUP4PhyhFDEX6S6T2HBn+9u6+8X+NXOp6s9CMkl4DJe+pASV6hKedNnFl # 0ufSJBkq2/avv+iTyrfVkn87/njrXYc+Imx2POFRpI79gU6ZrPwZ/VuXMTGY+9OF # qzTQkWHVgRcflp6LlAwHICAz5l6wY3bbljakhc3aKe+IdCdim9aTIaSz0Ei9W8M/ # D86U45CQpb3rC5NbtcNPfPkzgwsmE6ub9eL9qNdEDMVIlQ8ed+dZRH3BhcrmUKfE # 5UWYtdSF3RBNEmxMrrbFvNyqX02ahov6SXZF2CiefyKUO4KmqxMJcFfIks13k3w+ # j2jS8pD7NBJgqa6BHrDbMDuWNjst0XH/W6SQ0uq2cU3Mv3CHgejp7yPOH6qSeZTb # CNGH4+uUTGlWRZ3GMYy1nxB/48yhAyJkiNWOGzsu68Ww2SoSumpD8v7K5e/QT42p # yc6U8MVqwK7z8fjUtx2zVqh+Rpo0wJTavpkfaUxDxs4qrnq5Mo7m3lFjbZcjAi7x # jCsFHX12jVyjdGjMUe4OaegMu3Hmc/CuuVCuOHkbZDDwnl+EdnLkQP44EivX1A/m # oYIXPzCCFzsGCisGAQQBgjcDAwExghcrMIIXJwYJKoZIhvcNAQcCoIIXGDCCFxQC # AQMxDzANBglghkgBZQMEAgEFADB3BgsqhkiG9w0BCRABBKBoBGYwZAIBAQYJYIZI # AYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEIHtHXVfkkZB5UVSnwJBBFrRUYzS7FQ9c # uzgrOYr4SNaeAhAp0xUVYFAMJ/QjDNietRllGA8yMDIzMTAyMTE2MDQwOFqgghMJ # MIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBj # MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMT # MkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5n # IENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMC # VVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBU # aW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNT # RYcdg45brD5UsyPgz5/X5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RAp # ih5iY2nTWJw1cb86l+uUUI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sH # pjBoyoNC2vx/CSSUpIIa2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS # 48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWV # zu8IF+qCZE3/I+PKhu60pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZ # ZUdVnUokL6wrl76f5P17cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaD # iGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQ # FcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST6 # 18RrIbroHzSYLzrqawGw9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2 # x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgT # IUlRfgZm0zu++uuRONhRB8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNV # HQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD # CDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAU # uhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe # 1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmww # gZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5j # cnQwDQYJKoZIhvcNAQELBQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepd # IpLsjCICqbjPgKjZ5+PF7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJ # d6PrkKoS1yeF844ektrCQDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiY # dk9WuVLCtp04qYHnbUFcjGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0Pjl # SXcIWiHFtM+YlRpUurm8wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoD # Rd7ZULVQjK9WvUzF4UbFKNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuM # MsOI5ljitts++V+wQtaP4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLc # PTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQM # fq68/qTreWWqaNYiyjvrmoI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M6 # 6ElGt9V/zLY4wNjsHPW2obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI070 # 7NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCA # RK+AEEGKMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhHrP0oZipeWzANBgkqhkiG9w0B # AQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVk # IFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcwMzIyMjM1OTU5WjBjMQswCQYD # VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lD # ZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoY1BkmzwT1ySVFVxyUDxPKR # N6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo+n3znIkLf50fng8zH1ATCyZz # lm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQXf6sZKz5C3GeO6lE98NZW1Oco # LevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8ald68Dd5n12sy+iEZLRS8nZH # 92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6lY2zkpsUdzTYNXNXmG6jBZHRA # p8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lXKZYnLvWHpo9OdhVVJnCYJn+g # GkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU2YIqx5K/oN7jPqJz+ucfWmyU # 8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2RrOdOqPVA+C/8KI8ykLcGEh/ # FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR8zZJTYsg0ixXNXkrqPNFYLwj # jVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015LdhJRk8mMDDtbiiKowSYI+RQQ # EgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNYCQEoAA6EVO7O6V3IXjASvUae # tdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAw # HQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshvMB8GA1UdIwQYMBaAFOzX44LS # cV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF # BQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp # Z2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYy # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j # cmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEB # CwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBguEE0TzzBTzr8Y+8dQXeJLKftw # ig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFnzbYSlm/EUExiHQwIgqgWvalW # zxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/tYLaqT5Fmniye4Iqs5f2MvGQm # h2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWKcXZl2szwcqMj+sAngkSumScb # qyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7pp1yr8THwcFqcdnGE4AJxLaf # zYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkPlM05et3/JWOZJyw9P2un8WbD # Qc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4c6umAU+9Pzt4rUyt+8SVe+0K # XzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kaddSweJywm228Vex4Ziza4k9Tm # 8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYawmKAr7ZVBtzrVFZgxtGIJDwq9 # gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL5HYCJtnwZXZCpimHCUcr5n8a # pIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3bNzgaoSv27dZ8/DCCBY0wggR1 # oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X # DTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTAT # BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEh # MB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0B # AQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLh # Kac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+ # vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMp # Lc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+n # MNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1Dek # LgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmk # wuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0 # yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP # 9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHh # D5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnf # fEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId # 5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LS # cV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgP # MA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0 # dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2Vy # dHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNV # HR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB # c3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0B # AQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlU # Iu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqa # i7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eH # qNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01 # YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ # 8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3YwggNyAgEBMHcwYzELMAkGA1UE # BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2Vy # dCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQBUSv # 85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYL # KoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIzMTAyMTE2MDQwOFowKwYLKoZI # hvcNAQkQAgwxHDAaMBgwFgQUZvArMsLCyQ+CXc6qisnGTxmcz0AwLwYJKoZIhvcN # AQkEMSIEIBLyWPyJwcJeWXvf73I9fTV4d0kMMg3DNEz4NvUmETdcMDcGCyqGSIb3 # DQEJEAIvMSgwJjAkMCIEINL25G3tdCLM0dRAV2hBNm+CitpVmq4zFq9NGprUDHgo # MA0GCSqGSIb3DQEBAQUABIICABlbUYbehPZPLDYUu6rduetLPaIq9Elky78q8BNq # 0JYrfvtIGbkgK70XZ/T9h+t9X6G4TcHphxhGojeRogQEHbgPf54NO5/QI7coTZIS # hqwqcBD4Hb9UgX56ql4Cq3W3V3M6INwytO3CDMlF550821KhmKOUawPxensux1W9 # WTHVEtTwLvu/kLdkD+PJBKBtwI97nyHZYy5DWCxnuyjWJdIit0u9pMNtaIPKCwSx # zlv2S/iM2KByO6RO4jz23lQShhNg0SlM+ZuPdASAsh1Vv87VkFnZV/1O3N42XWI9 # 3QQD6cHbhAxoKNcnAKtq1hEC+skUd7177v2nx1qcWZ953w3381CYU5R6/injOMIS # 9+sQvfhGYax3down7vBIOY2qpXh3VvVQw6Fr6ek+rW9hsUG1dsmUfehPtf4jP4XM # 7xjAjp9m7FpPjRb+L4Lo8JK8UDrfa9v2NZ0axKFSKH9/naGQnEn4CN6Ysl8kRQxM # fM18qjsxQFOBiuj/uZJhUG/m/7wJpmwCXpfxZyTE4k3mo6g49aUPETImWQeqz4rE # FypnpUt8ueKAp4JOmxpDGoQ0mPc/abvjbjpq0Wpai5DjEDRqhp1iuL/nX+nA3SAW # 5/HAnKn7IdjjmMJNDk8idqLAQQ3l73Ac75a8miif281sKR6DPLi+z1phB6PmHDnG # lraU # SIG # End signature block |