public/Get-WindowsAutoRunOverview.ps1
|
function Get-WindowsAutoRunOverview { <# .SYNOPSIS Retrieves all autorun/startup applications and configurations from the Windows system. .DESCRIPTION Collects comprehensive information about all autorun locations on the system including: - Registry Run keys (HKLM and HKCU, including RunOnce and Policy Run keys) - Startup folders (All Users and Current User) - Scheduled tasks configured to run at computer startup (Machine scope - Boot triggers) - Scheduled tasks configured to run at user logon (User scope - Logon triggers) - Services set to automatic start - Active Setup registry entries - Winlogon registry keys (Userinit, Shell, VmApplet, AppSetup, System) - BootExecute registry entries - Group Policy startup/shutdown/logon/logoff scripts This function only retrieves data and returns it as objects. Use Get-WindowsAutoRunInventory to save the data to the system inventory JSON file. .OUTPUTS [PSCustomObject[]] Returns an array of autorun entries with properties: Name, Command, Location, RegistryPath, Scope, Type, Category .PARAMETER IncludeServices Include Windows Services that are set to Automatic start. Default is $false to reduce data volume. .PARAMETER IncludeScheduledTasks Include Scheduled Tasks that run at computer startup (Boot triggers) or user logon (Logon triggers). Default is $true. .EXAMPLE PS C:\> Get-WindowsAutoRunOverview Retrieves all autorun entries and returns them as objects .EXAMPLE PS C:\> Get-WindowsAutoRunOverview -IncludeServices Includes Windows Services set to automatic start in the results .EXAMPLE PS C:\> Get-WindowsAutoRunOverview | Where-Object { $_.Category -eq 'Registry' } Gets only registry-based autorun entries .EXAMPLE PS C:\> Get-WindowsAutoRunOverview | Where-Object { $_.Scope -eq 'Machine' } Gets only Machine scope entries (computer startup, not user logon) .EXAMPLE PS C:\> Get-WindowsAutoRunOverview | Where-Object { $_.Scope -eq 'User' } Gets only User scope entries (user logon tasks and registry) .EXAMPLE PS C:\> Get-WindowsAutoRunOverview | Export-Csv -Path C:\AutoRun.csv -NoTypeInformation Exports autorun data to CSV file .NOTES Function : Get-WindowsAutoRunOverview Author : John Billekens CoAuthor : GitHub Copilot Copyright : Copyright (c) John Billekens Consultancy Version : 2025.1116.1300 #> [CmdletBinding()] [OutputType([PSCustomObject[]])] param( [Parameter(Mandatory = $false)] [switch]$IncludeServices = $false, [Parameter(Mandatory = $false)] [switch]$IncludeScheduledTasks = $true ) begin { Write-Verbose "Starting $($MyInvocation.MyCommand)" # Define all registry run key locations $registryPaths = @( @{Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; Scope = "Machine"; Type = "Run" } @{Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"; Scope = "Machine"; Type = "RunOnce" } @{Path = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"; Scope = "Machine"; Type = "Run (32-bit)" } @{Path = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce"; Scope = "Machine"; Type = "RunOnce (32-bit)" } @{Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; Scope = "User"; Type = "Run" } @{Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"; Scope = "User"; Type = "RunOnce" } @{Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"; Scope = "Machine"; Type = "Shell Folders" } @{Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"; Scope = "Machine"; Type = "Shell Folders" } @{Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"; Scope = "User"; Type = "Shell Folders" } @{Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"; Scope = "User"; Type = "Shell Folders" } @{Path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run"; Scope = "Machine"; Type = "Policy Run" } @{Path = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run"; Scope = "User"; Type = "Policy Run" } @{Path = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components"; Scope = "Machine"; Type = "Active Setup" } ) # Startup folder locations $startupFolders = @( @{Path = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Startup"; Scope = "All Users" } @{Path = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup"; Scope = "Current User" } ) } process { try { $autoRunResults = @() # Collect Registry Run Keys Write-Verbose "Retrieving autorun entries from registry" foreach ($regPath in $registryPaths) { if (Test-Path $regPath.Path) { try { $regItems = Get-ItemProperty -Path $regPath.Path -ErrorAction SilentlyContinue if ($regItems) { $regItems.PSObject.Properties | Where-Object { $_.Name -notlike "PS*" } | ForEach-Object { Write-Verbose "Found registry entry: $($_.Name) in $($regPath.Path)" $autoRunResults += [PSCustomObject]@{ Name = $_.Name Command = $_.Value Location = "Registry" RegistryPath = $regPath.Path Scope = $regPath.Scope Type = $regPath.Type Category = "Registry" } } } } catch { Write-Warning "Unable to access registry path: $($regPath.Path) - $($_.Exception.Message)" } } } # Collect Startup Folder Items Write-Verbose "Retrieving autorun entries from startup folders" foreach ($folder in $startupFolders) { if (Test-Path $folder.Path) { try { $startupItems = Get-ChildItem -Path $folder.Path -File -ErrorAction SilentlyContinue foreach ($item in $startupItems) { Write-Verbose "Found startup item: $($item.Name) in $($folder.Path)" # For shortcuts, try to resolve target $command = "" if ($item.Extension -eq ".lnk") { try { $shell = New-Object -ComObject WScript.Shell $shortcut = $shell.CreateShortcut($item.FullName) $targetPath = $shortcut.TargetPath $arguments = $shortcut.Arguments $command = if ($arguments) { "$targetPath $arguments" } else { $targetPath } } catch { $command = $item.FullName } } else { $command = $item.FullName } $autoRunResults += [PSCustomObject]@{ Name = $item.Name Command = $command Location = "Startup Folder" RegistryPath = "" Scope = $folder.Scope Type = "Startup Folder" Category = "Startup Folder" } } } catch { Write-Warning "Unable to access startup folder: $($folder.Path) - $($_.Exception.Message)" } } } # Collect Scheduled Tasks (if enabled) if ($IncludeScheduledTasks) { Write-Verbose "Retrieving scheduled tasks configured for startup/logon" try { $tasks = Get-ScheduledTask -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Ready' -and ( $_.Triggers.CimClass.CimClassName -match 'MSFT_TaskBootTrigger|MSFT_TaskLogonTrigger' ) } foreach ($task in $tasks) { # Determine scope based on trigger type $trigger = $task.Triggers | Where-Object { $_.CimClass.CimClassName -match 'MSFT_TaskBootTrigger|MSFT_TaskLogonTrigger' } | Select-Object -First 1 $triggerType = $trigger.CimClass.CimClassName -replace 'MSFT_Task', '' -replace 'Trigger', '' # Boot triggers are Machine scope, Logon triggers are User scope $taskScope = if ($trigger.CimClass.CimClassName -eq 'MSFT_TaskBootTrigger') { "Machine" } else { "User" } Write-Verbose "Found scheduled task: $($task.TaskName) - Scope: $taskScope, Trigger: $triggerType" $action = $task.Actions | Select-Object -First 1 $command = if ($action.Execute) { if ($action.Arguments) { "$($action.Execute) $($action.Arguments)" } else { $action.Execute } } else { "" } $autoRunResults += [PSCustomObject]@{ Name = $task.TaskName Command = $command Location = "Scheduled Task" RegistryPath = $task.TaskPath Scope = $taskScope Type = "Scheduled Task ($triggerType)" Category = "Scheduled Task" } } } catch { Write-Warning "Unable to retrieve scheduled tasks: $($_.Exception.Message)" } } # Collect Windows Services (if enabled) if ($IncludeServices) { Write-Verbose "Retrieving Windows services set to automatic start" try { $services = Get-CimInstance -ClassName Win32_Service -Filter "StartMode='Auto' OR StartMode='Automatic'" -ErrorAction SilentlyContinue foreach ($service in $services) { Write-Verbose "Found service: $($service.Name)" $autoRunResults += [PSCustomObject]@{ Name = $service.Name Command = $service.PathName Location = "Service" RegistryPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$($service.Name)" Scope = "Machine" Type = "Service ($($service.StartMode))" Category = "Service" } } } catch { Write-Warning "Unable to retrieve services: $($_.Exception.Message)" } } # Collect Winlogon entries Write-Verbose "Retrieving Winlogon autorun entries" try { $winlogonPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" if (Test-Path $winlogonPath) { $winlogon = Get-ItemProperty -Path $winlogonPath -ErrorAction SilentlyContinue # Check critical Winlogon values $winlogonValues = @('Userinit', 'Shell', 'VmApplet', 'AppSetup', 'System') foreach ($valueName in $winlogonValues) { if ($winlogon.PSObject.Properties.Name -contains $valueName) { $value = $winlogon.$valueName if (-not [string]::IsNullOrWhiteSpace($value)) { Write-Verbose "Found Winlogon entry: $valueName = $value" $autoRunResults += [PSCustomObject]@{ Name = $valueName Command = $value Location = "Registry" RegistryPath = $winlogonPath Scope = "Machine" Type = "Winlogon" Category = "Registry" } } } } } } catch { Write-Warning "Unable to retrieve Winlogon entries: $($_.Exception.Message)" } # Collect BootExecute entries Write-Verbose "Retrieving BootExecute entries" try { $sessionManagerPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" if (Test-Path $sessionManagerPath) { $sessionManager = Get-ItemProperty -Path $sessionManagerPath -ErrorAction SilentlyContinue if ($sessionManager.PSObject.Properties.Name -contains 'BootExecute') { $bootExecute = $sessionManager.BootExecute if ($bootExecute) { # BootExecute can be a string or array $bootExecuteArray = if ($bootExecute -is [array]) { $bootExecute } else { @($bootExecute) } foreach ($item in $bootExecuteArray) { if (-not [string]::IsNullOrWhiteSpace($item)) { Write-Verbose "Found BootExecute entry: $item" $autoRunResults += [PSCustomObject]@{ Name = "BootExecute" Command = $item Location = "Registry" RegistryPath = $sessionManagerPath Scope = "Machine" Type = "BootExecute" Category = "Registry" } } } } } } } catch { Write-Warning "Unable to retrieve BootExecute entries: $($_.Exception.Message)" } # Collect GPO Startup/Shutdown Scripts Write-Verbose "Retrieving Group Policy startup and shutdown scripts" try { # Machine startup scripts $machineScriptsPath = "$env:SystemRoot\System32\GroupPolicy\Machine\Scripts\Startup" if (Test-Path $machineScriptsPath) { $scriptFiles = Get-ChildItem -Path $machineScriptsPath -File -ErrorAction SilentlyContinue foreach ($script in $scriptFiles) { Write-Verbose "Found GPO machine startup script: $($script.Name)" $autoRunResults += [PSCustomObject]@{ Name = $script.Name Command = $script.FullName Location = "GPO Script" RegistryPath = $machineScriptsPath Scope = "Machine" Type = "GPO Startup Script" Category = "GPO Script" } } } # Machine shutdown scripts $machineShutdownPath = "$env:SystemRoot\System32\GroupPolicy\Machine\Scripts\Shutdown" if (Test-Path $machineShutdownPath) { $scriptFiles = Get-ChildItem -Path $machineShutdownPath -File -ErrorAction SilentlyContinue foreach ($script in $scriptFiles) { Write-Verbose "Found GPO machine shutdown script: $($script.Name)" $autoRunResults += [PSCustomObject]@{ Name = $script.Name Command = $script.FullName Location = "GPO Script" RegistryPath = $machineShutdownPath Scope = "Machine" Type = "GPO Shutdown Script" Category = "GPO Script" } } } # User logon scripts $userScriptsPath = "$env:SystemRoot\System32\GroupPolicy\User\Scripts\Logon" if (Test-Path $userScriptsPath) { $scriptFiles = Get-ChildItem -Path $userScriptsPath -File -ErrorAction SilentlyContinue foreach ($script in $scriptFiles) { Write-Verbose "Found GPO user logon script: $($script.Name)" $autoRunResults += [PSCustomObject]@{ Name = $script.Name Command = $script.FullName Location = "GPO Script" RegistryPath = $userScriptsPath Scope = "User" Type = "GPO Logon Script" Category = "GPO Script" } } } # User logoff scripts $userLogoffPath = "$env:SystemRoot\System32\GroupPolicy\User\Scripts\Logoff" if (Test-Path $userLogoffPath) { $scriptFiles = Get-ChildItem -Path $userLogoffPath -File -ErrorAction SilentlyContinue foreach ($script in $scriptFiles) { Write-Verbose "Found GPO user logoff script: $($script.Name)" $autoRunResults += [PSCustomObject]@{ Name = $script.Name Command = $script.FullName Location = "GPO Script" RegistryPath = $userLogoffPath Scope = "User" Type = "GPO Logoff Script" Category = "GPO Script" } } } } catch { Write-Warning "Unable to retrieve GPO scripts: $($_.Exception.Message)" } # Return results Write-Verbose "AutoRun overview collection completed. Found $($autoRunResults.Count) entries." return $autoRunResults } catch { Write-Error "An error occurred during autorun overview collection: $($_.Exception.Message)" throw } } end { Write-Verbose "Completed $($MyInvocation.MyCommand)" } } # SIG # Begin signature block # MIImdwYJKoZIhvcNAQcCoIImaDCCJmQCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDZvM5jEqvg2b1v # 5YOYrfjUlhUws6vvy88Ik5WRmonWW6CCIAowggYUMIID/KADAgECAhB6I67aU2mW # D5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQK # Ew9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUg # U3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5 # WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYD # VQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjCCAaIwDQYJ # KoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y2ENBq26CK+z2M34mNOSJjNPvIhKA # VD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeYXIjfa3ajoW3cS3ElcJzkyZlBnwDE # JuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCxpectRGhhnOSwcjPMI3G0hedv2eNm # GiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY11XxM2AVZn0GiOUC9+XE0wI7CQKf # OUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+va8WxTlA+uBvq1KO8RSHUQLgzb1g # bL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fWlwBp6KNL19zpHsODLIsgZ+WZ1AzC # s1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+Gyn9/CRezKe7WNyxRf4e4bwUtrYE # 2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kOLIaFVhf5sMM/caEZLtOYqYadtn03 # 4ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwIDAQABo4IBXDCCAVgwHwYDVR0jBBgw # FoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYDVR0OBBYEFF9Y7UwxeqJhQo1SgLqz # YZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1Ud # JQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGg # P6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3Rh # bXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcBAQRwMG4wRwYIKwYBBQUHMAKGO2h0 # dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ1Jv # b3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAN # BgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgMnoEdJVj9TC1ndK/HYiYh9lVUacah # RoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvIyHI5UkPCbXKspioYMdbOnBWQUn73 # 3qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkkSivt51UlmJElUICZYBodzD3M/SFj # eCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSKr+nDO+Db8qNcTbJZRAiSazr7KyUJ # Go1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6ajTqV2ifikkVtB3RNBUgwu/mSiSU # ice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY2752LmESsRVVoypJVt8/N3qQ1c6F # ibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9AQO1gQrnh1TA8ldXuJzPSuALOz1Uj # b0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNHe0pWSGH2opXZYKYG4Lbukg7HpNi/ # KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQaL0cJqlmnx9HCDxF+3BLbUufrV64 # EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWRItFA3DE8MORZeFb6BmzBtqKJ7l93 # 9bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMeYRriWklUPsetMSf2NvUQa/E5vVye # fQIwggZFMIIELaADAgECAhAIMk+dt9qRb2Pk8qM8Xl1RMA0GCSqGSIb3DQEBCwUA # MFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMu # QS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQTAeFw0yNDA0 # MDQxNDA0MjRaFw0yNzA0MDQxNDA0MjNaMGsxCzAJBgNVBAYTAk5MMRIwEAYDVQQH # DAlTY2hpam5kZWwxIzAhBgNVBAoMGkpvaG4gQmlsbGVrZW5zIENvbnN1bHRhbmN5 # MSMwIQYDVQQDDBpKb2huIEJpbGxla2VucyBDb25zdWx0YW5jeTCCAaIwDQYJKoZI # hvcNAQEBBQADggGPADCCAYoCggGBAMslntDbSQwHZXwFhmibivbnd0Qfn6sqe/6f # os3pKzKxEsR907RkDMet2x6RRg3eJkiIr3TFPwqBooyXXgK3zxxpyhGOcuIqyM9J # 28DVf4kUyZHsjGO/8HFjrr3K1hABNUszP0o7H3o6J31eqV1UmCXYhQlNoW9FOmRC # 1amlquBmh7w4EKYEytqdmdOBavAD5Xq4vLPxNP6kyA+B2YTtk/xM27TghtbwFGKn # u9Vwnm7dFcpLxans4ONt2OxDQOMA5NwgcUv/YTpjhq9qoz6ivG55NRJGNvUXsM3w # 2o7dR6Xh4MuEGrTSrOWGg2A5EcLH1XqQtkF5cZnAPM8W/9HUp8ggornWnFVQ9/6M # ga+ermy5wy5XrmQpN+x3u6tit7xlHk1Hc+4XY4a4ie3BPXG2PhJhmZAn4ebNSBwN # Hh8z7WTT9X9OFERepGSytZVeEP7hgyptSLcuhpwWeR4QdBb7dV++4p3PsAUQVHFp # wkSbrRTv4EiJ0Lcz9P1HPGFoHiFAQQIDAQABo4IBeDCCAXQwDAYDVR0TAQH/BAIw # ADA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY2NzY2EyMDIxLmNybC5jZXJ0dW0u # cGwvY2NzY2EyMDIxLmNybDBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0 # dHA6Ly9jY3NjYTIwMjEub2NzcC1jZXJ0dW0uY29tMDUGCCsGAQUFBzAChilodHRw # Oi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY2NzY2EyMDIxLmNlcjAfBgNVHSMEGDAW # gBTddF1MANt7n6B0yrFu9zzAMsBwzTAdBgNVHQ4EFgQUO6KtBpOBgmrlANVAnyiQ # C6W6lJwwSwYDVR0gBEQwQjAIBgZngQwBBAEwNgYLKoRoAYb2dwIFAQQwJzAlBggr # BgEFBQcCARYZaHR0cHM6Ly93d3cuY2VydHVtLnBsL0NQUzATBgNVHSUEDDAKBggr # BgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAEQsN8wg # PMdWVkwHPPTN+jKpdns5AKVFjcn00psf2NGVVgWWNQBIQc9lEuTBWb54IK6Ga3hx # QRZfnPNo5HGl73YLmFgdFQrFzZ1lnaMdIcyh8LTWv6+XNWfoyCM9wCp4zMIDPOs8 # LKSMQqA/wRgqiACWnOS4a6fyd5GUIAm4CuaptpFYr90l4Dn/wAdXOdY32UhgzmSu # xpUbhD8gVJUaBNVmQaRqeU8y49MxiVrUKJXde1BCrtR9awXbqembc7Nqvmi60tYK # lD27hlpKtj6eGPjkht0hHEsgzU0Fxw7ZJghYG2wXfpF2ziN893ak9Mi/1dmCNmor # GOnybKYfT6ff6YTCDDNkod4egcMZdOSv+/Qv+HAeIgEvrxE9QsGlzTwbRtbm6gwY # YcVBs/SsVUdBn/TSB35MMxRhHE5iC3aUTkDbceo/XP3uFhVL4g2JZHpFfCSu2TQr # rzRn2sn07jfMvzeHArCOJgBW1gPqR3WrJ4hUxL06Rbg1gs9tU5HGGz9KNQMfQFQ7 # 0Wz7UIhezGcFcRfkIfSkMmQYYpsc7rfzj+z0ThfDVzzJr2dMOFsMlfj1T6l22GBq # 9XQx0A4lcc5Fl9pRxbOuHHWFqIBD/BCEhwniOCySzqENd2N+oz8znKooSISStnkN # aYXt6xblJF2dx9Dn89FK7d1IquNxOwt0tI5dMIIGYjCCBMqgAwIBAgIRAKQpO24e # 3denNAiHrXpOtyQwDQYJKoZIhvcNAQEMBQAwVTELMAkGA1UEBhMCR0IxGDAWBgNV # BAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAxMjU2VjdGlnbyBQdWJsaWMgVGlt # ZSBTdGFtcGluZyBDQSBSMzYwHhcNMjUwMzI3MDAwMDAwWhcNMzYwMzIxMjM1OTU5 # WjByMQswCQYDVQQGEwJHQjEXMBUGA1UECBMOV2VzdCBZb3Jrc2hpcmUxGDAWBgNV # BAoTD1NlY3RpZ28gTGltaXRlZDEwMC4GA1UEAxMnU2VjdGlnbyBQdWJsaWMgVGlt # ZSBTdGFtcGluZyBTaWduZXIgUjM2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEA04SV9G6kU3jyPRBLeBIHPNyUgVNnYayfsGOyYEXrn3+SkDYTLs1crcw/ # ol2swE1TzB2aR/5JIjKNf75QBha2Ddj+4NEPKDxHEd4dEn7RTWMcTIfm492TW22I # 8LfH+A7Ehz0/safc6BbsNBzjHTt7FngNfhfJoYOrkugSaT8F0IzUh6VUwoHdYDpi # ln9dh0n0m545d5A5tJD92iFAIbKHQWGbCQNYplqpAFasHBn77OqW37P9BhOASdmj # p3IijYiFdcA0WQIe60vzvrk0HG+iVcwVZjz+t5OcXGTcxqOAzk1frDNZ1aw8nFhG # EvG0ktJQknnJZE3D40GofV7O8WzgaAnZmoUn4PCpvH36vD4XaAF2CjiPsJWiY/j2 # xLsJuqx3JtuI4akH0MmGzlBUylhXvdNVXcjAuIEcEQKtOBR9lU4wXQpISrbOT8ux # +96GzBq8TdbhoFcmYaOBZKlwPP7pOp5Mzx/UMhyBA93PQhiCdPfIVOCINsUY4U23 # p4KJ3F1HqP3H6Slw3lHACnLilGETXRg5X/Fp8G8qlG5Y+M49ZEGUp2bneRLZoyHT # yynHvFISpefhBCV0KdRZHPcuSL5OAGWnBjAlRtHvsMBrI3AAA0Tu1oGvPa/4yeei # Ayu+9y3SLC98gDVbySnXnkujjhIh+oaatsk/oyf5R2vcxHahajMCAwEAAaOCAY4w # ggGKMB8GA1UdIwQYMBaAFF9Y7UwxeqJhQo1SgLqzYZcZojKbMB0GA1UdDgQWBBSI # YYyhKjdkgShgoZsx0Iz9LALOTzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIw # ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEB # AgEDCDAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZn # gQwBBAIwSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2NybC5zZWN0aWdvLmNvbS9T # ZWN0aWdvUHVibGljVGltZVN0YW1waW5nQ0FSMzYuY3JsMHoGCCsGAQUFBwEBBG4w # bDBFBggrBgEFBQcwAoY5aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVi # bGljVGltZVN0YW1waW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz # cC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAYEAAoE+pIZyUSH5ZakuPVKK # 4eWbzEsTRJOEjbIu6r7vmzXXLpJx4FyGmcqnFZoa1dzx3JrUCrdG5b//LfAxOGy9 # Ph9JtrYChJaVHrusDh9NgYwiGDOhyyJ2zRy3+kdqhwtUlLCdNjFjakTSE+hkC9F5 # ty1uxOoQ2ZkfI5WM4WXA3ZHcNHB4V42zi7Jk3ktEnkSdViVxM6rduXW0jmmiu71Z # pBFZDh7Kdens+PQXPgMqvzodgQJEkxaION5XRCoBxAwWwiMm2thPDuZTzWp/gUFz # i7izCmEt4pE3Kf0MOt3ccgwn4Kl2FIcQaV55nkjv1gODcHcD9+ZVjYZoyKTVWb4V # qMQy/j8Q3aaYd/jOQ66Fhk3NWbg2tYl5jhQCuIsE55Vg4N0DUbEWvXJxtxQQaVR5 # xzhEI+BjJKzh3TQ026JxHhr2fuJ0mV68AluFr9qshgwS5SpN5FFtaSEnAwqZv3IS # +mlG50rK7W3qXbWwi4hmpylUfygtYLEdLQukNEX1jiOKMIIGgjCCBGqgAwIBAgIQ # NsKwvXwbOuejs902y8l1aDANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYD # VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBS # U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjEwMzIyMDAwMDAwWhcNMzgw # MTE4MjM1OTU5WjBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIFJvb3Qg # UjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAiJ3YuUVnnR3d6Lkm # gZpUVMB8SQWbzFoVD9mUEES0QUCBdxSZqdTkdizICFNeINCSJS+lV1ipnW5ihkQy # C0cRLWXUJzodqpnMRs46npiJPHrfLBOifjfhpdXJ2aHHsPHggGsCi7uE0awqKggE # /LkYw3sqaBia67h/3awoqNvGqiFRJ+OTWYmUCO2GAXsePHi+/JUNAax3kpqstbl3 # vcTdOGhtKShvZIvjwulRH87rbukNyHGWX5tNK/WABKf+Gnoi4cmisS7oSimgHUI0 # Wn/4elNd40BFdSZ1EwpuddZ+Wr7+Dfo0lcHflm/FDDrOJ3rWqauUP8hsokDoI7D/ # yUVI9DAE/WK3Jl3C4LKwIpn1mNzMyptRwsXKrop06m7NUNHdlTDEMovXAIDGAvYy # nPt5lutv8lZeI5w3MOlCybAZDpK3Dy1MKo+6aEtE9vtiTMzz/o2dYfdP0KWZwZIX # bYsTIlg1YIetCpi5s14qiXOpRsKqFKqav9R1R5vj3NgevsAsvxsAnI8Oa5s2oy25 # qhsoBIGo/zi6GpxFj+mOdh35Xn91y72J4RGOJEoqzEIbW3q0b2iPuWLA911cRxgY # 5SJYubvjay3nSMbBPPFsyl6mY4/WYucmyS9lo3l7jk27MAe145GWxK4O3m3gEFEI # kv7kRmefDR7Oe2T1HxAnICQvr9sCAwEAAaOCARYwggESMB8GA1UdIwQYMBaAFFN5 # v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBT2d2rdP/0BE/8WoWyCAi/QCj0U # JTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUEDDAKBggr # BgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOgQYY/aHR0 # cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25B # dXRob3JpdHkuY3JsMDUGCCsGAQUFBwEBBCkwJzAlBggrBgEFBQcwAYYZaHR0cDov # L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEADr5lQe1oRLjl # ocXUEYfktzsljOt+2sgXke3Y8UPEooU5y39rAARaAdAxUeiX1ktLJ3+lgxtoLQhn # 5cFb3GF2SSZRX8ptQ6IvuD3wz/LNHKpQ5nX8hjsDLRhsyeIiJsms9yAWnvdYOdEM # q1W61KE9JlBkB20XBee6JaXx4UBErc+YuoSb1SxVf7nkNtUjPfcxuFtrQdRMRi/f # InV/AobE8Gw/8yBMQKKaHt5eia8ybT8Y/Ffa6HAJyz9gvEOcF1VWXG8OMeM7Vy7B # s6mSIkYeYtddU1ux1dQLbEGur18ut97wgGwDiGinCwKPyFO7ApcmVJOtlw9FVJxw # /mL1TbyBns4zOgkaXFnnfzg4qbSvnrwyj1NiurMp4pmAWjR+Pb/SIduPnmFzbSN/ # G8reZCL4fvGlvPFk4Uab/JVCSmj59+/mB2Gn6G/UYOy8k60mKcmaAZsEVkhOFuoj # 4we8CYyaR9vd9PGZKSinaZIkvVjbH/3nlLb0a7SBIkiRzfPfS9T+JesylbHa1LtR # V9U/7m0q7Ma2CQ/t392ioOssXW7oKLdOmMBl14suVFBmbzrt5V5cQPnwtd3UOTpS # 9oCG+ZZheiIvPgkDmA8FzPsnfXW5qHELB43ET7HHFHeRPRYrMBKjkb8/IN7Po0d0 # hQoF4TeMM+zYAJzoKQnVKOLg8pZVPT8wgga5MIIEoaADAgECAhEAmaOACiZVO2Wr # 3G6EprPqOTANBgkqhkiG9w0BAQwFADCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoT # GVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0 # aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0 # d29yayBDQSAyMB4XDTIxMDUxOTA1MzIxOFoXDTM2MDUxODA1MzIxOFowVjELMAkG # A1UEBhMCUEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIG # A1UEAxMbQ2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBMIICIjANBgkqhkiG9w0B # AQEFAAOCAg8AMIICCgKCAgEAnSPPBDAjO8FGLOczcz5jXXp1ur5cTbq96y34vuTm # flN4mSAfgLKTvggv24/rWiVGzGxT9YEASVMw1Aj8ewTS4IndU8s7VS5+djSoMcbv # IKck6+hI1shsylP4JyLvmxwLHtSworV9wmjhNd627h27a8RdrT1PH9ud0IF+njvM # k2xqbNTIPsnWtw3E7DmDoUmDQiYi/ucJ42fcHqBkbbxYDB7SYOouu9Tj1yHIohzu # C8KNqfcYf7Z4/iZgkBJ+UFNDcc6zokZ2uJIxWgPWXMEmhu1gMXgv8aGUsRdaCtVD # 2bSlbfsq7BiqljjaCun+RJgTgFRCtsuAEw0pG9+FA+yQN9n/kZtMLK+Wo837Q4QO # ZgYqVWQ4x6cM7/G0yswg1ElLlJj6NYKLw9EcBXE7TF3HybZtYvj9lDV2nT8mFSkc # SkAExzd4prHwYjUXTeZIlVXqj+eaYqoMTpMrfh5MCAOIG5knN4Q/JHuurfTI5XDY # O962WZayx7ACFf5ydJpoEowSP07YaBiQ8nXpDkNrUA9g7qf/rCkKbWpQ5boufUnq # 1UiYPIAHlezf4muJqxqIns/kqld6JVX8cixbd6PzkDpwZo4SlADaCi2JSplKShBS # ND36E/ENVv8urPS0yOnpG4tIoBGxVCARPCg1BnyMJ4rBJAcOSnAWd18Jx5n858JS # qPECAwEAAaOCAVUwggFRMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFN10XUwA # 23ufoHTKsW73PMAywHDNMB8GA1UdIwQYMBaAFLahVDkCw6A/joq8+tT4HKbROg79 # MA4GA1UdDwEB/wQEAwIBBjATBgNVHSUEDDAKBggrBgEFBQcDAzAwBgNVHR8EKTAn # MCWgI6Ahhh9odHRwOi8vY3JsLmNlcnR1bS5wbC9jdG5jYTIuY3JsMGwGCCsGAQUF # BwEBBGAwXjAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVtLmNv # bTAyBggrBgEFBQcwAoYmaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL2N0bmNh # Mi5jZXIwOQYDVR0gBDIwMDAuBgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93 # d3cuY2VydHVtLnBsL0NQUzANBgkqhkiG9w0BAQwFAAOCAgEAdYhYD+WPUCiaU58Q # 7EP89DttyZqGYn2XRDhJkL6P+/T0IPZyxfxiXumYlARMgwRzLRUStJl490L94C9L # GF3vjzzH8Jq3iR74BRlkO18J3zIdmCKQa5LyZ48IfICJTZVJeChDUyuQy6rGDxLU # UAsO0eqeLNhLVsgw6/zOfImNlARKn1FP7o0fTbj8ipNGxHBIutiRsWrhWM2f8pXd # d3x2mbJCKKtl2s42g9KUJHEIiLni9ByoqIUul4GblLQigO0ugh7bWRLDm0CdY9rN # LqyA3ahe8WlxVWkxyrQLjH8ItI17RdySaYayX3PhRSC4Am1/7mATwZWwSD+B7eMc # ZNhpn8zJ+6MTyE6YoEBSRVrs0zFFIHUR08Wk0ikSf+lIe5Iv6RY3/bFAEloMU+vU # BfSouCReZwSLo8WdrDlPXtR0gicDnytO7eZ5827NS2x7gCBibESYkOh1/w1tVxTp # V2Na3PR7nxYVlPu1JPoRZCbH86gc96UTvuWiOruWmyOEMLOGGniR+x+zPF/2DaGg # K2W1eEJfo2qyrBNPvF7wuAyQfiFXLwvWHamoYtPZo0LHuH8X3n9C+xN4YaNjt2yw # zOr+tKyEVAotnyU9vyEVOaIYMk3IeBrmFnn0gbKeTTyYeEEUz/Qwt4HOUBCrW602 # NCmvO1nm+/80nLy5r0AZvCQxaQ4xggXDMIIFvwIBATBqMFYxCzAJBgNVBAYTAlBM # MSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0Nl # cnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQQIQCDJPnbfakW9j5PKjPF5dUTANBglg # hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3 # DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV # MC8GCSqGSIb3DQEJBDEiBCAJ7WNMdIQh3YxOAVRff+Ft1dQDxn8zw40RwWp702uu # qjANBgkqhkiG9w0BAQEFAASCAYC0UPw2nJGrSIejyXC6HHEkM6H/klvaLd6D844i # f+9nL//gxHwwPR1eOIynzpNV9i2zAYKLbf8Ve3bOSLw5V4XeL46rX6zCBCLxHdUJ # Du8bL1PlrhY3Ma0NTz6IdSwgeTd8tz9iWZ3+tF22JUSaXPqS0wN8D+YJNNnMTJaQ # WaUxjaRvHf96nhUUe7nuLLwV7jsoSpgbMASPZJRezHxyAQxPvbw/dR8v4HnQHOEZ # 32+twge+mUEaKxSVVf8ZPxpf0z2m6QrQ/GQhhPAiM/zklt0inaEdw3dErPeMv7xX # gQrt4TyweCh7qffiJ4YxWwGREhkn256GSaEvj1y1cJ+HiTe7PLJNf2T68VV6RrWV # uv9CPfaHlj0sQMBaoM5VH5hciM5hQS7sYSp0Q7H/S/LpGV54eWvifgZ6sBrorM5H # IdtJp5s42I3cWurlQBFKslqstYAHe3ox+8/Y+7nyqZ/YrqHOodkCRrxcN+KBfzmo # 2W3SvS2OOYNDMRVm4dZeAfzuWtChggMjMIIDHwYJKoZIhvcNAQkGMYIDEDCCAwwC # AQEwajBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSww # KgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNgIRAKQp # O24e3denNAiHrXpOtyQwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMxCwYJ # KoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjAzMTEwODUwNTdaMD8GCSqGSIb3 # DQEJBDEyBDDFFringZyqIvgUFPohha08DOkHls/mbYKYI1eoZGjUt3yDWk62BMpa # 7EVJgqrBwBEwDQYJKoZIhvcNAQEBBQAEggIAfdsOhXt25AytR5L3MaIgIHWneCXp # m0G66Hc+E3904KF7FgFgsSWIE0dAJW0cRKOCm5x6lKfqiBsfd3eGgaiFRmQE7i2v # piMdL+k3ts8aV6JPeE5n8/nNN+nKjin1/UJdPFqfG+AzqT6bZSIhrRJOnqVj4ylL # H8QWM2iYYdL3Ou2m6pVRmHSGhupOkykqS6IJuV+35KzSC6WGAMUX/8xbwt7fcHLV # uGQxTckwA9pJTAXBd8Lz9t9U5nx1sF15J+tO5KA2i4nRVd6V8XOnJEhFgdoAgHEc # nxS4LfoVqCs0YMRK25W2RiATv3kezLX3An9RRgvimdrDGOjQWL3L9yx9mXUd8nmW # pt/fu1tAjQr0qCSQQk0TcDjcordYydJfGtGg1wGLiHc52Luxb8oopS5eNYwHIDbk # ycege4azg/qW7/wnZw8KPRbpvGnmqPCc+nzCSzuv7jWyD0fUGn2IQIMzo9x2shxq # MRVfO9m58yvMtt3Zdlu81FcymAq1/ylUlVX+lc3uc+zPVGQQ8cSm0j3GbjfAlj9l # xUCs7zp1c9hM4h88dEWnCVLE5q2VMoISNxbpu45MwzKVlAgGJ0+6HoazonxO2fG/ # YpbSHLOw8mX8MlGi49F2U+qSRyup03tTQGjdpcze0gUfTNMQ3PReIdztRoEEVTZN # TeTro5/+DD4nNG8= # SIG # End signature block |