private/InvokeGCS.ps1
|
<# .Synopsis Script for making GCS API calls. .Description The primary function (Call-Url) within this script is crafted to interact with the GCS API, returning a response if any, and allowing a maximum of 3 retry attempts. .Parameter CommandType A mandatory parameter indicating the CommandType for the API call. .Parameter Token A necessary parameter specifying the OAuth2 token used in the API call. .Parameter Method A mandatory parameter specifying the API call method (e.g., Get, Post, Put, Delete). .Parameter UrlPath An required parameter specifying the URL path. For example, if the URL is https://www.example.com/v1.0/admin/connection/connectionid, then /v1.0/admin/connection/connectionid is the URL path. .Parameter TenantId A required parameter specifying the TenantId for which the API call is intended. #> function GetEnvironmentFromTenant { param( [parameter(Mandatory=$true)] [string]$TenantId ) Write-Host "GetEnvironmentFromTenant for Tenantid: $($TenantId)" New-Variable -Name GccSubRegion -Value "gcc" -Option Constant New-Variable -Name UsgRegion -Value "usg" -Option Constant New-Variable -Name UsGovRegion -Value "usgov" -Option Constant New-Variable -Name DodSubRegion -Value "dod" -Option Constant New-Variable -Name DodConSubRegion -Value "dodcon" -Option Constant New-Variable -Name GCCTenantRegionScope -Value "na" -Option Constant $headers = @{"Accept" = "application/json"} $tenantCloudInfo = Invoke-RestMethodWithRetries -ApiName "GetTenantCloudInfo" -Uri "https://login.microsoftonline.com/$TenantId/.well-known/openid-configuration" -Headers $headers -Method Get | ConvertFrom-Json $regionScope = "" $regionSubScope = "" if( -not ([string]::IsNullOrEmpty($tenantCloudInfo.tenant_region_scope)) ) { $regionScope = ([string]$tenantCloudInfo.tenant_region_scope).ToLower() } if( -not ([string]::IsNullOrEmpty($tenantCloudInfo.tenant_region_sub_scope)) ) { $regionSubScope = ([string]$tenantCloudInfo.tenant_region_sub_scope).ToLower() } if(($regionScope -eq $GCCTenantRegionScope) -and ($regionSubScope -eq $GccSubRegion)) { return "GCC" } elseif (($regionScope -eq $UsgRegion) -or ($regionScope -eq $UsGovRegion)) { if($regionSubScope -eq $DodConSubRegion) { return "GCCH" } elseif($regionSubScope -eq $DodSubRegion) { return "DoD" } } return "PROD" } function Invoke-RestMethodWithRetries { param ( [parameter(Mandatory=$true)] [string]$apiName, [parameter(Mandatory=$true)] [string]$uri, [parameter(Mandatory=$true)] [hashtable]$headers, [parameter(Mandatory=$true)] [string]$method, [parameter(Mandatory=$false)] [object]$requestBody = $null, [parameter(Mandatory=$false)] [int]$maxRetries = 3, [parameter(Mandatory=$false)] [bool]$ShouldBrowserHandleRedirects = $false ) $retryCount = 0 $errorMessage = "" do { try { Write-Host "Request Made for $($apiName)" if($ShouldBrowserHandleRedirects -eq $true) { if ($requestBody) { # Send the request $response = Invoke-WebRequest -Uri $uri -Headers $headers -Method $method -Body $requestBody -MaximumRedirection 0 -ErrorAction SilentlyContinue # Extract the redirect URL $redirectUrl = $response.Headers.Location # Open the redirect URL in the default browser Start-Process -FilePath "msedge.exe" -ArgumentList "$redirectUrl -inprivate" return } else { # Send the request $response = Invoke-WebRequest -Uri $uri -Headers $headers -Method $method -MaximumRedirection 0 -ErrorAction SilentlyContinue # Extract the redirect URL $redirectUrl = $response.Headers.Location # Open the redirect URL in the default browser Start-Process -FilePath "msedge.exe" -ArgumentList "$redirectUrl -inprivate" return } } else { if ($requestBody) { return Invoke-WebRequest -Uri $uri -Headers $headers -Method $method -Body $requestBody } else { return Invoke-WebRequest -Uri $uri -Headers $headers -Method $method } } } catch { $errorMessage = $_ $retryCount++ $exponentialBackoff = [int]([Math]::Pow(2,$retryCount)) Write-Warning "Request failed for $apiName. Retrying (Attempt $retryCount)..." Start-Sleep -Seconds $exponentialBackoff # Increase the wait time with each retry } } while ($retryCount -lt $maxRetries) throw "Request failed for $apiName. All the retries are exhausted. `n$errorMessage" } # Select BaseUrl on the basis of Environment function SelectBaseUrl { param ( [Parameter(Mandatory=$true)] [string]$selectedEnvironment ) if ($selectedEnvironment -eq "GCC") { return "https://gcsgcc.office.com" } elseif ($selectedEnvironment -eq "GCCH") { return "https://gcs.office365.us" } elseif ($selectedEnvironment -eq "PROD") { return "https://gcs.office.com" } throw "Tenant Environment is not supported" } function Call-Url{ param( # cmdlet type [Parameter(Mandatory=$true)] [string] $CommandType, # token details [Parameter(Mandatory=$true)] [PSCustomObject] $Token, #Method [Parameter(Mandatory=$true)] [string] $Method, #Url Path [Parameter(Mandatory=$true)] [string] $UrlPath, #Request Body [parameter(Mandatory=$false)] [object] $RequestBody = $null, # Tenant id [Parameter(Mandatory=$true)] [string] $TenantId, # Content type Header [Parameter(Mandatory=$false)] [string] $ContentTypeHeader = "application/json", [Parameter(Mandatory=$false)] [bool] $ShouldBrowserHandleRedirects = $false ) try{ $culture = Get-Culture $languageCode = $culture.Name $baseUrl = SelectBaseUrl -SelectedEnvironment (GetEnvironmentFromTenant -TenantId $TenantId) $headers = @{"authorization"="Bearer $($Token.AccessToken)"; "Content-Type"=$ContentTypeHeader; "Accept" = "application/json"; "Accept-Language" = "$languageCode"} $uri = $baseUrl + $UrlPath return Invoke-RestMethodWithRetries -ApiName $CommandType -Uri $uri -Headers $headers -Method $Method -RequestBody $RequestBody -ShouldBrowserHandleRedirects $ShouldBrowserHandleRedirects } catch{ throw "error happen while calling API for $($CommandType), Error Message: $($_)" } } # SIG # Begin signature block # MIIojQYJKoZIhvcNAQcCoIIofjCCKHoCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCABCY0OXiu9YJ4O # uZGoUvXb2W7UtrDUvfGjktZIIQC3v6CCDYUwggYDMIID66ADAgECAhMzAAAEhJji # EuB4ozFdAAAAAASEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjUwNjE5MTgyMTM1WhcNMjYwNjE3MTgyMTM1WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDtekqMKDnzfsyc1T1QpHfFtr+rkir8ldzLPKmMXbRDouVXAsvBfd6E82tPj4Yz # aSluGDQoX3NpMKooKeVFjjNRq37yyT/h1QTLMB8dpmsZ/70UM+U/sYxvt1PWWxLj # MNIXqzB8PjG6i7H2YFgk4YOhfGSekvnzW13dLAtfjD0wiwREPvCNlilRz7XoFde5 # KO01eFiWeteh48qUOqUaAkIznC4XB3sFd1LWUmupXHK05QfJSmnei9qZJBYTt8Zh # ArGDh7nQn+Y1jOA3oBiCUJ4n1CMaWdDhrgdMuu026oWAbfC3prqkUn8LWp28H+2S # LetNG5KQZZwvy3Zcn7+PQGl5AgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUBN/0b6Fh6nMdE4FAxYG9kWCpbYUw # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwNTM2MjAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # AGLQps1XU4RTcoDIDLP6QG3NnRE3p/WSMp61Cs8Z+JUv3xJWGtBzYmCINmHVFv6i # 8pYF/e79FNK6P1oKjduxqHSicBdg8Mj0k8kDFA/0eU26bPBRQUIaiWrhsDOrXWdL # m7Zmu516oQoUWcINs4jBfjDEVV4bmgQYfe+4/MUJwQJ9h6mfE+kcCP4HlP4ChIQB # UHoSymakcTBvZw+Qst7sbdt5KnQKkSEN01CzPG1awClCI6zLKf/vKIwnqHw/+Wvc # Ar7gwKlWNmLwTNi807r9rWsXQep1Q8YMkIuGmZ0a1qCd3GuOkSRznz2/0ojeZVYh # ZyohCQi1Bs+xfRkv/fy0HfV3mNyO22dFUvHzBZgqE5FbGjmUnrSr1x8lCrK+s4A+ # bOGp2IejOphWoZEPGOco/HEznZ5Lk6w6W+E2Jy3PHoFE0Y8TtkSE4/80Y2lBJhLj # 27d8ueJ8IdQhSpL/WzTjjnuYH7Dx5o9pWdIGSaFNYuSqOYxrVW7N4AEQVRDZeqDc # fqPG3O6r5SNsxXbd71DCIQURtUKss53ON+vrlV0rjiKBIdwvMNLQ9zK0jy77owDy # XXoYkQxakN2uFIBO1UNAvCYXjs4rw3SRmBX9qiZ5ENxcn/pLMkiyb68QdwHUXz+1 # fI6ea3/jjpNPz6Dlc/RMcXIWeMMkhup/XEbwu73U+uz/MIIHejCCBWKgAwIBAgIK # YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw # OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD # VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la # UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc # 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D # dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+ # lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk # kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6 # A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd # X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL # 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd # sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3 # T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS # 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI # bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL # BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD # uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h # cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA # YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn # 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7 # v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b # pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/ # KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy # CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp # mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi # hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb # BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS # oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL # gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX # cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGl4wghpaAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAASEmOIS4HijMV0AAAAA # BIQwDQYJYIZIAWUDBAIBBQCggeYwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIACv # tKQ+EDpfm49U0Cw+ZktpWYiLN8AKM5/pQL2V4inkMHoGCisGAQQBgjcCAQwxbDBq # oEyASgBNAGkAYwByAG8AcwBvAGYAdAAuAEcAcgBhAHAAaAAuAEMAbwBuAG4AZQBj # AHQAbwByAHMALgBDAG0AZABsAGUAdAAuAGQAbABsoRqAGGh0dHA6Ly93d3cubWlj # cm9zb2Z0LmNvbTANBgkqhkiG9w0BAQEFAASCAQCVoPrC4jqL3lS8fYZQ3LxtHfW/ # CaI/qfxl06adGxmfKXVJmJt/tqkMuK566JPUCBuIYI36caaeXgIsPnlnjCqOTW+J # D0hGzDQuVDwvU9VSVw4W3lSciWVth3M5x+kxOuvdKU50LYE5uJJlHLnZx1FnxogJ # 76NrMSx6SqF0fLzTNDFNYxvmPSen9RwWRCAnIiOQ2UIa82j9czv/sVL2SD6BzQHT # hgi6CxHD4gBjwWnyWiz5sLWh34xW69sgpp+du3KyGwh4E/ExW8bPD39/0myPFAsC # zw481pre1W/RH+GCl0lPaqgoHZdcNrz+qdQFNZccvbXi0B+8DZAiKrdcG+EsoYIX # sDCCF6wGCisGAQQBgjcDAwExghecMIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQMx # DzANBglghkgBZQMEAgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUwggFBAgEB # BgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIKM8gMu9MkILyVHsp6kk+VKH # D2VZbSAykIwTJNkcl45cAgZpvGZ2yhwYEzIwMjYwNDA2MTM0NjI0Ljk1NlowBIAC # AfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn # MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjJBMUEtMDVFMC1EOTQ3MSUwIwYDVQQD # ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR/jCCBygwggUQoAMCAQIC # EzMAAAIQq83kFhjvObAAAQAAAhAwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp # bWUtU3RhbXAgUENBIDIwMTAwHhcNMjUwODE0MTg0ODEyWhcNMjYxMTEzMTg0ODEy # WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UE # CxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQL # Ex5uU2hpZWxkIFRTUyBFU046MkExQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jv # c29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQCNxzirTntnAiCkq7ilNdYt6O9gR25F/7WYiluIkQwVZaZTbGmKn7Mr # vEXEoYHUJyVRcFTT9lBnosbwfSAjvK+iyuw8QjUM8H9dxwYK+zApsApySeA64ZMQ # 8aTsr+8Rlr2HRe3TZvubaf0x0iOQusWXSkOuIrLPRAcal2H3dfr40Cl8TVMvbhWj # TGR6gUakvetf2BeEg4Xn0QydN3ajjkVb+jEyBj2rTLSMY7QesItMJmvnR7tNlFI1 # gDLaXIpu8ojYwqU3XAvMm9lttz/8vezWrcnoqFLQoLZU0QiZh0WBWQl6PjNmod9J # xNvH2GMWAWlWQmXjEflUny3Il1cT369TST0BpPZA/VmbdZCZd51KguOMjstbOe4f # CegYhcuIkxDM+oqpEgUvfDNysOtl5aC0B0E9uKmCVnkJCezoFqPkxvpr8RkL0bd9 # olgrlBUd4Tp4uhITCnV3Pla6stc0+ynRVamWmX8UlvyOtFP+M6ge7zmpFx1imAHJ # T1bshY92u2GbJ+p4DDSiZVY3knFyiBhsujakA0keWwx1afEik3ljAdsYQ8K6iwEc # +TZd334T+lk9BRHq/4Pzl4Q3kD9kz/GI+nFrx0lnzsGlO+6Lv/a5+VQwl/Zhz1ks # +AR2FBCjQvAwNJMNPjzLexXs92j6Dmr4yqcnO03/qq3VyBRN7277KQIDAQABo4IB # STCCAUUwHQYDVR0OBBYEFJ7jb4Wul0XZq9tSGWTzoEtIfmR6MB8GA1UdIwQYMBaA # FJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3Rh # bXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUH # MAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9z # b2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQC # MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqG # SIb3DQEBCwUAA4ICAQC+zis7eijxzM6vE+qedISRRWrvXxDOWsiLLv8RbsmZBewm # gXEdZQXRTHQ8PIoUNFc8lW/b0XuSkmQEkmZxCDkdBXtuVRcgxZDWpfQp20VBcj8x # Evvtn6krnHWNf61tGQDtrkW3u9a5GgASLTYekUfmb8CSH91+xvHzA6l5wlti+4e7 # LhobT+0bM5YULEww2EYAgnip1Xzsmdj+4wGaKh2Wb4bPfntdZbm2Dceu01le5DS1 # ZS/bq53icYomj+gtkc/vmnhGm3t0x1gpQX0C5UUHDFhlim+CTXa18r7/I7Crzj9+ # NdUJ0zzdCdrC1t6duT+Wdtz0qxmib4ae8DiK0AxSlJcVatxGSp1RAs34msbp88Gh # Xz4PxTZDYXheSIJHoRT0nNgrBO68vq3ecW7GeQt02NtODb/K/aPdZoO4IrmVI+Cy # d0iIfoGS7ZSLcDRpSjoP3P2/5cS4Gz2KhUlo6N//P5SuqDsRKfEbT9PV0pyLu8tD # Zc2BYVg7786UOO0aiZrWKNfibXg32qCtdO5YQbCALuGEGCneJ38sA5/0FJNYDmUG # uKWwSh7FcGs6f/XAzeuMbSEizG8Xn9g4rvyZVEZjpjvNgn65e3g5M4UHBp0+/wyS # Wt5Bks+dA+2LCiniuUtRho8KIPhhSpE1sunxKDKj2DSIBxljOdO5z7xDxkiuDDCC # B3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAw # gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT # KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIx # MDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57Ry # IQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VT # cVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhx # XFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQ # HJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1 # KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s # 4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUg # fX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3 # Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je # 1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUY # hEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUY # P3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGC # NxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4w # HQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYB # BAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcD # CDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0T # AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNV # HR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9w # cm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEE # TjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl # cnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOC # AgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/a # ZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp # 4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq # 95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qB # woEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG # +jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3B # FARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77 # IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJ # fn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K # 6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDx # yKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNZMIICQQIBATCC # AQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn # MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjJBMUEtMDVFMC1EOTQ3MSUwIwYDVQQD # ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQA6 # zJ/ZvquI8qedeUiAgvZ/nc9SwqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w # IFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7X311jAiGA8yMDI2MDQwNjA5MDUy # NloYDzIwMjYwNDA3MDkwNTI2WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDtffXW # AgEAMAoCAQACAhbcAgH/MAcCAQACAhKqMAoCBQDtf0dWAgEAMDYGCisGAQQBhFkK # BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJ # KoZIhvcNAQELBQADggEBAHA0fJqbNfFEq0XTzP5jXjrKyhO1qm0bWQgeMA+p8yMU # PnsKVfR7FYRVGP0Pi6vpm5jA58As95b076saw7+siZp47ol6pnlOMdi9HT7IOH2M # y3c21u1sHuD3KkRhbpM1F1tBfzz4gX3SM10niIfFw/Q2ewAcPj7uJlY3YTxcLPA+ # GabMnF2/LLnTXG2pc3QZRgjy0Nonv2zqKk+z25eLwu+dkDTZ6CBRJBJxZ3e+oVYM # NqMML2qaHWogzDuifGhmnz3Gr9mcmGgefWHqm0Y4WAr6uaJ9DNTjEJce/fWyyISD # Y9eMc4AYrmh2iz2K/hLJEKGYf6VKs/zaS+A17i02f/ExggQNMIIECQIBATCBkzB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAhCrzeQWGO85sAABAAAC # EDANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE # MC8GCSqGSIb3DQEJBDEiBCAXCF8bKQFt8WqYqi4HPMixGr81YJLGbJW38U3lMU2J # DDCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIMPVIe5+yPNjn1LWIdRBj2Ge # wpKsk+Dlr0xzhicaY8fGMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTACEzMAAAIQq83kFhjvObAAAQAAAhAwIgQgwzNm0U3uYtw9dEBS9IAkvxaW # VHzSVAuU2wFI6nNCEhowDQYJKoZIhvcNAQELBQAEggIAH/JrAX7EatIX4AZI8BUr # Q52SIMd/3OAMl4d4yFvjesh+SYYZ6r7aVzdcGu/c2PejbtnTT/PN+0R11W06Cgq7 # V01Ad0XZ1M/v+U8XRLsrfz7LXoA4SHFEl1FGtL1Agbzaqqi32U+ydPxT5TFsXSy0 # ipCu0yW62eGbnTpmlhD+GqpYVWVekZKiy8s5f/XgUa7HMcjw+w7XWfWVgPNgRIfi # eB7i2ZVEuLTJr/zgPVzOAmGAWT7dkZ78K5dLKzrcNmg6qoBtz8v9qU8y2ZMUTga8 # C1oz17Rrwjadn8kda46KV1zlWv6gukJSmWmz3h1ZnpJbBeGHvAcGL65nJt02uNwn # fRS4RJT/6RBSiM7V4jGcTa2pLnP3ZSCuVwMjzv/0F/6AsvsZNsNtFRlVO89vGc4r # hJNKyFYDy5HOzxPO4Ih76bYVYkTryF0kjjXHDG8Ld3MWY9qwIKIyRWA5Q3r7UQCv # WMlKJQ0tp17SharILR6hIZnWnMAzMAayJSXPTSuJsQ3BywpUu4o+EfpqxMouQOaT # 37t2JTLuvJdDxRrFy71uLwmpp7m+ulIJExcFniodWac1YDjiTAuQoOVCYBULjOAm # ddeOKnZHU2whBgcugnWqfnLPaPwj8HNc9xiwB1Y0Jv9O8oR5AI9L2ztLqsTpPDqi # 2z+XV4Bo0lLv+cWvDtfWY9M= # SIG # End signature block |