GenerateO365RefreshToken.ps1
<#PSScriptInfo .VERSION 1.2 .GUID 055455ac-419d-4e89-b4c9-d1ccba28393f .AUTHOR skrishnakumar .COMPANYNAME .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Exterro eDiscovery platform connect with O365 with the help of refresh token to support modern authentication. #> #-- This script is used for Exterro's eDiscovery Platform. #-- @author: Samraj K #-- Code snippets are referred from PS gallery projects. $ErrorActionPreference = "Stop" $WelknownClientId = "1b730954-1685-4b74-9bfd-dac224a7b894" $PSEndPointUrl = "https://ps.compliance.protection.outlook.com" $O365LoginUrl = "https://login.microsoftonline.com" [bool] $Global:autoClosed=$false; Function Show-LoginWindow { param( [System.Uri]$Url ) Add-Type -AssemblyName System.Web Add-Type -AssemblyName System.Windows.Forms $form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width=500;Height=650} $web = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width=400;Height=600;Url=($url ) } $DocComp = { $Global:uri = $web.Url.AbsoluteUri if ($Global:Uri -match "error=[^&]*|code=[^&]*") {$Global:autoClosed=$true; $form.Close() } } $web.ScriptErrorsSuppressed = $true $web.Add_DocumentCompleted($DocComp) $form.Text="Exterro Token Generation" $Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") $form.Icon=$Icon # $form.CompanyName="Exterro Inc" $form.Controls.Add($web) $form.Add_Shown({$form.Activate()}) $form.ShowDialog() | Out-Null $queryOutput = [System.Web.HttpUtility]::ParseQueryString($web.Url.Query) if($Global:autoClosed){ $output = @{} foreach($key in $queryOutput.Keys){ $output["$key"] = $queryOutput[$key] } return $output }else{ $FileLocation="tempFile.html" if (Test-Path $FileLocation) { Remove-Item $FileLocation } $web.DocumentText | Out-File -FilePath $FileLocation -NoClobber $output= GetStringBetweenTwoStrings -firstString "code=" -secondString "\\u0026session_state=" -importPath $FileLocation Remove-Item �path $FileLocation return $output } } function GetStringBetweenTwoStrings($firstString, $secondString, $importPath){ #Get content from file $file = Get-Content $importPath #Regex pattern to compare two strings $pattern = "$firstString(.*?)$secondString" #Perform the opperation $result = [regex]::Match($file,$pattern).Groups[1].Value #Return result return $result } function Display { param( [String]$codes ) [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $title = 'Refresh Token' $msg = 'Please copy the refresh token from the window.' $text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title, $codes) } function Get-ExterroPSO365RefreshToken { Unblock-File -Path $MyInvocation.ScriptName; #--- Get the options section Show-Menu �Title 'My Menu' $selection = Read-Host "Please make a selection ( Default : Microsoft global environment)" switch ($selection) { '1' { $PSEndPointUrl = "https://ps.compliance.protection.outlook.com" $O365LoginUrl = "https://login.microsoftonline.com" 'You chose option #1 - Microsoft global environment' } '2' { $PSEndPointUrl = "https://ps.compliance.protection.office365.us" $O365LoginUrl = "https://login.microsoftonline.us" 'You chose option #2 - Microsoft Cloud for US Government (GCC High)' } '3' { $PSEndPointUrl = "https://l5.ps.compliance.protection.office365.us" $O365LoginUrl = "https://login.microsoftonline.us" 'You chose option #3 - Microsoft Cloud for US Government (DoD)' } '4' { $PSEndPointUrl = "https://ps.compliance.protection.outlook.de" $O365LoginUrl = "https://login.microsoftonline.de" 'You chose option #4 - Microsoft Cloud Germany' } '5' { $PSEndPointUrl = "https://ps.protection.outlook.cn" $O365LoginUrl = "https://login.partner.microsoftonline.cn" 'You chose option #5 - Azure and Microsoft 365 operated by 21Vianet in China' } 'q' { return } default { $PSEndPointUrl = "https://ps.compliance.protection.outlook.com" $O365LoginUrl = "https://login.microsoftonline.com" 'Default value - Microsoft global environment' } } #--- End of option section $refreshToken = "" $responseCode="" $codeData = Show-LoginWindow -Url "$O365LoginUrl/common/oauth2/authorize?resource=$PSEndPointUrl&client_id=$WelknownClientId&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&prompt=login" + ";" if($Global:autoClosed){ If ($codeData["error"]) { "An error occurred accessing $PSEndPointUrl : " + $codeData["error"] return } ElseIf ($codeData["code"]) { $responseCode = $codeData["code"] ; } Else { "No code obtained from the endpoint url." ; return } }else{ $responseCode = $codeData; } #Fetch the access token if ($responseCode) { $postParams = @{grant_type='authorization_code';code=$responseCode;client_id=$WelknownClientId;redirect_uri='urn:ietf:wg:oauth:2.0:oob'} $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Content-Type", 'application/x-www-form-urlencoded') $response=Invoke-RestMethod -Uri "$O365LoginUrl/common/oauth2/token" -Method POST -Body $postParams -Headers $headers #Set-Clipboard -Value $response.refresh_token #$response | Out-File -FilePath "AccessToken.txt" Display $response.refresh_token; }else{ Write-Host "Powershell window might be closed abruptly." } } function Show-Menu { param ( [string]$Title = 'M365 Environment Details' ) Clear-Host Write-Host "================ $Title ================" Write-Host "1: Press '1' for Microsoft global environment." Write-Host "2: Press '2' for Microsoft Cloud for US Government(GCC High)." Write-Host "2: Press '3' for Microsoft Cloud for US Government(DoD)." Write-Host "3: Press '4' for Microsoft Cloud Germany." Write-Host "4: Press '5' for Azure and Microsoft 365 operated by 21Vianet in China." Write-Host "Q: Press 'Q' to quit." } Get-ExterroPSO365RefreshToken # SIG # Begin signature block # MIIqzAYJKoZIhvcNAQcCoIIqvTCCKrkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCXZep6NpFtxI8V # jvTrWSfGbj8WYUDSjPHt25nSAoi9MKCCE6cwggWQMIIDeKADAgECAhAFmxtXno4h # MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z # ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 # IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z # G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ # anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s # Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL # 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb # BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3 # JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c # AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx # YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0 # viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL # T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud # EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf # Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk # aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS # PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK # 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB # cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp # 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg # dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri # RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7 # 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5 # nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3 # i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H # EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G # CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 # IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz # ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C # 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce # 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da # E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T # SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA # FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh # D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM # 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z # 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05 # huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY # mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP # /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T # AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD # VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG # A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY # aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj # ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV # HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU # cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN # BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry # sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL # IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf # Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh # OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh # dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV # 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j # wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH # Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC # XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l # /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW # eE4wggdbMIIFQ6ADAgECAhAD6v665xpLOs7OXPxdA2xKMA0GCSqGSIb3DQEBCwUA # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz # ODQgMjAyMSBDQTEwHhcNMjEwODE3MDAwMDAwWhcNMjQwNjEzMjM1OTU5WjBgMQsw # CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x # FTATBgNVBAoTDEV4dGVycm8sIEluYzEVMBMGA1UEAxMMRXh0ZXJybywgSW5jMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6LFZi4RUAV1An+PPIxdUiSTq # bClWDQIIanxbz7VE/J5bFaVR/pS4ds6JtWCMShRz3nMe/Y32tdXzygZpVeIx5qD4 # v0FbUiHveVQkvUaDREcNh83bOaEn/iyKuY1hsUkvE9mePXUpVS3EqbJH5diRhg5s # zk/yeMIbqO8EwXGfH+xkPd2lym2jtVRqPuAGUNErcnzjYlQG1yu99is8YXZ7TOR2 # O6hXiYNafGmL6YaB6ywFPWSts8mz156+rxFmz7PF3k2tsTvo7NIcc1heabxVJuuo # OdZ5ZazjgIVw+BSDo4PLa+gBb5FAEJlaB+PlVfaSyQ/wapZ7mnBtvYWgeOTFV1sp # 2IRJqbBHWa3LLGCgg+J8IUxdnYWrw7vqcBE2HiNA8bUXnzjjANXeHfs7AqI6tQR/ # Fpv8ZQZF9YeaA82ycuIiVMxwpH0h0Nu7mLQ7supMmYhC8TsscjgJMnuHvv4ECfkv # ugdQjFds4cgI2EHpUxNGzdhaTY9K2IGyWFIamqzVQa26MpVS6wIUTJp0n5n1AdO/ # aPbvKBEIKGHwO8qOAigNIEipbMhb4RhtWxgLIjRjHsd9YTE3nRgVvFz2QOB9MhX6 # Cemck+Gtc4Wv2hPpRD8kVgHuFgGsvqrYZTybMwaAen7hfqn4Zoz/IrjFoowfZQXJ # J548OBGp8dYqa8W985cCAwEAAaOCAgYwggICMB8GA1UdIwQYMBaAFGg34Ou2O/hf # EYb7/mF7CIhl9E5CMB0GA1UdDgQWBBTMmvFGbCPHA3PcBvPWH+SRyBLvfDAOBgNV # HQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBT # oFGgT4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0 # Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6 # Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5n # UlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkw # JwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYIKwYB # BQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNv # bTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lD # ZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQw # DAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAjLcPltOkacap+5d7J8pZ # 7gBt5XPhEb28yjyd93xjPrcfa/Hgm4oSFeHAl484gw5xl/eD8QtT+nUEbEG6ImlV # jxWZ1Kz5g8EpCUKwR8ZpB5RPPwRecFVAkaARoOEcXLN6E3omg+AK+NkKtV2/Uj1R # /aXE/+9dli80yTzsF+csNw6PCR1miaP31vuG0av4dMN59XIT9pm+0K13v4cUeVli # iKmSP9BaEBEnIxnw8amjyqznwKiLBJxNDvx1PJ53Tpun3RBfzEd96x2ZrEuB91u1 # 6VLhapv1a6fDBfWXhjkfCVreX+HO4QLfVE50MiyNYsWRXqmTnIr/AjzGzFViO8vx # 3frJlZG5u2wd9RNsPw+h/4HmJzd6tFuzY8kYsXjVOdPJGFWOip3Qu2Eh1xvmpZ/D # S1RTF8a5lGSX9aL4v0sdRLUcuWSBWjNUWHf7cARwEJed/6OcmfaFvZBRKa9QO+Q1 # u6G4DJqhyTvrYqrUDjyHS1ZYtNJCk/CN7mI7Rb+Cv6OoMWzl5fXb/TtqWpgkEYGv # kyAnMO1jmWDTO4I9zYZVsTTmvREytTyTYsppGttdWNlvrI6koPldDJryzxbrYcKo # oeprN1le9n3fV67DxNEYMW9+cJM28aNiveyWIpAZgwInP/p+5weNG0+zCP9SiAvO # 6XrbT3zlwQmqSygFG59XAOAxghZ7MIIWdwIBATB9MGkxCzAJBgNVBAYTAlVTMRcw # FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3Rl # ZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAPq/rrn # Gks6zs5c/F0DbEowDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZ # BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB # BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgbVobQO3OFQLi5vkMrjnGRIjAoW/3vXaB # 5QO8ZgOwNbcwDQYJKoZIhvcNAQEBBQAEggIAZOjjbLmMaPq+DYyENer+WulRIPlC # Ev4irueXRTJGVgnU/ohLXCF70dcs3oSA2H27OHamg8P6I+Hr7+NyjgoCnlOW5AWA # M2fIh53454vV+KzficJzEJvYWToE1dTXsYNM91yl8FXRGwMaN4dbgU94dO6ZqjDh # 4r+gll1u0336Kth64EOFaNl0RLcdjYpkNc4CY8TusoiCVeQyK3XNgWtPegQ6rKpt # M4MdWDaVMvVr6/F+iZqE2D0vmHU05rLyja5wI05qDrVSBQ9bexJ/bTg9SMyAWKvG # nUyaX78Jw/aujRsQ01LVdCURI7bXjpQPHxQ0XE4/gJvLv6aWpcYOIqJqkRICKCHv # UHhOTQEEzBfy+oClBs/vsZzbL5IjXSAcC5MO16/qwnRsT39Ga+vTjtbXiifVMOeY # 7+Z0+tF64TebtTttC6r0qneVoNKhvSOkYbhDLUifnG5BmQ1+spQydP4NPyYdDZPX # jXSsDNHwQrQjd0moUhKsrpfQhvIBRPj9h2xw2XZSsGnVkqtFuRuunePn1GMVsxVR # 32nhnYZYqJUbrd3q9fYkzQJXJRyY/QyTWZC9PFX5ZcV1nkt1iP+Rq8KWt4kC3faR # ZFTSuMybOMs0YU+dn38aCruJ3xZssDtKHfT0l8VaDS0sc8C/4VVlygqpgZzQRRB1 # SPbcLFI4P2HBMXChghNRMIITTQYKKwYBBAGCNwMDATGCEz0wghM5BgkqhkiG9w0B # BwKgghMqMIITJgIBAzEPMA0GCWCGSAFlAwQCAgUAMIHwBgsqhkiG9w0BCRABBKCB # 4ASB3TCB2gIBAQYKKwYBBAGyMQIBATAxMA0GCWCGSAFlAwQCAQUABCANO76WOglh # WgXKo/t34HHwGU/fESUcKCLMrqERhP4qmgIVALD00GijNwTxPF44c2+26nzLL/Jf # GA8yMDIzMDIyMjA1MTEzMlqgbqRsMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpN # YW5jaGVzdGVyMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1Nl # Y3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgU2lnbmVyICMzoIIN6jCCBvYwggTeoAMC # AQICEQCQOX+a0ko6E/K9kV8IOKlDMA0GCSqGSIb3DQEBDAUAMH0xCzAJBgNVBAYT # AkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZv # cmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBS # U0EgVGltZSBTdGFtcGluZyBDQTAeFw0yMjA1MTEwMDAwMDBaFw0zMzA4MTAyMzU5 # NTlaMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpNYW5jaGVzdGVyMRgwFgYDVQQK # Ew9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1NlY3RpZ28gUlNBIFRpbWUgU3Rh # bXBpbmcgU2lnbmVyICMzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA # kLJxP3nh1LmKF8zDl8KQlHLtWjpvAUN/c1oonyR8oDVABvqUrwqhg7YT5EsVBl5q # iiA0cXu7Ja0/WwqkHy9sfS5hUdCMWTc+pl3xHl2AttgfYOPNEmqIH8b+GMuTQ1Z6 # x84D1gBkKFYisUsZ0vCWyUQfOV2csJbtWkmNfnLkQ2t/yaA/bEqt1QBPvQq4g8W9 # mCwHdgFwRd7D8EJp6v8mzANEHxYo4Wp0tpxF+rY6zpTRH72MZar9/MM86A2cOGbV # /H0em1mMkVpCV1VQFg1LdHLuoCox/CYCNPlkG1n94zrU6LhBKXQBPw3gE3crETz7 # Pc3Q5+GXW1X3KgNt1c1i2s6cHvzqcH3mfUtozlopYdOgXCWzpSdoo1j99S1ryl9k # x2soDNqseEHeku8Pxeyr3y1vGlRRbDOzjVlg59/oFyKjeUFiz/x785LaruA8Tw9a # zG7fH7wir7c4EJo0pwv//h1epPPuFjgrP6x2lEGdZB36gP0A4f74OtTDXrtpTXKZ # 5fEyLVH6Ya1N6iaObfypSJg+8kYNabG3bvQF20EFxhjAUOT4rf6sY2FHkbxGtUZT # bMX04YYnk4Q5bHXgHQx6WYsuy/RkLEJH9FRYhTflx2mn0iWLlr/GreC9sTf3H99C # e6rrHOnrPVrd+NKQ1UmaOh2DGld/HAHCzhx9zPuWFcUCAwEAAaOCAYIwggF+MB8G # A1UdIwQYMBaAFBqh+GEZIA/DQXdFKI7RNV8GEgRVMB0GA1UdDgQWBBQlLmg8a5or # JBSpH6LfJjrPFKbx4DAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADAWBgNV # HSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDCDAl # MCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAIw # RAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdv # UlNBVGltZVN0YW1waW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA/BggrBgEFBQcw # AoYzaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBVGltZVN0YW1waW5n # Q0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkq # hkiG9w0BAQwFAAOCAgEAc9rtaHLLwrlAoTG7tAOjLRR7JOe0WxV9qOn9rdGSDXw9 # NqBp2fOaMNqsadZ0VyQ/fg882fXDeSVsJuiNaJPO8XeJOX+oBAXaNMMU6p8IVKv/ # xH6WbCvTlOu0bOBFTSyy9zs7WrXB+9eJdW2YcnL29wco89Oy0OsZvhUseO/NRaAA # 5PgEdrtXxZC+d1SQdJ4LT03EqhOPl68BNSvLmxF46fL5iQQ8TuOCEmLrtEQMdUHC # DzS4iJ3IIvETatsYL254rcQFtOiECJMH+X2D/miYNOR35bHOjJRs2wNtKAVHfpsu # 8GT726QDMRB8Gvs8GYDRC3C5VV9HvjlkzrfaI1Qy40ayMtjSKYbJFV2Ala8C+7TR # Lp04fDXgDxztG0dInCJqVYLZ8roIZQPl8SnzSIoJAUymefKithqZlOuXKOG+fRuh # fO1WgKb0IjOQ5IRT/Cr6wKeXqOq1jXrO5OBLoTOrC3ag1WkWt45mv1/6H8Sof6eh # SBSRDYL8vU2Z7cnmbDb+d0OZuGktfGEv7aOwSf5bvmkkkf+T/FdpkkvZBT9thnLT # otDAZNI6QsEaA/vQ7ZohuD+vprJRVNVMxcofEo1XxjntXP/snyZ2rWRmZ+iqMODS # rbd9sWpBJ24DiqN04IoJgm6/4/a3vJ4LKRhogaGcP24WWUsUCQma5q6/YBXdhvUw # ggbsMIIE1KADAgECAhAwD2+s3WaYdHypRjaneC25MA0GCSqGSIb3DQEBDAUAMIGI # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVy # c2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UE # AxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xOTA1 # MDIwMDAwMDBaFw0zODAxMTgyMzU5NTlaMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQI # ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT # D1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFt # cGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMgbAa/ZLH6I # mX0BmD8gkL2cgCFUk7nPoD5T77NawHbWGgSlzkeDtevEzEk0y/NFZbn5p2QWJgn7 # 1TJSeS7JY8ITm7aGPwEFkmZvIavVcRB5h/RGKs3EWsnb111JTXJWD9zJ41OYOioe # /M5YSdO/8zm7uaQjQqzQFcN/nqJc1zjxFrJw06PE37PFcqwuCnf8DZRSt/wflXMk # PQEovA8NT7ORAY5unSd1VdEXOzQhe5cBlK9/gM/REQpXhMl/VuC9RpyCvpSdv7Qg # sGB+uE31DT/b0OqFjIpWcdEtlEzIjDzTFKKcvSb/01Mgx2Bpm1gKVPQF5/0xrPnI # hRfHuCkZpCkvRuPd25Ffnz82Pg4wZytGtzWvlr7aTGDMqLufDRTUGMQwmHSCIc9i # VrUhcxIe/arKCFiHd6QV6xlV/9A5VC0m7kUaOm/N14Tw1/AoxU9kgwLU++Le8bwC # KPRt2ieKBtKWh97oaw7wW33pdmmTIBxKlyx3GSuTlZicl57rjsF4VsZEJd8GEpoG # LZ8DXv2DolNnyrH6jaFkyYiSWcuoRsDJ8qb/fVfbEnb6ikEk1Bv8cqUUotStQxyk # SYtBORQDHin6G6UirqXDTYLQjdprt9v3GEBXc/Bxo/tKfUU2wfeNgvq5yQ1TgH36 # tjlYMu9vGFCJ10+dM70atZ2h3pVBeqeDAgMBAAGjggFaMIIBVjAfBgNVHSMEGDAW # gBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUGqH4YRkgD8NBd0UojtE1 # XwYSBFUwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0l # BAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBD # oEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZp # Y2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKG # M2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENB # LmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkq # hkiG9w0BAQwFAAOCAgEAbVSBpTNdFuG1U4GRdd8DejILLSWEEbKw2yp9KgX1vDsn # 9FqguUlZkClsYcu1UNviffmfAO9Aw63T4uRW+VhBz/FC5RB9/7B0H4/GXAn5M17q # oBwmWFzztBEP1dXD4rzVWHi/SHbhRGdtj7BDEA+N5Pk4Yr8TAcWFo0zFzLJTMJWk # 1vSWVgi4zVx/AZa+clJqO0I3fBZ4OZOTlJux3LJtQW1nzclvkD1/RXLBGyPWwlWE # ZuSzxWYG9vPWS16toytCiiGS/qhvWiVwYoFzY16gu9jc10rTPa+DBjgSHSSHLeT8 # AtY+dwS8BDa153fLnC6NIxi5o8JHHfBd1qFzVwVomqfJN2Udvuq82EKDQwWli6YJ # /9GhlKZOqj0J9QVst9JkWtgqIsJLnfE5XkzeSD2bNJaaCV+O/fexUpHOP4n2HKG1 # qXUfcb9bQ11lPVCBbqvw0NP8srMftpmWJvQ8eYtcZMzN7iea5aDADHKHwW5NWtMe # 6vBE5jJvHOsXTpTDeGUgOw9Bqh/poUGd/rG4oGUqNODeqPk85sEwu8CgYyz8XBYA # qNDEf+oRnR4GxqZtMl20OAkrSQeq/eww2vGnL8+3/frQo4TZJ577AWZ3uVYQ4SBu # xq6x+ba6yDVdM3aO8XwgDCp3rrWiAoa6Ke60WgCxjKvj+QrJVF3UuWp0nr1Irpgx # ggQtMIIEKQIBATCBkjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBN # YW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExp # bWl0ZWQxJTAjBgNVBAMTHFNlY3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgQ0ECEQCQ # OX+a0ko6E/K9kV8IOKlDMA0GCWCGSAFlAwQCAgUAoIIBazAaBgkqhkiG9w0BCQMx # DQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIzMDIyMjA1MTEzMlowPwYJ # KoZIhvcNAQkEMTIEMFiC6e99yJdv28ET9wLmp5NERNo6Hsmd9VjyiIg0Ddsb0T2n # hve6f/fp0d9KZ0kUgjCB7QYLKoZIhvcNAQkQAgwxgd0wgdowgdcwFgQUqzQBOqxA # lzGfCBrwsxjhg/gPeIEwgbwEFALWW5Xig3DBVwCV+oj5I92Tf62PMIGjMIGOpIGL # MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxML # SmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwG # A1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQIQMA9v # rN1mmHR8qUY2p3gtuTANBgkqhkiG9w0BAQEFAASCAgCOmuCKr9D3hPzkDwyM9Afd # MtVJx0YiDl8snfKxwaTKts7HHvgAgWedc7FmzhJpfTZT2Iw6Sdk3z2M9lctU5tzI # +yvm94Fcdk3IK5ZIBPD7AvMbKMeSM95NRT1ORQw2uJNZZhZxDAEHM3a++zHL/qNx # g8Fznho6a+5aJXu5JeFXQrgs+k/1Ol16rr5PMU1AGPNWhJhZQwI63bW1r1z+VBu1 # 5zw+yY+x0FKC56TYEGFgdm/cYBEB+fMGoKXUQzAgpm+l6YYdaBY5EOptIMLDF+uP # N1O6yS42MB+YdLEWGK5Cunj5VJTmIxa8haTNQQT+hI+yc1IuTWZEdiGT+N/Rp/VA # xRlm85R5HIVWafZTJLKC8Hfp8/sOypyGX0VqevWe17hkDmyIU0cNemfF0jwcScI9 # ZSPacXIchEsT7TbKvhfonILHZ7nVyPa7772KRcEuvy9bblWPXyNkj/0eC7wyO1Q+ # eLh6KCSvyjC4FfKSDzExGva+DgTXCNZVOqPIELHMoABgb+NZWi8RhuvCmrKRNboJ # sGF6fsbWhu0qBITn9/lzxev+zLKSadxxnDGAuZ3QiN2D7L5kYvfDxqZkO7QYqqhq # HCHuYzWp/3VT9mn/gHkcIgeYVW4kH8p4FFo9hOQenZAlN58Y53Ospp7+rCEM6G5U # cGmRN3JrxHpGZxOsKoxlVw== # SIG # End signature block |