param( [switch]$Elevated, [string]$workSpace = "NA", [string]$userName = "NA", [string]$EnableUI = "No" ) $ErrorActionPreference = "Stop" Start-Transcript -path "C:\ProgramData\CN_WireguardInstall_Log.txt" -append function Test-Admin { $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) } if ((Test-Admin) -eq $false) { if ($elevated) { Write-Host "Tried to elevate, did not work, aborting" } else { Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated -workSpace "{1}" -userName "{2}" -EnableUI "{3}"' -f ($myinvocation.MyCommand.Definition),$workSpace,$userName,$EnableUI) } exit } Write-Host "Running with full privileges" try{ $activateUi = [bool]0 $configureWireguard = [bool]0 Write-Host "SPUN_WireGuard_Install script" $username = $userName $workspace = $workSpace Write-Host "Fetched Parameters - username:$username, workspace:$workspace, EnableUI:$EnableUI" $ScriptVersion = "5.4.2 - Executing Speerity Uninstall and Wireguard Insttall Script without Configuration." Write-Host "ScriptVersion :$ScriptVersion" $SpeerityInstallDir = 'C:\Program Files (x86)\Speerity' $ProceedUninstall = [bool]0 $ProceedWireguardInstall = [bool]0 if(!(Test-Path $SpeerityInstallDir)){ Write-Host "Speerity Install directory does not exist Hence Aborting Uninstallation. $($SpeerityInstallDir)" $ProceedUninstall = [bool]0 } else{ Write-Host "Speerity Install directory exist, Checking for installed version." $InstalledVersionFile = "$($SpeerityInstallDir)\version.txt" if((Test-Path $InstalledVersionFile -PathType Leaf)){ $InstalledVersion = Get-Content "$($SpeerityInstallDir)\version.txt" Write-Host "$($InstalledVersion)" $ProceedUninstall = [bool]1 } else{ throw [System.IO.FileNotFoundException] "Installed version file at $($InstalledVersionFile) not found." } } if($ProceedUninstall){ Write-Host "Uninstalling Speerity...." Write-Host "Current Folder : $pwd" Set-Location "C:\Program Files (x86)\Speerity" Write-Host "Current Folder : $pwd" Write-Host "Running Uninstall.exe." #Start-Process -Wait -FilePath "Uninstall.exe" -ArgumentList "/S /p ScriptBasedUnInstallation" -PassThru ./Uninstall.exe /S /p "ScriptBasedUnInstallation" } else{ Write-Host "Abborting Uninstallation..." } if($userName -eq "NA" -or $workSpace -eq "NA"){ Write-Host "Either of the input parameters are null, Hence skiping configuration" $configureWireguard = [bool]0 } else{ Write-Host "Username or Workspace Accepted, Hence Configuring tunnel" Write-Host "Validating Username and Workspace" $getConfFileUrl = "https://subapi.exium.net/tenant/wgsilentauth/$workspace/$username/windows" Write-Host "Requesting for conf file details" Write-Host "Request URL: $getConfFileUrl" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" $confFileDetailsJson =Invoke-WebRequest -Uri $getConfFileUrl -UseBasicParsing $parsedResponseJson = $confFileDetailsJson | ConvertFrom-Json Write-Host "Response JSON : $parsedResponseJson" $confFileUrl = $parsedResponseJson.configfile Write-Host "ConfigFile download Url :$confFileUrl" if($null -eq $confFileUrl){ Write-Host "Invalid response.Hence not configuring WireGuard." $configureWireguard = [bool]0 } else{ Write-Host "A valid conf file response was fetched." $configureWireguard = [bool]1 } } if($EnableUI -eq "No"){ Write-Host "Skipping UI activation." $activateUi = [bool]0 } elseif($EnableUI -eq "Yes"){ Write-Host "Activating UI" $activateUi = [bool]1 } else{ Write-Host "Invalid EnableUI Parameter. Hence skipping its activation" } Write-Host "Cleaning Up" #---Uninstalling and Cleaning up Wireguard and Monitor-Ng---# $ErrorActionPreference = "Continue" $WireGuardInstallDir = "C:\Program Files\WireGuard" $ProgramFiles = "C:\Program Files" $MonitorNgFolder = "C:\Program Files\monitor-ng" Write-Host "Stoping and deleting monitor-ng-service" Set-Location $ProgramFiles if(!(Test-Path $MonitorNgFolder)){ Write-Host "MonitorNgFolder Folder does not exist." } else{ Write-Host "MonitorNgFolder Folder exist, Hence deleting the folder." Set-Service -Name "monitor-ng-svc" -StartupType Disabled -ErrorAction Continue taskkill /F /IM monitor-ng.exe sc.exe stop monitor-ng-svc sc.exe delete monitor-ng-svc Start-Sleep -Seconds 2 Set-Location $MonitorNgFolder Write-Host "Deleting Monitor exe => $pwd" if(Test-Path -Path monitor-ng.exe -PathType Leaf){ Remove-Item monitor-ng.exe } else{ Write-Host "Monitor Ng Exe was not found." } Write-Host "Deleting ReconnectNg script" if(Test-Path -Path ReconnectNg.ps1 -PathType Leaf){ Remove-Item -Path ReconnectNg.ps1 -Recurse -Force } else{ Write-Host "ReconnectNg.ps1 not found" } Write-Host "Deleting wg_re_install script" if(Test-Path -Path wg_re_install.ps1 -PathType Leaf){ Remove-Item -Path wg_re_install.ps1 -Recurse -Force } else{ Write-Host "wg_re_install.ps1 not found" } } Start-Sleep -Seconds 2 Set-Location $ProgramFiles Write-Host "Deleting MonitorNgFolder" if(Test-Path -Path $MonitorNgFolder){ Remove-Item -Path $MonitorNgFolder -Recurse -Force } else{ Write-Host "$MonitorNgFolder not found" } Write-Host "Checking if WireGuard Folder is present or not" $ProceedWireguardUnInstallation = [bool]0 $WireGuardApp = Get-WmiObject -Class Win32_Product | Where-Object name -eq "WireGuard" if($null -eq $WireGuardApp){ $ProceedWireguardUnInstallation = [bool]0 } else{ Write-Host "Wireguard found Installed hence proceeding towards uninstallation" $ProceedWireguardUnInstallation = [bool]1 } if($ProceedWireguardUnInstallation){ Write-Host "Proceeding with uninstallation" Write-Host "[PWD: $pwd]-UnInstallation in process." if($null -eq $WireGuardApp){ Write-Host "The Wireguard app is not found." } else{ Write-Host "The Wireguard app is not found." $WireGuardApp.Uninstall() } Start-Sleep -Seconds 15 Write-Host "Uninstalled EXE" Write-Host "Removing exe traces in from Temp folder" $ProgramDataDir = "C:\ProgramData" $downloadedExePath = "$ProgramDataDir\wireguard-installer.exe" if(Test-Path -Path $downloadedExePath -PathType Leaf){ Write-Host "Deleting EXE." Get-Childitem -Path $downloadedExePath -Filter *.exe | where-object {$_.Name -ilike "*wireguard-installer*"} | Remove-Item -Force Start-Sleep -Seconds 5 } else{ Write-Host "No EXE found in Temp folder" } Write-Host "Removing Install Log files" Get-Childitem -Path C:\ -Filter *.txt | where-object {$_.Name -ilike "*CN_WireguardInstall_Log*"} | Remove-Item -Force Write-Host "Removing Old Conf files" Get-Childitem -Path $ProgramDataDir -Filter *.conf | where-object {$_.Name -ilike "*-win*"} | Remove-Item -Force } else{ Write-Host "No WireGuard Installation folder found" } $ErrorActionPreference = "Stop" #--- Installing Wireguard---# Write-Host "Executing Wireguard Installation" $ProgramDataDir = "C:\ProgramData" Write-Host "Checking if ProgramDataFolder is valid or not" if(Test-Path -Path $ProgramDataDir -IsValid){ Write-Host "ProgramDataFolder is valid" $ProceedWireguardInstall = [bool]1 } else{ Write-Host "ProgramDataFolder is invalid" $ProceedWireguardInstall = [bool]0 } if($ProceedWireguardInstall){ Write-Host "Proceeding with installation" $wireguardExeUrl = "https://download.wireguard.com/windows-client/wireguard-installer.exe" Set-Location $ProgramDataDir Write-Host "[PWD: $pwd]-Installation in process." Start-Sleep -Seconds 5 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" Invoke-WebRequest -UseBasicParsing -Uri $wireguardExeUrl -OutFile wireguard-installer.exe Write-Host "Installing EXE." Start-Sleep -Seconds 5 Start-Process -Wait -FilePath "wireguard-installer.exe" -ArgumentList "/S" -PassThru Start-Sleep -Seconds 5 Write-Host "Wireguard Installation done" }# Skipping Wireguard Installation else{ Write-Host "Installation aborted. Unable to Access Program Data folder :$ProgramDataDir " } if($configureWireguard){ #--- Wireguard Configuration ---# $getConfFileUrl = "https://subapi.exium.net/tenant/wgsilentauth/$workspace/$username/windows" Write-Host "Clearing old conf files" $confFileName = "$workspace-$username-win.conf" $tunnelName = "$workspace-$username-win" Write-Host "Tunnel Name: $tunnelName" Write-Host "workspace: $workspace" if(Test-Path -Path $confFileName -PathType Leaf){ Write-Host "Deleting confFile details." Remove-Item -LiteralPath $confFileName -Force -Recurse } else{ Write-Host "confFile File not found." } Write-Host "Uninstalling Tunnel Service" $serviceName = 'WireGuardTunnel$*' # Use a wildcard (*) to match all WireGuard services $wireguardServices = Get-Service -Name $serviceName foreach ($service in $wireguardServices) { Write-Host "WireGuard service name: $($service.Name)" $string = $($service.Name) # Using Split() method $splitString = $string.Split('$') $serviceName = $splitString[0] # Using -split operator $splitString = $string -split '\$' $service1 = $splitString[0] $serviceName = $splitString[1] Write-Host "Service Name: $serviceName" & 'C:\Program Files\WireGuard\wireguard.exe' /uninstalltunnelservice $serviceName } Start-Sleep -Seconds 5 Write-Host "Requesting for conf file details" Write-Host "Request URL: $getConfFileUrl" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" $confFileDetailsJson =Invoke-WebRequest -Uri $getConfFileUrl -UseBasicParsing $parsedResponseJson = $confFileDetailsJson | ConvertFrom-Json Write-Host "Response JSON : $parsedResponseJson" $confFileUrl = $parsedResponseJson.configfile Write-Host "ConfigFile download Url :$confFileUrl" Start-Sleep -Seconds 5 Write-Host "Downloading new conf file" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" Invoke-WebRequest -UseBasicParsing -Uri $confFileUrl -OutFile $confFileName $confFilePath = "$ProgramDataDir\$confFileName" if(Test-Path -Path $confFilePath -PathType Leaf){ Start-Sleep -Seconds 5 Write-Host "Configuring EXE." Start-Process 'C:\Program Files\WireGuard\wireguard.exe' -ArgumentList '/installtunnelservice', "$ProgramDataDir\$confFileName" Start-Sleep -Seconds 5 Write-Host "Configuring Service." $serviceName = "WireGuardTunnel$"+$tunnelName Start-Sleep -Seconds 1 Start-Process sc.exe -ArgumentList 'config', $serviceName Write-Host "Starting Service: $serviceName" Start-Sleep -Seconds 5 Start-Service $serviceName -ErrorAction Continue Start-Sleep -Seconds 5 Get-Service -Name "*WireGuard*" Write-Host "Adding entry into Environment Registry" $registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" $Name = "ng_info" $value = "$workspace-$username-win" Set-ItemProperty -Path $registryPath -Name $Name -Value $value Start-Sleep -Seconds 10 Set-Location $ProgramFiles Write-Host "Downloading Monitor-NG files => $pwd" $monitorNgExeUrl = "https://clientreleases.s3.us-west-1.amazonaws.com/windows/wireguardservice/0.1.1/monitor-ng.exe" $reconnectNgFileUrl = "https://clientreleases.s3.us-west-1.amazonaws.com/powerShellScripts/PublicScripts/ReconnectNg.ps1" $wg_reinstallFileUrl = "https://clientreleases.s3.us-west-1.amazonaws.com/powerShellScripts/PublicScripts/wg_re_install.ps1" if(!(Test-Path $MonitorNgFolder)){ Write-Host "MonitorNgFolder Folder does not exist." mkdir monitor-ng } else{ Write-Host "MonitorNgFolder Folder exist. Hence skipping its creation." } Set-Location $MonitorNgFolder [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" Invoke-WebRequest -UseBasicParsing -Uri $monitorNgExeUrl -OutFile monitor-ng.exe Write-Host "Copying files required for Monitor-Svc" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" Invoke-WebRequest -UseBasicParsing -Uri $reconnectNgFileUrl -OutFile ReconnectNg.ps1 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Ssl3 [Net.ServicePointManager]::SecurityProtocol = "Tls, Tls11, Tls12, Ssl3" Invoke-WebRequest -UseBasicParsing -Uri $wg_reinstallFileUrl -OutFile wg_re_install.ps1 Write-Host "Files required for Monitor-Ng service downloaded." Write-Host "Configuring Monitor Ng service." Set-Location $MonitorNgFolder Write-Host "Creating monitor-ng-service" sc.exe create monitor-ng-svc binpath= "C:\Program Files\monitor-ng\monitor-ng.exe" start= auto DisplayName= "monitor-ng-svc" Write-Host "Adding description monitor-ng-service" sc.exe description monitor-ng-svc "monitor-ng-svc" Write-Host "Setting failure case monitor-ng-service" sc.exe failure monitor-ng-svc reset= 0 actions= restart/0/restart/0/restart/0 Set-Service -Name "monitor-ng-svc" -StartupType Automatic Start-Sleep -Seconds 60 Write-Host "Checking monitor-ng-service" sc.exe query "monitor-ng-svc" Start-Sleep -Seconds 10 $Service = "monitor-ng-svc" If ((Get-Service $Service).Status -ne 'Running') { sc.exe start "monitor-ng-svc" } sc.exe query "monitor-ng-svc" if($activateUi){ Write-Host "Setting Wireguard UI" reg add HKLM\Software\WireGuard /v LimitedOperatorUI /t REG_DWORD /d 0 /f } } else{ Write-Host "Conf file was not downloaded.Hence installation aborted." } }#configureWireguard Write-Host "Completed Process" }#try catch{ Write-Host "Exception occured at executing script " Write-Host "$($_)" } Stop-Transcript # SIG # Begin signature block # MIImAwYJKoZIhvcNAQcCoIIl9DCCJfACAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAD38z3ikEjjalD # sKAAryKvB93+ADhip3nWu6mFCKV6FaCCDa4wggbHMIIEr6ADAgECAhBmVHqbUCSw # 1zT+te/1EkgZMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI # DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxNzA1 # BgNVBAMMLlNTTC5jb20gRVYgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBDQSBS # U0EgUjMwHhcNMjIxMTAzMTUwNjAxWhcNMjUxMTAyMTUwNjAxWjCBuDELMAkGA1UE # BhMCVVMxDjAMBgNVBAgMBVRleGFzMQ4wDAYDVQQHDAVBbGxlbjETMBEGA1UECgwK # RXhpdW0gSW5jLjEQMA4GA1UEBRMHNzU3Nzg1NjETMBEGA1UEAwwKRXhpdW0gSW5j # LjEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xGTAXBgsrBgEEAYI3PAIB # AgwIRGVsYXdhcmUxEzARBgsrBgEEAYI3PAIBAxMCVVMwggGiMA0GCSqGSIb3DQEB # AQUAA4IBjwAwggGKAoIBgQCD6iQMi+XR6jgUXRWDyfKvd6UKEwAnCsQrIwl5CN2S # zgkdvbRYzDE7coqQU1WoKcG7EYsRqcKpZ2MOl0etNxrKyBZLKzYwo9D6RX3RvLwH # a90wV0lE+RzatnJpGhQ3PpNb28GSGpIbZYub0TNIkWIWazmafnZWkQD9tsO2whoz # RnonG4lyRedhDkPAR8ebcUby8RLev7m8M1ky7bQ18Evmel3IeYNszfUWcqK5MSlD # Pe/Q0I8Satyt1aoBQoiHwJ70JGQKT4dVDQcB8Ij6v6ib9i7ZJZ0ENVmR84vAd2pt # JU4HZj/F88yEOb0xEgdvWny7YXqQWVaHbxlAsB63/KMCYVdibidmcOvPxfIfrunM # N50vEDwRX3/5/rxESXQI62hYQi4M1ZBLv2YykdEpy+LYQotpizuiuZSKDqRpQvzw # 3gecCfF/PWeAZ3qJHnN7Pmt2QJ++0g2HNhNuMRO+83sIvs/vw6/HOZbMLWRprsFq # l0hEUw5yY5b8NO43SejAA7kCAwEAAaOCAYcwggGDMAwGA1UdEwEB/wQCMAAwHwYD # VR0jBBgwFoAUNr1J/zEs669qQP6ZwBbtuvxI3V8wWwYIKwYBBQUHAQEETzBNMEsG # CCsGAQUFBzAChj9odHRwOi8vY2VydC5zc2wuY29tL1NTTGNvbS1TdWJDQS1FVi1D # b2RlU2lnbmluZy1SU0EtNDA5Ni1SMy5jZXIwXwYDVR0gBFgwVjAHBgVngQwBAzAN # BgsqhGgBhvZ3AgUBBzA8BgwrBgEEAYKpMAEDAwIwLDAqBggrBgEFBQcCARYeaHR0 # cHM6Ly93d3cuc3NsLmNvbS9yZXBvc2l0b3J5MBMGA1UdJQQMMAoGCCsGAQUFBwMD # MFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmxzLnNzbC5jb20vU1NMY29tLVN1 # YkNBLUVWLUNvZGVTaWduaW5nLVJTQS00MDk2LVIzLmNybDAdBgNVHQ4EFgQUtuhm # h2/LQVIk1E7RKSQXeCrqf/AwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUA # A4ICAQCibGszRI7XQJL5v/aEdcPYPlieL7DbJ1yavrgrTvdm5QyVdTMndbqKw/Ag # XbvbxKQtYTgpsUpQHXSAN1RrR4N9+HsIvBcnDEJYxTJjGYCqBTwEDrfCPuS24etD # hp47TIszuM9UdksuzD8TIa+weKsA2Y8cY2fB252I5ZEk3EzHovlA5yT9mm+ikkeL # gr0KmJ7HPiZ3p//ufbDR1UeX5Y8+veSGbDa/tACGA4rrRIv/+ostkv1+UnxelX9H # iv30Ltrka0iJ24Bq/pfnmAdHLSB0QHjB7ZDY2cGF59xsmzC+tMQEB/99pjOiAWRW # fsjJMsTP1MJAaGB974wJUq3vT2mAagofmv4v154hwYUpRX2WVHIZ0Zs3R1+EpaJm # Dwns4XdSFaf9qf46Nzo9ZiKdOCWg8V2SQEqcRoixf61oDFi/8P05P3Igrv0mQn1D # /3mEqTiCF/i7bRrX1ebw59imnuLXWIjiYOv47SyrB35Tz+jTC0kNj7Shuuhj1tem # EoTllLmuxtzI5KI355yx5u57p75z8DtiNbbPP2iMSw3L86tcQK+zD2g68XHQ3fBB # /wZi26BPKosB2ol1fj+gHrozUiPhE13FgtfK4VUrolNREE8I5/iTUdRGhU4E5GAO # iCyA3wIVuBLH3zHCv5UIKcdg0vSta542nJUATJtSwtz1WSBQMjCCBt8wggTHoAMC # AQICEEJLalPOx2YUHCpjsaUcQQQwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYT # AlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwP # U1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlm # aWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE5MDMyNjE3NDQyM1oXDTM0MDMy # MjE3NDQyM1owezELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQH # DAdIb3VzdG9uMREwDwYDVQQKDAhTU0wgQ29ycDE3MDUGA1UEAwwuU1NMLmNvbSBF # ViBDb2RlIFNpZ25pbmcgSW50ZXJtZWRpYXRlIENBIFJTQSBSMzCCAiIwDQYJKoZI # hvcNAQEBBQADggIPADCCAgoCggIBAPCqN/crIZEgZzo5jhXlIbpaEyqNUdBzPb2u # AYwTe9Z++GZj7fR7K5LxvmNr96g3ZXYNfDSnUrHYePBf6Z93emE+g2bsZs63pD19 # GpWvHV1/xZVJoNjqvSPmlD+ZbiVGOMRVmDg8qfTlrnna+3VuAB8QP7GPAv9CrpL8 # 9dNaCSVSY4jdX/SRKBYVq1QunPHe4NvSMmkhZ0ZtV1+bytE3f6dpJx6uO2pessYK # oD1gHnx2xRyjAmVzhDFl7f5VaJusIdGdhH7qAc/k50tMGF1kgXc2aMcD+MrENvaf # EmzdRBkL6WB+CSvbmjw2z46hHAH3dbX2b4cLA1rPmNfLKFCXpaHyqCEc+7FMNeoY # WxbHRVwAIHlviNNQb3D3xdJDHxeSfjGWqUG6Q/K50Y3GaJLgm4qA1nnWKV/mwIGK # 8ssOTRg2C3WqSTbtI84XzlGHKdDYDKKiZv/b55MTi3yUyWtRjVLWO++KDeS9/jih # WmhZ2AfntTWwkDg8Wy0iEJcHO7KyMmBhxjgVbLC6tX6D+TyyKh6/rc1Yp49vO2w3 # 366ILEffER2o1xS0Za9P9qJJsmFwCv7ZThd4V16JJdLEHkrTnnPqFGgpAiJR/c8U # BC7/HvOUlJ1zUKyqqStDcSGOdjKWKBBZK+w/IOku5tPjZiUROJxpQ+rTJKT/oiXq # CA4oWJzpAgMBAAGjggFVMIIBUTASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQY # MBaAFPlgu9Tj1TT2uPUGgCWnc9tGaaieMHwGCCsGAQUFBwEBBHAwbjBKBggrBgEF # BQcwAoY+aHR0cDovL3d3dy5zc2wuY29tL3JlcG9zaXRvcnkvU1NMY29tLVJvb3RD # QS1FVi1SU0EtNDA5Ni1SMi5jcnQwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3Nwcy5z # c2wuY29tMBEGA1UdIAQKMAgwBgYEVR0gADATBgNVHSUEDDAKBggrBgEFBQcDAzBF # BgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3Jscy5zc2wuY29tL1NTTGNvbS1Sb290 # Q0EtRVYtUlNBLTQwOTYtUjIuY3JsMB0GA1UdDgQWBBQ2vUn/MSzrr2pA/pnAFu26 # /EjdXzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAHKP+oFIgpHi # YIMlW3uPL5QPg1jOiCT6mUJOLU43ififsR6udEB5+d7L9/8sJRBSmECPVDj/XdEq # qVrmtwK7yH/uKtP/f8w2PFUpQ102SZYmXXDn8isFZ0dMmVgZCPaxxk9g0vw4vgKs # JdGIDaUs4d3TfVfPasMZYNJtql17ROhaW4PbyBs2Cn4K9QpSNnjimvsTVMycyUe/ # Yk41rz7hug/Jk+7VILeWt1B2UjV6naE7JmQ3H868A3vEYYFSicx7/loFGkeu5BLK # jlTjWp+wwYry+V9GaLmvx9k+hNErJRI4PbuaAerfzGaotsUfapNHsM4GkoStQ4Nq # hjlcTOICS3hzrkso5qT4YWmAzP806LAvZAJJDY0uH33roYYFD+1ecDTlGAIA62O+ # dSZtpxyQVweumaWON9Knw1hspfTnUiI1p1u7butI25py3qpaYkkJnpArEg/IOtuv # aHOd2eN5ypj5aB3q5lguqRhszZk6ms0mcETmZpicJR4ZasfY8+f/pjV3+/V9u4yC # x299VDK76pkLOeggURUvieMq4cUg83p4Tj2vF2KSVI0njJA33OMp6EKTtvg7KwuZ # ULjkNAaYI+7q37VUu67b8erdcvlF7bHaQzuA/G9s39yRbbil1O91zWVMZCxZ3xMu # AhtL+gSTwLs3HR+yINNPM68WoRzAqqiIMYIXqzCCF6cCAQEwgY8wezELMAkGA1UE # BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMREwDwYDVQQK # DAhTU0wgQ29ycDE3MDUGA1UEAwwuU1NMLmNvbSBFViBDb2RlIFNpZ25pbmcgSW50 # ZXJtZWRpYXRlIENBIFJTQSBSMwIQZlR6m1AksNc0/rXv9RJIGTANBglghkgBZQME # AgEFAKB8MBAGCisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3 # AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEi # BCBAF9KLezhqj6d2D3jHhfQsgCRerTrNI/mIu9KMKUimPTANBgkqhkiG9w0BAQEF # AASCAYA+/NC2z1A6F+BtvvmkVr7i5to2lMNH2inTeNZaa2Ra6pHuDZ1MBiZv+NNO # G0HIx0Y7dKdXFO8H93gnuoSxwgfwliPa+lXvMShRZUz7yfNSbOrDFG0i8RBBHByq # t6936cyfaxiy+x1ySzwzb8wYsDXKSTYSKi1I8/xNz02rFDyFp/lvXmvH6mEOzXdA # cQ74mGB8KJgstmYHfTrqsvj+8gY7QEIcm787YlXEBYgwAUd1LIaAXxWymiDqrn+S # +4FVq9+9RumVD9GibthJiKmodMGP6uqgdG85nZDN1hGflHUKXg0JmBE2LOXKFlwd # ubtmav66axYLALY1guoZfeyzVvAr8pUTYI9ICuSm3eotKwtIOgsdy6ICJFyeP1u1 # qXe9JysrjUrR8aRg0H5CQHUe03E31TnL8mXIQvH8iHissTli3HuEHCbGJTe0La6B # C21DD7su+ATgraq996eU+00E1Hkn9VWP6UtiqNxngJo0xhaKpu4Y/3rDUNQSE4dC # pVA4GzGhghTuMIIU6gYKKwYBBAGCNwMDATGCFNowghTWBgkqhkiG9w0BBwKgghTH # MIIUwwIBAzENMAsGCWCGSAFlAwQCATB3BgsqhkiG9w0BCRABBKBoBGYwZAIBAQYM # KwYBBAGCqTABAwYBMDEwDQYJYIZIAWUDBAIBBQAEINemfhdBNmbvHExK6y/UrvTq # s+qphQiqVnzhpX1iawO5AggTxQoKbSxswhgPMjAyMzA1MjYxMzI3NDNaMAMCAQGg # ghHZMIIE+TCCAuGgAwIBAgIQGtYIp9Y0tc3el8ujzPDQSzANBgkqhkiG9w0BAQsF # ADBzMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 # b24xETAPBgNVBAoMCFNTTCBDb3JwMS8wLQYDVQQDDCZTU0wuY29tIFRpbWVzdGFt # cGluZyBJc3N1aW5nIFJTQSBDQSBSMTAeFw0yMjEyMDkxODMwNTFaFw0zMjEyMDYx # ODMwNTBaMGsxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwH # SG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxJzAlBgNVBAMMHlNTTC5jb20gVGlt # ZXN0YW1waW5nIFVuaXQgMjAyMjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABN58 # +pIllLLZNNnIXgaHKkSv1gJjjgpCv7j9Hb7hA4fIDEIvJgwiiVUtDNqo7JJ4jqcj # iP/4vVoHcm/0d4E9O7ijggFaMIIBVjAfBgNVHSMEGDAWgBQMnRAljpqnG5mHQ88I # fuG9gZD0zzBRBggrBgEFBQcBAQRFMEMwQQYIKwYBBQUHMAKGNWh0dHA6Ly9jZXJ0 # LnNzbC5jb20vU1NMLmNvbS10aW1lU3RhbXBpbmctSS1SU0EtUjEuY2VyMFEGA1Ud # IARKMEgwPAYMKwYBBAGCqTABAwYBMCwwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3 # LnNzbC5jb20vcmVwb3NpdG9yeTAIBgZngQwBBAIwFgYDVR0lAQH/BAwwCgYIKwYB # BQUHAwgwRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NybHMuc3NsLmNvbS9TU0wu # Y29tLXRpbWVTdGFtcGluZy1JLVJTQS1SMS5jcmwwHQYDVR0OBBYEFAW6k9Hf4hSs # ICqGWTF/KHIOraxfMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEA # Wqi0lhBjDURozMeTk2UktonPEN/eeN5k1LeIys69k8AycnHM94hYaqd4jqvEZ07B # 7CpLeBhwI9koRqDZZVOOuEGkW03mgJ1udoJC5Zwke9/cfXTg0GFiyqQKszBaijcT # ZR1rDj08F5mhkUzKQ+tpMb8jdbvoWg/UG7Mj3GFIbnoPNGfeUjAiDzQmCKaxEBIk # TBzDgrZSTRrVo7eEnz9EeFnsRnZtIRB/LKbrqRRu4aySzHNuC0JJmmTvpct9P6tI # 4gvlJj5YIiJV34WtQ98uEUxLPGPBtW5EDkUt1wvv6n2S5KCClQj6bZ/PCuil1foY # emnkR9h2lYZkN0H1H59sqIsLniBvN3a5sCsSfVAc7B7krWpeqNit6Vq0hs2UDk1R # LsEmaZyOUu2IYx+rD9+ZJ8Y6+jWV7UcWdEWPVAlhf2tiS7aJO2MZLqOJQCY/pDbK # K6efyc1W2BRgKisPk2yBuZUSrNxwgiQoiZb0jFYc5IUa7jVmzClIYoMAFx2r41xR # VPCODpCW8aLetC0BVkppdbNttlKJHuEzQIO1w/Bc8p2Fu10aQma8K8F9ffnurv52 # aQHdcdgu16jER8KXMxEwn0AoXSpKHqF/g9OD1ZsvAU0IKVZB4z0Je2mLkRYPfC7k # OV8gOkic3BRkM86tU7QMa736ax3vadow9dlOX5y+u/0wggXYMIIEwKADAgECAhEA # 5CcElfaMkdbQ7HtJTqTfHDANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJQTDEi # MCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2Vy # dHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYDVQQDExlDZXJ0dW0gVHJ1 # c3RlZCBOZXR3b3JrIENBMB4XDTE4MDkxMTA5MjY0N1oXDTIzMDkxMTA5MjY0N1ow # fDELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9u # MRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9v # dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQD5D92jK33L0Cr+7GeFpucuG7p34eP1r6Ts+kpdkcRXR2sY # d2t28v2T5D0PwhaeC2bDVpSeF4OFzlbv8hb9AGL1IglU6GUXTkG54E9Gl6obyLhu # Yl5psV/bKgJ+/GzK80HY7dDo/D9hSO2wAxQdEA5LGeC7TuyGZf82815nAgudhlVh # /Xo47f7iGQC3b6FQYnV0PKD6yCWStG56Isf4HqHjst2RMasrHQT/pUoEN+mFpDMr # /eLWVTR8GaRKaMeyqNO3yqGTiOvBl7yM+R3ZIoQkdMcEPWqpKZPM67hb4f5fJao0 # WMjBI1SdG5gRwzicfj2GbKUPQIZ8AvRcAk8oy65xnw86yDP+ESU16vy6xWA92XwY # 1bKp03V4A3IiyjrDH+8s5S6p+p4stlFG/a8D1upgaOqFFjZrhekewLPdxCTcgCqB # QW2UPsjgyYFBAJ5ev3/FCJiiGCxCQLP5bzgnS06A9D2BR+CIfOoczrV1XFEuHCt/ # GnIo5wC10XTG1+SfrQeTtlM1Nfw35MP2XRa+IXPekgr4oGNqvJaSaj74vGVVm971 # DYkmBPwlGqYlacvCbcp84llfl6zr7y7IvNcbWTwrzPIZyJNrJ2MZz/zpJvjKcZt/ # k/40Z4ROmev8s3gJM3C6ZqZ27Rtz6xqlDcQiEyCUVgpOLGxOsf3PnAm6ojPthwID # AQABo4IBUTCCAU0wEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4EFgQU3QQJB6L1 # en1SUxKSle44gCUNplkwHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzihDdGdfcw # DgYDVR0PAQH/BAQDAgEGMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9zc2xjb20u # Y3JsLmNlcnR1bS5wbC9jdG5jYS5jcmwwcwYIKwYBBQUHAQEEZzBlMCkGCCsGAQUF # BzABhh1odHRwOi8vc3NsY29tLm9jc3AtY2VydHVtLmNvbTA4BggrBgEFBQcwAoYs # aHR0cDovL3NzbGNvbS5yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYS5jZXIwOgYD # VR0gBDMwMTAvBgRVHSAAMCcwJQYIKwYBBQUHAgEWGWh0dHBzOi8vd3d3LmNlcnR1 # bS5wbC9DUFMwDQYJKoZIhvcNAQELBQADggEBAB+VmiNU7oXC89RvuekEj0Z/LPcy # wKdDrAcA7eCpRS39F+HtAEDIr5is9cAZrRuglzBAbOxb+6OTToyJYht88Dpfp0LP # WMp1ZZwiTL92e5iTnBWDM7EO3FE4h3yVnBJplB4AeHR+3MAGd7pwLYcs12id47qF # rUnzj2S0FQaDksaXpECTi63xZ5S0uVpnVDyoG9kFz+Sk+YgSAAaIJYXUXu7zk1fW # gfgsrvf1UUirtmI6edvsLvI/FFY6yNnLpKJPJajRm6stMCBQBxpv8fGUHTmDY+gf # /UnQ6B1GskaCJr2cneGiaEFIUW56/DWW9FTSvCtE5UfXd4KlSqtflzOrJBEwggb8 # MIIE5KADAgECAhBtUhhwh+gjTYVgANCAj5NWMA0GCSqGSIb3DQEBCwUAMHwxCzAJ # BgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYG # A1UECgwPU1NMIENvcnBvcmF0aW9uMTEwLwYDVQQDDChTU0wuY29tIFJvb3QgQ2Vy # dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBMB4XDTE5MTExMzE4NTAwNVoXDTM0MTEx # MjE4NTAwNVowczELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQH # DAdIb3VzdG9uMREwDwYDVQQKDAhTU0wgQ29ycDEvMC0GA1UEAwwmU1NMLmNvbSBU # aW1lc3RhbXBpbmcgSXNzdWluZyBSU0EgQ0EgUjEwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCuURAT0vk8IKAghd7JUBxkyeH9xek0/wp/MUjoclrFXqhh # /fGH91Fc+7fm0MHCE7A+wmOiqBj9ODrJAYGq3rm33jCnHSsCBNWAQYyoauLq8Ijq # sS1JlXL29qDNMMdwZ8UNzQS7vWZMDJ40JSGNphMGTIA2qn2bohGtgRc4p1395ESy # pUOaGvJ3t0FNL3BuKmb6YctMcQUF2sqooMzd89h0E6ujdvBDo6ZwNnWoxj7YmfWj # SXg33A5GuY9ym4QZM5OEVgo8ebz/B+gyhyCLNNhh4Mb/4xvCTCMVmNYrBviGgdPZ # Yrym8Zb84TQCmSuX0JlLLa6WK1aO6qlwISbb9bVGh866ekKblC/XRP20gAu1Cjvc # YciUgNTrGFg8f8AJgQPOCc1/CCdaJSYwhJpSdheKOnQgESgNmYZPhFOC6IKaMAUX # k5U1tjTcFCgFvvArXtK4azAWUOO1Y3fdldIBL6LjkzLUCYJNkFXqhsBVcPMuB0nU # DWvLJfPimstjJ8lF4S6ECxWnlWi7OElVwTnt1GtRqeY9ydvvGLntU+FecK7DbqHD # Ud366UreMkSBtzevAc9aqoZPnjVMjvFqV1pYOjzmTiVHZtAc80bAfFe5LLfJzPI6 # DntNyqobpwTevQpHqPDN9qqNO83r3kaw8A9j+HZiSw2AX5cGdQP0kG0vhzfgBwID # AQABo4IBgTCCAX0wEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBTdBAkH # ovV6fVJTEpKV7jiAJQ2mWTCBgwYIKwYBBQUHAQEEdzB1MFEGCCsGAQUFBzAChkVo # dHRwOi8vd3d3LnNzbC5jb20vcmVwb3NpdG9yeS9TU0xjb21Sb290Q2VydGlmaWNh # dGlvbkF1dGhvcml0eVJTQS5jcnQwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3Nwcy5z # c2wuY29tMD8GA1UdIAQ4MDYwNAYEVR0gADAsMCoGCCsGAQUFBwIBFh5odHRwczov # L3d3dy5zc2wuY29tL3JlcG9zaXRvcnkwEwYDVR0lBAwwCgYIKwYBBQUHAwgwOwYD # VR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybHMuc3NsLmNvbS9zc2wuY29tLXJzYS1S # b290Q0EuY3JsMB0GA1UdDgQWBBQMnRAljpqnG5mHQ88IfuG9gZD0zzAOBgNVHQ8B # Af8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJIZdQ2mWkLPGQfZ8vyU+sCb8BXp # RJZaL3Ez3VDlE3uZk3cPxPtybVfLuqaci0W6SB22JTMttCiQMnIVOsXWnIuAbD/a # FTcUkTLBI3xys+wEajzXaXJYWACDS47BRjDtYlDW14gLJxf8W6DQoH3jHDGGy8kG # JFOlDKG7/YrK7UGfHtBAEDVe6lyZ+FtCsrk7dD/IiL/+Q3Q6SFASJLQ2XI89ihFu # gdYL77CiDNXrI2MFspQGswXEAGpHuaQDTHUp/LdR3TyrIsLlnzoLskUGswF/KF8+ # kpWUiKJNC4rPWtNrxlbXYRGgdEdx8SMjUTDClldcrknlFxbqHsVmr9xkT2QtFmG+ # dEq1v5fsIK0vHaHrWjMMmaJ9i+4qGJSD0stYfQ6v0PddT7EpGxGd867Ada6FZyHw # buQSadMb0K0P0OC2r7rwqBUe0BaMqTa6LWzWItgBjGcObXeMxmbQqlEz2YtAcErk # Zvh0WABDDE4U8GyV/32FdaAvJgTfe9MiL2nSBioYe/g5mHUSWAay/Ip1RQmQCvmF # 9sNfqlhJwkjy/1U1ibUkTIUBX3HgymyQvqQTZLLys6pL2tCdWcjI9YuLw30rgZm8 # +K387L7ycUvqrmQ3ZJlujHl3r1hgV76s3WwMPgKk1bAEFMj+rRXimSC+Ev30hXZd # qyMdl/il5Ksd0vhGMYICVzCCAlMCAQEwgYcwczELMAkGA1UEBhMCVVMxDjAMBgNV # BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMREwDwYDVQQKDAhTU0wgQ29ycDEv # MC0GA1UEAwwmU1NMLmNvbSBUaW1lc3RhbXBpbmcgSXNzdWluZyBSU0EgQ0EgUjEC # EBrWCKfWNLXN3pfLo8zw0EswCwYJYIZIAWUDBAIBoIIBYTAaBgkqhkiG9w0BCQMx # DQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIzMDUyNjEzMjc0M1owKAYJ # KoZIhvcNAQk0MRswGTALBglghkgBZQMEAgGhCgYIKoZIzj0EAwIwLwYJKoZIhvcN # AQkEMSIEII9dorQmxxxbRuX8OFHfSGwAecU4I6ft1+mHVq0Vi9xeMIHJBgsqhkiG # 9w0BCRACLzGBuTCBtjCBszCBsAQgjcXEJULSTxXP9cgZbtRag2jUyta9y+Qhqd4j # UJ2L0yIwgYswd6R1MHMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G # A1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxLzAtBgNVBAMMJlNTTC5j # b20gVGltZXN0YW1waW5nIElzc3VpbmcgUlNBIENBIFIxAhAa1gin1jS1zd6Xy6PM # 8NBLMAoGCCqGSM49BAMCBEYwRAIgYpgeO3zUqIgYKo7sezitMNcOGWZIlGrmADtT # 7j0g0g4CIFrs5yM+c/MvxUkdi9AmcvTG8iqX/tu7Gk69NpakbGYd # SIG # End signature block