Obs/bin/ObsDep/content/Powershell/Roles/Common/CompleteBootDSC.ps1
$waitForTimeSyncScript = "$PSScriptRoot\WaitForTimeSyncBeforeDSC.ps1" if (Test-Path $waitForTimeSyncScript) { # Wait for time on this machine to syncrhonize before we begin the boot-time DSC process. # This ensures that our transcript times don't get messed up by clock changes during this time. & $waitForTimeSyncScript } $logFile = "$env:windir\SetupComplete.log" Start-Transcript -Path $logFile -Append function Trace-Execution { param( [Parameter(ValueFromPipeline=$true)] [string] $message, $ForegroundColor = "White") Process { if ($message) { "$message - $([DateTime]::Now.ToString())" | Write-Host } } } Trace-Execution "Starting CompleteBootDSC" function Start-WaitForLCM { $ErrorActionPreference = 'Stop' $waitingForLCM = $true $maxRetryCount = 180 # 180 retries X once every 10 seconds = 30 minutes $currentIteration = 1 Trace-Execution "Waiting for LCM" while ($waitingForLCM) { Trace-Execution "Attempt# $currentIteration" $lcmStatus = Get-DscLocalConfigurationManager if (($lcmStatus.LCMState -like 'Idle') -or ($lcmStatus.LCMState -like 'PendingConfiguration')) { $waitingForLCM = $false } else { if($currentIteration -ge $maxRetryCount) { Trace-Execution "LCM did not reach a stable state after $currentIteration attempts." return $false } Trace-Execution "Waiting 10 seconds for LCM to stabilize" sleep 10 } $currentIteration++ } Trace-Execution "LCM Ready" return $true } function Start-DSCWithCatch { param( [CimSession]$CimSession ) # WINRM may restart and fail the connection used use by Start-DscConfiguration. # It will continue processing in the background, but Get-DscConfiguration will need to # wait for it to finish. try { # Log redirection through DCOM is minimal, unfortunately. Start-DscConfiguration -CimSession $CimSession -Force -Wait -UseExisting -Verbose -ErrorAction Stop *>&1 | Trace-Execution return $true } catch { # If an exception is encountered, wait until LCM is done processing the configuration in the background, # and then check whether it succeeded. Trace-Execution "*** Start-DscConfiguration threw exception '$_'. This may be expected due to WinRM restarts. Wait for LCM to stabilize." $lcmReady = Start-WaitForLCM Trace-Execution "LCM ready: $lcmReady" Trace-Execution "Testing DSC configuration." $result = Test-DscConfiguration -Detailed -Verbose Trace-Execution "Converged resources: $(Get-ResourceListAsString $result.ResourcesInDesiredState)" Trace-Execution "Unconverged resources: $(Get-ResourceListAsString $result.ResourcesNotInDesiredState)" return $result.InDesiredState } } <# .Synopsis Writes DSC status file at the specified location .Parameter TargetFolderPath Target folder where the DSC status file will be written .Parameter Version Current version being deployed or the version to which the stamp is being updated. The name of the status file will contain the version to detect completion of DSC. .Parameter Status Status of CompleteBootDSC script. #> function Write-DscStatusFile { param( [Parameter(Mandatory)] [System.Xml.XmlElement] $TargetPaths, [Parameter(Mandatory)] [string] $Version, [Parameter(Mandatory)] [ValidateSet("Started", "Completed", "Failed")] [string] $Status, [Parameter(Mandatory = $false)] [object[]] $ResourcesNotInDesiredState ) $fileName = $env:COMPUTERNAME + "." + $Version + ".xml" $filePath = Join-Path -Path $TargetPaths.TargetShare.PrimaryPath -ChildPath $fileName Trace-Execution "DSC status file will be written at: $filePath" $fileDirectory = Split-Path $filePath if (-not (Test-Path $fileDirectory)) { Trace-Execution "Creating directory for the status file: $fileDirectory" New-Item -Type Directory -Path $fileDirectory -Force | Out-Null } Add-Type -AssemblyName System.Xml.Linq $xml = [System.Xml.Linq.XElement]::new("DeploymentDSC", [System.Xml.Linq.XElement]::new("Status", $Status)) if ($ResourcesNotInDesiredState -and $ResourcesNotInDesiredState.Length -gt 0) { $childElement = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]"ResourcesNotInDesiredState") foreach ($resource in $ResourcesNotInDesiredState) { $childElement.Add([System.Xml.Linq.XElement]::new("ResourceId", $resource.ResourceId)) } $xml.Add($childElement) } $xml.Save($filePath) } function Get-ResourceListAsString { param ( [object[]]$Resources ) if ($Resources) { return ( ($Resources | % { "$($_.ConfigurationName): $($_.ResourceId)" }) -join ", " ) } return [string]::Empty } # Apply settings to the LCM function Set-LcmMetaConfig { param ( [string[]] $PartialConfigs ) Trace-Execution "Importing $PSScriptRoot\DscMetaConfig.psm1" Import-Module "$PSScriptRoot\DscMetaConfig.psm1" -Force $metaMofPath = Join-Path -Path $env:temp -ChildPath 'lcm' New-Item -Path $metaMofPath -ItemType Directory -Force -ErrorAction SilentlyContinue Remove-Item $metaMofPath\localhost.meta.mof -Force -ErrorAction SilentlyContinue Trace-Execution "*** Generating LCM configuration" $null = MetaMof -OutputPath $metaMofPath -CredentialEncryptionThumbprint $encryptionCert.ThumbPrint -PartialConfigList $PartialConfigs $lcmConfig = $false do { try { Trace-Execution "*** Setting LCM configuration from $metaMofPath" Set-DscLocalConfigurationManager -Path $metaMofPath -Force -ErrorAction Stop $lcmConfig = $true } catch { $errorMessage = $_.Exception.ToString() Trace-Execution "Error setting LCM configuration : '$errorMessage'" Start-Sleep 60 } } until ($lcmConfig) } $ErrorActionPreference = 'Stop' try { $partialConfigListFileName = "c:\DSCConfigs\DscPartialConfigList.xml" # wait for up to 5 minutes for WinRM service to start on it's own $retryCount = 0 do { $retryCount++ try { Trace-Execution "Getting WinRM service, attempt $retryCount" $getWinRM = (Get-Service -Name WinRM -ErrorAction Stop).Status Trace-Execution "WinRM service status is $getWinRM" if ($getWinRM -ne 'Running') { Start-Sleep -Seconds 15 } } catch { $errorMessage = $_.Exception.Message Trace-Execution "Error getting WinRM service : '$errorMessage'" Start-Sleep -Seconds 15 } } until (($getWinRM -eq 'Running') -or ($retryCount -ge 20)) # if WinRM service isn't started after 5 minutes, attempt to start it $retryCount = 0 while ((Get-Service -Name WinRM -ErrorAction SilentlyContinue).Status -ne 'Running') { $retryCount++ try { Trace-Execution "Starting WinRM service, attempt $retryCount" Start-Service -Name WinRM -ErrorAction Stop } catch { $errorMessage = $_.Exception.Message Trace-Execution "Error starting WinRM service : '$errorMessage'" Start-Sleep 60 } } # Get the configuration file with the information needed to generate the DSC status file $configFile = "C:\DscConfigs\CompleteBootDscStatusConfig.xml" Trace-Execution "Extracting data from configuration file present at: $configFile" $content = [xml] (Get-Content -Path $configFile) # Define the path of the file where the status will be defined $targetFolderPaths = $content.Configuration.TargetShares $version = $content.Configuration.Version # Boot-time DSC configuration for hosts sets up the vSwitches, so prior to the convergence of # those resources hosts have no network connectivity. We skip attempting to write the initial # 'Started' status for hosts because it will always fail. if (Test-Path $partialConfigListFileName) { $isHostDscConfig = Get-Item $partialConfigListFileName | Select-String -SimpleMatch "NewComputeBootstrapDscConfiguration" } if ($isHostDscConfig) { Trace-Execution "Not writing initial DSC status for a host configuration, because host networking has not been configured yet." } else { Trace-Execution "Trying to write DSC status file with status: Started" Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status Started } Trace-Execution "Installing DSC Configuration decryption certificate" # This code is structured to be idempotent, partly for debugging and partly because a one-node POC # host will already have the certificates installed, because it is where the deployment collateral # runs. # Import the cert necessary for verifying DSC MOF signatures. $signingCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscSigningCert*') {$_}} $encryptionCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscEncryptionCert*') {$_}} $certPasswordPlaintext = Get-Content -Path c:\DSCConfigs\DscCertPassword.txt -ErrorAction SilentlyContinue if ($certPasswordPlaintext -ne $null) { $certPassword = $certPasswordPlaintext | ConvertTo-SecureString -AsPlainText -Force # Import the cert necessary for verifying DSC MOF signatures. if (-not $signingCert) { # This can loop indefinitely since deployment will fail on timeout if the certificate is not imported. # We need to retry here since the certificate is not always immediately available from Cert:\ path after import. do { Trace-Execution "Installing DSC Configuration signature verification certificate" try { Import-PfxCertificateSafe -FilePath c:\DSCConfigs\DscSigning.pfx ` -CertStoreLocation Cert:\LocalMachine\My ` -Password $certPassword ` -Exportable ` -ErrorAction Stop $signingCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscSigningCert*') {$_}} } catch { Trace-Execution "Failed to import DSC Configuration signature verification certificate due to '$_'." } finally { if (-not $signingCert) { Trace-Execution "Failed to find DSC signature verification certificate, will retry in 10 seconds" Start-Sleep -Seconds 10 } } } until ($signingCert) Trace-Execution "Deleting DSC signature verification cert files" Remove-Item -Path c:\DSCConfigs\DscSigning.pfx -Force } # Import the cert necessary for decrypting creds in DSC MOFs. if (-not $encryptionCert) { # This can loop indefinitely since deployment will fail on timeout if the certificate is not imported. # We need to retry here since the certificate is not always immediately available from Cert:\ path after import. do { try { Trace-Execution "Installing DSC Configuration decryption certificate" Import-PfxCertificateSafe -FilePath c:\DSCConfigs\DscEncryption.pfx ` -CertStoreLocation Cert:\LocalMachine\My ` -Password $certPassword ` -Exportable ` -ErrorAction Stop $encryptionCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscEncryptionCert*') {$_}} } catch { Trace-Execution "Failed to import DSC Configuration decryption certificate" } finally { if (-not $encryptionCert) { Trace-Execution "Failed to find DSC decryption certificate, will retry in 10 seconds" Start-Sleep -Seconds 10 } } } until ($encryptionCert) Trace-Execution "Deleting DSC Configuration decryption cert files" Remove-Item -Path c:\DSCConfigs\DscEncryption.pfx -Force } Remove-Item -Path c:\DSCConfigs\DscCertPassword.txt -Force } if (-not $encryptionCert) { Trace-Execution "Failed to find DSC Signing Certificate" throw } Trace-Execution "Reexporting public key for LCM configuration" $encryptionCert | Export-Certificate -FilePath c:\DSCConfigs\DscDecryption.cer -Force $partialConfigList = @() $partialConfigListFile = Get-ChildItem -Path $partialConfigListFileName -ErrorAction SilentlyContinue $partialConfigListFileContent = $null if ($partialConfigListFile) { $partialConfigListFileContent = [xml](Get-Content -Path $partialConfigListFile) $partialConfigList = [array] ($partialConfigListFileContent.PartialConfigurations.PartialConfiguration.Name) Trace-Execution "Read list of $($partialConfigList.Count) partial configs: $($partialConfigList -join ',')" } Trace-Execution "Configuring LCM without enabling partial configurations." Set-LcmMetaConfig -PartialConfigs @() # Use DCOM for invoke the Start-DscConfiguration to avoid complications with WINRM restarting during JEA resources. $opt = New-CimSessionOption -Protocol Dcom $session = New-CimSession -ComputerName localhost -SessionOption $opt # Don't call DSC via WINRM between the Publish and when configuration is complete. # After publishing configurations, DSC configuration may auto-start on a timer. # When configurations re-start WINRM, calls to DSC through WINRM may cause a dead-lock. # If starting the DSC configs in this secion fails, we will make one final attempt below # to re-converge them before failing the overall action. Trace-Execution "*** Publishing DSC configurations in C:\DSCConfigs" # If there are partial configurations, publish them all. If not, just apply them serially. if ($partialConfigListFile) { $availablePhases = [array] (($partialConfigListFileContent.PartialConfigurations.PartialConfiguration.Phase) | Select-Object -Unique | Sort-Object) $publishedPhaseCount = 0 foreach($phase in $availablePhases) { Trace-Execution "Get list of partial configurations in phase: $phase" $selectedPartials = $partialConfigListFileContent.PartialConfigurations.PartialConfiguration | Where-Object {$_.Phase -eq $phase} $partialsForCurrentPhase = $selectedPartials.Name Trace-Execution "Configurations for this phase: $($partialsForCurrentPhase -join ',')" foreach ($configName in $partialsForCurrentPhase) { $publishedPhaseCount++ if ($publishedPhaseCount -eq $availablePhases.Count) { Trace-Execution "Configuration for all phases has been published. Setting marker file." New-Item -Type File -Name dsc.published -Path C:\DSCConfigs -Force | Out-Null } $configDirectory = Get-ChildItem "C:\DSCConfigs" -Directory | Where-Object Name -eq $configName if ($configDirectory) { Trace-Execution "Publishing configuration $configName from directory $($configDirectory.FullName)" Publish-DscConfiguration -Path $configDirectory.FullName -Force -ErrorAction Stop Trace-Execution "Applying configuration $configName" $result = Start-DSCWithCatch -CimSession $session Trace-Execution "Result of applying DSC for phase $($phase) and configuration $($configName): $result" } else { Trace-Execution "Configuration $configName is defined in $partialConfigListFileName but is not present under C:\DSCConfigs" } } } } else { $partialDirs = Get-ChildItem C:\DSCConfigs -Directory foreach ($partialDir in $partialDirs) { Trace-Execution "*** Applying DSC configuration from $($partialDir.FullName)" Publish-DscConfiguration -Path $partialDir.FullName -Force -ErrorAction Stop $result = Start-DSCWithCatch -CimSession $session Trace-Execution "Result of applying DSC for directory $($partialDir.FullName): $result" } } $lcmStatusResult = Start-WaitForLCM if($lcmStatusResult -eq $false) { Trace-Execution "Failed to find LCM in acceptable state. Trying to write status file to orchestrator(s)." Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status Failed return } Trace-Execution "*** DSC configuration complete" Trace-Execution "*** Checking for errors from Get-WinEvent -LogName 'Microsoft-Windows-DSC/Operational' | Sort-Object -Property TimeCreated" $evt = Get-WinEvent -LogName "Microsoft-Windows-DSC/Operational" | Sort-Object -Property TimeCreated [object[]] $dscErrors = $evt | Where-Object { $_.LevelDisplayName -eq "Error" } Trace-Execution "$($dscErrors.Count) errors processing initial DSC configuration. See event log." $dscErrors | Format-List TimeCreated, Message # At this point WinRM should be stable. Trace-Execution "*** Testing whether DSC configuration is in expected states." $t = Test-DscConfiguration -Verbose -Detailed if(($t -eq $null) -or ($t.InDesiredState -eq $false)) { Trace-Execution "*** Some resources are not in the desired state. Attempt to mitigate by running Start-DscConfiguration again." $result = Start-DSCWithCatch -CimSession $session Trace-Execution "Result of last DSC convergence attempt: $result" Trace-Execution "*** Testing whether DSC configuration is in expected states." $t = Test-DscConfiguration -Verbose -Detailed } Trace-Execution "*** DSC results:" Trace-Execution "In desired state: $($t.InDesiredState)" Trace-Execution "ResourcesInDesiredState: $(Get-ResourceListAsString $t.ResourcesInDesiredState)" Trace-Execution "ResourcesNotInDesiredState: $(Get-ResourceListAsString $t.ResourcesNotInDesiredState)" # Allow deployment to detect that the machine has finished processing DSC. # By this point, the host has been brought to the state expected by both Wait-BareMetalDeployment and Wait-VirtualNetwork. if($null -eq $t) { Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status "Failed" } elseif ($t.InDesiredState -eq $false) { Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status "Failed" -ResourcesNotInDesiredState $t.ResourcesNotInDesiredState } else { Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status "Completed" } Trace-Execution "Resetting LCM to not use Partial Configuration mode." Set-LcmMetaConfig -PartialConfigs @() } catch { # Attempt to write the DSC status file so the orchestrator has a chance to fail fast rather than timing out. Trace-Execution "Encountered an exception during boot-time DSC execution: $_" Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status Failed throw } finally { $session | Remove-CimSession -ErrorAction Ignore Trace-Execution "***CompleteBootDSC.ps1 complete***" Stop-Transcript -ErrorAction Ignore } # SIG # Begin signature block # MIInwQYJKoZIhvcNAQcCoIInsjCCJ64CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBc0apg1mDx1TiH # C1b6p9flh/dYCKhMmTYuIagIsATYraCCDXYwggX0MIID3KADAgECAhMzAAADTrU8 # esGEb+srAAAAAANOMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMwMzE2MTg0MzI5WhcNMjQwMzE0MTg0MzI5WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDdCKiNI6IBFWuvJUmf6WdOJqZmIwYs5G7AJD5UbcL6tsC+EBPDbr36pFGo1bsU # p53nRyFYnncoMg8FK0d8jLlw0lgexDDr7gicf2zOBFWqfv/nSLwzJFNP5W03DF/1 # 1oZ12rSFqGlm+O46cRjTDFBpMRCZZGddZlRBjivby0eI1VgTD1TvAdfBYQe82fhm # WQkYR/lWmAK+vW/1+bO7jHaxXTNCxLIBW07F8PBjUcwFxxyfbe2mHB4h1L4U0Ofa # +HX/aREQ7SqYZz59sXM2ySOfvYyIjnqSO80NGBaz5DvzIG88J0+BNhOu2jl6Dfcq # jYQs1H/PMSQIK6E7lXDXSpXzAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUnMc7Zn/ukKBsBiWkwdNfsN5pdwAw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMDUxNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAD21v9pHoLdBSNlFAjmk # mx4XxOZAPsVxxXbDyQv1+kGDe9XpgBnT1lXnx7JDpFMKBwAyIwdInmvhK9pGBa31 # TyeL3p7R2s0L8SABPPRJHAEk4NHpBXxHjm4TKjezAbSqqbgsy10Y7KApy+9UrKa2 # kGmsuASsk95PVm5vem7OmTs42vm0BJUU+JPQLg8Y/sdj3TtSfLYYZAaJwTAIgi7d # hzn5hatLo7Dhz+4T+MrFd+6LUa2U3zr97QwzDthx+RP9/RZnur4inzSQsG5DCVIM # pA1l2NWEA3KAca0tI2l6hQNYsaKL1kefdfHCrPxEry8onJjyGGv9YKoLv6AOO7Oh # JEmbQlz/xksYG2N/JSOJ+QqYpGTEuYFYVWain7He6jgb41JbpOGKDdE/b+V2q/gX # UgFe2gdwTpCDsvh8SMRoq1/BNXcr7iTAU38Vgr83iVtPYmFhZOVM0ULp/kKTVoir # IpP2KCxT4OekOctt8grYnhJ16QMjmMv5o53hjNFXOxigkQWYzUO+6w50g0FAeFa8 # 5ugCCB6lXEk21FFB1FdIHpjSQf+LP/W2OV/HfhC3uTPgKbRtXo83TZYEudooyZ/A # Vu08sibZ3MkGOJORLERNwKm2G7oqdOv4Qj8Z0JrGgMzj46NFKAxkLSpE5oHQYP1H # tPx1lPfD7iNSbJsP6LiUHXH1MIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCGaEwghmdAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAANOtTx6wYRv6ysAAAAAA04wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGeRR6jaG2U0Qxb3whBaCYoG # W4Q+vE3CYBSPcA2IBsI5MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAu1FK9apckRRb5natw/bejl1P0AiT3Zzdu/g/icB8gPlctA349PGS2Ogv # hknyCN+zmPlf4GE97sjylFQJBYJRkSrgbXRgHrohFeCqeLt+Os3k+Q9aON0IMb11 # EbdbkVADmwivyISxadKUZD6d1wjxuhEQHGFz/DR+wU8EmgCMVOjpJx0xvHE+fxFr # LAuTVZeQ4NYzBOSRh8adCgLMKvMwi/aIkHLMuwQcmiA2QJGcO72q6s5KFnCMrbsw # wvNnZZ6nFFashXxXKZRv6pwiWg9uLSwXdcrI+ZMtxJ65HbbVLAtvrdGYqDU8mqTV # A+JoEd97pod4fy2PhmnHACeop/EwfKGCFyswghcnBgorBgEEAYI3AwMBMYIXFzCC # FxMGCSqGSIb3DQEHAqCCFwQwghcAAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFYBgsq # hkiG9w0BCRABBKCCAUcEggFDMIIBPwIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCDnRJmul/onXXF7ecvt5qE8cVDKzr4lAWor9Zw52hnZjQIGZQrjflZX # GBIyMDIzMDkyMjA4MzIxMC41M1owBIACAfSggdikgdUwgdIxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVs # YW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046 # MkFENC00QjkyLUZBMDExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNl # cnZpY2WgghF7MIIHJzCCBQ+gAwIBAgITMwAAAbHKkEPuC/ADqwABAAABsTANBgkq # hkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yMjA5 # MjAyMDIxNTlaFw0yMzEyMTQyMDIxNTlaMIHSMQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVy # YXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjJBRDQtNEI5 # Mi1GQTAxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAhqKrPtXsG8fsg4w8R4MzZTAK # kzwvEBQ94ntS+72rRGIMF0GCyEL9IOt7f9gkGoamfbtrtdY4y+KIFR8w19/nU3Eo # WhJfrYamrfpgtFmTaE3XCKCsI7rnrPmlVOMmndDyN1gAlfeu4l5rdxx9ODECBPdS # /+w/jDT7JkBhrYllqVXcwGAgWLdXAoUDgKVByv5XhKkbOrPx9qppuZjKm4nflmfw # b/bTWkA3aMMQ67tBoMLSsbIN3BJNWZdwczjoQVXo3YXr2fB+PYNmHviCcDUMHs0V # xmf7i/WSpBafsDMEn6WY7G8qtRGVX+7X0zDVg/7NVDLMqfn/iv++5hJGP+2Fmv4W # ZkBS1MBpwvOi4EQ25pIG45jWTffR4ynyed1I1SxSOP+efuBx0WrN1A250lv5fGZH # CL0vCMDT/w+U6wpNnxfDoQRY9Ut82iNK5alkxNozPP/DNI+nknTaSliaR2XnSXDI # ZEs7lfuJYg0qahfJJ1CZF2IYxOS9FK1crEigSb8QnEJoj6ThLf4FYpYLTsRXlPdQ # bvBsVvgt++BttooznwfK0DKMOc718SLS+unwkVO0aF23CEQSStoy0ZW34K+cbRmU # fia+k9E+4luoTnT17oKqYfDNO5Rk8UwVa8mfh8+/R3fZaz2O/ZhiYT/RZHV9Quz5 # PHGlaCfXPQ8A6zFJlE8CAwEAAaOCAUkwggFFMB0GA1UdDgQWBBT0m2eR7w2thIr1 # 8WehUTSmvQ45kzAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNV # HR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Ny # bC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYI # KwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAy # MDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI # MA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEA2Oc3kmql5VKEitAh # oBCc1U6/VwMSYKQPqhC59f00Y5fbwnD+B2Qa0wnJqADSVVu6bBCVrks+EGbkuMhR # b/lpiHNKVnuXF4PKTDnvCnYCqgwAmbttdxe0m38fJpGU3fmECEFX4OYacEhFwTkL # ZtIUVjdqwPnQpRII+YqX/Q0Vp096g2puPllSdrxUB8xIOx3F7LGOzyv/1WmrLyWA # hUGpGte0W3qfX4YWkn7YCM+yl887tj5j+jO/l1MRi6bl4MsN0PW2FCYeRbyzQEEN # sg5Pd351Z08ROR/nR8z+cAuQwR29ijaDKIms5IbRr1nZL/qZskFSuCuSA+nYeMuT # JxHg2HCXrt6ECFbEkYoPaBGTzxPYopcuJEcChhNlWkduCRguykEsmz0LvtmS7Fe6 # 8g4Zoh3sQkIE5VEwnKC3HwVemhK7eNYR1q7RYExfGFUDMQdO7tQpbcPD4oaBbtFG # WGu3nz1IryWs9K88zo8+eoQV/o9SxNU7Rs6TMqcLdM6C6LgmGVaWKKC0S2DVKU8z # Fx0y5z25h1ZJ7X/Zhaav1mtXVG6+lJIq8ktJgOU5/pomumdftgosxGjIp3NORy9f # DUll+KQl4YmN9GzZxPYkhuI0QYriLmytBtUK+AK91hURVldVbUjP8sksr1dsiQwy # OYQIkSxrTuhp0pw7h5329jphgEYwggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZ # AAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVa # MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT # HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEF # AAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1 # V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9 # alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmv # Haus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928 # jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3t # pK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEe # HT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26o # ElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4C # vEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ug # poMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXps # xREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0C # AwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYE # FCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtT # NRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNo # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o # dG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD # AEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZW # y4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5t # aWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAt # MDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0y # My5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pc # FLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpT # Td2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0j # VOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3 # +SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmR # sqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSw # ethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5b # RAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmx # aQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsX # HRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0 # W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0 # HVUzWLOhcGbyoYIC1zCCAkACAQEwggEAoYHYpIHVMIHSMQswCQYDVQQGEwJVUzET # MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFu # ZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjJB # RDQtNEI5Mi1GQTAxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2 # aWNloiMKAQEwBwYFKw4DAhoDFQDtZLG+pANsDu/LLr1OfTA/kEbHK6CBgzCBgKR+ # MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT # HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBBQUAAgUA # 6LazMDAiGA8yMDIzMDkyMTIwMTg1NloYDzIwMjMwOTIyMjAxODU2WjB3MD0GCisG # AQQBhFkKBAExLzAtMAoCBQDotrMwAgEAMAoCAQACAiDiAgH/MAcCAQACAhH2MAoC # BQDouASwAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEA # AgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQADgYEAB267WP0n+2BtSTOQ # vGPs4Mz062BtDymKqXu2jt66ituOi7h+Syu/ip7a1Y7MAW3DlSO88DQ/lU/luYDg # /Ffy3otZ2RgNKjwsdb0UKm6Y3+ItKK3GZBQ4yN4+ddFelA8wbkyy49H42XSTEm3H # u6B6XsJ2vxfvI93pTBUyZ/6gmG4xggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMAITMwAAAbHKkEPuC/ADqwABAAABsTANBglghkgBZQME # AgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJ # BDEiBCDmKIkpbMfi7dL1KBnRiERjxPvrwukEHZroBNbJplCNBDCB+gYLKoZIhvcN # AQkQAi8xgeowgecwgeQwgb0EIIPtDYsUW9+p4OjL2Cm7fm3p1h6usM7RwxOU4iib # NM9sMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAGx # ypBD7gvwA6sAAQAAAbEwIgQg5GJhcez2ZsP9tGJfYOPE1Nt3+rKJGX+Xm9z2i7de # bt4wDQYJKoZIhvcNAQELBQAEggIAR5oaCHZPrxQjRpAFRK8wgEfcsH9qulQzsybp # 8ARjpTpdEfrsNt3zLqO2vssBPbEY5MuL+3FoSxysOlvIJrTiGU53b/4SNssK3j0a # 9iVJLDPdzh6CxZmLHGrfDg/LFXVL9Lh7utvOsexKBq9XB0JuCPpLvju2TkcQCTpd # quvToasgdeTcnXAWoBhrv4GfAW4HbiosXUYvZOXaxXjtQ9/+ZyIb0CNrWmnawwN1 # /57feOwf5sQNHswV0/Xd8PVoudXwsiY25y1gLPbq8z6kNOnqMjNgkc5wZVHaG51P # BOJO8rJKUOc1TM4R1AKDLCP17MYOTMyqlt1Mi+fWkb1knrYJghqV4ORTM2uADq55 # TWmMD7xSiRolvphY8ey/ncEY9f7MH8Uk7t4mf2AuJwyznFcEFKYWQ1tW9aCy9cyS # A1LULeh4mJwfi3fPTyh0ty/+AoVnQpD9gouTOhbOLNNV8OGzv6ZeAa1IYx7hGMe2 # nK3551L//3RG3eAzqQcQwKtUjyG5yb1SAUvJy8YSWXgMV3YlnOAnrQwFUrU4qwrP # qZI+FzXjNCVculWoN/w/vZatW2paxEyO3SelTN7uYssDfv6nt8L8X88B3iDIrpqm # KzIjCpwrBVorOuQ9l+Nh0sSN+HFmPq1zcKVR4PN42hMdIf8HXQHwTgEDGNlwUUuz # k6h35Ws= # SIG # End signature block |