HelperFunctions.psm1
function RequireConnectAadSupport() { if(-not $Global:AadSupport.Session.Active) { Write-Host "Please run 'Connect-AadSupport' first." -ForegroundColor Yellow throw "Running 'Connect-AadSupport' required" } } function GetTokenForMsGraph { # Get Access Token $result = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.MsGraph ` -ClientId $Global:AadSupport.Clients.AzurePowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzurePowershell.RedirectUri ` -UserId $Global:AadSupport.Session.AccountId ` -SkipServicePrincipalSearch ` -HideOutput # Throw error if can't get Access Token if($result.Error) { throw $result.Error } # Return Access Token return $result.AccessToken } function GetTokenForAadGraph { # Get Access Token $result = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.AadGraph ` -ClientId $Global:AadSupport.Clients.AzurePowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzurePowershell.RedirectUri ` -UserId $Global:AadSupport.Session.AccountId ` -SkipServicePrincipalSearch ` -HideOutput # Throw error if can't get Access Token if($result.Error) { throw $result.Error } # Return Access Token return $result.AccessToken } function Load-AadSupportAdalAssembly { param( [string]$AdalPath = $Global:AadSupportAdalPath ) #Attempt to load the assemblies. Without these we cannot continue so we need the user to stop and take an action Try { $Params = @{ PSScriptRoot = $PSScriptRoot AadSupportAdalPath = $Global:AadSupportAdalPath } Invoke-AdalCommand -Command { Param($Params) [System.Reflection.Assembly]::LoadFrom($Params.AadSupportAdalPath) | Out-Null } -Parameters $Params Invoke-AdalCommand -Command { Param($Params) . "$($Params.PSScriptRoot)\Adal.Class.ps1" } -Parameters $Params } Catch { Write-Warning "Unable to load ADAL assemblies.`nUpdate the AzureAd module by running Install-Module AzureAd -Force -AllowClobber" } } function Write-ObjectToHost { [cmdletbinding()] param( # PowerShell Object to write all Properties to Host [Parameter(Mandatory=$True,Position=0,ValueFromPipeline = $true)] [psobject] $InputObject, $Depth=0 ) $Type = $InputObject.GetType().Name if($Type -eq "Hashtable" -or $Type -eq "OrderedDictionary") { $InputObject = New-Object -TypeName PSObject -Property $InputObject } $Indent = "" for($i=0; $i -lt $Depth; $i++) { $Indent = $Indent + " " } foreach($object in $InputObject) { $Members = $object | Get-Member ForEach($Member in $Members) { if($Member.MemberType -eq "NoteProperty" -or $Member.MemberType -eq "Property") { Write-Host "$Indent $($Member.Name) : " -NoNewline -ForegroundColor Yellow if($InputObject.($Member.Name) -match "Collections") { $Depth++ Write-Host "" Write-ObjectToHost $Object.($Member.Name) -Depth $Depth } else { Write-Host $Object.($Member.Name) } } } Write-Host "" } } function Show-AadSupportStatusBar { if(!$Global:AadSupport.StatusBar) { $Global:AadSupport.StatusBar = 0 } if($Global:AadSupport.StatusBar % 10 -eq 0) { Write-Host "." -ForegroundColor Yellow -NoNewline $Global:AadSupport.StatusBar = 0 } $Global:AadSupport.StatusBar++ } function GetAadSpAppRoles { param( [string]$ClientObjectId, [AllowNull()][string]$ResourceObjectId ) $ServiceAppRoleAssignedTo = Invoke-AadCommand -Command { Param($ClientObjectId) Get-AzureADServiceAppRoleAssignedTo -All $true -ObjectId $ClientObjectId } -Parameters $ClientObjectId if($ResourceObjectId) { $ResourceSp = Get-AadServicePrincipal -Id $ResourceObjectId $CurrentAppRoles = $ServiceAppRoleAssignedTo | where {$_.ResourceId -eq $ResourceObjectId} } else { $CurrentAppRoles = $ServiceAppRoleAssignedTo } # Out-put current App Roles if ($CurrentAppRoles) { $AppRolesView = @() foreach($AppRole in $CurrentAppRoles) { $Resource = Get-AadServicePrincipal -Id $AppRole.ResourceId $AppRolesView += [PSCustomObject]@{ RoleId = $AppRole.Id RoleValue = ($Resource.AppRoles | where {$_.Id -eq $AppRole.Id}).Value RoleAssignedId = $AppRole.ObjectId ResourceDisplayName = $AppRole.ResourceDisplayName } } return $AppRolesView } return } # ############################################################################ Function Convert-AadThumbprintToByteArray { [cmdletbinding()] param( [parameter(Mandatory=$true)] [String] $Thumbprint ) Write-Verbose "Converting thumbrpint '$Thumbprint' to ByteArray" $Bytes = [byte[]]::new($Thumbprint.Length / 2) For($i=0; $i -lt $Thumbprint.Length; $i+=2){ $Bytes[$i/2] = [convert]::ToByte($Thumbprint.Substring($i, 2), 16) } return $Bytes } # ############################################################################ Function Convert-ByteArrayToThumbprint { [cmdletbinding()] param( [parameter(Mandatory=$true)] [Byte[]] $Bytes ) $Thumbprint = [System.Text.StringBuilder]::new($Bytes.Length * 2) ForEach($byte in $Bytes){ $Thumbprint.AppendFormat("{0:x2}", $byte) | Out-Null } return $Thumbprint.ToString() } function Base64UrlEncode($Value) { return $Value.Replace("=", [String]::Empty).Replace('+', '-').Replace('/', '_') } function Base64UrlDecode($Value) { while($Value.Length % 4 -ne 0) { $Value += "=" } return $Value.Replace('-', '+').Replace('_', '/') } function ConvertFrom-Base64String { param ( [Parameter(Mandatory=$true)] [string]$base64string ) return [System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string))) } <# EXAMPLE USAGE $MyParams = @{ UserId = $AccountId } Invoke-AadCommand -Command { Param($params) Get-AzureADUser -ObjectId $params.UserId } -Parameters $MyParams #> function Invoke-AadCommand { [CmdletBinding()] Param( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] [ScriptBlock]$Command, $Parameters ) "Invoking Azure AD Runspace..." | Log-AadSupport $Command | Log-AadSupport if($Parameters) { "Params for Command..." | Log-AadSupport $Parameters | Log-AadSupport } $Error.Clear() if(-not $Global:AadSupport.Session.Active) { Write-Host "Need to run Connect-AadSupport" -ForegroundColor Yellow throw "Not Authenticated Yet." } if(!$AccountId) { $AccountId = "" } # Get Token for AAD Graph to be used for Azure AD PowerShell $token = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.AadGraph ` -ClientId $Global:AadSupport.Clients.AzureAdPowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzureAdPowershell.RedirectUri ` -Tenant $Global:AadSupport.Session.TenantId ` -UserId $Global:AadSupport.Session.AccountId ` -Prompt "Never" ` -SkipServicePrincipalSearch ` -HideOutput $AadAccessToken = $token.AccessToken $token = $null # Get Token for MS Graph to be used for Azure AD PowerShell $token = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.MsGraph ` -ClientId $Global:AadSupport.Clients.AzureAdPowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzureAdPowershell.RedirectUri ` -Tenant $Global:AadSupport.Session.TenantId ` -UserId $Global:AadSupport.Session.AccountId ` -Prompt "Never" ` -SkipServicePrincipalSearch ` -HideOutput $MsGraphAccessToken = $token.AccessToken $ErrorHandlingBegin = { $Error.Clear() } $ErrorHandlingEnd = { return $Error } $ConnectParams = @{ TenantId = $Global:AadSupport.Session.TenantId AzureEnvironmentName = $Global:AadSupport.Session.AzureEnvironmentName LogLevel = "Info" LogFilePath = "c:\AadSupportLogs\" AadAccessToken = $AadAccessToken MsAccessToken = $MsGraphAccessToken AccountId =$Global:AadSupport.Session.AccountId } Write-Verbose "Connect Parameters..." Write-Verbose $ConnectParams | ConvertTo-Json -Depth 99 # IMPORT LOGGING IN RUNSPACE $GlobalParams = $Global:AadSupport $Global:AadCommandResult = $null $ScriptBlock = { Param( $ConnectParams, $AadCommand, $AadCommandParams, $AadSupport ) Write-Verbose "Running Connect-AzureAd" # Connect to AAD PowerShell Module $session = Connect-AzureAd ` -TenantId $ConnectParams.TenantId ` -AzureEnvironmentName $ConnectParams.AzureEnvironmentName ` -LogLevel $ConnectParams.LogLevel ` -LogFilePath $ConnectParams.LogPath ` -AadAccessToken $ConnectParams.AadAccessToken ` -MsAccessToken $ConnectParams.MsAccessToken ` -AccountId $ConnectParams.AccountId # Run the AAD PowerShell Command $Command = [scriptblock]::Create($AadCommand) $Results = Invoke-Command -ScriptBlock $Command -ArgumentList $AadCommandParams $Return = $results | ConvertTo-Json -Depth 99 return $Return } $Job = Start-Job -ScriptBlock $ScriptBlock -ArgumentList $ConnectParams, $Command, $Parameters, $Global:AadSupport $Results = $Job | Wait-Job | Receive-Job | ConvertFrom-Json return $Results } function Invoke-AadSupportRunspace { [CmdletBinding()] Param( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] $Command, $Parameters, $Runspace ) Write-Host "Starting Runspace" "Invoking ADAL Runspace with Command..." | Log-AadSupport $Command | Log-AadSupport if($Parameters) { "Params for Command..." | Log-AadSupport $Parameters | Log-AadSupport } $ErrorHandlingBegin = { $Error.Clear() } $ErrorHandlingEnd = { $Error } # Setup Runspace $RunspaceName = "AadSupportRunspace" $PowerShell = [powershell]::Create() $PowerShell.runspace = $Runspace.Instance $PowerShell.runspace.Name = $RunspaceName $RunspaceState = $PowerShell.runspace.RunspaceStateInfo.State if($RunspaceState -eq "BeforeOpen") { $PowerShell.runspace = $PowerShell.runspace.Open() } # Clear errors in runspace [void]$PowerShell.AddScript($ErrorHandlingBegin) # IMPORT LOGGING IN RUNSPACE $PowerShell.runspace.SessionStateProxy.SetVariable('GlobalParams',$Global:AadSupport) [void]$PowerShell.AddScript({ $ImportLogging = "$($GlobalParams.Path)\LoggingFunctions.ps1" . $ImportLogging }) $PowerShell.Invoke() $PowerShell.Commands.Clear() # Lets start running our 'calling' commands in Runspace # Run Command Write-Host "$($PowerShell.runspace.RunspaceStateInfo.State)" -ForegroundColor Yellow [void]$PowerShell.AddScript($Command).AddArgument($Parameters) $RunCommand = $PowerShell.BeginInvoke() $PowerShell.Commands.Clear() # Get Errors inside runspace [void]$PowerShell.AddScript($ErrorHandlingEnd) $ErrorInsideRunspace = $PowerShell.Invoke() $PowerShell.Dispose() if($RunCommand) { $RunCommand | Log-AadSupport Write-Host "Runspace Complete" return $RunCommand } if($ErrorInsideRunspace) { $ErrorInsideRunspace | Log-AadSupport -Force Write-Host "Runspace Errors" return $ErrorInsideRunspace } Write-Host "Runspace unknown failure" } function Invoke-AdalCommand { [CmdletBinding()] Param( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] $Command, $Parameters ) "Invoking ADAL Runspace with Command..." | Log-AadSupport $Command | Log-AadSupport if($Parameters) { "Params for Command..." | Log-AadSupport $Parameters | Log-AadSupport } $ErrorHandlingBegin = { $Error.Clear() } $ErrorHandlingEnd = { $Error } # Setup Runspace $RunspaceName = "AadSupportAdal" $PowerShell = [powershell]::Create() IF(-not $Global:AadSupportAdalRunspace) { $Global:AadSupportAdalRunspace = [runspacefactory]::CreateRunspace() } $PowerShell.runspace = $Global:AadSupportAdalRunspace #$PowerShell.runspace = $Global:AadSupport.Runspace.Adal.Instance $PowerShell.runspace.Name = $RunspaceName $RunspaceState = $PowerShell.runspace.RunspaceStateInfo.State if($RunspaceState -eq "BeforeOpen") { $PowerShell.runspace = $PowerShell.runspace.Open() } # Clear errors in runspace [void]$PowerShell.AddScript($ErrorHandlingBegin) # IMPORT LOGGING IN RUNSPACE $PowerShell.runspace.SessionStateProxy.SetVariable('GlobalParams',$Global:AadSupport) [void]$PowerShell.AddScript({ $ImportLogging = "$($GlobalParams.Path)\LoggingFunctions.ps1" . $ImportLogging }) $PowerShell.Invoke() $PowerShell.Commands.Clear() # Run Command [void]$PowerShell.AddScript($Command).AddArgument($Parameters) $RunCommand = $PowerShell.Invoke() $PowerShell.Commands.Clear() # Get Errors inside runspace [void]$PowerShell.AddScript($ErrorHandlingEnd) $ErrorInsideRunspace = $PowerShell.Invoke() $PowerShell.Dispose() if($RunCommand) { $RunCommand | Log-AadSupport return $RunCommand } if($ErrorInsideRunspace) { $ErrorInsideRunspace | Log-AadSupport -Force return $ErrorInsideRunspace } } <# TEST #> <# $Params = @{} $MyCommand = { Param($params) try { return "TEST" $result = $Global:AdalContext.AcquireToken($params.ResourceId,$params.ClientId,$params.Redirect,$params.Prompt,$params.UserId, $params.ExtraQueryParams) } catch { $_ } return $result.AccessToken } $myvar = $null Invoke-AdalCommand -Command $MyCommand -Parameters $Params -OutVariable $myvar $var #> <# EXAMPLE USAGE $MyParams = @{ UserId = $AccountId } Invoke-AadCommand -Command { Param($params) Get-AzureADUser -ObjectId $params.UserId } -Parameters $MyParams #> function Invoke-AzureCommand { [CmdletBinding()] Param( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] $Command, $Parameters, $SubscriptionId ) "Invoking Azure PSH... Runspace ID:" + $($Global:AadSupport.Runspace.AzureAd.Instance.Id) | Log-AadSupport $Command | Log-AadSupport if($Parameters) { "Params for Command..." | Log-AadSupport $Parameters | Log-AadSupport } if($SubscriptionId) { "Azure Subscription ID..." | Log-AadSupport $SubscriptionId | Log-AadSupport } $Error.Clear() # Get Token for AAD Graph to be used for Azure PowerShell $AadToken = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.AadGraph ` -ClientId $Global:AadSupport.Clients.AzureAdPowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzureAdPowershell.RedirectUri ` -Tenant $Global:AadSupport.Session.TenantId ` -UserId $Global:AadSupport.Session.AccountId ` -Prompt "Auto" ` -SkipServicePrincipalSearch ` -HideOutput # Get Token for Azure Graph to be used for Azure PowerShell $AzureToken = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.AzureServiceApi ` -ClientId $Global:AadSupport.Clients.AzurePowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzurePowershell.RedirectUri ` -Tenant $Global:AadSupport.Session.TenantId ` -UserId $Global:AadSupport.Session.AccountId ` -Prompt "Auto" ` -SkipServicePrincipalSearch ` -HideOutput $AzureGraphToken = Get-AadTokenUsingAdal ` -ResourceId $Global:AadSupport.Resources.AzureRmApi ` -ClientId $Global:AadSupport.Clients.AzurePowershell.ClientId ` -Redirect $Global:AadSupport.Clients.AzurePowershell.RedirectUri ` -Tenant $Global:AadSupport.Session.TenantId ` -UserId $Global:AadSupport.Session.AccountId ` -Prompt "Auto" ` -SkipServicePrincipalSearch ` -HideOutput if($token.Error) { return "Run Connect-AadSupport" } $AadAccessToken = $AadToken.AccessToken $AzureAccessToken = $AzureToken.AccessToken $AzureGraphAccessToken = $AzureGraphToken.AccessToken $ErrorHandlingBegin = { $Error.Clear() } $ErrorHandlingEnd = { $Error } $ConnectParams = @{ TenantId = $Global:AadSupport.Session.TenantId AzureEnvironmentName = $Global:AadSupport.Session.AzureEnvironmentName AadAccessToken = $AadAccessToken GraphAccessToken = $AzureGraphAccessToken AzureAccessToken = $AzureAccessToken AccountId = $Global:AadSupport.Session.AccountId SubscriptionId = $SubscriptionId } $ConnectCommand = { Param($Params) Clear-AzContext -Force $AzureSession = Connect-AzAccount ` -AccessToken $Params.AzureAccessToken ` -GraphAccessToken $Params.AadAccessToken ` -AccountId $Params.AccountId ` -Tenant $Params.TenantId return $AzureSession } $ConnectCommandWithSubscription = { Param($Params) Clear-AzContext -Force $AzureSession = Connect-AzAccount ` -AccessToken $Params.AzureAccessToken ` -GraphAccessToken $Params.AadAccessToken ` -AccountId $Params.AccountId ` -Tenant $Params.TenantId ` -Subscription $Params.SubscriptionId return $AzureSession } # Set up runspace $PowerShell = [powershell]::Create() $PowerShell.runspace = $Global:AadSupport.Runspace.AzureAd.Instance $RunspaceState = $Global:AadSupport.Runspace.AzureAd.Instance.RunspaceStateInfo.State if($RunspaceState -eq "BeforeOpen") { $PowerShell.runspace = $Global:AadSupport.Runspace.AzureAd.Instance.Open() } # IMPORT LOGGING IN RUNSPACE [void]$PowerShell.AddScript($ErrorHandlingBegin) $PowerShell.runspace.SessionStateProxy.SetVariable('GlobalParams',$Global:AadSupport) [void]$PowerShell.AddScript({ $ImportLogging = "$($GlobalParams.Path)\LoggingFunctions.ps1" . $ImportLogging }) $PowerShell.Invoke() $PowerShell.Commands.Clear() # Connect to Azure (Connect-AzAccountd) #$SessionAzureGraphAccessToken = $Global:AadSupport.Session.AzureGraphAccessToken #$SessionAzureAccessToken = $Global:AadSupport.Session.AzureAccessToken #$SessionAadAccessToken = $Global:AadSupport.Session.AadAccessToken #if($SessionAzureGraphAccessToken -ne $AzureGraphAccessToken -and $SessionAzureGraphAccessToken -ne $AzureAccessToken -and $SessionAadAccessToken -ne $AadAccessToken) #{ if($SubscriptionId) { [void]$PowerShell.AddScript($ConnectCommandWithSubscription).AddArgument($ConnectParams) } else { [void]$PowerShell.AddScript($ConnectCommand).AddArgument($ConnectParams) } $RunConnectAzureAd = $PowerShell.Invoke() $PowerShell.Commands.Clear() #} # Update our cached access tokens #$Global:AadSupport.Session.AzureGraphAccessToken = $SessionAzureGraphAccessToken #$Global:AadSupport.Session.AzureAccessToken = $SessionAzureAccessToken #$Global:AadSupport.Session.AadAccessToken = $SessionAadAccessToken # Run command [void]$PowerShell.AddScript($Command).AddArgument($Parameters) $RunCommand = $PowerShell.Invoke() $PowerShell.Commands.Clear() # Get errors in runspace [void]$PowerShell.AddScript($ErrorHandlingEnd) $ErrorInsideRunspace = $PowerShell.Invoke() $PowerShell.Commands.Clear() if($RunCommand) { $RunCommand | Log-AadSupport return $RunCommand } if($ErrorInsideRunspace) { $ErrorInsideRunspace | Log-AadSupport -Force throw $ErrorInsideRunspace } } function Invoke-MSOnlineCommand { param ( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] $Command, $Parameters ) "Invkoking MsOnline PSH" | Log-AadSupport $Command | Log-AadSupport if($Parameters) { "Params for Command..." | Log-AadSupport $Parameters | Log-AadSupport } $ConnectState = $Global:AadSupport.Runspace.MSOnline.Connected if(-not $ConnectState -and $Command -ne "Connect-MsolService") { try { Invoke-MSOnlineCommand -Command "Connect-MsolService" } catch { throw $_ } $Global:AadSupport.Runspace.MSOnline.Connected = $true } $PowerShell = [powershell]::Create() $PowerShell.runspace = $Global:AadSupport.Runspace.MSOnline.Instance $RunspaceState = $Global:AadSupport.Runspace.MSOnline.Instance.RunspaceStateInfo.State if($RunspaceState -eq "BeforeOpen") { $PowerShell.runspace = $Global:AadSupport.Runspace.MSOnline.Instance.Open() } # IMPORT LOGGING IN RUNSPACE $PowerShell.runspace.SessionStateProxy.SetVariable('GlobalParams',$Global:AadSupport) [void]$PowerShell.AddScript({ $ImportLogging = "$($GlobalParams.Path)\LoggingFunctions.ps1" . $ImportLogging }) $PowerShell.Invoke() $PowerShell.Commands.Clear() # Run command [void]$PowerShell.AddScript($Command).AddArgument($Parameters) $RunCommand = $PowerShell.Invoke() $PowerShell.Commands.Clear() # Get errors in runspace [void]$PowerShell.AddScript($ErrorHandlingEnd) $ErrorInsideRunspace = $PowerShell.Invoke() $PowerShell.Commands.Clear() if($RunCommand) { $RunCommand | Log-AadSupport return $RunCommand } if($ErrorInsideRunspace) { $ErrorInsideRunspace | Log-AadSupport -Force return $ErrorInsideRunspace } $PowerShell.Dispose() } function Log-AadSupport { Param( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] [AllowNull()] $Message="", [switch]$Force ) if(-not $Message) { return } if($Message) { if($Force) { Write-Verbose $Message Log-AadSupportMessage -Message $Message -Force } else { Write-Verbose $Message Log-AadSupportMessage -Message $Message } } } function Log-AadSupportMessage { Param( [Parameter( mandatory=$true, Position=0, ValueFromPipeline = $true )] $Message, [switch]$Force ) if(-not $Message) { return } if(-not $GlobalParams -and $Global:AadSupport) { $GlobalParams = $Global:AadSupport } if($GlobalParams.Logging.Enabled -or $Force) { if($Message.GetType().ToString() -eq "System.Collections.Hashtable") { $Message = $Message | ConvertTo-Json } $LogFileName = $GlobalParams.Logging.FileName $LogPath = $GlobalParams.Logging.Path $Now = (Get-Date).ToUniversalTime() $Utc = Get-Date $Now -Format o $date = ($Utc).Replace(":","-").Replace(".","_") if(-not $LogFileName) { $LogFileName = "$($date.ToString()).txt" New-Item -Path $LogPath -Name $LogFileName -ItemType "file" -Force | Out-Null $GlobalParams.Logging.FileName = $LogFileName } $FullPath = "$LogPath/$LogFileName" Add-Content -Path $FullPath -Value "$date | " -Force -NoNewline Add-Content -Path $FullPath -Value $Message -Force } } # SIG # Begin signature block # MIIjnAYJKoZIhvcNAQcCoIIjjTCCI4kCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC3NOjSXxJhSKSt # lP/A4TMF2DUCTo88cOLj7e8bEj1g66CCDYEwggX/MIID56ADAgECAhMzAAAB32vw # LpKnSrTQAAAAAAHfMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAxMjE1MjEzMTQ1WhcNMjExMjAyMjEzMTQ1WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC2uxlZEACjqfHkuFyoCwfL25ofI9DZWKt4wEj3JBQ48GPt1UsDv834CcoUUPMn # s/6CtPoaQ4Thy/kbOOg/zJAnrJeiMQqRe2Lsdb/NSI2gXXX9lad1/yPUDOXo4GNw # PjXq1JZi+HZV91bUr6ZjzePj1g+bepsqd/HC1XScj0fT3aAxLRykJSzExEBmU9eS # yuOwUuq+CriudQtWGMdJU650v/KmzfM46Y6lo/MCnnpvz3zEL7PMdUdwqj/nYhGG # 3UVILxX7tAdMbz7LN+6WOIpT1A41rwaoOVnv+8Ua94HwhjZmu1S73yeV7RZZNxoh # EegJi9YYssXa7UZUUkCCA+KnAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUOPbML8IdkNGtCfMmVPtvI6VZ8+Mw # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDYzMDA5MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAnnqH # tDyYUFaVAkvAK0eqq6nhoL95SZQu3RnpZ7tdQ89QR3++7A+4hrr7V4xxmkB5BObS # 0YK+MALE02atjwWgPdpYQ68WdLGroJZHkbZdgERG+7tETFl3aKF4KpoSaGOskZXp # TPnCaMo2PXoAMVMGpsQEQswimZq3IQ3nRQfBlJ0PoMMcN/+Pks8ZTL1BoPYsJpok # t6cql59q6CypZYIwgyJ892HpttybHKg1ZtQLUlSXccRMlugPgEcNZJagPEgPYni4 # b11snjRAgf0dyQ0zI9aLXqTxWUU5pCIFiPT0b2wsxzRqCtyGqpkGM8P9GazO8eao # mVItCYBcJSByBx/pS0cSYwBBHAZxJODUqxSXoSGDvmTfqUJXntnWkL4okok1FiCD # Z4jpyXOQunb6egIXvkgQ7jb2uO26Ow0m8RwleDvhOMrnHsupiOPbozKroSa6paFt # VSh89abUSooR8QdZciemmoFhcWkEwFg4spzvYNP4nIs193261WyTaRMZoceGun7G # CT2Rl653uUj+F+g94c63AhzSq4khdL4HlFIP2ePv29smfUnHtGq6yYFDLnT0q/Y+ # Di3jwloF8EWkkHRtSuXlFUbTmwr/lDDgbpZiKhLS7CBTDj32I0L5i532+uHczw82 # oZDmYmYmIUSMbZOgS65h797rj5JJ6OkeEUJoAVwwggd6MIIFYqADAgECAgphDpDS # 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/BvW1taslScxMNelDNMYIVcTCCFW0CAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAd9r8C6Sp0q00AAAAAAB3zAN # BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg9tETE2oQ # SbVlNAqc7OIjde1rh+dQesF7FV9UFXmQcUowQgYKKwYBBAGCNwIBDDE0MDKgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN # BgkqhkiG9w0BAQEFAASCAQAq0clLoNdzj4UEDSEs5+RCGmIUrnekj9K8SrBdt5Bf # UvptjmbJcSgq8SnA0AxklN/NoVpSW/71E13p6qbGpaUHB3EZ+bOyMGcm9oXr4g2W # SWCAMhi3ykzOSUr9FTTRliL+9++Bhr79Wef6wBY13R/j/M13ISS+IT+EnvpVAR6e # dIxIYHMN0IDuA366UVZi+aizPdtCtzscy7RY0U9lheuY3XSU9RZkaKIZqdJwJXwb # BTFB6QiUVPKiHNCFmVD1DIlnQPhIV8Hs0t3VeRM+kgk9B35/rK/ff2Mv1T4xOm5w # PDioLUlIo4/6K0A9lQyWPtuKP/noAO6ye76It1TECdl6oYIS+zCCEvcGCisGAQQB # gjcDAwExghLnMIIS4wYJKoZIhvcNAQcCoIIS1DCCEtACAQMxDzANBglghkgBZQME # AgEFADCCAVkGCyqGSIb3DQEJEAEEoIIBSASCAUQwggFAAgEBBgorBgEEAYRZCgMB # MDEwDQYJYIZIAWUDBAIBBQAEIGmKBkSYnhVrxFkWTRPrJYW9ouDzDcsuLrOfk7Yk # yLntAgZg1JCMzAsYEzIwMjEwNzA4MTczMTI5LjIyM1owBIACAfSggdikgdUwgdIx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhh # bGVzIFRTUyBFU046RDA4Mi00QkZELUVFQkExJTAjBgNVBAMTHE1pY3Jvc29mdCBU # aW1lLVN0YW1wIFNlcnZpY2Wggg5KMIIE+TCCA+GgAwIBAgITMwAAAUGvf1KXXPLc # RQAAAAABQTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMDAeFw0yMDEwMTUxNzI4MjdaFw0yMjAxMTIxNzI4MjdaMIHSMQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQg # SXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg # RVNOOkQwODItNEJGRC1FRUJBMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt # cCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8irLqL28 # dal+PJUmUJOwvYn/sOCEzQzZyj94XbFPtRhDhPjagvvKOv1GgMoOuXvkpM3uM5E6 # 7vyOCPxqhTAzq7Ak3zkEXXBv7JoM8Xm0x5UcnAkpUiEo0eycRl6bnYIB3KlZW3uz # 4Jc2v2FV0KCGkLrvqfKP8V/i2hVyN854OejWpx8wGUazM4CYUVowcgEDc76OY+Xa # 4W27DCZJm2f9ol4BjSL+b2L/T8n/LEGknaUxwSQTN1LQCt+uBDCASd6VQR5CLLJV # t6MBL0W1NlaWxEAJwlIdyBnS1ihLvRg1jc/KUZe0sRFdD3fhKrjPac3hoy007Fvr # 6Go0WJ4pr2rJdQIDAQABo4IBGzCCARcwHQYDVR0OBBYEFC0oPyxuLpD9RXBr9c8N # O0EFEsbEMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRP # ME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 # Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEww # SgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv # TWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0l # BAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEBAFJ63yJ92ChqCgpexD48 # okviGuC4ikNsvmwlCSet1sFpvJEzLJB8cTF4z4qQTz8AsQtcew6mAVmQCYDu9f5e # e11xXj1LwHYsZGnSs/OfRul1VKmY51OQpqvK5O/Ct4fs0Iblzo8eyOLJygTk97aX # VA4Uzq8GblL7LQ5XiwAY446MOALnNXFo/Kq9tvzipwY1YcRn/nlMQ+b92OiLLmHV # Mi2wAUORiKFvaAfYWjhQd+2qHLMsdpNluwBbWe7FF5ABsDo0HROMWyCgxdLQ3vqr # 3DMSH3ZWKiirFsvWJmchfZPGRObwqszvSXPFmPBZ9o+er+4UoLV+50GWnnQky7HV # gLkwggZxMIIEWaADAgECAgphCYEqAAAAAAACMA0GCSqGSIb3DQEBCwUAMIGIMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNy # b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0xMDA3MDEy # MTM2NTVaFw0yNTA3MDEyMTQ2NTVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqR0NvHcRijog7PwT # l/X6f2mUa3RUENWlCgCChfvtfGhLLF/Fw+Vhwna3PmYrW/AVUycEMR9BGxqVHc4J # E458YTBZsTBED/FgiIRUQwzXTbg4CLNC3ZOs1nMwVyaCo0UN0Or1R4HNvyRgMlhg # RvJYR4YyhB50YWeRX4FUsc+TTJLBxKZd0WETbijGGvmGgLvfYfxGwScdJGcSchoh # iq9LZIlQYrFd/XcfPfBXday9ikJNQFHRD5wGPmd/9WbAA5ZEfu/QS/1u5ZrKsajy # eioKMfDaTgaRtogINeh4HLDpmc085y9Euqf03GS9pAHBIAmTeM38vMDJRF1eFpwB # BU8iTQIDAQABo4IB5jCCAeIwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNVj # OlyKMZDzQ3t8RhvFM2hahW1VMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsG # A1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJc # YmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9z # b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz # LmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWlj # cm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0 # MIGgBgNVHSABAf8EgZUwgZIwgY8GCSsGAQQBgjcuAzCBgTA9BggrBgEFBQcCARYx # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL1BLSS9kb2NzL0NQUy9kZWZhdWx0Lmh0 # bTBABggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBQAG8AbABpAGMAeQBfAFMA # dABhAHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAB+aIUQ3ixuCY # P4FxAz2do6Ehb7Prpsz1Mb7PBeKp/vpXbRkws8LFZslq3/Xn8Hi9x6ieJeP5vO1r # VFcIK1GCRBL7uVOMzPRgEop2zEBAQZvcXBf/XPleFzWYJFZLdO9CEMivv3/Gf/I3 # fVo/HPKZeUqRUgCvOA8X9S95gWXZqbVr5MfO9sp6AG9LMEQkIjzP7QOllo9ZKby2 # /QThcJ8ySif9Va8v/rbljjO7Yl+a21dA6fHOmWaQjP9qYn/dxUoLkSbiOewZSnFj # nXshbcOco6I8+n99lmqQeKZt0uGc+R38ONiU9MalCpaGpL2eGq4EQoO4tYCbIjgg # tSXlZOz39L9+Y1klD3ouOVd2onGqBooPiRa6YacRy5rYDkeagMXQzafQ732D8OE7 # cQnfXXSYIghh2rBQHm+98eEA3+cxB6STOvdlR3jo+KhIq/fecn5ha293qYHLpwms # ObvsxsvYgrRyzR30uIUBHoD7G4kqVDmyW9rIDVWZeodzOwjmmC3qjeAzLhIp9cAv # VCch98isTtoouLGp25ayp0Kiyc8ZQU3ghvkqmqMRZjDTu3QyS99je/WZii8bxyGv # WbWu3EQ8l1Bx16HSxVXjad5XwdHeMMD9zOZN+w2/XU/pnR4ZOC+8z1gFLu8NoFA1 # 2u8JJxzVs341Hgi62jbb01+P3nSISRKhggLUMIICPQIBATCCAQChgdikgdUwgdIx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p # Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhh # bGVzIFRTUyBFU046RDA4Mi00QkZELUVFQkExJTAjBgNVBAMTHE1pY3Jvc29mdCBU # aW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAKrlvym1CquIoQcrzncL # vkD1WpUDoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJ # KoZIhvcNAQEFBQACBQDkkYN+MCIYDzIwMjEwNzA4MjIwMDMwWhgPMjAyMTA3MDky # MjAwMzBaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAOSRg34CAQAwBwIBAAICFHUw # BwIBAAICEWcwCgIFAOSS1P4CAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGE # WQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQBf # 03wxDUKRxZZg1FCqg6Gvfcrtwy1dS1YlrxMTMzFPezl4E1Ke7Xs1uW+7slKKXxJH # 3ZnzeJKZZ40wkAyLkTjSAqVx5QqT1CJ+RnY2O2CBSu9GvVRemLQkVEPBPhpup8Bq # KYQ3q/m7cqRCtnRU/9+rkVYFk/b8QGclJW2Mb7WPmDGCAw0wggMJAgEBMIGTMHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABQa9/Updc8txFAAAAAAFB # MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw # LwYJKoZIhvcNAQkEMSIEIJqhEv0vGa8NCfq3lsH3k64L8qDBF7o9PQQV4nBIqfNn # MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgUT8BPIzqc3SecHRPLKBtW0vO # OnT+78haWo+XcxVerd4wgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMAITMwAAAUGvf1KXXPLcRQAAAAABQTAiBCCU0h2ov0x/FBADtf3AlLh+i/Gc # gyqVycB32DiXDjJhITANBgkqhkiG9w0BAQsFAASCAQCa/AfZb7Z7WUr6OKGQU8Sm # uK26bmppuF0/Lfw4r0V0+wxShBxWVaY2+VHTxXBx6ySvEqRCf1VI/L4cY9kDz0VH # v1kbgVpTp7DBSZx0U7H+DOpFYBmjqKWDZkUBR9f16pF7lK7Q52weDY3Ige0bN9Ya # uIy2egAw77WKhruII2ECsAZrGq8wRnpWviaUv+8lYaV6p1NuTle5jnR7Az1SOwV3 # Rh59mIqbDercDt/P+l7X7VKOtQCxZ6nNsCsbcUBUm8iwcC0kJtHytvNo54PJjzak # 4rw9dRyY7AemyEGM1KdsI2t0Fewd+ngeHsen+/OLFope6HacEtGXxgtNaU77NSNa # SIG # End signature block |