<#PSScriptInfo .VERSION 1.1.0 .GUID 71fc1c3a-6fed-4d99-9a29-84e4513e5fe7 .AUTHOR Rensen Information Services Limited .COMPANYNAME Rensen Information Services Limited .COPYRIGHT Rensen Information Services Limited .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .DESCRIPTION Configure Dataristix for remote access via IIS. #> Param($install, $uninstall, [switch]$disable, [switch]$confirm, [switch]$help) $ErrorActionPreference = "Stop" # The Dataristix web application will be installed as a subfolder of the parent Web site Set-Variable DataristixParentWebSite -Option Constant -Value "Default Web Site" # The Dataristix core Web application name Set-Variable DataristixWebAppName -Option Constant -Value "dataristix" # The Dataristix application pool names start with the DataristixAppPoolPrefix, followed by the module name and DataristixAppPoolSuffix Set-Variable DataristixAppPoolPrefix -Option Constant -Value "Dataristix " Set-Variable DataristixAppPoolSuffix -Option Constant -Value " App Pool" Set-Variable DataristixCoreAppPool -Option Constant -Value ($DataristixAppPoolPrefix + "Core" + $DataristixAppPoolSuffix) Set-Variable DataristixModulesParentWebSite -Option Constant -Value ($DataristixParentWebSite + "/" + $DataristixWebAppName) # Dataristix always installs here Set-Variable DataristixServicesFolder -Option Constant -Value "C:\Program Files\Rensen\Dataristix\Services" Set-Variable DataristixDataRootFolder -Option Constant -Value "C:\ProgramData\Rensen\Dataristix" # Main function function Run { Param($install, $uninstall, $disable, $confirm, $help) process { # Check if IIS and WebSockets is available ValidateIIS # Check parameters ValidateParameters if ($help -eq $True) { WriteUsageAndExit } # Ask for confirmation if -confirm parameter is undefined if ($confirm -ne $True) { $confirmation = Read-Host "Dataristix services will be restarted and the IIS Default Web Site configuration may be changed. Proceed (y/n)?" if ($confirmation -ne 'y') { # terminate exit } } # Ensure that all Dataristix Web application are removed before they are possibly re-created RemoveDataristixWebApp StopServices write-host "Configuring ..." if ($install -ne $Null) { # Install MSI and configure IIS for remote administration of all installed modules InstallMsi(Resolve-Path($install)) } elseif ($uninstall -ne $Null) { # Unstall MSI and configure IIS for remote administration of all remaining modules UninstallMsi(Resolve-Path($uninstall)) } elseif ($disable -eq $True) { # Configure IIS by removing remote administration Web applications for all installed modules # Nothing to do because Web applications are removed in the first step } else { # Configure IIS for remote administration of all installed modules RecreateDataristixWebApp } StartServices WriteDataristixUrl } } function WriteUsageAndExit { write-host "Usage:" write-host " Configure-Dataristix-Headless" write-host "or: Configure-Dataristix-Headless -disable" write-host "or: Configure-Dataristix-Headless -install " write-host "or: Configure-Dataristix-Headless -uninstall " exit } function ValidateIIS { $webSockets = Get-WindowsOptionalFeature -Online | where FeatureName -like 'IIS-WebSockets' if ($webSockets.State -ne "Enabled") { WriteError "IIS with WebSockets is not available. Install IIS with WebSockets enabled, then try again." WriteError "If IIS is installed after the .NET Core Windows Server Hosting bundle (which some Dataristix installers" WriteError "may deploy) then subsequently open the Control Panel and select Change / Repair of the" WriteError "`".NET Core Windows Server Hosting`" module. For further details please see" WriteError " https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/?view=aspnetcore-3.1#install-the-net-core-hosting-bundle." exit } # leave to Admin: Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebSockets } function ValidateParameters { $actionCount = 0; if ($install -ne $Null) { $actionCount++ } if ($uninstall -ne $Null) { $actionCount++ } if ($disable -eq $True) { $actionCount++ } if ($actionCount -gt 1) { WriteError "Pass one of 'install', 'uninstall' or 'disable'." exit } } # Start Core and Connector services function StartServices { # Start Connector services first Get-Service "Rensen Dataristix*" | Foreach-Object { if ($_.Name.EndsWith("Connector Service")) { write-host "Starting service " $_.Name "..." Start-Service $_.Name } } # Start Core service last to reduce number of logged connection errors by Core Get-Service "Rensen Dataristix*" | Foreach-Object { if ($_.Name.EndsWith("Core Service")) { write-host "Starting service " $_.Name "..." Start-Service $_.Name } } } # Stop Core and Connector services function StopServices { # Stop Core service first to reduce number of logged connection errors by Core Get-Service "Rensen Dataristix*" | Foreach-Object { if ($_.Name.EndsWith("Core Service")) { write-host "Stopping service " $_.Name "..." Stop-Service $_.Name } } # Stop Connector services Get-Service "Rensen Dataristix*" | Foreach-Object { if ($_.Name.EndsWith("Connector Service")) { write-host "Stopping service " $_.Name "..." Stop-Service $_.Name } } } function WriteDataristixUrl { if ($(Get-WebApplication $DataristixWebAppName) -eq $Null) { WriteSuccess "Dataristix remote administration is disabled" } else { $webSite = Get-WebURL -PSPath ("IIS:\Sites\" + $DataristixParentWebSite) if ($webSite -ne $Null) { $responseUri = "" + $webSite.ResponseUri if ($responseUri.StartsWith("http", "CurrentCultureIgnoreCase") -eq $False){ WriteError("Unexpected error: The web site URL must begin with 'http' or 'https'. Please check if access to the URL is blocked.") WriteError(" URL: " + $responseUri) } else { $bindingInfo = Get-IISSiteBinding $DataristixParentWebSite if ($bindingInfo -ne $Null) { WriteSuccess "Dataristix remote administration URL:" WriteSuccess (" " + $responseUri + $DataristixWebAppName) $bindings = $bindingInfo.protocol.Split(" ") WriteSuccess "Protocols:" $hasHttps = $False $bindings | Foreach-Object { $protocol = $_ if ($protocol.StartsWith("http", "CurrentCultureIgnoreCase") -eq $True) { WriteSuccess (" " + $protocol) } if ($protocol -eq "https") { $hasHttps = $True } } if ($hasHttps -eq $False) { WriteWarning "HTTPS should be configured for secure communications to Dataristix." } } } } } } # Remove Dataristix Web Site and application pools function RemoveDataristixWebApp() { Start-IISCommitDelay # Need path; web application cannot be found by name via Where-Object $webAppPath = "/" + $DataristixWebAppName # Remove dataristix web application Get-WebApplication -Site $DataristixParentWebSite | Foreach-Object { if ($_.Path.StartsWith($webAppPath)) { $name = $_.Path.SubString(1); Remove-WebApplication -Site $DataristixParentWebSite -Name $name } } $uacFolderPath = Join-Path -Path $DataristixDataRootFolder -ChildPath "core/uac" # Remove all Dataristix* application pools Get-IISAppPool | Foreach-Object { if ($_.Name.StartsWith($DataristixAppPoolPrefix)) { $appPoolUser = "IIS AppPool\" + $_.Name $moduleName = $_.Name.Replace($DataristixAppPoolPrefix, "") $moduleName = $moduleName.Replace($DataristixAppPoolSuffix, "") if ($moduleName -eq "Core") { RevokeFullAccess $uacFolderPath $appPoolUser $dataPath = Join-Path -Path $DataristixDataRootFolder -ChildPath "core" } else { RevokeReadAccess $uacFolderPath $appPoolUser $dataPath = Join-Path -Path $DataristixDataRootFolder -ChildPath ("modules/" + $moduleName + " Connector") } $logDataPath = Join-Path -Path $dataPath -ChildPath "logs" #remove access from folder to avoid "unknown account SID" RevokeFullAccess $logDataPath $appPoolUser #remove app pool Remove-WebAppPool -Name $_.Name } } # reset to launch separate API process $corePath = Join-Path $DataristixServicesFolder -ChildPath "core" $coreApiPath = Join-Path $corePath -ChildPath "api" $coreServicePath = Join-Path $corePath -ChildPath "service" $coreServiceExists = Test-Path -Path $coreServicePath -PathType Container if ($coreServiceExists -eq $True) { SetLaunchAPI $coreServicePath $True } $modulesPath = Join-Path -Path $DataristixServicesFolder -ChildPath "modules" $modulesExist = Test-Path -Path $modulesPath -PathType Container if ($modulesExist -eq $True) { Get-ChildItem -Directory -Path $modulesPath | Foreach-Object { if ($_.Name.EndsWith(" Connector")) { $modulePath = $_.FullName $servicePath = Join-Path -Path $modulePath -ChildPath "service" SetLaunchAPI $servicePath $True } } } Stop-IISCommitDelay -Commit $True } function CreateWebAppPool { param($name) process { New-WebAppPool -Name $name | Out-Null $appPoolPath = Join-Path -Path "IIS:\AppPools" -ChildPath $name # set to "no managed code" Set-ItemProperty $appPoolPath managedRuntimeVersion "" } } function EvalRemoveAccessRule { param($path, $user, $success) process { if ($success -ne $True) { WriteError "Removing access permissions failed" WriteError (" Path: " + $path) WriteError (" User: " + $user) #exit } } } function GrantFullAccess{ param($path, $user) process { $Acl = Get-Acl $path $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($user, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow") $Acl.SetAccessRule($Ar) Set-Acl $path $Acl } } function GrantReadAccess{ param($path, $user) process { $Acl = Get-Acl $path $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($user, "Read", "ContainerInherit,ObjectInherit", "None", "Allow") $Acl.SetAccessRule($Ar) Set-Acl $path $Acl } } function RevokeFullAccess{ param($path, $user) process { $Acl = Get-Acl $path $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($user, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow") $r = $Acl.RemoveAccessRule($Ar) EvalRemoveAccessRule $path $user $r Set-Acl $path $Acl } } function RevokeReadAccess{ param($path, $user) process { $Acl = Get-Acl $path $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($user, "Read", "ContainerInherit,ObjectInherit", "None", "Allow") $r = $Acl.RemoveAccessRule($Ar) EvalRemoveAccessRule $path $user $r Set-Acl $path $Acl } } function SetLaunchApiAppConfig { param($servicepath, $enable) process { $success = $False Get-ChildItem -File -Path $servicepath -filter "*.config" | Foreach-Object { $filename = $_.Name if ($filename.StartsWith("Rensen.Dataristix.Connector.") -and $filename.EndsWith(".Service.exe.config")) { # add or update Launch API app setting [xml]$appConfigXml = Get-Content -Path $_.FullName -Raw if ($appConfigXml -eq $Null) { return } # configuration node must exist $configNode = $appConfigXml.SelectSingleNode("configuration") if ($configNode -eq $Null) { return } # Create appSettings node if it does not exist $appSettingsNode = $configNode.SelectSingleNode("appSettings") if ($appSettingsNode -eq $null) { # app settings node does not exist yet; add $appSettingsElem = $appConfigXml.CreateElement("appSettings") $appSettingsNode = $configNode.AppendChild($appSettingsElem) } # Try find LaunchAPI settings node $launchApiNode = $Null $appConfigXml.SelectNodes("//configuration/appSettings/*") | Foreach-Object { if ($_.key -eq "LaunchAPI"){ $launchApiNode =$_ # do not break here } } # Initialize current LaunchAPI value to undefined $currentValue = $Null # Create launch API node if not exists if ($launchApiNode -eq $Null) { $launchApiElem = $appConfigXml.CreateElement("add") $launchApiNode = $appSettingsNode.AppendChild($launchApiElem) $launchApiNode.SetAttribute("key", "LaunchAPI") # $currentValue remains Null } else { # update $currentValue with current setting $currentValue = $launchApiNode.GetAttribute("value") } # Write to file if currentValue is different from desired value if ($currentValue -ne $enable) { $launchApiNode.SetAttribute("value", $enable) $appConfigXml.Save($_.FullName) } $success = $True } } return $success } } function SetLaunchApiAppSettings() { param($appSettingsFile, $enable) process { $fileContent = Get-Content -path $appSettingsFile -Raw if ($fileContent -eq $Null) { # No settings yet; set to empty JSON object $fileContent = "{}" } $settings = ConvertFrom-Json $fileContent # Default value for "LaunchAPI" is "True" if the value is not defined in appsettings $currentLaunchAPI = $True if ($settings.LaunchAPI -ne $Null) { $currentLaunchAPI = $settings.LaunchAPI } elseif ($enable -eq $False) { # Create LaunchAPI property so that property can be set to False $settings | Add-Member -NotePropertyName "LaunchAPI" -NotePropertyValue $enable } # Update settings if required if ($currentLaunchAPI -ne $enable) { # Set new value for LaunchAPI $settings.LaunchAPI = $enable $text = ConvertTo-Json($settings) # Save to file Set-Content $appSettingsFile $text } } } function SetLaunchAPI() { param($servicePath, $enable) process { # Try update appsettings JSON file first $appSettingsFile = Join-Path -Path $servicePath -ChildPath "appsettings.json" $fileExists = Test-Path -Path $appSettingsFile -PathType Leaf if ($fileExists -eq $True) { SetLaunchApiAppSettings $appSettingsFile $enable } else { # try update app config XML file next $setAppConfigSucceeded = SetLaunchApiAppConfig $servicePath $enable if ($setAppConfigSucceeded -eq $False){ WriteWarning ("Skipping 'LaunchAPI' service configuration because the configuration file does not exist or is not readable in: " + $servicePath) } return } } } # Re-Create Dataristix web application and application pools based on what is installed function RecreateDataristixWebApp() { $corePath = Join-Path $DataristixServicesFolder -ChildPath "core" $coreApiPath = Join-Path $corePath -ChildPath "api" $coreServicePath = Join-Path $corePath -ChildPath "service" if (-Not (Test-Path -Path $coreApiPath)) { WriteError("Dataristix Core Service must be installed.") WriteError("Install the Rensen Dataristix Core Service, then try again.") exit } Start-IISCommitDelay # Recreate Core Web App Pool CreateWebAppPool $DataristixCoreAppPool # Recreate Core Web App New-WebApplication -Site $DataristixParentWebSite -Name $DataristixWebAppName -ApplicationPool $DataristixCoreAppPool -PhysicalPath $coreApiPath | Out-Null # set permissions for core app pool user $coreUser = "IIS AppPool\" + $DataristixCoreAppPool #save memory by not launching separate API process SetLaunchAPI $coreServicePath $False $connectorParentWebSite = $DataristixWebAppName + "/connectors" # Set to connectors app to core api physical path also New-WebApplication -Site $DataristixParentWebSite -Name $connectorParentWebSite -ApplicationPool $DataristixCoreAppPool -PhysicalPath $coreApiPath | Out-Null $coreDataPath = Join-Path -Path $DataristixDataRootFolder -ChildPath "core" $coreLogDataPath = Join-Path -Path $coreDataPath -ChildPath "logs" $uacFolderPath = Join-Path -Path $coreDataPath -ChildPath "uac" GrantFullAccess $uacFolderPath $coreUser GrantFullAccess $coreLogDataPath $coreUser # Create web app and app pool for each installed connector $modulesPath = Join-Path -Path $DataristixServicesFolder -ChildPath "modules" Get-ChildItem -Directory -Path $modulesPath | Foreach-Object { if ($_.Name.EndsWith(" Connector")) { $modulePath = $_.FullName $apiPath = Join-Path -Path $modulePath -ChildPath "api" $servicePath = Join-Path -Path $modulePath -ChildPath "service" $moduleName = $_.Name.Replace(" Connector", "") $siteName = $connectorParentWebSite + "/" + $moduleName $appPool = $DataristixAppPoolPrefix + $moduleName + $DataristixAppPoolSuffix $appPoolUser = "IIS AppPool\" + $appPool CreateWebAppPool $appPool New-WebApplication -Site $DataristixParentWebSite -Name $siteName -ApplicationPool $appPool -PhysicalPath $apiPath | Out-Null # Set required permissions for app pool user $connectorDataPath = Join-Path -Path $DataristixDataRootFolder -ChildPath ("modules/" + $_.Name) $connectorLogDataPath = Join-Path -Path $connectorDataPath -ChildPath "logs" # Grant FULL access to connector log folder GrantFullAccess $connectorLogDataPath $appPoolUser # Grant READ access to user access control folder GrantReadAccess $uacFolderPath $appPoolUser #save memory by not launching separate API process SetLaunchAPI $servicePath $False } } Stop-IISCommitDelay -Commit $True } function WriteSuccess { param($msg) process { write-host $msg -Foreground Green } } function WriteWarning { param($msg) process { Write-Warning $msg } } function WriteError { param($msg) process { write-host $msg -Foreground Red } } function EvalMsiExecInstallResult { param($r) process { if ($r -ne 0) { WriteError("msiexec (install) failed with result code: " + $r) WriteError("Ensure that all pre-requisites are installed before executing msiexec.") WriteError("Visit https://docs.dataristix.com for further information.") exit } } } function EvalMsiExecUninstallResult { param($r) process { # silently ignore if uninstall failed (error code 1605) because product is not installed if ($r -eq 1605) { WriteWarning("msiexec (uninstall) failed because the product is not installed.") } elseif ($r -ne 0) { WriteError("msiexec (uninstall) failed with result code: " + $r) exit } } } # InstallMsi # 1. Install MSI # 2. Re-create dataristix Web Application with installed connectors function InstallMsi { param($pathnames) process { #install Core MSI first if exists because other MSIs may depend on it $pathnames | Foreach-Object { $filename = Split-Path -Path $_ -Leaf -Resolve if (($filename.StartsWith("Rensen.Dataristix.Core.Service") -eq $True) -and ($filename.EndsWith(".msi") -eq $True)) { write-host "Installing" $_ $args = "/qn /i `"$_`"" $r = (Start-Process msiexec.exe -ArgumentList $args -Wait -Passthru).ExitCode EvalMsiExecInstallResult $r } } #install other MSIs if exists $pathnames | Foreach-Object { $filename = Split-Path -Path $_ -Leaf -Resolve # Process Dataristix MSIs only if (($filename.StartsWith("Rensen.Dataristix.Core.Service") -eq $True)) { # skip Core service here } elseif (($filename.StartsWith("Rensen.Dataristix.") -eq $True) -and ($filename.EndsWith(".msi") -eq $True)) { write-host "Installing" $_ $args = "/qn /i `"$_`"" $r = (Start-Process msiexec.exe -ArgumentList $args -Wait -Passthru).ExitCode EvalMsiExecInstallResult $r } } # 2. Re-create dataristix Web Application with installed connectors RecreateDataristixWebApp } } function UninstallMsi { param($pathnames) process { $pathnames | Foreach-Object { $filename = Split-Path -Path $_ -Leaf -Resolve # Process Dataristix MSIs only if (($filename.StartsWith("Rensen.Dataristix.") -eq $True) -and ($filename.EndsWith(".msi") -eq $True)) { write-host "Uninstalling" $filename $args = "/qn /x `"$_`"" $r = (Start-Process msiexec.exe -ArgumentList $args -Wait -Passthru).ExitCode EvalMsiExecUninstallResult $r $True } } } } Run $install $uninstall $disable $confirm $help # SIG # Begin signature block # MIIpKAYJKoZIhvcNAQcCoIIpGTCCKRUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDmSnWtV3OwziYd # Sg9mmpCRR7iqA1qezry33RW1bg3TZKCCEhcwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5 # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3 # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4 # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1 # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7 # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2 # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/ # L9Uo2bC5a4CH2RwwggaCMIIE6qADAgECAhEAknipBc2dCJAIpXOG5qjEDDANBgkq # hkiG9w0BAQwFADBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2 # MB4XDTIyMDQyMTAwMDAwMFoXDTI1MDQyMDIzNTk1OVowfDELMAkGA1UEBhMCTlox # ETAPBgNVBAgMCEF1Y2tsYW5kMSwwKgYDVQQKDCNSZW5zZW4gSW5mb3JtYXRpb24g # U2VydmljZXMgTGltaXRlZDEsMCoGA1UEAwwjUmVuc2VuIEluZm9ybWF0aW9uIFNl # cnZpY2VzIExpbWl0ZWQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCg # Y0MfTryznk+V5YwpCGElLu3IeCBaAio9oxcQM1BtOl2U7t+D5ERK+rj2siDVYSz7 # ftY1QBbQeULM/4WprQh/1eq9dhIBtstCajLgCzAoKiH974753l0hJ3kxLolJihJz # HvdZKHCpI/xePTm53Imp3DmLYpV6KMyEBp1J44AQ3FPNM1nyedgMuoM7hnl60kxa # lVi38aYiSJaW4N2bKyDT6PDVEiLyqXzBTSmFEdf3jDvfR36GwxzNhK+1UFfi8JVB # +h8AOpCkEliUBqyoZl/vj/di2q7ao4nFKhvFRb+N6F7tjZHcen7zoLHBKQWNhqQF # lgzUZspC+zSGTtsIViRkYYRN8xkUt2TbkXcb7ebbS22ZU7vqInfFmjGim1EdGkia # N3FWAsrRpN1NcEIRE39quNcY1O6u3alFjdl2GOZUD7CNubedgDI7tkNP+wFAQ4ZZ # 8NJwrRRhqZlO3tvtTTbmaAJm7JzvPCePW6jMpiusY4b9RAUNmRV8EhelmNUsvZmO # 0HJzRIbglS7XvRtxsHqnPzZLlbYbsaSUhlRGdNJLdg46dfQww4irLeZ/WBP621Gj # R7CBYm0hxjAxF68bYmvGnEJEhBEj3ZWCnzty4ElYlo9eoOhcefJ+kBqGvOweu6w5 # /VVFQ4xb9zlIGBQkVnmUX5Nfaq/TlfNwxixIAkaW6QIDAQABo4IBpTCCAaEwHwYD # VR0jBBgwFoAUDyrLIIcouOxvSK4rVKYpqhekzQwwHQYDVR0OBBYEFLdEXu5xmuLa # i8p1bXMBRZOLyyIRMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYI # KwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNV # HR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJs # aWNDb2RlU2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUH # MAKGOGh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWdu # aW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNv # bTAaBgNVHREEEzARgQ9hZG1pbkByZW5zZW4uaW8wDQYJKoZIhvcNAQEMBQADggGB # ACRTumN60t4Xbg12a8kgDlDIz2+ilbX8eVCwkUlxpmVlMiZwM4PnBengD1qZnCiC # llysHb2SA61AdY/Pvt2cIraupprjAGY9KWW7MVBJ3y/o+1PLWkLz4373Zqkwro0u # XkGtG/nP078kYDGDlnrEydOGuHOwB4f//lRVoiG1Lgc7GMc2aOnLmv63zGUfF7p6 # Iw5MsvjkC9QHKIMvgPlG4QuZ5m5Sigd1R30Vfv4XADLngkSEHdgQp0E2HzuvFxNf # RgxF6S3mBg/cfBpe00b2LlYMRgo336gcxTbc4CgA6BZudWVqF38dsKQz3C9CC4Q6 # hOANQJZArsva0HnVcZA3XQrky947a5l71rt7VYPMXXNM2KW12L4hGAQKSnICjOBt # kgZ8hvWsaeqC3RsvYRbiOYacbyU0oBPpOu6iQrQ2KY1ppIE83zvabjOOcAP/0Njq # DDwoFerO8r3kLfCaKLkWXJ35eCwP3d90nQ42X20jFVN1zH251ivFbknsPDecuv3S # LTGCFmcwghZjAgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28g # TGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENB # IFIzNgIRAJJ4qQXNnQiQCKVzhuaoxAwwDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEE # AYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3 # AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgYXjcc2KF1guMyNmj # L+sk/aC9ADK6y3WbmVz0rGAg1g0wDQYJKoZIhvcNAQEBBQAEggIAgsYeAQY62+3C # dpQ1rj/kcz9h0+pSWROj0CAZoSbslA5CABb3WU2Uty/oT+w8LyyWKppHd+8PGnPB # bJx2gzapTCqUhZpV4Bebcuybx8JTLHyFLP5ZVcWmSdoxbKb/YzJKFoaneBjUS7ND # vla/IyTfV1ZRNYRG2esFeetIFELoZzwtlS7fru7HntTCvxUfzpGojCVgEyQiC7R4 # qdRjnAfM+yTCiTgqTJ7Cju3bUIrY2dleQ3VNDmolNhVL5HGsjUNbPVXWyr3tMvmX # 85u7HdN948hMpFexIgK35B6NaIzs1IrmcxhR+ZX4lFEkQ4tFkQ6/SKdRz51P3B7z # uel5ovsqk9mq9XHoyDb8vJcIhg/6iWaHsjpU+AYlc2xLLVEecP9ttBUy0/gDl/YO # ZncBGjk1HyIJ/uWdPLlY/MOrM0pPFssJP7BW8g/UbtZn8+F1u/XuWYGgyXv/maiN # A2fqlzLMHKGiHt3d7tzUzTdFmXEOT1kBffhfw4rnNyYXNRpzmhkLnhZU81zUxuxV # 6H1V/uxY0iaAPn3WIEW4e71c5YeCDRZgivnLxLtqp14pfyHJ+Qhfsl227XrgepSA # yK1lW+zapIVGnm2LrLuIx4qVuFfPuV2aeb/oZd9axBYdVibuqLR0zLMH2O8OmKE1 # 5VDu8rWzVynZbq6TruFgAZ6qZgzulGChghNRMIITTQYKKwYBBAGCNwMDATGCEz0w # ghM5BgkqhkiG9w0BBwKgghMqMIITJgIBAzEPMA0GCWCGSAFlAwQCAgUAMIHwBgsq # hkiG9w0BCRABBKCB4ASB3TCB2gIBAQYKKwYBBAGyMQIBATAxMA0GCWCGSAFlAwQC # AQUABCCvTKX1pvw9LZu0B9UzYbdollxOoOtVaNrddE/qS19rNgIVAN0fcmoD1Ebl # fHqwcpfTt9IHrECwGA8yMDIyMDYxNDAyMTM0N1qgbqRsMGoxCzAJBgNVBAYTAkdC # MRMwEQYDVQQIEwpNYW5jaGVzdGVyMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQx # LDAqBgNVBAMMI1NlY3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgU2lnbmVyICMzoIIN # 6jCCBvYwggTeoAMCAQICEQCQOX+a0ko6E/K9kV8IOKlDMA0GCSqGSIb3DQEBDAUA # MH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO # BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UE # AxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQTAeFw0yMjA1MTEwMDAwMDBa # Fw0zMzA4MTAyMzU5NTlaMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpNYW5jaGVz # dGVyMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1NlY3RpZ28g # UlNBIFRpbWUgU3RhbXBpbmcgU2lnbmVyICMzMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAkLJxP3nh1LmKF8zDl8KQlHLtWjpvAUN/c1oonyR8oDVABvqU # rwqhg7YT5EsVBl5qiiA0cXu7Ja0/WwqkHy9sfS5hUdCMWTc+pl3xHl2AttgfYOPN # EmqIH8b+GMuTQ1Z6x84D1gBkKFYisUsZ0vCWyUQfOV2csJbtWkmNfnLkQ2t/yaA/ # bEqt1QBPvQq4g8W9mCwHdgFwRd7D8EJp6v8mzANEHxYo4Wp0tpxF+rY6zpTRH72M # Zar9/MM86A2cOGbV/H0em1mMkVpCV1VQFg1LdHLuoCox/CYCNPlkG1n94zrU6LhB # KXQBPw3gE3crETz7Pc3Q5+GXW1X3KgNt1c1i2s6cHvzqcH3mfUtozlopYdOgXCWz # pSdoo1j99S1ryl9kx2soDNqseEHeku8Pxeyr3y1vGlRRbDOzjVlg59/oFyKjeUFi # z/x785LaruA8Tw9azG7fH7wir7c4EJo0pwv//h1epPPuFjgrP6x2lEGdZB36gP0A # 4f74OtTDXrtpTXKZ5fEyLVH6Ya1N6iaObfypSJg+8kYNabG3bvQF20EFxhjAUOT4 # rf6sY2FHkbxGtUZTbMX04YYnk4Q5bHXgHQx6WYsuy/RkLEJH9FRYhTflx2mn0iWL # lr/GreC9sTf3H99Ce6rrHOnrPVrd+NKQ1UmaOh2DGld/HAHCzhx9zPuWFcUCAwEA # AaOCAYIwggF+MB8GA1UdIwQYMBaAFBqh+GEZIA/DQXdFKI7RNV8GEgRVMB0GA1Ud # DgQWBBQlLmg8a5orJBSpH6LfJjrPFKbx4DAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0T # AQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsG # AQQBsjEBAgEDCDAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQ # UzAIBgZngQwBBAIwRAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC5zZWN0aWdv # LmNvbS9TZWN0aWdvUlNBVGltZVN0YW1waW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgw # ZjA/BggrBgEFBQcwAoYzaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNB # VGltZVN0YW1waW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAc9rtaHLLwrlAoTG7tAOjLRR7JOe0 # WxV9qOn9rdGSDXw9NqBp2fOaMNqsadZ0VyQ/fg882fXDeSVsJuiNaJPO8XeJOX+o # BAXaNMMU6p8IVKv/xH6WbCvTlOu0bOBFTSyy9zs7WrXB+9eJdW2YcnL29wco89Oy # 0OsZvhUseO/NRaAA5PgEdrtXxZC+d1SQdJ4LT03EqhOPl68BNSvLmxF46fL5iQQ8 # TuOCEmLrtEQMdUHCDzS4iJ3IIvETatsYL254rcQFtOiECJMH+X2D/miYNOR35bHO # jJRs2wNtKAVHfpsu8GT726QDMRB8Gvs8GYDRC3C5VV9HvjlkzrfaI1Qy40ayMtjS # KYbJFV2Ala8C+7TRLp04fDXgDxztG0dInCJqVYLZ8roIZQPl8SnzSIoJAUymefKi # thqZlOuXKOG+fRuhfO1WgKb0IjOQ5IRT/Cr6wKeXqOq1jXrO5OBLoTOrC3ag1WkW # t45mv1/6H8Sof6ehSBSRDYL8vU2Z7cnmbDb+d0OZuGktfGEv7aOwSf5bvmkkkf+T # /FdpkkvZBT9thnLTotDAZNI6QsEaA/vQ7ZohuD+vprJRVNVMxcofEo1XxjntXP/s # nyZ2rWRmZ+iqMODSrbd9sWpBJ24DiqN04IoJgm6/4/a3vJ4LKRhogaGcP24WWUsU # CQma5q6/YBXdhvUwggbsMIIE1KADAgECAhAwD2+s3WaYdHypRjaneC25MA0GCSqG # SIb3DQEBDAUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEU # MBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0 # d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhv # cml0eTAeFw0xOTA1MDIwMDAwMDBaFw0zODAxMTgyMzU5NTlaMH0xCzAJBgNVBAYT # AkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZv # cmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBS # U0EgVGltZSBTdGFtcGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAMgbAa/ZLH6ImX0BmD8gkL2cgCFUk7nPoD5T77NawHbWGgSlzkeDtevEzEk0 # y/NFZbn5p2QWJgn71TJSeS7JY8ITm7aGPwEFkmZvIavVcRB5h/RGKs3EWsnb111J # TXJWD9zJ41OYOioe/M5YSdO/8zm7uaQjQqzQFcN/nqJc1zjxFrJw06PE37PFcqwu # Cnf8DZRSt/wflXMkPQEovA8NT7ORAY5unSd1VdEXOzQhe5cBlK9/gM/REQpXhMl/ # VuC9RpyCvpSdv7QgsGB+uE31DT/b0OqFjIpWcdEtlEzIjDzTFKKcvSb/01Mgx2Bp # m1gKVPQF5/0xrPnIhRfHuCkZpCkvRuPd25Ffnz82Pg4wZytGtzWvlr7aTGDMqLuf # DRTUGMQwmHSCIc9iVrUhcxIe/arKCFiHd6QV6xlV/9A5VC0m7kUaOm/N14Tw1/Ao # xU9kgwLU++Le8bwCKPRt2ieKBtKWh97oaw7wW33pdmmTIBxKlyx3GSuTlZicl57r # jsF4VsZEJd8GEpoGLZ8DXv2DolNnyrH6jaFkyYiSWcuoRsDJ8qb/fVfbEnb6ikEk # 1Bv8cqUUotStQxykSYtBORQDHin6G6UirqXDTYLQjdprt9v3GEBXc/Bxo/tKfUU2 # wfeNgvq5yQ1TgH36tjlYMu9vGFCJ10+dM70atZ2h3pVBeqeDAgMBAAGjggFaMIIB # VjAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUGqH4 # YRkgD8NBd0UojtE1XwYSBFUwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYB # Af8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAG # A1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1 # c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgw # PwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RS # U0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRy # dXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAbVSBpTNdFuG1U4GRdd8DejILLSWE # EbKw2yp9KgX1vDsn9FqguUlZkClsYcu1UNviffmfAO9Aw63T4uRW+VhBz/FC5RB9 # /7B0H4/GXAn5M17qoBwmWFzztBEP1dXD4rzVWHi/SHbhRGdtj7BDEA+N5Pk4Yr8T # AcWFo0zFzLJTMJWk1vSWVgi4zVx/AZa+clJqO0I3fBZ4OZOTlJux3LJtQW1nzclv # kD1/RXLBGyPWwlWEZuSzxWYG9vPWS16toytCiiGS/qhvWiVwYoFzY16gu9jc10rT # Pa+DBjgSHSSHLeT8AtY+dwS8BDa153fLnC6NIxi5o8JHHfBd1qFzVwVomqfJN2Ud # vuq82EKDQwWli6YJ/9GhlKZOqj0J9QVst9JkWtgqIsJLnfE5XkzeSD2bNJaaCV+O # /fexUpHOP4n2HKG1qXUfcb9bQ11lPVCBbqvw0NP8srMftpmWJvQ8eYtcZMzN7iea # 5aDADHKHwW5NWtMe6vBE5jJvHOsXTpTDeGUgOw9Bqh/poUGd/rG4oGUqNODeqPk8 # 5sEwu8CgYyz8XBYAqNDEf+oRnR4GxqZtMl20OAkrSQeq/eww2vGnL8+3/frQo4TZ # J577AWZ3uVYQ4SBuxq6x+ba6yDVdM3aO8XwgDCp3rrWiAoa6Ke60WgCxjKvj+QrJ # VF3UuWp0nr1IrpgxggQtMIIEKQIBATCBkjB9MQswCQYDVQQGEwJHQjEbMBkGA1UE # CBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQK # Ew9TZWN0aWdvIExpbWl0ZWQxJTAjBgNVBAMTHFNlY3RpZ28gUlNBIFRpbWUgU3Rh # bXBpbmcgQ0ECEQCQOX+a0ko6E/K9kV8IOKlDMA0GCWCGSAFlAwQCAgUAoIIBazAa # BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIyMDYx # NDAyMTM0N1owPwYJKoZIhvcNAQkEMTIEMGk3Kv3JK0gfetWSKHGD9MvE3JWSlU2P # 2M0i3hoMhSANCQkpH9f2sklwHrEKCOiLMDCB7QYLKoZIhvcNAQkQAgwxgd0wgdow # gdcwFgQUqzQBOqxAlzGfCBrwsxjhg/gPeIEwgbwEFALWW5Xig3DBVwCV+oj5I92T # f62PMIGjMIGOpIGLMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNl # eTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1Qg # TmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1 # dGhvcml0eQIQMA9vrN1mmHR8qUY2p3gtuTANBgkqhkiG9w0BAQEFAASCAgBn/Yai # wKssVGdQmj2+Z9uNIHsgDHZOVxUzWhvADs4TUFjRy9OB0woYPjO1pPSm0CeroBhy # O3ndjE2gU66AhSYLtG+XQrQbDNwRJToBxkXipNZKCD7cmLkUNk/S5289yjVFfE6b # +DJ1RY03lXL26gagWMJCY70eTNNKOD0C8cULF5sDBjUQptV//7EQnBZaUchZhEfQ # w4+LLx0X39DQ3agxr7OjlDJ2tcSbP71fdsyGEwUVl7+O7595Qy0aNwphY5XlteLz # XZHtMdm6W+sPalTpFgTiTSwP1Wk95xYfaJN/rtJgNDKuwBtn/co9JPtqVXS7jj7X # TSXNZONFI0ssVySRXynmPgJ7ctmwiceRnERte86rGMG1WLby+7N4xrkjXKU2eQI+ # el/XhoTAp01+6Qo5Iv8Z9bLr7Sl1iYDrvCAe78brfxSaNmtUATaQ9lYMobmzP0ro # PLQbVLChT949t28LRt2fsp7eDiuB8+yxitq1gEmfYn2O5vYDAa5EGFDzhFHH4G0S # Ol4ZcjIUxZh4AlIG646OTiN73Zj2jyiuZCS05OrjrZaZPYwmF4J7PB7LLkI6AAWy # AdeLStrSN8h3F7d7ROXZyMhcNs3KRpEIbbJYcUwi0yoA0ZndKR1KnIgYlvfmMMw2 # zwVV9dFWWIzwT07Zoits3dP5asMwhrV/GeUFbA== # SIG # End signature block