Migrate.Autorest/custom/Set-AzMigrateLocalServerReplication.ps1
|
# ---------------------------------------------------------------------------------- # # Copyright Microsoft Corporation # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ---------------------------------------------------------------------------------- <# .Synopsis Updates the target properties for the replicating server. .Description The Set-AzMigrateLocalServerReplication cmdlet updates the target properties for the replicating server. .Link https://learn.microsoft.com/powershell/module/az.migrate/set-azmigratelocalserverreplication #> function Set-AzMigrateLocalServerReplication { [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Runtime.PreviewMessageAttribute("This cmdlet is based on a preview API version and may experience breaking changes in future releases.")] [OutputType([Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.IJobModel])] [CmdletBinding(DefaultParameterSetName = 'ById', PositionalBinding = $false, SupportsShouldProcess, ConfirmImpact='Medium')] param( [Parameter(Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the replicating server for which the properties need to be updated. The ID should be retrieved using the Get-AzMigrateLocalServerReplication cmdlet. ${TargetObjectID}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.Int32] # Specifies the number of CPU cores. ${TargetVMCPUCore}, [Parameter()] [ValidateSet("true" , "false")] [ArgumentCompleter( { "true" , "false" })] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies if RAM is dynamic or not. ${IsDynamicMemoryEnabled}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.ProtectedItemDynamicMemoryConfig] # Specifies the dynamic memory configuration of RAM. ${DynamicMemoryConfig}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.Int64] # Specifies the target RAM size in MB. ${TargetVMRam}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.AzLocalNicInput[]] # Specifies the nics on the source server to be included for replication. ${NicToInclude}, [Parameter()] [ValidateSet("WindowsGuest" , "LinuxGuest")] [ArgumentCompleter( { "WindowsGuest" , "LinuxGuest" })] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the OS type of the VM, either WindowsGuest or LinuxGuest. ${OsType}, [Parameter()] [ValidateSet("Standard", "TrustedLaunch")] [ArgumentCompleter( { "Standard", "TrustedLaunch" })] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the security type of the target VM. 'TrustedLaunch' enables Secure Boot and vTPM, implies -EnableSecureBoot 'true', and requires a Generation 2 target VM. 'Standard' is accepted for either generation and keeps Secure Boot on a Generation 2 target. ${TargetVMSecurityOption}, [Parameter()] [ValidateSet("true" , "false")] [ArgumentCompleter( { "true" , "false" })] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies whether Secure Boot is enabled on the target VM. Enabling it requires a Generation 2 target VM; 'false' is accepted for either generation. ${EnableSecureBoot}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Runtime.DefaultInfo(Script = '(Get-AzContext).Subscription.Id')] [System.String] # The subscription Id. ${SubscriptionId}, [Parameter()] [Alias('AzureRMContext', 'AzureCredential')] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Azure')] [System.Management.Automation.PSObject] # The credentials, account, tenant, and subscription used for communication with Azure. ${DefaultProfile}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Runtime')] [System.Management.Automation.SwitchParameter] # Wait for .NET debugger to attach ${Break}, [Parameter(DontShow)] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Runtime')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Runtime.SendAsyncStep[]] # SendAsync Pipeline Steps to be appended to the front of the pipeline ${HttpPipelineAppend}, [Parameter(DontShow)] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Runtime')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Runtime.SendAsyncStep[]] # SendAsync Pipeline Steps to be prepended to the front of the pipeline ${HttpPipelinePrepend}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Runtime')] [System.Uri] # The URI for the proxy server to use ${Proxy}, [Parameter(DontShow)] [ValidateNotNull()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Runtime')] [System.Management.Automation.PSCredential] # Credentials for a proxy server to use for the remote call ${ProxyCredential}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Runtime')] [System.Management.Automation.SwitchParameter] # Use the default credentials for the proxy ${ProxyUseDefaultCredentials} ) process { $helperPath = [System.IO.Path]::Combine($PSScriptRoot, "Helper", "AzLocalCommonSettings.ps1") Import-Module $helperPath $helperPath = [System.IO.Path]::Combine($PSScriptRoot, "Helper", "AzLocalCommonHelper.ps1") Import-Module $helperPath $HasTargetVMSecurityOption = $PSBoundParameters.ContainsKey('TargetVMSecurityOption') $HasEnableSecureBoot = $PSBoundParameters.ContainsKey('EnableSecureBoot') if ($HasEnableSecureBoot) { $secureBootEnabled = [System.Convert]::ToBoolean($EnableSecureBoot) } # Purely a contradiction between parameters, so reject it before the module and service checks. if ($HasTargetVMSecurityOption -and $TargetVMSecurityOption -eq $TargetVMSecurityTypes.TrustedLaunch -and $HasEnableSecureBoot -and -not $secureBootEnabled) { throw "-EnableSecureBoot 'false' cannot be used with -TargetVMSecurityOption 'TrustedLaunch'." } CheckResourcesModuleDependency $HasTargetObjectId = $PSBoundParameters.ContainsKey('TargetObjectID') $HasTargetVMCPUCore = $PSBoundParameters.ContainsKey('TargetVMCPUCore') $HasTargetVMRam = $PSBoundParameters.ContainsKey('TargetVMRam') $HasDynamicMemoryConfig = $PSBoundParameters.ContainsKey('DynamicMemoryConfig') $HasNicToInclude = $PSBoundParameters.ContainsKey('NicToInclude') $HasIsDynamicMemoryEnabled = $PSBoundParameters.ContainsKey('IsDynamicMemoryEnabled') if ($HasIsDynamicMemoryEnabled) { $isDynamicRamEnabled = [System.Convert]::ToBoolean($IsDynamicMemoryEnabled) } $HasOsType = $PSBoundParameters.ContainsKey('OsType') $null = $PSBoundParameters.Remove('TargetVMCPUCore') $null = $PSBoundParameters.Remove('IsDynamicMemoryEnabled') $null = $PSBoundParameters.Remove('DynamicMemoryConfig') $null = $PSBoundParameters.Remove('TargetVMRam') $null = $PSBoundParameters.Remove('NicToInclude') $null = $PSBoundParameters.Remove('TargetObjectID') $null = $PSBoundParameters.Remove('OsType') $null = $PSBoundParameters.Remove('TargetVMSecurityOption') $null = $PSBoundParameters.Remove('EnableSecureBoot') $null = $PSBoundParameters.Remove('WhatIf') $null = $PSBoundParameters.Remove('Confirm') # Set common ErrorVariable and ErrorAction for get behaviors $null = $PSBoundParameters.Add('ErrorVariable', 'notPresent') $null = $PSBoundParameters.Add('ErrorAction', 'SilentlyContinue') # Validate ARM ID format from inputs if ($hasTargetObjectId -and !(Test-AzureResourceIdFormat -Data $TargetObjectID -Format $IdFormats.ProtectedItemArmIdTemplate)) { throw New-InvalidResourceIdProvidedException ` -ResourceId $TargetObjectID ` -ResourceType "ProtectedItem" ` -Format $IdFormats.ProtectedItemArmIdTemplate } # $TargetObjectID is in the format of # "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.DataReplication/replicationVaults/{2}/protectedItems/{3}" $ProtectedItemIdArray = $TargetObjectID.Split("/") $ResourceGroupName = $ProtectedItemIdArray[4] # {1} $VaultName = $ProtectedItemIdArray[8] # {2} $MachineName = $ProtectedItemIdArray[10] # {3} # Get existing Protected Item with ResourceGroupName, VaultName, Name $null = $PSBoundParameters.Add("ResourceGroupName", $ResourceGroupName) $null = $PSBoundParameters.Add("VaultName", $VaultName) $null = $PSBoundParameters.Add("Name", $MachineName) $ProtectedItem = Az.Migrate.Internal\Get-AzMigrateProtectedItem @PSBoundParameters if ($null -eq $ProtectedItem) { throw New-AzMigrateProtectedItemNotFoundException -Id $TargetObjectID } $null = $PSBoundParameters.Remove("Name") $null = $PSBoundParameters.Remove("VaultName") $customProperties = $ProtectedItem.Property.CustomProperty $MachineIdArray = $customProperties.FabricDiscoveryMachineId.Split("/") $SiteType = $MachineIdArray[7] $SiteName = $MachineIdArray[8] # No "DisableProtection" means IR has not been initiated # "CommitFailover" means migration has been completed if ('DisableProtection' -notin $ProtectedItem.Property.AllowedJob -or 'CommitFailover' -in $ProtectedItem.Property.AllowedJob) { throw "Set server replication is not allowed for this item '$TargetObjectID' at the moment. Please check its status and try again later. Allowed jobs are: $($ProtectedItem.Property.AllowedJob -join ', ')." } if ($SiteType -eq $SiteTypes.HyperVSites) { $customPropertiesUpdate = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.HyperVToAzStackHCIProtectedItemModelCustomPropertiesUpdate]::new() $customPropertiesUpdate.InstanceType = $AzLocalInstanceTypes.HyperVToAzLocal } elseif ($SiteType -eq $SiteTypes.VMwareSites) { $customPropertiesUpdate = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.VMwareToAzStackHCIProtectedItemModelCustomPropertiesUpdate]::new() $customPropertiesUpdate.InstanceType = $AzLocalInstanceTypes.VMwareToAzLocal } # Gen 1 target VMs do not support Secure Boot or vTPM; fail before the service round-trip. if ($HasTargetVMSecurityOption -or $HasEnableSecureBoot) { $securityDecision = Resolve-AzMigrateTargetSecurityOption ` -Mode 'Update' ` -HyperVGeneration $customProperties.HyperVGeneration ` -HasTargetVMSecurityOption $HasTargetVMSecurityOption ` -TargetVMSecurityOption $TargetVMSecurityOption ` -HasEnableSecureBoot $HasEnableSecureBoot ` -SecureBootEnabled ([bool]$secureBootEnabled) if ($securityDecision.Gen2Required) { throw "Secure Boot and Trusted Launch require a Generation 2 (EFI) target VM. Protected item '$TargetObjectID' has a Generation 1 (BIOS) target VM." } # The service rejects turning Secure Boot off for a Gen 2 source that has it on. if ($securityDecision.VerifySourceSecureBoot -and $true -eq (Get-AzMigrateSourceSecureBootState -MachineId $customProperties.FabricDiscoveryMachineId)) { # For VMware sources $MachineName is an opaque id, so report the discovered name. $sourceName = if ([string]::IsNullOrEmpty($customProperties.SourceVMName)) { $MachineName } else { $customProperties.SourceVMName } throw "Source server '$sourceName' has Secure Boot enabled, so it cannot be migrated with -EnableSecureBoot 'false'. Omit -EnableSecureBoot to keep Secure Boot enabled on the target VM, or disable Secure Boot on the source server first." } $customPropertiesUpdate.SecurityOption = $securityDecision.SecurityOption } # Update target CPU core if ($HasTargetVMCPUCore) { if ($TargetVMCPUCore -lt $TargetVMCPUCores.Min -or $TargetVMCPUCore -gt $TargetVMCPUCores.Max) { throw "Specify -TargetVMCPUCore between $($TargetVMCPUCores.Min) and $($TargetVMCPUCores.Max)." } $customPropertiesUpdate.TargetCpuCore = $TargetVMCPUCore } # Update TargetVMRam if ($HasTargetVMRam) { if ($customProperties.HyperVGeneration -eq "1") { # Between 512 MB and 1 TB if ($TargetVMRam -lt $TargetVMRamInMB.Gen1Min -or $TargetVMRam -gt $TargetVMRamInMB.Gen1Max) { throw "Specify -TargetVMRAM between $($TargetVMRamInMB.Gen1Min) and $($TargetVMRamInMB.Gen1Max) MB (i.e., 1 TB) for Hyper-V Generation 1 VM." } } else # Hyper-V Generation 2 { # Between 32 MB and 12 TB if ($TargetVMRam -lt $TargetVMRamInMB.Gen2Min -or $TargetVMRam -gt $TargetVMRamInMB.Gen2Max) { throw "Specify -TargetVMRAM between $($TargetVMRamInMB.Gen2Min) and $($TargetVMRamInMB.Gen2Max) MB (i.e., 12 TB) for Hyper-V Generation 2 VM." } } $customPropertiesUpdate.TargetMemoryInMegaByte = $TargetVMRam } $targetMemory = $customPropertiesUpdate.TargetMemoryInMegaByte -or $customProperties.TargetMemoryInMegaByte # Update IsDynamicRam if ($HasIsDynamicMemoryEnabled) { $customPropertiesUpdate.IsDynamicRam = $isDynamicRamEnabled } elseif ($HasDynamicMemoryConfig) { $customPropertiesUpdate.IsDynamicRam = $customProperties.IsDynamicRam } # Dynamic memory is enabled - set provided configuration if ($customPropertiesUpdate.IsDynamicRam -and $HasDynamicMemoryConfig) { if ($targetMemory -lt $DynamicMemoryConfig.MinimumMemoryInMegaByte) { throw "DynamicMemoryConfig - Specify minimum memory less than $($targetMemory)" } if ($targetMemory -gt $DynamicMemoryConfig.MaximumMemoryInMegaByte) { throw "DynamicMemoryConfig - Specify maximum memory greater than $($targetMemory)" } if ($DynamicMemoryConfig.TargetMemoryBufferPercentage -NotIn $RAMConfig.MinTargetMemoryBufferPercentage..$RAMConfig.MaxTargetMemoryBufferPercentage) { throw "DynamicMemoryConfig - Specify target memory buffer percentage between $($RAMConfig.MinTargetMemoryBufferPercentage) % and $($RAMConfig.MaxTargetMemoryBufferPercentage) %." } $customPropertiesUpdate.DynamicMemoryConfig = $DynamicMemoryConfig } # Dynamic memory is enabled - set default configuration if ($customPropertiesUpdate.IsDynamicRam -and !$HasDynamicMemoryConfig) { if ($null -eq $customProperties.DynamicMemoryConfig) { $memoryConfig = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.ProtectedItemDynamicMemoryConfig]::new() $memoryConfig.MinimumMemoryInMegaByte = [System.Math]::Min($targetMemory, $RAMConfig.DefaultMinDynamicMemoryInMB) $memoryConfig.MaximumMemoryInMegaByte = [System.Math]::Max($targetMemory, $RAMConfig.DefaultMaxDynamicMemoryInMB) $memoryConfig.TargetMemoryBufferPercentage = $RAMConfig.DefaultTargetMemoryBufferPercentage $customPropertiesUpdate.DynamicMemoryConfig = $memoryConfig } else { $customPropertiesUpdate.DynamicMemoryConfig = $customProperties.DynamicMemoryConfig } } # Update Nics if ($HasNicToInclude -and $NicToInclude.length -gt 0) { # Get discovered machine with ResourceGroupName, SiteName, MachineName $null = $PSBoundParameters.Add("SiteName", $SiteName) $null = $PSBoundParameters.Add("MachineName", $MachineName) if ($SiteType -eq $SiteTypes.HyperVSites) { $machine = Az.Migrate.Internal\Get-AzMigrateHyperVMachine @PSBoundParameters } elseif ($SiteType -eq $SiteTypes.VMwareSites) { $machine = Az.Migrate.Internal\Get-AzMigrateMachine @PSBoundParameters } if ($null -eq $machine) { throw New-AzMigrateDiscoveredMachineNotFoundException ` -Name $MachineName ` -ResourceGroupName $ResourceGroupName ` -SiteName $SiteName } $null = $PSBoundParameters.Remove("MachineName") $null = $PSBoundParameters.Remove("SiteName") # Nics [PSCustomObject[]]$nics = @() [PSCustomObject[]]$uniqueNics = @() foreach ($nic in $NicToInclude) { $discoveredNic = $machine.NetworkAdapter | Where-Object { $_.NicId -eq $nic.NicId } if ($null -eq $discoveredNic) { throw "The Nic id '$($nic.NicId)' is not found." } if ($uniqueNics.Contains($nic.NicId)) { throw "The Nic id '$($nic.NicId)' is already included. Please remove the duplicate entry and try again." } $uniqueNics += $nic.NicId $htNic = @{} $nic.PSObject.Properties | ForEach-Object { $htNic[$_.Name] = $_.Value } if ($htNic.SelectionTypeForFailover -eq $VMNicSelection.SelectedByUser -and [string]::IsNullOrEmpty($htNic.TargetNetworkId)) { throw "The TargetVirtualSwitchId parameter is required when the CreateAtTarget flag is set to 'true'. NIC '$($htNic.NicId)'. Please utilize the New-AzMigrateLocalNicMappingObject command to properly create a Nic mapping object." } $nics += [PSCustomObject]$htNic } if ($SiteType -eq $SiteTypes.HyperVSites) { $customPropertiesUpdate.NicsToInclude = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.HyperVToAzStackHCINicInput[]]$nics } elseif ($SiteType -eq $SiteTypes.VMwareSites) { $customPropertiesUpdate.NicsToInclude = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.VMwareToAzStackHCINicInput[]]$nics } } # Update OS type if ($HasOsType) { $customPropertiesUpdate.OsType = $OsType } $protectedItemPropertiesUpdate = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.ProtectedItemModelPropertiesUpdate]::new() $protectedItemPropertiesUpdate.CustomProperty = $customPropertiesUpdate # Remove common ErrorVariable and ErrorAction for get behaviors $null = $PSBoundParameters.Remove('ErrorVariable') $null = $PSBoundParameters.Remove('ErrorAction') if ($PSCmdlet.ShouldProcess($TargetObjectID, "Updates VM replication.")) { # Update protected item with ResourceGroupName, VaultName, Name, Property $null = $PSBoundParameters.Add('VaultName', $vaultName) $null = $PSBoundParameters.Add('Name', $MachineName) $null = $PSBoundParameters.Add('Property', $protectedItemPropertiesUpdate) $null = $PSBoundParameters.Add('NoWait', $true) $operation = Az.Migrate.Internal\Update-AzMigrateProtectedItem @PSBoundParameters $null = $PSBoundParameters.Remove('NoWait') $null = $PSBoundParameters.Remove('Property') $null = $PSBoundParameters.Remove('Name') # Get job with ResourceGroupName, VaultName, JobName $jobName = $operation.Target.Split("/")[-1].Split("?")[0].Split("_")[0] $null = $PSBoundParameters.Add('JobName', $jobName) return Az.Migrate.Internal\Get-AzMigrateLocalReplicationJob @PSBoundParameters } } } # SIG # Begin signature block # MIInbgYJKoZIhvcNAQcCoIInXzCCJ1sCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD460v9iMLo83bT # 0xws0R0pCZGZpbBZ7YleVP7mlsQM7KCCDMkwggYEMIID7KADAgECAhMzAAACHPrN # xZvoL37EAAAAAAIcMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQxWhcNMjcwNDE1MTg1 # OTQxWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDVsZfgOKmM31HPfoWOoNEiw0SlCiIxUMC0I9NMWbucKOw/e9lP # oAoehQVu6SG65V4EPzrYsnBnFPNoi4/HoOdjhz1qkrEt4I6tEcxXU6oOeY9zGveC # /3iBeuhLYxM3M/PkcUoebF+Nednm8OkdSPoDu8imViHPQq/8CQUu0WRR4rE+dMRf # rpVqfmNi2qWCX94T4MsepijGVkwE//tJg0ryAiYdHT34LSnlG/RSBZmQRGWZ5g8j # qnKjRParSqMft1gvjuUTVgtWNZfgcLFSK5Wa0myrq8OPcgTGGsRgun+tnSS+IxDT # xVsAPH1OzvPjwomguByhUe/OcvUN0D5Wmp7xAgMBAAGjggGqMIIBpjAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFNoH7a2YDjOSwpkp6DHcmUS7J+0yMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxFjAUBgNVBAUT # DTIzMDAxMis1MDc1NjkwHwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEw # YAYDVR0fBFkwVzBVoFOgUYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # bDBtBggrBgEFBQcBAQRhMF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDI0LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IC # AQAUnEqhaRXe0T3hIJjvdQErEkrA/7bByjn6t5IArODkkRjzkYwtKMc2yYj2quaN # rLutWw2YZcngKPy1b71YyDJQTy4NDRwaSh9Tw5thrk3NmcPrAHia5vtcBJ1CgtKK # 7mQbIcQ22d/N3813ayCDDFewu1+jsZmX+r/aTEqaOM4TVxVtRSkuCy8nAXKuChOK # Li/zA4XuH8iEYqIsj2YoNaeSxVmeGiERXpKdo3dDmYi0kO5w2D8VS4c3+9h6gElY # BaAAg/dYErBg27qT3vv0zRDJhJufvCNylA8S7/+8H5E/PV5cng6na9VV/w9OV3qu # uND6zdGa2EX38Glp50F9AIQk3p2xXmcvorDeM4XJ7UlWYBi6g80J1SSOQnInCYFE # msfUNn3+1AaTJKSJL83quKArTac2pKhu0Yzzzrzo6HrsRiQKzpnRBb1/dMa6P3hz # 75XbMRBctNsFhZC07WCmjExdLg2eHW5uV0TY8D5+6wozJf7vF3+WHkYPO85Z+BC6 # U4FkNbYNycZ9cE4j1tXRdyDCfml6c0HWPHjNVDObrv9lKt3qUqFpX38VCqVCyNOO # 1UcXfQiVjJw32U2WUKZjt/neJKHEBsm9kFsLuWzkQ53+qcaSaytmsCnk2gOglrlD # 5d3kKyvvAw+rzm0lT8K38P6PLxfZQHhu4W8dV7Av8N2ZmDCCBr0wggSloAMCAQIC # EzMAAAA5O7Y3Gb8GHWcAAAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoX # DTM2MDMyMjIyMTMwNFowVzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQ # Q0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeq # lRYHNa265v4IY9fH8TKhemHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo # 0dtS/EW6I/yEL/bLSY8hKpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATv # QVL4tcf03aTycsz8QeCdM0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a # 1uv1zerOYMnsneRRwCbpyW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1 # FyQfK0fVkaya8SmVHQ/tOf23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfO # GSWHIIV4YrTJTT6PNty5REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7 # ttOu1bVnXfHaqPYl2rPs20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJ # uz2MXMCt7iw7lFPG9LXKGjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxS # CwyoGIq0PhaA7Y+VPct5pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOm # VQop36wUVUYklUy++vDWeEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3 # SkE/xIkgpfl22MM1itkZ35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPX # LQaUEggxMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBP # oE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAw # TgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOC # AgEAFJQfOChP7onn6fLIMKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D # 5W4wMwYeLystcEqfkjz4NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBY # nbu0+THSuVHTe0VTTPVhily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSI # vgn0JksVBVMYVI5QFu/qhnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6 # aR9y34aiM1qmxaxBi6OUnyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4w # PKC5OmHm1DQIt/MNokbbH3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7 # RTX8AdBPo0I6OEojf39zuFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK # /fg8B2qjW88MT/WF5V5uvZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSK # YBv0VisCzfxgeU+dquXW9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkw # YTu/9dLeH2pDqeJZAABVDWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVT # Ql0v4q8J/AUmQN5W4n101cY2L4A7GTQG1h32HHAvfQESWP0xghn7MIIZ9wIBATBu # MFcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIc # +s3Fm+gvfsQAAAAAAhwwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZI # hvcNAQkEMSIEIFWkvLi/lHnhpbjaUg2LblZWhYpUYP6MN0S7PSXIlbmLMEIGCisG # AQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAboB+9oISb/dnlDKWHCSV # YSgxV433Y97G3xyRVwpYYnulYzbHhyyX7O2LrT30+g0gJc43TwSR553oo+J9++FP # zt6XjrPf0ZYOOihpqMfJ1/nnO0cj48nD1cAbm8IhLkhyQx9b55pNimajFgtjVbd7 # O0XUxd0jwnW0DqPw2ZS/3WV9V6weSFVHEQCYntD6MWQtK3ge0gKNgFGkJHzrLYKK # v8gWzgNBidgWoU8R86i2IIKDSSzMFvdstqhmna0NGwnJzeiGvuPQDuX4ktyXJrPZ # pcaCIOKxNM5SrY1wiX8b7ShfqN0NQMLRly2ulPnSFIDshWbTiw+zdY+S3lJcOtUL # xqGCF60wghepBgorBgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheC # AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIB # QQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCBmVXQPHXXHyd8fKpwN # ApsoxPV3gktOT0KGKYPLuE+ouQIGat4mTSd6GBMyMDI2MTAyODAwNDM1MC4yMzVa # MASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0 # ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo2RjFBLTA1RTAtRDk0NzElMCMG # A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKAD # AgECAhMzAAACHAlVFdfDWQfRAAEAAAIcMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29m # dCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI1MDgxNDE4NDgzMVoXDTI2MTExMzE4 # NDgzMVowgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr # BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG # A1UECxMeblNoaWVsZCBUU1MgRVNOOjZGMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxN # aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAow0xEAUaFIyyLIXeFzeI8IKyBON2u0Dr02ISE5p9G5CUXfnF # u2S0E1gWCMvDWpopX6lRxjmgnqaL3BtnWlBVTo8xUNRZu23ie4YBMAJB7Ut6mnqn # HVwvDJxGO4TD3SnrCd+yg35B9QFejq3o4+OByvXjynaypZyukcQaLsKQvoxE8ElH # H7zcOXEJWmU3rnXzaW/S4SH3OPhoUbTTcy6nUgKx5pRWiQ24UEPLYzcxGJjqjkz+ # GiCWGPFHDMdW86laWvmCslouQPsN2eBk8dxJcEZmW4l6p4TthoXcfexEA9YdYaMz # 10aMhZNpdsNaDtDQUMDEC3k1D1My69MXSPlUmD9xFyDlkXiVa7BCEp3XcVtqTgzH # Gwr28JD6oE7zEPYeuZOiuCBXTZSo/wk3tbDlsESbIPV6inYqrzxiMYqlxfCdzC3C # imh9/NT/Lk9/aU+Iyyc9b3OaT0dZ8wgLaVDCGELRMrqyImdFHv0MudctzW/kPsV3 # Ja9ufpKWujEiN3CW//X8hFa9j5ImNeQzcMit3MoSaoGwnbiZJX1IyibIphlqccXF # k4oTTSOQBsAUw8U0gwOnM5UJD8mBUBd65Np6NBkx2cviJ4I34GyXFCWyy5Ft1QsB # YyVfAG3KOhCfPHQf8lQzJvLr57YW0bD/xVs4Ag4gTS6KZNyFEfX9jFdRlr0CAwEA # AaOCAUkwggFFMB0GA1UdDgQWBBRa3mOCzB8u7zpvDh8MGKVYLCk7ZDAfBgNVHSME # GDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1l # LVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsG # AQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p # Y3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMB # Af8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDAN # BgkqhkiG9w0BAQsFAAOCAgEAklb6w/deaid3BujQCtWFBe0n9pkyRy+yyWEg70iD # woJ5u0e0O+4GerNzdZb1zTPsHJ8EGMyo1K7ytL21+pmdFMTl19PC8OJ5Y2p+XKUQ # y2dD+hggRMmJgDQsgbOCxHYeO+jg4t+vg61wUrovzzLkH3z0PJXXvoNuBj9Lda9C # iNMd60451Kube99ArSf6ZMj3t0p4rFbgSazDs+8TJ+8KA5GVaYjPHj9rlMuI3Wjo # hEc9apnQ6hMjMck3jlHZIwluVYeUQE0qjmApfMtTAEzbMUdY8sLTunL1GkbDSeKn # 9O7llBGnNtyM1uM9Mdv1VyWh0z/IriQKIjntqqGyoF0HvDHOFZCyUDBPLflyiu7Y # 1zQ/sPounsb96aBfQdq3h3LOn6t+m9EnNz/G6MzzWvpJk6YgTHTIqeQN/F/XpiPv # bfek3nq/PYbL3au+kBfRUHiCFXSvt6lor0HC626vUmz9ZNPOxwEWLuccomxsy3Jw # WH79vsM/7ARqoG5h6d6NahfaOuRP4XI9xtdH3Pa/NCLyQjxKXyLxzwQzjddkX2Ep # TJnlypuhPmEdea59Uz2E303LxyXSnKBvGsAnyWYAfnejr3YAiL9YrN2l2dn198Rp # A4DCm9QtZYiwC0q2fuUvui34PfPIUZByf7wHuuWu50hY9WLx1kOMI8xyo7AI6TaN # rnIwggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEB # CwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAe # Fw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGm # TOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/H # ZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDc # wUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62A # W36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1w # jjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCG # MFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ # 1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP # 8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFz # ymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHz # NgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3 # xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsG # AQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/ # LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEG # DCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYB # BQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8G # A1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQw # VgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9j # cmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUF # BwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQEL # BQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfC # cTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AF # vonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l # 9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn # 8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5m # O0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyx # TkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4 # S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9 # y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM # +Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhw # RNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4C # AQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0 # ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo2RjFBLTA1RTAtRDk0NzElMCMG # A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIa # AxUAWmTiA01u5mxq/nVxiRJLMOskVGeggYMwgYCkfjB8MQswCQYDVQQGEwJVUzET # MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T # dGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAO6LR4cwIhgPMjAyNjEwMjcx # NTUzNDNaGA8yMDI2MTAyODE1NTM0M1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA # 7otHhwIBADAHAgEAAgIL8TAHAgEAAgISoTAKAgUA7oyZBwIBADA2BgorBgEEAYRZ # CgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0G # CSqGSIb3DQEBCwUAA4IBAQCg5KKZnanTdS0W5cNqDrj38psf91Th9fPJvQnvdCtI # I4N6MfXDBnR0at9heP1L0O+jBWhGTW8qg2FctlZFMOoipx0FBRbtSUWwzBKv8r5Y # r+JUTFbtHIVY5Cjnw5u7x1wTFVyZ6xNQ4pPQ4HpITWZ8umrVSj4FcooH8BW+h5JA # gZ3scKnVdWT4QFBbZG18P8dOK1wy42TH8d+yVd8jIFRep1DhXVMem82jloa+M+je # m8ztPByeC0NSJUB7c8JajXuNvguk/QFVLQRvTCnqYKUwcD9cvkFDxiEtZPCWAwqy # XANQfT/uWou/wzJxFxgudVT9hyyK54vy3ixCjcToZk/6MYIEDTCCBAkCAQEwgZMw # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIcCVUV18NZB9EAAQAA # AhwwDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB # BDAvBgkqhkiG9w0BCQQxIgQgodlmyKVRSCLmAvRp34icpT1pwlbFX2uZo4rEkMcI # oiMwgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCCgIGkmNhdo7+KE7dWhI+E2 # Ctx2RLWoYvvJodCIciHHaDCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAACHAlVFdfDWQfRAAEAAAIcMCIEILiG82kJJoJV5POnTUzljyyC # Y2c8PY3xa0pQ8LE3WTtDMA0GCSqGSIb3DQEBCwUABIICAIQpICEMxj6V1rsgzUl+ # UQfGeaNhPi1OxP1hcfLMDzYXV1zd035keMhIV9t2Oe+PTW/b9MVshXYSAT29wBRm # U7YT94FyCSauwCKEhLZn96sbCYb9KbZkFBBKvG7jEu/lgIgIQuYejJwv4+vJJcBA # +1FdKWpte3qGee5OHCl0SueRHnhvVqdatR02/X9CTo7f/7Ph0e1++trDUjaO/M3n # VXq7JT4HZldaxUE+TW3qrJtBdp9r+6HWH03IKaFWFhR3yZVbmaP5aL/nw/LadJf/ # XIg+i04A9CCuRwdznXspe/tdwDnBfYcDMVVLSuqJKDNIxlVT/B/QoovAWaQJsuJV # Zyb2IAuYMCfiqDmjV9PUb6kZhcuj9ymGjA3eodqRbGYLxQ5KJv4w9+b2FBmkSWhq # dj8JcN7nNZtXGxynXiF/sRg3k6l32nlgIINPHuqMq3bvJcdWtttlXyTWJY2R/07I # ILSXNgTfxmh4zplkmg/Cn97NPaDZOwpW68YfKYyn7214op6ZOQeKHiSrM/tO/BV6 # LaZ/U5FdNDqcr1kIX04zs9qU69YB6ZIkqkCN0sB+b34dUAE9VWT1uG/FT0IOIbP3 # elntsXfJhdQApQ9Y0cTx4y52gqHIyxPA59AK+J18FTyYFUdUBymRz7wvmS4SjZGA # oGlfxzdnKlFRULU6gaUmTq7T # SIG # End signature block |