FastTrack-KeyVaultRequests.psm1
|
Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue Function Get-ResponseError { param([System.Net.HttpWebResponse]$Response) $streamReader = New-Object System.IO.StreamReader($Response.GetResponseStream()) $streamReader.BaseStream.Position = 0 $streamReader.DiscardBufferedData() $body = ConvertFrom-Json($streamReader.ReadToEnd()) if([string]::IsNullOrEmpty($body)) { $body = ConvertFrom-Json("{}") } Add-Member -InputObject $body -MemberType NoteProperty -Name "StatusCode" -Value $_.Exception.Response.StatusCode $body } Function Invoke-GetRequest { param([String]$Uri, [hashtable]$Headers) $response = try { Invoke-RestMethod -Method GET -Uri $Uri -ContentType 'application/json' -Headers $Headers } catch { Get-ResponseError $_.Exception.Response } return $response } Function Invoke-PostRequest { param([String]$Uri, [hashtable]$Headers, [String]$Body) $response = try { Invoke-RestMethod -Method POST -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body } catch { Get-ResponseError $_.Exception.Response } return $response } Function Invoke-PutRequest { param([String]$Uri, [hashtable]$Headers, [String]$Body) $response = try { Invoke-RestMethod -Method PUT -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body } catch { Get-ResponseError $_.Exception.Response } return $response } Function Invoke-DeleteRequest { param([String]$Uri, [hashtable]$Headers, [String]$Body) $response = try { Invoke-RestMethod -Method DELETE -Uri $Uri -ContentType 'application/json' -Headers $Headers -Body $Body } catch { Get-ResponseError $_.Exception.Response } return $response } Function Waiting-TransactionComplete() { param([string] $TransactionID = $(throw "Transaction ID unable to find, Please try again."), [string] $EnvironmentMode) [array]$FinalResults = "Completed","Failed" $current = $previous = 1; do { $Transaction = Get-FastTrackMigrationTransactionStatus -TransactionID $TransactionID -EnvironmentMode $EnvironmentMode for ($j = 1; (!$FinalResults.Contains($Transaction.Status) -and $j -le $current); $j++) { sleep -Milliseconds 1000 Write-Progress -Id 1 -Activity Waiting -Status 'Next attempt will start ' -PercentComplete ($j/$current*100) -SecondsRemaining ($current-$j) } $current,$previous = ($current + $previous),$current } while ($current -lt 60 -and !$FinalResults.Contains($Transaction.Status)) return $Transaction } Function SetBaseRequestValues{ param ( [string] $TenantID, [string] $CompanyName, [string] $LogonUserEmail ) $TransactionId = New-Guid $CustomerIdentity = (New-Object PSObject | Add-Member -PassThru NoteProperty TenantId $TenantID | Add-Member -PassThru NoteProperty CompanyName $CompanyName | Add-Member -PassThru NoteProperty LogOnUserEmail $LogonUserEmail) $CustomerObject = (New-Object PSObject | Add-Member -PassThru NoteProperty TransactionId $TransactionId | Add-Member -PassThru NoteProperty Customer $CustomerIdentity) return $CustomerObject } Function SetKvRequestValues{ param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [PSObject] $RequestObject, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $KeyVaultSecretName, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $KeyVaultSecretValue, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $MigrationType = "Notes", [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [PSObject] $Region ) return ($RequestObject | Add-Member -PassThru NoteProperty Name $KeyVaultSecretName | Add-Member -PassThru NoteProperty Value $KeyVaultSecretValue | Add-Member -PassThru NoteProperty Region $Region | Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov | Add-Member -PassThru NoteProperty MigrationType $MigrationType) } Function SetKvNewUpdateRequestValues{ param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [PSObject] $RequestObject, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $KeyVaultSecretName, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $KeyVaultSecretValue, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $MigrationType = "Notes", [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $Region, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $Comment = $null, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $CredType ) $CredTypeob =(New-Object PSObject | Add-Member -PassThru NoteProperty CredType $CredType | Add-Member -PassThru NoteProperty Comments $Comment) $result = ($RequestObject | Add-Member -PassThru NoteProperty Name $KeyVaultSecretName | Add-Member -PassThru NoteProperty Value $KeyVaultSecretValue | Add-Member -PassThru NoteProperty Region $Region | Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov | Add-Member -PassThru NoteProperty MigrationType $MigrationType | Add-Member -PassThru NoteProperty CredType $CredTypeob) return $result } Function SetKvGetRequestValues{ param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [PSObject] $RequestObject, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $MigrationType = "Notes", [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $Region, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $CredType ) $result = ($RequestObject | Add-Member -PassThru NoteProperty Region $Region | Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov | Add-Member -PassThru NoteProperty MigrationType $MigrationType | Add-Member -PassThru NoteProperty CredType $CredType) return $result } function New-FastTrackMigrationSecret { <# .SYNOPSIS Create a new FastTrack Migration secret .DESCRIPTION This cmdlet is used for customers who are Global Administrators to create a new FastTrack Migration Secret. In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet. .PARAMETER SecretName Unique name for new Secret. .PARAMETER SecretValue Value for new Secret. .PARAMETER Region Region of migration. .PARAMETER MigrationType The type of migration. .PARAMETER CredentialType The type of credential. Valid options are: Admin, Certificate, Migration_Account, Mig_Sched, RDG, Sharepoint, SAS, VPN, Encrypted .PARAMETER Comment Any comment related to credential. .PARAMETER EnvironmentMode DO NOT USE. INTERNAL USE ONLY .EXAMPLE New-FastTrackMigrationSecret -SecretName:"NewSecret" -SecretValue:"NewSecretValue" -Region:"Region" -MigrationType:"Mig-ExHybrid" -CredentialType "Admin" This will create a new Secret named as NewSecret and value as NewSecretValue. .INPUTS System.String .OUTPUTS System.Management.Automation.PSObject This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID. .LINK Set-FastTrackMigrationSecret Remove-FastTrackMigrationSecret Get-FastTrackMigrationSecrets #> param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $SecretName, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $SecretValue, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $Region, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $MigrationType, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "RDG", "Sharepoint", "SAS", "VPN", "Encrypted")] [string] $CredentialType, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $Comment, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [ValidateSet("dev","uat","prod")] [string] $EnvironmentMode = "prod" ) if($global:MsoAdminProperties.Count -eq 0) { Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function." return } $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"] ` -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName ` -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account $updateJsonObj = SetKvNewUpdateRequestValues -RequestObject:$jsonObj ` -KeyVaultSecretName:$SecretName ` -KeyVaultSecretValue:$SecretValue ` -Region:$Region ` -MigrationType:$MigrationType ` -Comment: $Comment ` -CredType $CredentialType $serializedJson = $updateJsonObj | ConvertTo-Json -Compress: $true $header = @{} $header.Add("ACCESS_TOKEN",$global:MsftAccessToken) $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"]) Write-Host "Sending Secret Create Request..." if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase)) { $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson } else { $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson } if($JsonResult.StatusCode -ne $null) { Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)" } else { Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId) -EnvironmentMode $EnvironmentMode } } function Set-FastTrackMigrationSecret { <# .SYNOPSIS Update an existing FastTrack Migration Secret .DESCRIPTION This cmdlet is used for customers who are Global Administrators to update already existing KeyVault secret. In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet. .PARAMETER SecretName Unique name for already existing Secret. .PARAMETER SecretValue New value for specified Secret. .PARAMETER Region Region of migration. .PARAMETER MigrationType The type of migration. .PARAMETER CredentialType The type of credential. Valid options are: Admin, Certificate, Migration_Account, Mig_Sched, RDG, Sharepoint, SAS, VPN, Encrypted .PARAMETER Comment Any comment related to credential. .PARAMETER EnvironmentMode DO NOT USE. INTERNAL USE ONLY .EXAMPLE Set-FastTrackMigrationSecret -SecretName:"SecretValueName" -SecretValue:"ChangedSecretValue" -Region:"Region" -MigrationType:"Mig-ExHybrid" -CredentialType "Admin" This will update the value of SecretValueName as ChangedSecretValue. .INPUTS System.String .OUTPUTS System.Management.Automation.PSObject This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID. .LINK New-FastTrackMigrationSecret Remove-FastTrackMigrationSecret Get-FastTrackMigrationSecrets #> param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $SecretName, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $SecretValue, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $Region, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $MigrationType, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "RDG", "Sharepoint", "SAS", "VPN", "Encrypted")] [string] $CredentialType, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [string] $Comment, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [ValidateSet("dev","uat","prod")] [string] $EnvironmentMode = "prod" ) if($global:MsoAdminProperties.Count -eq 0) { Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function." return } $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"] ` -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName ` -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account $updateJsonObj = SetKvNewUpdateRequestValues -RequestObject:$jsonObj ` -KeyVaultSecretName:$SecretName ` -KeyVaultSecretValue:$SecretValue ` -Region:$Region ` -MigrationType:$MigrationType ` -Comment: $Comment ` -CredType $CredentialType $serializedJson = $updateJsonObj | ConvertTo-Json -Compress: $true $header = @{} $header.Add("ACCESS_TOKEN",$global:MsftAccessToken) $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"]) Write-Host "Sending Secret Update Request..." if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase)) { $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson } else { $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault/Set",$EnvironmentMode)) -Headers $header -Body $serializedJson } if($JsonResult.StatusCode -ne $null) { # Error? Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)" } else { Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId) -EnvironmentMode $EnvironmentMode } } function Remove-FastTrackMigrationSecret { <# .SYNOPSIS Remove an existing FastTrack Migration secret .DESCRIPTION This cmdlet is used for customers who are Global Administrators to remove already existing FastTrack Migration Secret. In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet. .PARAMETER SecretName Unique name for already existing secret. .PARAMETER Region Region of migration. .PARAMETER MigrationType The type of migration. .PARAMETER EnvironmentMode DO NOT USE. INTERNAL USE ONLY .EXAMPLE Remove-FastTrackMigrationSecret -SecretName:"SecretValueName" -Region:"Region" -MigrationType:"Mig-ExHybrid" This will remove the SecretValueName. .INPUTS System.String .OUTPUTS System.Management.Automation.PSObject This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID. .LINK New-FastTrackMigrationSecret Set-FastTrackMigrationSecret Get-FastTrackMigrationSecrets #> param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $SecretName, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $Region, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $MigrationType, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [ValidateSet("dev","uat","prod")] [string] $EnvironmentMode = "prod" ) if($global:MsoAdminProperties.Count -eq 0) { Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function." return } $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"] ` -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName ` -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account $deleteJson = SetKvRequestValues -RequestObject:$jsonObj ` -KeyVaultSecretName:$SecretName ` -Region:$Region ` -MigrationType:$MigrationType $serializedJson = $deleteJson | ConvertTo-Json -Compress: $true $header = @{} $header.Add("ACCESS_TOKEN",$global:MsftAccessToken) $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"]) Write-Host "Sending KeyVault Delete Request..." if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase)) { $JsonResult = Invoke-DeleteRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault",$EnvironmentMode)) -Headers $header -Body $serializedJson } else { $JsonResult = Invoke-DeleteRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault",$EnvironmentMode)) -Headers $header -Body $serializedJson } if($JsonResult.StatusCode -ne $null) { # Error? Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)" } else { Waiting-TransactionComplete -TransactionID ($JsonResult.TransactionId) -EnvironmentMode $EnvironmentMode } } function Get-FastTrackMigrationSecrets { <# .SYNOPSIS Get a list of secrets for a FastTrack migration customer .DESCRIPTION This cmdlet is used for customers who are Global Administrators to retrieve a list of secret names. In order to use this cmdlet, you must first login using the Login-FastTrackMigrationAccount cmdlet. .PARAMETER Region Region of migration. .PARAMETER MigrationType Type of migration. Mig-ExHybrid Exchange to Exchange hybrid migration Mig-ExSimpleMRS Exchange to Exchange hybrid migration Mig-ExCutover Cutover Migration Mig-ExStaged Staged Migration Mig-IMAP IMAP Migration Mig-GmailCutover Gmail Cutover Migration Mig-GmailStaged Gmail staged Migration Mig-GroupWise GroupWise Migration Mig-GoogleDrive Google drive to OneDrive migration Mig-GoogleSites GoogleSites Migration Mig-Box Box drive to OneDrive migration Mig-FileSharesToOneDrive FileShare to OneDrive migration Mig-FileSharesToTeamSites FileShare to TeamSite migration Mig-DominoBAM Notes user documents into BAM (Binary Tree Application Manager) migration Mig-DominoODME Notes user documents into ODME migration MIG-SPOnPrem Sharepoint Migration .PARAMETER CredentialType The type of credential. Valid options are: Admin, Certificate, Migration_Account, Mig_Sched, RDG, Sharepoint, SAS, VPN, Encrypted, All .PARAMETER EnvironmentMode DO NOT USE. INTERNAL USE ONLY .EXAMPLE Get-FastTrackMigrationSecrets -Region "India" -MigrationType "Mig-ExCutover" -CredentialType "Admin" .INPUTS System.String .OUTPUTS System.Management.Automation.PSObject This cmdlet generates System.Management.Automation.PSObject object that represents transaction ID. .LINK New-FastTrackMigrationSecret Remove-FastTrackMigrationSecret Set-FastTrackMigrationSecret #> param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $Region, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $MigrationType, [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [ValidateSet("Admin", "Certificate", "Migration_Account", "Mig_Sched", "RDG", "Sharepoint", "SAS", "VPN", "Encrypted", "All")] [string] $CredentialType = "All", [Parameter(Mandatory=$false,ValueFromPipeline=$true)] [ValidateSet("dev","uat","prod")] [string] $EnvironmentMode = "prod" ) if($global:MsoAdminProperties.Count -eq 0) { Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackMigrationAccount] function." return } $jsonObj = SetBaseRequestValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"] ` -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName ` -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account $updateJsonObj = SetKvGetRequestValues -RequestObject:$jsonObj ` -Region:$Region ` -MigrationType:$MigrationType ` -CredType $CredentialType $serializedJson = $updateJsonObj | ConvertTo-Json -Compress: $true $header = @{} $header.Add("ACCESS_TOKEN",$global:MsftAccessToken) $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"]) Write-Host "Fetching Secrets ..." if($EnvironmentMode.Equals("UAT", [System.StringComparison]::CurrentCultureIgnoreCase)) { $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-csi-{0}.azurewebsites.net/api/KeyVault/List",$EnvironmentMode)) -Headers $header -Body $serializedJson } else { $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/KeyVault/List",$EnvironmentMode)) -Headers $header -Body $serializedJson } if($JsonResult.StatusCode -ne $null) { # Error? Write-Warning "Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)" } else { if($JsonResult.Secrets.Count -eq 0) { Write-Host "No Secrets Found" } else { Write-Host "`nSecrets`n-------" return $JsonResult.Secrets } } } # SIG # Begin signature block # MIIkWAYJKoZIhvcNAQcCoIIkSTCCJEUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCed2kJUhkNbpFc # RVxS6vpC2gdRf6ug/YCAOZClJ7uVLaCCDYEwggX/MIID56ADAgECAhMzAAABA14l # HJkfox64AAAAAAEDMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMTgwNzEyMjAwODQ4WhcNMTkwNzI2MjAwODQ4WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDRlHY25oarNv5p+UZ8i4hQy5Bwf7BVqSQdfjnnBZ8PrHuXss5zCvvUmyRcFrU5 # 3Rt+M2wR/Dsm85iqXVNrqsPsE7jS789Xf8xly69NLjKxVitONAeJ/mkhvT5E+94S # nYW/fHaGfXKxdpth5opkTEbOttU6jHeTd2chnLZaBl5HhvU80QnKDT3NsumhUHjR # hIjiATwi/K+WCMxdmcDt66VamJL1yEBOanOv3uN0etNfRpe84mcod5mswQ4xFo8A # DwH+S15UD8rEZT8K46NG2/YsAzoZvmgFFpzmfzS/p4eNZTkmyWPU78XdvSX+/Sj0 # NIZ5rCrVXzCRO+QUauuxygQjAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUR77Ay+GmP/1l1jjyA123r3f3QP8w # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDM3OTY1MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAn/XJ # Uw0/DSbsokTYDdGfY5YGSz8eXMUzo6TDbK8fwAG662XsnjMQD6esW9S9kGEX5zHn # wya0rPUn00iThoj+EjWRZCLRay07qCwVlCnSN5bmNf8MzsgGFhaeJLHiOfluDnjY # DBu2KWAndjQkm925l3XLATutghIWIoCJFYS7mFAgsBcmhkmvzn1FFUM0ls+BXBgs # 1JPyZ6vic8g9o838Mh5gHOmwGzD7LLsHLpaEk0UoVFzNlv2g24HYtjDKQ7HzSMCy # RhxdXnYqWJ/U7vL0+khMtWGLsIxB6aq4nZD0/2pCD7k+6Q7slPyNgLt44yOneFuy # bR/5WcF9ttE5yXnggxxgCto9sNHtNr9FB+kbNm7lPTsFA6fUpyUSj+Z2oxOzRVpD # MYLa2ISuubAfdfX2HX1RETcn6LU1hHH3V6qu+olxyZjSnlpkdr6Mw30VapHxFPTy # 2TUxuNty+rR1yIibar+YRcdmstf/zpKQdeTr5obSyBvbJ8BblW9Jb1hdaSreU0v4 # 6Mp79mwV+QMZDxGFqk+av6pX3WDG9XEg9FGomsrp0es0Rz11+iLsVT9qGTlrEOla # P470I3gwsvKmOMs1jaqYWSRAuDpnpAdfoP7YO0kT+wzh7Qttg1DO8H8+4NkI6Iwh # SkHC3uuOW+4Dwx1ubuZUNWZncnwa6lL2IsRyP64wggd6MIIFYqADAgECAgphDpDS # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIWLTCCFikCAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAQNeJRyZH6MeuAAAAAABAzAN # BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgO5GeTbTp # bywvHZHVFtX7uDQU0EoG+b4WKu5rCT8aCcgwQgYKKwYBBAGCNwIBDDE0MDKgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN # BgkqhkiG9w0BAQEFAASCAQBD3vOma8JRFwDZTYuycDk0RjgzcSxPOL13adKWUNp4 # ssMSumbh+xgo0yq6islWzZ1fS549Q6KClsTluHBKb3GXnrHliN0Y1zAfINCArjGb # Ssw1JNIxBTWMOMwQDcXtNHYoqLzECCwoGK9DEZ0+TEOZ7qnfVcIw/r0I/lLRyvLm # pk+9BOOKUW0cCRPUr8WeboiB+1HSIn4STLZqpSti9kVZ1QHf5d7FyLn6SPYbe9bB # 6ZSnfekpNxlFnQbWMNTTTK/UWFw2pMztTIHsgrsli8OhZJw+lrwUofluI36Jxy7h # JXz+r/2PoMCF3oRhxVPuN2BtwjpofUC/8/zP2RvSewPpoYITtzCCE7MGCisGAQQB # gjcDAwExghOjMIITnwYJKoZIhvcNAQcCoIITkDCCE4wCAQMxDzANBglghkgBZQME # AgEFADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMB # MDEwDQYJYIZIAWUDBAIBBQAEIOif6cuNRWMsu+p2JO1SKreeK7jPa912cTQ/F0Rg # VjVWAgZbiBcFkn4YEzIwMTgwOTExMTQ0NzAyLjMzN1owBwIBAYACAfSggdSkgdEw # gc4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsT # IE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFs # ZXMgVFNTIEVTTjpCMUI3LUY2N0YtRkVDMjElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaCCDx8wggT1MIID3aADAgECAhMzAAAA0rjjWm3EWxp3 # AAAAAADSMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMB4XDTE4MDgyMzIwMjYzNFoXDTE5MTEyMzIwMjYzNFowgc4xCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP # cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpC # MUI3LUY2N0YtRkVDMjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy # dmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL6qlCgdibSaobrq # BKjOOMdrBs+/2QwgzuuPOfmdCTBQuNs7pWysQ39PEGqEpHRY0iGUGYNgpnzPnlG2 # MUmMiGaxnOkvW7/F9dOkM2YsCVZGakzO4filhUPoBJKcScTugOG5o43C3Vtl+zbi # ux2lsjTFk0w3jFIf9FUD15+sskWZ0cOfhHe2BQfWaTpJj0s3aS4STsWm3S2VVhbX # 6lZmtjqod7o8Wx8PpCVpGAygKTQMNpNgVKqV27U3DYYhhmhidBLviqzgfA30tUDO # z9bXMrg29Ma0pvFaflIAVnWoNAZVcYqrGXd7yla4I6s7MwqwcisN00RKlXVnMr6S # lbo4l0UCAwEAAaOCARswggEXMB0GA1UdDgQWBBTsrDhxdfqXySP5UnJlSeA9onfg # zjAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEug # SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N # aWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG # AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rp # bVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQBGz0MpcRwOvTZ3QXq9FWewgAJy # KiaSFpgoufls+WX4AyPQmD/LnB+ZcJR5LQnoHvdWeQizH9lW8SnbiStsnH1mVPIc # 45Nh7PvKHLjdrke3Ky4Ht5VicKAZu18vdL3xU42eUOkMG4F6nL5nJByDTTp51vxO # T/W/WS12PZZmcwNs6nZKrTT/TmG0QXNkZ0KL5kpF/CR7/TtO8PVQ9ciCOl/+2tnp # Hpwj8U3XsvLaKAck9RzpoWHQ4dF3zeRKWXA7qW6pexvFX6nmJ/KFJsftRAVwZ/Z5 # mC+LOIcJlln4ZTEAKEW+HPfyjl+BS5yIl3dqhnVFukt5QLsWlKNUQKT5fNn7MIIG # cTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0 # IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1 # WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCC # ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9p # lGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEw # WbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeG # MoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJ # UGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw # 2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0C # AwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ # 80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E # BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2U # kFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j # b20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmww # WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYD # VR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYI # KwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0 # AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9 # naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtR # gkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzy # mXlKkVIArzgPF/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCf # Mkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3D # nKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs # 9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110 # mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL # 2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffI # rE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxE # PJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc # 1bN+NR4Iuto229Nfj950iEkSoYIDrTCCApUCAQEwgf6hgdSkgdEwgc4xCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29m # dCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT # TjpCMUI3LUY2N0YtRkVDMjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg # U2VydmljZaIlCgEBMAkGBSsOAwIaBQADFQBw+Ch/1VIzmUVpODcOv+U5mO7zwqCB # 3jCB26SB2DCB1TELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEp # MCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJzAlBgNV # BAsTHm5DaXBoZXIgTlRTIEVTTjo1N0Y2LUMxRTAtNTU0QzErMCkGA1UEAxMiTWlj # cm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIF # AN9ByYMwIhgPMjAxODA5MTExMjU2MzVaGA8yMDE4MDkxMjEyNTYzNVowdDA6Bgor # BgEEAYRZCgQBMSwwKjAKAgUA30HJgwIBADAHAgEAAgIAwzAHAgEAAgIbgTAKAgUA # 30MbAwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMBoAowCAIBAAID # FuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IBAQBzp+UcxDG97qyLWVTp # SgbfFi5jDwy9Jii0iRRnzcJI3gLGjOS855qhuKg8sNaKfbcDDXZCkKQApl/fJixy # 0Rbti3j56vrfEPe4QFJy9XxE38cwGT9NaPPff87BhHhdVWUpDyKNAIaSKzE5MqNK # VhoWc+CPJWPUB2S2Uv1gz03ewDnT4IQYewYVLf9xZ4/g/oHTclyu57SgN/ZGCwlK # oB5bdbHSZwXRJgH9GCg7OyMZ+8K8mjAXl5NFC2z8ADCeX96+KJcaula/jiL6mKXp # 6l8w4e3OWJyOtb5e5I62ZQwyqqOgrRRXubTnwpDHzKPfZ8GWRBmV50rjEg4uBLWg # RtjEMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC # EzMAAADSuONabcRbGncAAAAAANIwDQYJYIZIAWUDBAIBBQCgggEyMBoGCSqGSIb3 # DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgGDTJ7+Xu5tIap73i # kOYWxNm1bodsavar6m+WfP3NacYwgeIGCyqGSIb3DQEJEAIMMYHSMIHPMIHMMIGx # BBRw+Ch/1VIzmUVpODcOv+U5mO7zwjCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwAhMzAAAA0rjjWm3EWxp3AAAAAADSMBYEFCsC05SXi13MgewU # yDGKf6Kr9RviMA0GCSqGSIb3DQEBCwUABIIBAEXA96a7WLkF1jC3M5mx7MeFvzWJ # gQ7Yy6qNZh3vOa7YLkwefUekBklcwreEMKGTE9Ng/DtGtp7L0gKyczxLgoGa8ZHj # MItDFHjvoTVNj5Go1HM719wQtfRo4Ppx3p1aGw+O5mI9cSvV6lYnHOkv9aMefizr # rwTH1ifnZ/o5KTSsNSHwtZ/JN2TwESYp3Z++7QyBA2bvKhly3AJMdJS3JFt71Oaw # cipDUMHWVC5/5Gt6K4BMYvLojqowXvBgtIWX/wG6MNGH1lE425U6+R/A5aqCcver # krIS/IwoZAb/RlvPpqQiA2q+PGBZCfMnhJAINyZzA/HXvnUOhFQG+WWtSLg= # SIG # End signature block |