Samples/UCSMFirmwareUpdate.ps1
<# .SYNOPSIS This script automates the upgrade of UCS firmware .DESCRIPTION This script logs into Cisco.com, download firmware bundles to a local working directory, upload bundles to the target UCS domain and walk through all steps of the upgrade .PARAMETERSET hfp: To upgrade all components infra as well as servers infraOnly: To upgrade only infra component .EXAMPLE UCSMFirmwareUpdate.ps1 -ucs xx.xx.xx.xx -version 'x.x(xx)' -imagedir c:\work\images -hfp "all" UCSMFirmwareUpdate.ps1 -ucs xx.xx.xx.xx -version 'x.x(xx)' -imagedir c:\work\images -hfp "default" Upgrades all components of UCS -ucs -- UCS Manager IP -- Example: "1.2.3.4" -version -- UCS Manager version to upgrade -imagedir -- Path to download firmware bundle -hfp -- Firmware Host Pack. Values can be "all" or "default" All parameters are mandatory The prompts that will always be presented to the user will be for Username and Password for UCS and for cisco software image download .EXAMPLE UCSMFirmwareUpdate.ps1 -ucs xx.xx.xx.xx -version 'x.x(xx)' -imagedir c:\work\images -infraOnly Upgrade Infrastructure only portion of UCSM -infraOnly -- Optional SwitchParameter when specified upgrades Infrastructure only .NOTES Author: Eric Williams Email: ericwill@cisco.com Company: Cisco Systems, Inc. Version: v1.1 Date: 06/05/2014 Disclaimer: Code provided as-is. No warranty implied or included. This code is for example use only and not for production .INPUTS UCSM IP Address UCS Manager version to upgrade Directory path to download firmware image bundles Switch Parameter to upgrade infrastructure only portion HFP Parameter specifies which HFP to be upgraded .OUTPUTS None .LINK https://communities.cisco.com/docs/DOC-36062 #> param( [parameter(Mandatory=${true})][string]${version}, [parameter(Mandatory=${true})][string]${ucs}, [parameter(Mandatory=${true})][string]${imageDir}, [parameter(ParameterSetName='hfp', Mandatory=${true})][ValidateSet("all","default")][string]${hfp}, [parameter(ParameterSetName='infraOnly', Mandatory=${true})][Switch]${infraOnly} ) function Set-LogFilePath($LogFile) { Write-Host "Creating log file under directory ${LogFile}\Logs\" $Global:LogFile = "$LogFile\Logs\Script.$(Get-Date -Format yyyy-MM-dd.hh-mm-ss).log" if([System.IO.File]::Exists($Global:LogFile) -eq $false) { $null = New-Item -Path $Global:LogFile -ItemType File -Force } } function Write-Log { [CmdletBinding()] param ( [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [String] $Message ) $lineNum = (Get-PSCallStack).ScriptLineNumber[1] $Message = "Line: $lineNum - $Message" $ErrorActionPreference = 'Stop' "Info: $(Get-Date -Format g): $Message" | Out-File $Global:LogFile -Append Write-Host $Message } function Write-ErrorLog { [CmdletBinding()] param ( [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [object] $Message ) $lineNum = (Get-PSCallStack).ScriptLineNumber[1] $Message = "Line: $lineNum - $Message" "Error: $(Get-Date -Format g):" | Out-File $Global:LogFile -Append $Message | Out-File $LogFile -Append Write-Error $Message $trash = Disconnect-Ucs -ErrorAction Ignore exit } function Connect-UcsManager { # IP address and credentials to access the management server software that manages # firmware updates for the nodes of the solution. $ucsConnection = Connect-Ucs -Name ${ucs} -Credential ${ucsCred} -ErrorVariable errVar -ErrorAction SilentlyContinue if ($errVar) { Write-Log "Error attempting to connect to UCS Manager at $managementServerAddress. Details: $errVar" return $null } else { Write-Log "Connected to Cisco UCS Manager $managementServerAddress" return $ucsConnection } } function Wait-UcsManagerActivation { $count = 0 $ucsConnection = $null while ($ucsConnection -eq $null) { if ($count -eq 20) { Write-Log "Error creating a session to UCS Manager even after 20 attempts" return $null } Write-Log "Checking if UCS Manager $($Parameters.ManagementServerAddress) is reachable.." if ((Test-Connection -ComputerName ${ucs} -Quiet) -ne $true) { $count++ Write-Log "UCS Manager is still not reachable.." Write-Log "Sleeping for 30 seconds.. " Start-Sleep -Seconds 30 continue } $count++ Write-Log "Attempt # $count - Trying to login to UCS Manager..." $ucsConnection = Connect-UcsManager if ($ucsConnection -eq $null) { Write-Log "Error creating a session to UCS Manager " Write-Log "Sleeping for 30 seconds..." Start-Sleep -Seconds 30 } else { Write-Log "Successfully logged back into UCS Manager" return $ucsConnection } } } function Wait-UcsFabricInterconnectActivation($fiDetails) { $count = 0 $isComplete = $false do { if ($count -eq 20) { Write-Log "Error FI activation is still not completed even after 20 minutes. Exiting with error now" return $false } $count++ Write-Log "Getting the status of FI $($fiDetails.Id)..." try { $fwStatus = $fiDetails | Get-UcsFirmwareStatus -ErrorAction Stop| Select OperState switch ($fwStatus.OperState) { { @("bad-image", "failed", "faulty-state") -contains $_ } { Write-Log "Firmware activation of the Fabric Interconnect $($fiDetails.Id) has failed. Status is $fwStatus"; $isComplete = $true; return $false } "ready" { Write-Log "Firmware activation of the Fabric Interconnect $($fiDetails.Id) is complete"; $isComplete = $true; return $true } { @("activating", "auto-activating", "auto-updating", "rebooting", "rebuilding", "scheduled", "set-startup", "throttled", "upgrading", "updating", "") -contains $_ } { Write-Log "Firmware activation is in progress $fwStatus"; Write-Log "Sleeping for 1 minute..."; Start-Sleep -Seconds 60; break } } } catch { Write-Log "Failed to get the status of the firmware update process. $_.Exception" throw $_.Exception } } while ($isComplete -eq $false) } function Wait-UcsServersActivation { $count = 0 $bladeServers = @() $rackServers = @() #Sleep for 15 seconds so that all the servers comes in upgrading state Start-Sleep -Seconds 15 #get all servers for which firmware status is not ready and not in error or faulty state. $moNotInReadyState = Get-UcsServer | Get-UcsFirmwareStatus -Filter 'OperState -cne ready -and (OperState -cne "bad-image" -and OperState -cne failed -and OperState -cne "faulty-state")' | Get-UcsParent if ($moNotInReadyState.Count -gt 0) { Write-Log "Monitoring the state of below servers:" foreach ($mo in $moNotInReadyState) { Write-Log $mo.Dn } do { if ($count -eq 40) { Write-Log "Error servers activation is still not completed even after 2 hours. Exiting with error now" return $false } $count++ Write-Log "Sleeping for 3 minutes..."; Start-Sleep -Seconds 180; try { #Logs the operstate of all the servers. foreach($mo in $moNotInReadyState) { $tmpOperState = $mo | Get-UcsFirmwareStatus | select OperState $moDn = $mo.Dn Write-Log "Server firmware activation for server: $moDn is in progress: $tmpOperState" } #exits from the monitoring if all the servers are in ready state. if (($moNotInReadyState | Get-UcsFirmwareStatus | ? {$_.OperState -ne "ready"}).Count -eq 0) { Write-Log "Server firmware activation is done"; return $true } } catch { Write-Log "Failed to get the status of the firmware update process. $_.Exception" throw $_.Exception } } while ($true) } else { Write-Log "No servers to Monitor. Please check server firmware status. Servers may be in 'ready', 'bad-image', 'failed' or 'faulty-state'." } return $true } function Ack-UcsFIRebootEvent { $count = 0 while ($fwAck -eq $null) { $count++ Write-Log "Checking if there is a Pending activity generated for the activation of the Primary FI" $fwAck = Get-UcsFirmwareAck -Filter 'OperState -ilike waiting-for-*' if ($fwAck -eq $null) { Write-Log "Pending activity is not generated yet sleeping for 1 minute and then retrying the operation.." Start-Sleep -Seconds 60 } if ($count -ge 40) { Write-ErrorLog "Pending activity is not generated. This is an error case. Terminating firmware update" } } Write-Log "UCS Manager has generated a pending activity for primary FI reboot." Write-Log "Acknowledging the reboot of the primary FI now" $trash = Get-UcsFirmwareAck -Filter 'OperState -ilike waiting-for-*' | Set-UcsFirmwareAck -AdminState "trigger-immediate" -Force Write-Log "Activation of the primary FI has started" Write-Log "This will take few minutes. Sleeping for 5 minutes.." Start-Sleep -Seconds 300 } function Activate-UcsPrimaryFI { $count = 0 $isCompleted = $false $primaryFI = "" while (!$isCompleted) { $fwStatus = $null $count++ if ($count -ge 20) { Write-ErrorLog "FI activation is still not completed even after 20 minutes. Exiting with error now" } if (Get-UcsStatus -ErrorAction SilentlyContinue -ErrorVariable errVar | ? { $_.HaConfiguration -eq "cluster" }) { $primary = Get-UcsMgmtEntity -LeaderShip primary -ErrorAction SilentlyContinue -ErrorVariable errVar if($primary -ne $null) { $fwStatus = Get-UcsNetworkElement -Id $primary.Id -ErrorAction SilentlyContinue -ErrorVariable errVar | Get-UcsFirmwareStatus | Select OperState } } else { $primary = Get-UcsNetworkElement -ErrorAction SilentlyContinue -ErrorVariable errVar if($primary -ne $null) { $fwStatus = Get-UcsNetworkElement -ErrorAction SilentlyContinue -ErrorVariable errVar | Get-UcsFirmwareStatus | Select OperState } } if ( ($fwStatus -eq $null) -or ($primary -eq $null)) { Write-Log "UCS Manager is not reachable.. Details: $errVar" Write-Log "UCS Manager connection is reset. Reconnecting.." $trash = Disconnect-Ucs -ErrorAction Ignore $ucsConnection = Wait-UcsManagerActivation if ($ucsConnection -eq $null) { Write-Log "ERROR: Unable to login back to the UCS Manager even after multiple retries." Write-Log "Terminating firmware update" Write-ErrorLog "Firmware Activation has failed" } else { #Setting the DefaultUcs so that we don't need to specify the handle for every method call $ExecutionContext.SessionState.PSVariable.Set("DefaultUcs", $ucsConnection) if (Get-UcsStatus | ? { $_.HaConfiguration -eq "cluster" }) { $primaryFI = Get-UcsNetworkElement -Id (Get-UcsMgmtEntity -Leadership primary).Id } else { $primaryFI = Get-UcsNetworkElement } $primaryActivated = Wait-UcsFabricInterconnectActivation $primaryFI if (!$primaryActivated) { Write-Log "ERROR: Activation of firmware faled on the $($subordFI.Id)" Write-ErrorLog "Firmware Activation has failed" } else { $updatedVersion = $primaryFI | Get-UcsMgmtController | Get-UcsFirmwareRunning -Deployment system | Select PackageVersion Write-Log "Activation of firmware on $($primaryFI.Id) is successful. Updated version is $($updatedVersion.PackageVersion)" break; } } } else { Write-Log "Activation of the primary FI is still in progress $($fwStatus.OperState)" Write-Log "Sleeping for a minute.." Start-Sleep -Seconds 60 } } $trash = Disconnect-Ucs -ErrorAction Ignore } Set-LogFilePath $imageDir if ((Get-Module | where {$_.Name -ilike "Cisco.UcsManager"}).Name -ine "Cisco.UcsManager") { Write-Log "Loading Module: Cisco UCS PowerTool Module" Write-Log "" Import-Module Cisco.UcsManager } if ((Get-Module | where {$_.Name -ilike "Cisco.Ucs.Common"}).Name -ine "Cisco.Ucs.Common") { Write-Log "Loading Module: Cisco UCS PowerTool Module" Write-Log "" Import-Module Cisco.Ucs.Common } # Script only supports one UCS Domain update at a time $output = Set-UcsPowerToolConfiguration -SupportMultipleDefaultUcs $false Try { ${Error}.Clear() # Login into UCS Write-Log "Enter Credentials of UCS Manager to be upgraded to version: '$($version)'" ${ucsCred} = Get-Credential -Message "Enter Credentials of UCS Manager to be upgraded" Write-Log "" Write-Log "Logging into UCS Domain: '$($ucs)'" Write-Log "" $ucsConnection = Connect-UcsManager #Setting the DefaultUcs so that we don't need to specify the handle for every method call $ExecutionContext.SessionState.PSVariable.Set("DefaultUcs", $ucsConnection) if (${Error}) { Write-Log "Error creating a session to UCS Manager Domain: '$($ucs)'" Write-Log " Error equals: ${Error}" Write-Log " Exiting" exit } #Check if the FI belongs to 6300 series. $sixtyThreeSeriesFI = $false ${fiModel} = (Get-UcsNetworkElement).Model | Select-Object -First 1 if ($fiModel -cmatch "^UCS-FI-(?<modelNum>63\d\d).*$") { $sixtyThreeSeriesFIfound = $true } if ($fiModel -cmatch "^UCS-FI-(?<modelNum>64\d\d).*$") { $sixtyFourSeriesFIfound = $true } ${infraVersionA} = ${version} + 'A' ${infraVersionB} = ${version} + 'B' ${infraVersionC} = ${version} + 'C' ${versionSplit} = ${version}.Split("()") ${versionBundle} = ${versionSplit}[0] + "." + ${versionSplit}[1] ${bundle} = @() ${ccoImageList} = @() if ($sixtyThreeSeriesFIfound) { ${aSeriesBundle} = "ucs-6300-k9-bundle-infra." + ${versionBundle} + ".A.bin" } elseif($sixtyFourSeriesFIfound) { ${aSeriesBundle} = "ucs-6400-k9-bundle-infra." + ${versionBundle} + ".A.bin" } else { ${aSeriesBundle} = "ucs-k9-bundle-infra." + ${versionBundle} + ".A.bin" } if (${infraOnly} -eq $false) { ${bSeriesBundle} = "ucs-k9-bundle-b-series." + ${versionBundle} + ".B.bin" ${cSeriesBundle} = "ucs-k9-bundle-c-series." + ${versionBundle} + ".C.bin" ${bundle} = @(${aSeriesBundle},${bSeriesBundle},${cSeriesBundle}) } elseif (${infraOnly} -eq $true) { ${bundle} = @(${aSeriesBundle}) } Write-Log "Starting Firmware download process to local directory: ${imageDir}" Write-Log "" foreach(${eachBundle} in ${bundle}) { ${fileName} = ${imagedir} + "\" + ${eachBundle} if( test-path -Path ${fileName}) { Write-Log "Image File : '${eachBundle}' already exist in local directory: '${imageDir}'" } else { ${ccoImageList} += ${eachBundle} } } if(${ccoImageList} -ne ${null}) { Write-Log "Enter Cisco.com (CCO) Credentials" ${ccoCred} = Get-Credential -Message "Enter Cisco.com (CCO) Credentials" foreach(${eachbundle} in ${ccoImageList}) { [array]${ccoImage} += Get-UcsSoftwareImageList -AllReleases -Credential ${ccoCred} -ErrorAction Stop | where { $_.ImageName -match ${eachbundle}} Write-Log "Preparing to download UCS Manager version '$($version)' bundle file: '$($eachbundle)'" } ${Error}.Clear() Write-Log "Downloading UCS Manager version: '$($version)' bundles to local directory: $($imageDir)" Write-Log "Sleeping for 2 minutes ..." Start-Sleep -Seconds 120 $output = ${ccoImage} | Get-UcsSoftwareImage -Path ${imageDir} -ErrorAction Stop } Write-Log "Firmware download process completed to local directory: ${imageDir}" Write-Log "" foreach (${image} in ${bundle}) { Write-Log "Checking if image file: '$($image)' is already uploaded to UCS Domain: '$($ucs)'" ${firmwarePackage} = Get-UcsFirmwarePackage -Name ${image} ${deleted} = $false if (${firmwarePackage}) { # Check if all the images within the package are present by looking at presence ${deleted} = ${firmwarePackage} | Get-UcsFirmwareDistImage | ? { $_.ImageDeleted -ne ""} } if (${deleted} -or !${firmwarePackage}) { $Error.Clear() # If Image does not exist on FI, uplaod $fileName = ${imageDir} + "\" + ${image} if((Get-UcsFirmwareDownloader -FileName ${image} -TransferState failed).count -ne 0) { Write-ErrorLog "Image: '$($image)' already exists under Download Tasks in failed state. Exiting..." } Write-Log "Uploading image file: '$($image)' to UCS Domain: '$($ucs)'" $trash = Send-UcsFirmware -LiteralPath $fileName | Watch-Ucs -Property TransferState -SuccessValue downloaded -FailureValue failed -PollSec 30 -TimeoutSec 600 -ErrorAction SilentlyContinue if ($Error -ne "") { Write-ErrorLog "Error uploading image: '$($image)' to UCS Domain: '$($ucs)'. Please check Download Tasks for details." } Write-Log "Upload of image file: '$($image)' to UCS Domain: '$($ucs)' completed" Write-Log "" } else { Write-Log "Image file: '$($image)' is already uploaded to UCS Domain: '$($ucs)'" Write-Log "" } } # Check if the status of the firmware boot unit is ready before proceeding with the firmware update if (!(Get-UcsNetworkElement | Get-UcsMgmtController | Get-UcsFirmwareBootDefinition | Get-UcsFirmwareBootUnit | Where-Object { $_.OperState -eq 'ready'})) { Write-ErrorLog "Fabric Interconnect is not in ready state. Can't proceed with Firmware update." } # Start the Firmware Auto Install for the Infrastructure update. This will take care of updating the UCS Manager # both the Fabric Interconnects. $activatedVersion = Get-UcsMgmtController -Subject system | Get-UcsFirmwareRunning -Type system | Select Version if ($activatedVersion.Version -ne $version) { Write-Log "Triggering the auto install of the infrastructure firmware to $aSeriesBundle" try { $trash = Start-UcsTransaction $trash = Get-UcsOrg -Level root | Get-UcsFirmwareInfraPack -Name "default" -LimitScope | Set-UcsFirmwareInfraPack -ForceDeploy "yes" -InfraBundleVersion ${infraVersionA} -Force $trash = Get-UcsSchedule -Name "infra-fw" | Get-UcsOnetimeOccurrence -Name "infra-fw" | Set-UcsOnetimeOccurrence -Date (Get-UcsTopSystem).CurrentTime -Force $trash = Complete-UcsTransaction -ErrorAction Stop | Out-Null } catch { Write-ErrorLog "Failed to start firmware auto install process. Details: $_.Exception" } Write-Log "Waiting until UCS Manager restarts" $trash = Disconnect-Ucs -ErrorAction Ignore Write-Log "Sleeping for 5 minutes ..." Start-Sleep -Seconds 300 $ucsConnection = Wait-UcsManagerActivation #Setting the DefaultUcs so that we don't need to specify the handle for every method call $ExecutionContext.SessionState.PSVariable.Set("DefaultUcs", $ucsConnection) #Check if UCSM got activated to the new version. Write-Log "Checking the status of the firmware installation" #----> $activatedVersion = Get-UcsMgmtController -Subject system | Get-UcsFirmwareRunning -Type system | Select Version if ($activatedVersion.Version -eq $version) { Write-Log "UCS Manager is activated to the $activatedVersion successfully" } else { Write-Log "Activation has failed so terminating the update process" Write-ErrorLog "UCS Manager is at $activatedVersion version" } Start-Sleep -Seconds 60 Write-Log "Checking the status of the FI activation" # Now check for the status of the FI activation. As part of the auto install first the secondary FI will be activated. if (Get-UcsStatus | ? { $_.HaConfiguration -eq "cluster" }) { while ($subordFIActivated -eq $null) { try { $subordFI = Get-UcsNetworkElement -Id (Get-UcsMgmtEntity -Leadership subordinate -ErrorAction Stop).Id -ErrorAction Stop $subordFIActivated = Wait-UcsFabricInterconnectActivation $subordFI } catch { Write-Log "Failed to get the status $_.Exception" $trash = Disconnect-Ucs -ErrorAction Ignore $ucsConnection = Wait-UcsManagerActivation if ($ucsConnection -eq $null) { Write-ErrorLog "Unable to connect to the UCS Manager. Terminating the process.." } #Setting the DefaultUcs so that we don't need to specify the handle for every method call $ExecutionContext.SessionState.PSVariable.Set("DefaultUcs", $ucsConnection) } } if (!$subordFIActivated) { Write-ErrorLog "Activation of firmware failed on the $($subordFI.Id)" } else { $updatedVersion = $subordFI | Get-UcsMgmtController | Get-UcsFirmwareRunning -Deployment system | Select PackageVersion Write-Log "Activation of firmware on $($subordFI.Id) is successful." Start-Sleep -Seconds 30 Ack-UcsFIRebootEvent Activate-UcsPrimaryFI } } else { Ack-UcsFIRebootEvent Activate-UcsPrimaryFI } } else { Write-Log "UCS Manager is already at $activatedVersion version. Skipping FI upgrade..." } #=====================>>>>>>>>>>>Server Firmware Upgrade<<<<<<<<<<================================ if (${infraOnly} -eq $false) { $Error.Clear() $trash = Disconnect-Ucs -ErrorAction Ignore $ucsConnection = Connect-UcsManager #Setting the DefaultUcs so that we don't need to specify the handle for every method call $ExecutionContext.SessionState.PSVariable.Set("DefaultUcs", $ucsConnection) try { if($hfp -eq "all") { $fwCompHostPackInfo = Get-UcsServiceProfile | select PnDn, OperHostFwPolicyName $fwCompHostPackDnList = @("org-root/fw-host-pack-default") foreach($eachfwCompHostPackInfo in $fwCompHostPackInfo) { if (!($eachfwCompHostPackInfo.PnDn -eq "" -or $eachfwCompHostPackInfo.OperHostFwPolicyName -eq "")) { if(!$fwCompHostPackDnList.Contains($eachfwCompHostPackInfo.OperHostFwPolicyName)) { $fwCompHostPackDnList += $eachfwCompHostPackInfo.OperHostFwPolicyName } } } } elseif($hfp -eq "default") { $fwCompHostPackDnList = @("org-root/fw-host-pack-default") } $fwCompHostPacks = $fwCompHostPackDnList | %{Get-UcsFirmwareComputeHostPack -Dn $_ -PolicyOwner local} #$trash = Get-UcsOrg -Level root | Add-UcsFirmwareComputeHostPack -ModifyPresent -BladeBundleVersion ${infraVersionB} -Name "default" -RackBundleVersion ${infraVersionC} -ErrorAction Stop $trash = $fwCompHostPacks | Set-UcsFirmwareComputeHostPack -BladeBundleVersion ${infraVersionB} -RackBundleVersion ${infraVersionC} -Force -ErrorAction Stop Write-Log "Triggered Server firmware upgrade. Modified Host Firmware Package. Version=${version}" while ($serverActivated -eq $null) { try { $serverActivated = Wait-UcsServersActivation } catch { Write-Log "Failed to get the status $_.Exception" } } } catch { Write-Error "Failed modifying Host Firmware Package Version=${version}" Write-Log ${Error} $trash = Disconnect-Ucs -ErrorAction Ignore exit } } #=====================>>>>>>>>>>>Server Firmware Upgrade<<<<<<<<<<================================ $trash = Disconnect-Ucs -ErrorAction Ignore Write-Log "Firmware update process completed." #return $true } Catch { if (${Error} -like "*In order to download software, you must accept the EULA*") { Write-Log "Error occurred in script:" Write-Log " In order to download software, you must accept the EULA. You will receive an email within 24 hours which will have details on accepting EULA.` Once you accept the EULA by following the instructions mentioned in the email, re-run this script to proceed." $trash = Disconnect-Ucs -ErrorAction Ignore exit } else { Write-Log "Error occurred in script:" Write-Log ${Error} $trash = Disconnect-Ucs -ErrorAction Ignore exit } } # SIG # Begin signature block # MIIhdAYJKoZIhvcNAQcCoIIhZTCCIWECAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDkyxfIx7eez/Rp # boytgBC7tkhPn/MEBgtn8/BYPgxhtKCCGpQwggeNMIIFdaADAgECAhBAAYkJtMec # EjtNtgBsSCkGMA0GCSqGSIb3DQEBCwUAMEgxCzAJBgNVBAYTAlVTMRIwEAYDVQQK # EwlJZGVuVHJ1c3QxJTAjBgNVBAMTHFRydXN0SUQgRVYgQ29kZSBTaWduaW5nIENB # IDQwHhcNMjMwNjMwMDAyOTQ5WhcNMjYwNjI5MDAyODQ5WjCB7zELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFNhbiBKb3NlMRAwDgYD # VQQFEwc0NjgyNDc4MRMwEQYLKwYBBAGCNzwCAQMTAlVTMRswGQYLKwYBBAGCNzwC # AQITCkNhbGlmb3JuaWExHTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRsw # GQYDVQQKExJDaXNjbyBTeXN0ZW1zIEluYy4xGzAZBgNVBAsTEkNpc2NvIFN5c3Rl # bXMgSW5jLjEbMBkGA1UEAxMSQ2lzY28gU3lzdGVtcyBJbmMuMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAy5xBW8oNHs29o8ajhoPZo8Vbch/Hglt6ZIIV # ELZvBzPFPH+GQEwIIPkJ7QmfI0vWdXv79h14SAxdyNdO7nmNn64zc28hbtPLoHyr # EohZWg+f7O7sgpeFMPIXXsn5miH3WCLXbTyjQhkmYv7uLQ7jIjaumixXjytkpFjq # v2jIpO1SS7b6cUWOUn18HyAg4vtpmEaNS9dsU74y+KEqVxxZlajBBkpd4snDVEJm # T9uX4HisduRhVQPoBOfh5Zm7GS0vkqNNbK2QCKC8oyfvA2w6QHTB5GEllMjLUK8C # wPHsZCf3g3oC2CoWesP/Q+Ib4TMRtutaqp9gnTMBHh6hKO+ny/S7Tw+8Le54Lflx # hODh3u5zO3C4iCBkMFQeMDUWvPS31OU34Y1kL0mhrJ7Bvw8IfwooVLIB8BsVJleV # ptnkylQTzaFF5P7cbytn7AYEzCldbTb+o1AE15P60TVmk4YFTK87vK+7rPUMwDtc # mUbL1jQ1I3fa0Xc6g9FDECq9flxlERm72GytDpSt49n81M/D9C+wpN3hgGY+uPh2 # Qj2umO8EaSnvwmUhe2lpdkgZat/DErGsTKIUJ1updY/8OxjcIavhJx6W+t28uijA # tMKO2VvAQBh8HUT6APMMlk1+tTvVTLGIrKdbvBVXnV9QsMjM7r3zJPqtIS4Gjdix # mKHUlN8CAwEAAaOCAckwggHFMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgbA # MIGOBggrBgEFBQcBAQSBgTB/MDAGCCsGAQUFBzABhiRodHRwOi8vY29tbWVyY2lh # bC5vY3NwLmlkZW50cnVzdC5jb20wSwYIKwYBBQUHMAKGP2h0dHA6Ly92YWxpZGF0 # aW9uLmlkZW50cnVzdC5jb20vY2VydHMvdHJ1c3RpZGV2Y29kZXNpZ25pbmc0LnA3 # YzAfBgNVHSMEGDAWgBT+BaSGWZo/NAFajQheG9t1ebnhxjBvBgNVHSAEaDBmMAcG # BWeBDAEDMFsGC2CGSAGG+S8ABg4BMEwwSgYIKwYBBQUHAgEWPmh0dHBzOi8vc2Vj # dXJlLmlkZW50cnVzdC5jb20vY2VydGlmaWNhdGVzL3BvbGljeS90cy9pbmRleC5o # dG1sME4GA1UdHwRHMEUwQ6BBoD+GPWh0dHA6Ly92YWxpZGF0aW9uLmlkZW50cnVz # dC5jb20vY3JsL3RydXN0aWRldmNvZGVzaWduaW5nNC5jcmwwHQYDVR0OBBYEFKrf # vaFZgfyRARnHauLZbMwOsKXsMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA0GCSqGSIb3 # DQEBCwUAA4ICAQCpq0LlFMbsDbXiQUcCGv90QV3xaaBGmT5tzfMX875z40qzAVcp # NIZlxFm52PszxsXgx1NyX5BH1KuksUdb0lvo20JXj+C4OjRRj2e9cb4J2oB8MyCB # gyeZo1sMHuJzXM6Jiu4xstRiKg26oSRPZNydZOymWA0n+DJMZGQunAJPthn4sf2w # OyC0B/CeR0EO6LAe/I4hWStje8NDkBU/jOzSptAkUGoepZrmV6qhBcqV7KPd/wi0 # 79fyBgY8nQayFeMdLqj40omm9cziW2N0atKhsV9KRc81adj08pyFqmlPqVpnIfTy # 1aC8aOmZR3+4sQgzw4UWCFA4wo808eH2eiR0+ryak8pks1ruHLmymVRj9JxPMOcQ # LT6nrRDfkm2sZD0kPpHNRMI1bUtdv0n9aJ9+4YN/aj/DXN3XHVeFF+UVnvI2t68U # WEbbar0NLuu7/KaeztWyezw4neotKSM+tTDk1sxOXFwd7FpXoZJdKzZSVbLI7ft0 # rLsI2L3xR8wCB2yJjH7tvFv19w9pjzTlv2PylLH79V28VVRyLhAigYeurwhRuc84 # s8cKwoXS53KMWuY8Bb8IaSGG5TpZu+Hnnu4HYKBYvBvOJmOGovDHiHD0+992Wja2 # wBEi0t+DhlFHRfcD8AHMPi4Xy4MKpIGZVGCmF+jic3tmqj854gc0X5tsfTCCBY0w # ggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkG # A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp # Z2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENB # MB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMx # FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv # bTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orY # WcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8ae # FaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckg # HWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwr # t0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y # 1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjX # WkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIb # Zpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0c # lcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLim # dwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIW # IgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZ # qbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX # 44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3z # bcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGG # GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2Nh # Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBF # BgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl # cnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG # 9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviH # GmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59Pes # MHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3 # A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rb # II01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+ # 2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDCCBq4wggSWoAMCAQICEAc2N7ck # VHzYR6z9KGYqXlswDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8G # A1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4XDTIyMDMyMzAwMDAwMFoX # DTM3MDMyMjIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0 # LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hB # MjU2IFRpbWVTdGFtcGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAMaGNQZJs8E9cklRVcclA8TykTepl1Gh1tKD0Z5Mom2gsMyD+Vr2EaFEFUJf # pIjzaPp985yJC3+dH54PMx9QEwsmc5Zt+FeoAn39Q7SE2hHxc7Gz7iuAhIoiGN/r # 2j3EF3+rGSs+QtxnjupRPfDWVtTnKC3r07G1decfBmWNlCnT2exp39mQh0YAe9tE # QYncfGpXevA3eZ9drMvohGS0UvJ2R/dhgxndX7RUCyFobjchu0CsX7LeSn3O9TkS # Z+8OpWNs5KbFHc02DVzV5huowWR0QKfAcsW6Th+xtVhNef7Xj3OTrCw54qVI1vCw # MROpVymWJy71h6aPTnYVVSZwmCZ/oBpHIEPjQ2OAe3VuJyWQmDo4EbP29p7mO1vs # gd4iFNmCKseSv6De4z6ic/rnH1pslPJSlRErWHRAKKtzQ87fSqEcazjFKfPKqpZz # QmiftkaznTqj1QPgv/CiPMpC3BhIfxQ0z9JMq++bPf4OuGQq+nUoJEHtQr8FnGZJ # UlD0UfM2SU2LINIsVzV5K6jzRWC8I41Y99xh3pP+OcD5sjClTNfpmEpYPtMDiP6z # j9NeS3YSUZPJjAw7W4oiqMEmCPkUEBIDfV8ju2TjY+Cm4T72wnSyPx4JduyrXUZ1 # 4mCjWAkBKAAOhFTuzuldyF4wEr1GnrXTdrnSDmuZDNIztM2xAgMBAAGjggFdMIIB # WTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBS6FtltTYUvcyl2mi91jGog # j57IbzAfBgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8E # BAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsG # AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0 # dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQu # Y3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsG # CWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEAfVmOwJO2b5ipRCIBfmbW2CFC # 4bAYLhBNE88wU86/GPvHUF3iSyn7cIoNqilp/GnBzx0H6T5gyNgL5Vxb122H+oQg # JTQxZ822EpZvxFBMYh0MCIKoFr2pVs8Vc40BIiXOlWk/R3f7cnQU1/+rT4osequF # zUNf7WC2qk+RZp4snuCKrOX9jLxkJodskr2dfNBwCnzvqLx1T7pa96kQsl3p/yhU # ifDVinF2ZdrM8HKjI/rAJ4JErpknG6skHibBt94q6/aesXmZgaNWhqsKRcnfxI2g # 55j7+6adcq/Ex8HBanHZxhOACcS2n82HhyS7T6NJuXdmkfFynOlLAlKnN36TU6w7 # HQhJD5TNOXrd/yVjmScsPT9rp/Fmw0HNT7ZAmyEhQNC3EyTN3B14OuSereU0cZLX # JmvkOHOrpgFPvT87eK1MrfvElXvtCl8zOYdBeHo46Zzh3SP9HSjTx/no8Zhf+yvY # fvJGnXUsHicsJttvFXseGYs2uJPU5vIXmVnKcPA3v5gA3yAWTyf7YGcWoWa63VXA # OimGsJigK+2VQbc61RWYMbRiCQ8KvYHZE/6/pNHzV9m8BPqC3jLfBInwAM1dwvnQ # I38AC+R2AibZ8GV2QqYphwlHK+Z/GqSFD/yYlvZVVCsfgPrA8g4r5db7qS9EFUrn # Ew4d2zc4GqEr9u3WfPwwgga8MIIEpKADAgECAhALrma8Wrp/lYfG+ekE4zMEMA0G # CSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1 # NiBUaW1lU3RhbXBpbmcgQ0EwHhcNMjQwOTI2MDAwMDAwWhcNMzUxMTI1MjM1OTU5 # WjBCMQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxIDAeBgNVBAMTF0Rp # Z2lDZXJ0IFRpbWVzdGFtcCAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAvmpzn/aVIauWMLpbbeZZo7Xo/ZEfGMSIO2qZ46XB/QowIEMSvgjEdEZ3 # v4vrrTHleW1JWGErrjOL0J4L0HqVR1czSzvUQ5xF7z4IQmn7dHY7yijvoQ7ujm0u # 6yXF2v1CrzZopykD07/9fpAT4BxpT9vJoJqAsP8YuhRvflJ9YeHjes4fduksTHul # ntq9WelRWY++TFPxzZrbILRYynyEy7rS1lHQKFpXvo2GePfsMRhNf1F41nyEg5h7 # iOXv+vjX0K8RhUisfqw3TTLHj1uhS66YX2LZPxS4oaf33rp9HlfqSBePejlYeEdU # 740GKQM7SaVSH3TbBL8R6HwX9QVpGnXPlKdE4fBIn5BBFnV+KwPxRNUNK6lYk2y1 # WSKour4hJN0SMkoaNV8hyyADiX1xuTxKaXN12HgR+8WulU2d6zhzXomJ2PleI9V2 # yfmfXSPGYanGgxzqI+ShoOGLomMd3mJt92nm7Mheng/TBeSA2z4I78JpwGpTRHiT # 7yHqBiV2ngUIyCtd0pZ8zg3S7bk4QC4RrcnKJ3FbjyPAGogmoiZ33c1HG93Vp6lJ # 415ERcC7bFQMRbxqrMVANiav1k425zYyFMyLNyE1QulQSgDpW9rtvVcIH7WvG9sq # Yup9j8z9J1XqbBZPJ5XLln8mS8wWmdDLnBHXgYly/p1DhoQo5fkCAwEAAaOCAYsw # ggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoG # CCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNV # HSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQUn1csA3cOKBWQ # ZqVjXu5Pkh92oFswWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNl # cnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGlu # Z0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v # Y3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFt # cGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAPa0eH3aZW+M4hBJH2UOR9hHb # m04IHdEoT8/T3HuBSyZeq3jSi5GXeWP7xCKhVireKCnCs+8GZl2uVYFvQe+pPTSc # VJeCZSsMo1JCoZN2mMew/L4tpqVNbSpWO9QGFwfMEy60HofN6V51sMLMXNTLfhVq # s+e8haupWiArSozyAmGH/6oMQAh078qRh6wvJNU6gnh5OruCP1QUAvVSu4kqVOcJ # VozZR5RRb/zPd++PGE3qF1P3xWvYViUJLsxtvge/mzA75oBfFZSbdakHJe2BVDGI # GVNVjOp8sNt70+kEoMF+T6tptMUNlehSR7vM+C13v9+9ZOUKzfRUAYSyyEmYtsnp # ltD/GWX8eM70ls1V6QG/ZOB6b6Yum1HvIiulqJ1Elesj5TMHq8CWT/xrW7twipXT # J5/i5pkU5E16RSBAdOp12aw8IQhhA/vEbFkEiF2abhuFixUDobZaA0VhqAsMHOma # T3XThZDNi5U2zHKhUs5uHHdG6BoQau75KiNbh0c+hatSF+02kULkftARjsyEpHKs # F7u5zKRbt5oK5YGwFvgc4pEVUNytmB3BpIiowOIIuDgP5M9WArHYSAR16gc0dP2X # dkMEP5eBsX7bf/MGN4K3HP50v/01ZHo/Z5lGLvNwQ7XHBx1yomzLP8lx4Q1zZKDy # Hcp4VQJLu2kWTsKsOqQxggY2MIIGMgIBATBcMEgxCzAJBgNVBAYTAlVTMRIwEAYD # VQQKEwlJZGVuVHJ1c3QxJTAjBgNVBAMTHFRydXN0SUQgRVYgQ29kZSBTaWduaW5n # IENBIDQCEEABiQm0x5wSO022AGxIKQYwDQYJYIZIAWUDBAIBBQCggYgwGQYJKoZI # hvcNAQkDMQwGCisGAQQBgjcCAQQwHAYJKoZIhvcNAQkFMQ8XDTI0MTEwNzA2MTkw # OVowHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIE # IFG8xCMdKkOJaRcTLNW/637DaGFLbn/CxBhAxTgDtjiHMA0GCSqGSIb3DQEBAQUA # BIICAGglXb/maPxWLzrGlMsypygDH7FzG7DjcblMK/dqIKVzsiA5osY/6LrpzkxC # NPASxwjZCCyIt9/DawPENNXPHMK1bYtviZKIZAsypQYlCb2DtgFg9r69ojDuMgS3 # oEMTjK63k2E8x5TmJewY00kaUHLha/XaTFpUeEGP2KqZqkL/Z4JOK6/JB0uyqgEc # F78M+mKJH980sZeezs4W426s2nhd3JMeiNAzOzZIm4nFBzscEKwiyWVMY0hehpWw # Qc4H1uFid7fl7P17uv9KzYa8O/vNgyuz57GIwLUxnG1l/SDLZIAGoS6AWFCiLPUy # qBnjnt8gbvVeKmeYMy33sJPXq+H533QpOI5oYPYJXbjXJliDk73oN4QZrXOr0UjF # 8VByDl6HnBfUgxUOpbEf76ftpyC/9k1JaujpR0b/aUZZRmZDJjSpfPhLoCCbmztA # tQ1+Ke3lpfSyvWmRdeo2BZovXu6n2FebGu+KQnZBe8U9TzFGbACoLvzpGfXE2eDb # 1EzEItP44zR/mplU9MaR+lPvyablKk9wynqKnS+3nJHvpgmLM/6enYU+F+HlKcGi # 70UHna+qDvHbbFMu0C88NWYG+wKGU5JHTG2Tq4yd7eBvkqM4hCLyovSI9Pfa7cMD # hk3fJobi+R5lYlfzJ+78TjU0giFmQlJKfl9sdCELDHp51X2RoYIDIDCCAxwGCSqG # SIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp # Z2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQw # OTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQC65mvFq6f5WHxvnpBOMzBDANBglg # hkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN # AQkFMQ8XDTI0MTEwNzA2MTkwOVowLwYJKoZIhvcNAQkEMSIEIJTUTvc8nSQumxIO # kTQPaZiNRcB14bWQE1ReFVvMvovJMA0GCSqGSIb3DQEBAQUABIICABRXx2HaAXPl # S0gBJ6l5yce5UTGziNOMkjxqoP1oKouKB7SBP6d/K0LXL6Aj2qqIGBzRXYQAcdyC # IC/QVo4TWZ5LIOlH4ld7M8Vh52EHcUFo5oMv7ZWvteLf036qvPfscWHTrlBsh88K # Wyq/GfEOmOzbiy5OOf7SV/F9MrEAD57uzRGl99LgcobgjerqM2IBGV/Oh128TJCK # LUy1RZSS52enwZaBR0Ls7A41Iy02s4w7mWBwA5Yunpm/1vaHpoI+ic/WOaipNPWf # S6KZmrltxiW7VymZQqZ2S7g5MsFBLGAlb+011jwup3DJpkWC9vIjepOCeMadUFLZ # H2HIdCZQhUp9wv4qpMOtWz/goF/fG12JvYvlgMcL4YNQmup0qVk52Xm0BDPfy84a # 4ZX7nsqX3U83XYA+Ts3eFg5Wh+7n525xTa3ifbqTNMBoHCtAO7cBper8T+GlUfTU # c7ZXESu9pI72JFJm3pc4UfAvdrVrI/mVMtUoR9/m61mBiQVnSY4BNuI8Wg292w/Q # axZzpGlpGc0pi/B1HDhPgjhaB/CaCwBq2zFxxDgYroTk1wZwUGYZFS9paQw3iDNx # NMOQEwZTrEWDsLV8VHqLzhZ5svjFi0lQr3jLG478LsAB4saS+4cTd3tzPeBBPW4K # gkg3v4KGQ5CDLvNgMp/1mB/B1MCeQy1K # SIG # End signature block |