custom/New-AzMigrateServerReplication.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 Starts replication for the specified server. .Description The New-AzMigrateServerReplication cmdlet starts the replication for a particular discovered server in the Azure Migrate project. .Link https://docs.microsoft.com/en-us/powershell/module/az.migrate/new-azmigrateserverreplication #> function New-AzMigrateServerReplication { [OutputType([Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api20180110.IJob])] [CmdletBinding(DefaultParameterSetName='ByIdDefaultUser', PositionalBinding=$false)] param( [Parameter(ParameterSetName='ByIdDefaultUser', Mandatory)] [Parameter(ParameterSetName='ByIdPowerUser', Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the machine ID of the discovered server to be migrated. ${MachineId}, [Parameter(ParameterSetName='ByInputObjectDefaultUser', Mandatory)] [Parameter(ParameterSetName='ByInputObjectPowerUser', Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api202001.IVMwareMachine] # Specifies the discovered server to be migrated. The server object can be retrieved using the Get-AzMigrateServer cmdlet. ${InputObject}, [Parameter(ParameterSetName='ByIdPowerUser', Mandatory)] [Parameter(ParameterSetName='ByInputObjectPowerUser', Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api20180110.IVMwareCbtDiskInput[]] # Specifies the disks on the source server to be included for replication. ${DiskToInclude}, [Parameter(Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Support.LicenseType] # Specifies if Azure Hybrid benefit is applicable for the source server to be migrated. ${LicenseType}, [Parameter(Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the Resource Group id within the destination Azure subscription to which the server needs to be migrated. ${TargetResourceGroupId}, [Parameter(Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the Virtual Network id within the destination Azure subscription to which the server needs to be migrated. ${TargetNetworkId}, [Parameter(Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the Subnet name within the destination Virtual Netowk to which the server needs to be migrated. ${TargetSubnetName}, [Parameter(DontShow)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Mapping. ${ReplicationContainerMapping}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Account id. ${VMWarerunasaccountID}, [Parameter(Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the name of the Azure VM to be created. ${TargetVMName}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the SKU of the Azure VM to be created. ${TargetVMSize}, [Parameter(ParameterSetName='ByIdDefaultUser')] [Parameter(ParameterSetName='ByInputObjectDefaultUser')] [Parameter(ParameterSetName='ByIdPowerUser')] [Parameter(ParameterSetName='ByInputObjectPowerUser')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies if replication be auto-repaired in case change tracking is lost for the source server under replication. ${PerformAutoResync}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the Availability Set to be used for VM creationSpecifies the Availability Set to be used for VM creation. ${TargetAvailabilitySet}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the Availability Zone to be used for VM creation. ${TargetAvailabilityZone}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the storage account to be used for boot diagnostics. ${TargetBootDiagnosticsStorageAccount}, [Parameter(ParameterSetName='ByIdDefaultUser', Mandatory)] [Parameter(ParameterSetName='ByInputObjectDefaultUser', Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Support.DiskAccountType] # Specifies the type of disks to be used for the Azure VM. ${DiskType}, [Parameter(ParameterSetName='ByIdDefaultUser', Mandatory)] [Parameter(ParameterSetName='ByInputObjectDefaultUser', Mandatory)] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the Operating System disk for the source server to be migrated. ${OSDiskID}, [Parameter(ParameterSetName='ByIdDefaultUser')] [Parameter(ParameterSetName='ByInputObjectDefaultUser')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [System.String] # Specifies the disk encyption set to be used. ${DiskEncryptionSetID}, [Parameter()] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Category('Path')] [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Runtime.DefaultInfo(Script='(Get-AzContext).Subscription.Id')] [System.String] # Azure 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 { $parameterSet = $PSCmdlet.ParameterSetName $HasRunAsAccountId = $PSBoundParameters.ContainsKey('VMWarerunasaccountID') $HasTargetAVSet = $PSBoundParameters.ContainsKey('TargetAvailabilitySet') $HasTargetAVZone = $PSBoundParameters.ContainsKey('TargetAvailabilityZone') $HasTargetBDStorage = $PSBoundParameters.ContainsKey('TargetBootDiagnosticsStorageAccount') $HasResync = $PSBoundParameters.ContainsKey('PerformAutoResync') $HasDiskEncryptionSetID = $PSBoundParameters.ContainsKey('DiskEncryptionSetID') $HasTargetVMSize = $PSBoundParameters.ContainsKey('TargetVMSize') $null = $PSBoundParameters.Remove('ReplicationContainerMapping') $null = $PSBoundParameters.Remove('VMWarerunasaccountID') $null = $PSBoundParameters.Remove('TargetAvailabilitySet') $null = $PSBoundParameters.Remove('TargetAvailabilityZone') $null = $PSBoundParameters.Remove('TargetBootDiagnosticsStorageAccount') $null = $PSBoundParameters.Remove('MachineId') $null = $PSBoundParameters.Remove('DiskToInclude') $null = $PSBoundParameters.Remove('TargetResourceGroupId') $null = $PSBoundParameters.Remove('TargetNetworkId') $null = $PSBoundParameters.Remove('TargetSubnetName') $null = $PSBoundParameters.Remove('TargetVMName') $null = $PSBoundParameters.Remove('TargetVMSize') $null = $PSBoundParameters.Remove('PerformAutoResync') $null = $PSBoundParameters.Remove('DiskType') $null = $PSBoundParameters.Remove('OSDiskID') $null = $PSBoundParameters.Remove('LicenseType') $null = $PSBoundParameters.Remove('DiskEncryptionSetID') $null = $PSBoundParameters.Remove('MachineId') $null = $PSBoundParameters.Remove('InputObject') if(($parameterSet -match 'Id') -or ($parameterSet -match 'InputObject')){ if(($parameterSet -match 'InputObject')){ $MachineId = $InputObject.Id } $MachineIdArray = $MachineId.Split("/") $SiteType = $MachineIdArray[7] $SiteName = $MachineIdArray[8] $ResourceGroupName = $MachineIdArray[4] $MachineName = $MachineIdArray[10] $null = $PSBoundParameters.Add('ResourceGroupName', $ResourceGroupName) $null = $PSBoundParameters.Add('SiteName', $SiteName) $siteObject = Az.Migrate\Get-AzMigrateSite @PSBoundParameters if($siteObject -and ($siteObject.Count -ge 1)){ $ProjectName = $siteObject.DiscoverySolutionId.Split("/")[8] }else{ throw "Site not found" } $null = $PSBoundParameters.Remove('ResourceGroupName') $null = $PSBoundParameters.Remove('SiteName') $null = $PSBoundParameters.Add("ResourceGroupName", $ResourceGroupName) $null = $PSBoundParameters.Add("Name", "Servers-Migration-ServerMigration") $null = $PSBoundParameters.Add("MigrateProjectName", $ProjectName) $solution = Az.Migrate\Get-AzMigrateSolution @PSBoundParameters $VaultName = $solution.DetailExtendedDetail.AdditionalProperties.vaultId.Split("/")[8] $null = $PSBoundParameters.Remove('ResourceGroupName') $null = $PSBoundParameters.Remove("Name") $null = $PSBoundParameters.Remove("MigrateProjectName") } if ($SiteType -ne "VMwareSites"){ throw "Provider not supported" } # in case if the credential type is null which is in case of older appliances or # in case if the credential type is vmwarefabric type which is for newer appliances # send that run as account id only. # for vCenter there will be always one credential so returning the first one which matches it. # when multiple vCenter support comes then this might not work and need to redesign this. if(!$HasRunAsAccountId){ $null = $PSBoundParameters.Add('ResourceGroupName', $ResourceGroupName) $null = $PSBoundParameters.Add('SiteName', $SiteName) $runAsAccounts = Az.Migrate\Get-AzMigrateRunAsAccount @PSBoundParameters $VMWarerunasaccountID = "" foreach($account in $runAsAccounts){ if(($null -eq $account.CredentialType) -or ($account.CredentialType -eq "VMwareFabric")){ $VMWarerunasaccountID = $account.Id break } } if($VMWarerunasaccountID -eq ""){ throw "Run As Account missing" } $null = $PSBoundParameters.Remove('ResourceGroupName') $null = $PSBoundParameters.Remove('SiteName') } $policyName = "migrate" + $SiteName + "policy" $null = $PSBoundParameters.Add('ResourceGroupName', $ResourceGroupName) $null = $PSBoundParameters.Add('ResourceName', $VaultName) $null = $PSBoundParameters.Add('PolicyName', $policyName) $policyObj = Az.Migrate\Get-AzMigrateReplicationPolicy @PSBoundParameters -ErrorVariable notPresent -ErrorAction SilentlyContinue if($policyObj -and ($policyObj.Count -ge 1)){ $PolicyId = $policyObj.Id }else{ throw "The replication infrastructure is not initialized. Run the initialize-azmigratereplicationinfrastructure script again." } $null = $PSBoundParameters.Remove('ResourceGroupName') $null = $PSBoundParameters.Remove('ResourceName') $null = $PSBoundParameters.Remove('PolicyName') $null = $PSBoundParameters.Add('ResourceGroupName', $ResourceGroupName) $null = $PSBoundParameters.Add('ResourceName', $VaultName) $allFabrics = Az.Migrate\Get-AzMigrateReplicationFabric @PSBoundParameters $FabricName = "" if($allFabrics -and ($allFabrics.length -gt 0)){ foreach ($fabric in $allFabrics) { if(($fabric.Property.CustomDetail.InstanceType -ceq "VMwareV2") -and ($fabric.Property.CustomDetail.VmwareSiteId.Split("/")[8] -ceq $SiteName)){ $FabricName = $fabric.Name break } } } if($FabricName -eq ""){ throw "Fabric not found for given resource group." } $null = $PSBoundParameters.Add('FabricName', $FabricName) $peContainers = Az.Migrate\Get-AzMigrateReplicationProtectionContainer @PSBoundParameters $ProtectionContainerName = "" if($peContainers -and ($peContainers.length -gt 0)){ $ProtectionContainerName = $peContainers[0].Name } if($ProtectionContainerName -eq ""){ throw "Container not found for given resource group." } $mappingName = "containermapping" $null = $PSBoundParameters.Add('MappingName', $mappingName) $null = $PSBoundParameters.Add("ProtectionContainerName", $ProtectionContainerName) $mappingObject = Az.Migrate\Get-AzMigrateReplicationProtectionContainerMapping @PSBoundParameters -ErrorVariable notPresent -ErrorAction SilentlyContinue if($mappingObject -and ($mappingObject.Count -ge 1)){ $TargetRegion = $mappingObject.ProviderSpecificDetail.TargetLocation }else{ throw "The replication infrastructure is not initialized. Run the initialize-azmigratereplicationinfrastructure script again." } $null = $PSBoundParameters.Remove('MappingName') $HashCodeInput = $SiteName + $TargetRegion $Source = @" using System; public class HashFunctions { public static int hashForArtifact(String artifact) { int hash = 0; int al = artifact.Length; int tl = 0; char[] ac = artifact.ToCharArray(); while (tl < al) { hash = ((hash << 5) - hash) + ac[tl++] | 0; } return Math.Abs(hash); } } "@ Add-Type -TypeDefinition $Source -Language CSharp $hash = [HashFunctions]::hashForArtifact($HashCodeInput) $LogStorageAccountID = "/subscriptions/" + $SubscriptionId + "/resourceGroups/" + $ResourceGroupName + "/providers/Microsoft.Storage/storageAccounts/migratelsa" + $hash $LogStorageAccountSas = "migratelsa" + $hash + '-cacheSas' if(!$HasTargetBDStorage){ $TargetBootDiagnosticsStorageAccount = $LogStorageAccountID } # Storage accounts need to be in the same subscription as that of the VM. if (($null -ne $TargetBootDiagnosticsStorageAccount) -and ($TargetBootDiagnosticsStorageAccount.length -gt 1)){ $TargetBDSASubscriptionId = $TargetBootDiagnosticsStorageAccount.Split('/')[2] $TargetSubscriptionId = $TargetResourceGroupId.Split('/')[2] if($TargetBDSASubscriptionId -ne $TargetSubscriptionId){ $TargetBootDiagnosticsStorageAccount = $null } } if(!$HasResync){ $PerformAutoResync = "true" } $null = $PSBoundParameters.Add("MigrationItemName", $MachineName) $null = $PSBoundParameters.Add("PolicyId", $PolicyId) $ProviderSpecificDetails = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api20180110.VMwareCbtEnableMigrationInput]::new() $ProviderSpecificDetails.DataMoverRunAsAccountId = $VMWarerunasaccountID $ProviderSpecificDetails.SnapshotRunAsAccountId = $VMWarerunasaccountID $ProviderSpecificDetails.InstanceType = 'VMwareCbt' $ProviderSpecificDetails.LicenseType = $LicenseType $ProviderSpecificDetails.PerformAutoResync = $PerformAutoResync if($HasTargetAVSet){ $ProviderSpecificDetails.TargetAvailabilitySetId = $TargetAvailabilitySet } if($HasTargetAVZone){ $ProviderSpecificDetails.TargetAvailabilityZone = $TargetAvailabilityZone } $ProviderSpecificDetails.TargetBootDiagnosticsStorageAccountId = $TargetBootDiagnosticsStorageAccount $ProviderSpecificDetails.TargetNetworkId = $TargetNetworkId $ProviderSpecificDetails.TargetResourceGroupId = $TargetResourceGroupId $ProviderSpecificDetails.TargetSubnetName = $TargetSubnetName $ProviderSpecificDetails.TargetVMName = $TargetVMName if($HasTargetVMSize){$ProviderSpecificDetails.TargetVMSize = $TargetVMSize} $ProviderSpecificDetails.VmwareMachineId = $MachineId if ($parameterSet -match 'DefaultUser'){ [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api20180110.IVMwareCbtDiskInput[]]$DiskToInclude = @() if($parameterSet -eq 'ByInputObjectDefaultUser'){ foreach($onPremDisk in $InputObject.Disk){ if($onPremDisk.Uuid -ne $OSDiskID){ $DiskObject = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api20180110.VMwareCbtDiskInput]::new() $DiskObject.DiskId = $onPremDisk.Uuid $DiskObject.DiskType = "Standard_LRS" $DiskObject.IsOSDisk = "false" $DiskObject.LogStorageAccountSasSecretName = $LogStorageAccountSas $DiskObject.LogStorageAccountId = $LogStorageAccountID if($HasDiskEncryptionSetID){ $DiskObject.DiskEncryptionSetId = $DiskEncryptionSetID } $DiskToInclude+=$DiskObject } } } $DiskObject = [Microsoft.Azure.PowerShell.Cmdlets.Migrate.Models.Api20180110.VMwareCbtDiskInput]::new() $DiskObject.DiskId = $OSDiskID $DiskObject.DiskType = $DiskType $DiskObject.IsOSDisk = "true" $DiskObject.LogStorageAccountSasSecretName = $LogStorageAccountSas $DiskObject.LogStorageAccountId = $LogStorageAccountID if($HasDiskEncryptionSetID){ $DiskObject.DiskEncryptionSetId = $DiskEncryptionSetID } $DiskToInclude+=$DiskObject $ProviderSpecificDetails.DisksToInclude = $DiskToInclude }else{ foreach ($DiskObject in $DiskToInclude) { $DiskObject.LogStorageAccountSasSecretName = $LogStorageAccountSas $DiskObject.LogStorageAccountId = $LogStorageAccountID } $ProviderSpecificDetails.DisksToInclude = $DiskToInclude } $null = $PSBoundParameters.add('ProviderSpecificDetail', $ProviderSpecificDetails) $null = $PSBoundParameters.Add('NoWait', $true) $output = Az.Migrate.internal\New-AzMigrateReplicationMigrationItem @PSBoundParameters $JobName = $output.Target.Split("/")[12].Split("?")[0] $null = $PSBoundParameters.Remove('NoWait') $null = $PSBoundParameters.Remove('ProviderSpecificDetail') $null = $PSBoundParameters.Remove("ResourceGroupName") $null = $PSBoundParameters.Remove("ResourceName") $null = $PSBoundParameters.Remove("FabricName") $null = $PSBoundParameters.Remove("MigrationItemName") $null = $PSBoundParameters.Remove("ProtectionContainerName") $null = $PSBoundParameters.Remove("PolicyId") $null = $PSBoundParameters.Add('JobName', $JobName) $null = $PSBoundParameters.Add('ResourceName', $VaultName) $null = $PSBoundParameters.Add('ResourceGroupName', $ResourceGroupName) return Az.Migrate.internal\Get-AzMigrateReplicationJob @PSBoundParameters } } # SIG # Begin signature block # MIIjlgYJKoZIhvcNAQcCoIIjhzCCI4MCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDixiNXIQxwB14s # XpJkr/FQVGcFzQSS5RSF7+qEh5om0KCCDYUwggYDMIID66ADAgECAhMzAAABiK9S # 1rmSbej5AAAAAAGIMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAwMzA0MTgzOTQ4WhcNMjEwMzAzMTgzOTQ4WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQCSCNryE+Cewy2m4t/a74wZ7C9YTwv1PyC4BvM/kSWPNs8n0RTe+FvYfU+E9uf0 # t7nYlAzHjK+plif2BhD+NgdhIUQ8sVwWO39tjvQRHjP2//vSvIfmmkRoML1Ihnjs # 9kQiZQzYRDYYRp9xSQYmRwQjk5hl8/U7RgOiQDitVHaU7BT1MI92lfZRuIIDDYBd # vXtbclYJMVOwqZtv0O9zQCret6R+fRSGaDNfEEpcILL+D7RV3M4uaJE4Ta6KAOdv # V+MVaJp1YXFTZPKtpjHO6d9pHQPZiG7NdC6QbnRGmsa48uNQrb6AfmLKDI1Lp31W # MogTaX5tZf+CZT9PSuvjOCLNAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUj9RJL9zNrPcL10RZdMQIXZN7MG8w # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzQ1ODM4NjAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # ACnXo8hjp7FeT+H6iQlV3CcGnkSbFvIpKYafgzYCFo3UHY1VHYJVb5jHEO8oG26Q # qBELmak6MTI+ra3WKMTGhE1sEIlowTcp4IAs8a5wpCh6Vf4Z/bAtIppP3p3gXk2X # 8UXTc+WxjQYsDkFiSzo/OBa5hkdW1g4EpO43l9mjToBdqEPtIXsZ7Hi1/6y4gK0P # mMiwG8LMpSn0n/oSHGjrUNBgHJPxgs63Slf58QGBznuXiRaXmfTUDdrvhRocdxIM # i8nXQwWACMiQzJSRzBP5S2wUq7nMAqjaTbeXhJqD2SFVHdUYlKruvtPSwbnqSRWT # GI8s4FEXt+TL3w5JnwVZmZkUFoioQDMMjFyaKurdJ6pnzbr1h6QW0R97fWc8xEIz # LIOiU2rjwWAtlQqFO8KNiykjYGyEf5LyAJKAO+rJd9fsYR+VBauIEQoYmjnUbTXM # SY2Lf5KMluWlDOGVh8q6XjmBccpaT+8tCfxpaVYPi1ncnwTwaPQvVq8RjWDRB7Pa # 8ruHgj2HJFi69+hcq7mWx5nTUtzzFa7RSZfE5a1a5AuBmGNRr7f8cNfa01+tiWjV # Kk1a+gJUBSP0sIxecFbVSXTZ7bqeal45XSDIisZBkWb+83TbXdTGMDSUFKTAdtC+ # r35GfsN8QVy59Hb5ZYzAXczhgRmk7NyE6jD0Ym5TKiW5MIIHejCCBWKgAwIBAgIK # YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw # OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD # VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la # UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc # 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D # dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+ # lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk # kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6 # A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd # X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL # 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd # sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3 # T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS # 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI # bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL # BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD # uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h # cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA # YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn # 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7 # v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b # pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/ # KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy # CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp # mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi # hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb # BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS # oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL # gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX # cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCFWcwghVjAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAGIr1LWuZJt6PkAAAAA # AYgwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAgC # KPBYU0HRO/Yz0FAaLHyEid69/v7srZHNiPnBnYi3MEIGCisGAQQBgjcCAQwxNDAy # oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20wDQYJKoZIhvcNAQEBBQAEggEAdhHq+c81I47CgDaYWyTkSzdE9UuwaiDjEW62 # JwrAwJEzTbsUgBbLow3tBZOcSN1P+UUY3tzW5cJuxSBceTHx3WoQbavzMsGnkVKe # BdRhhmUFULyyKR/Cf0xDeGmqJDAe6vPE2N2ZB6fJdKRgshwBhYzYn0TZrflkIi4t # JKYV5phEbG7GJqGuyzUqSxstcsmNWNv0iFQwyZZrYtFqoqGdUFCoXtvc9PGrIuij # 3toO9Ru1ZYWm/47V4Mi9Ta/bWBiLeszUooOrxcJdQdeEA5YWTEpm9yhVT55TvHBj # 5mVnc7vH4u5+ipvrsyRmUAOO/oS7hCPpcM5wo5zokBiQpHTEvqGCEvEwghLtBgor # BgEEAYI3AwMBMYIS3TCCEtkGCSqGSIb3DQEHAqCCEsowghLGAgEDMQ8wDQYJYIZI # AWUDBAIBBQAwggFVBgsqhkiG9w0BCRABBKCCAUQEggFAMIIBPAIBAQYKKwYBBAGE # WQoDATAxMA0GCWCGSAFlAwQCAQUABCBCk1x9jUAeNySnbM7/L94XenF8IRdBdZnd # U1Lqyi9r0wIGX9uK7NWtGBMyMDIxMDEyMjA4NTkwMS41OTlaMASAAgH0oIHUpIHR # MIHOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQL # EyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhh # bGVzIFRTUyBFU046MEE1Ni1FMzI5LTRENEQxJTAjBgNVBAMTHE1pY3Jvc29mdCBU # aW1lLVN0YW1wIFNlcnZpY2Wggg5EMIIE9TCCA92gAwIBAgITMwAAAScvbqPvkagZ # qAAAAAABJzANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMDAeFw0xOTEyMTkwMTE0NTlaFw0yMTAzMTcwMTE0NTlaMIHOMQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQg # T3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046 # MEE1Ni1FMzI5LTRENEQxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNl # cnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD4Ad5xEZ5On0uN # L71ng9xwoDPRKeMUyEIj5yVxPRPh5GVbU7D3pqDsoXzQMhfeRP61L1zlU1HCRS+1 # 29eo0yj1zjbAlmPAwosUgyIonesWt9E4hFlXCGUcIg5XMdvQ+Ouzk2r+awNRuk8A # BGOa0I4VBy6zqCYHyX2pGauiB43frJSNP6pcrO0CBmpBZNjgepof5Z/50vBuJDUS # ug6OIMQ7ZwUhSzX4bEmZUUjAycBb62dhQpGqHsXe6ypVDTgAEnGONdSBKkHiNT8H # 0Zt2lm0vCLwHyTwtgIdi67T/LCp+X2mlPHqXsY3u72X3GYn/3G8YFCkrSc6m3b0w # TXPd5/2fAgMBAAGjggEbMIIBFzAdBgNVHQ4EFgQU5fSWVYBfOTEkW2JTiV24WNNt # lfIwHwYDVR0jBBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBL # oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljVGltU3RhUENBXzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr # BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNU # aW1TdGFQQ0FfMjAxMC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAK # BggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAQEACsqNfNFVxwalZ42cEMuzZc12 # 6Nvluanx8UewDVeUQZEZHRmppMFHAzS/g6RzmxTyR2tKE3mChNGW5dTL730vEbRh # nYRmBgiX/gT3f4AQrOPnZGXY7zszcrlbgzxpakOX+x0u4rkP3Ashh3B2CdJ11XsB # di5PiZa1spB6U5S8D15gqTUfoIniLT4v1DBdkWExsKI1vsiFcDcjGJ4xRlMRF+fw # 7SY0WZoOzwRzKxDTdg4DusAXpaeKbch9iithLFk/vIxQrqCr/niW8tEA+eSzeX/E # q1D0ZyvOn4e2lTnwoJUKH6OQAWSBogyK4OCbFeJOqdKAUiBTgHKkQIYh/tbKQjCC # BnEwggRZoAMCAQICCmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29m # dCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1 # NVoXDTI1MDcwMTIxNDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAw # ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/ # aZRrdFQQ1aUKAIKF++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxh # MFmxMEQP8WCIhFRDDNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhH # hjKEHnRhZ5FfgVSxz5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tk # iVBisV39dx898Fd1rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox # 8NpOBpG2iAg16HgcsOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJN # AgMBAAGjggHmMIIB4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIox # kPNDe3xGG8UzaFqFbVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0P # BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9 # lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQu # Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3Js # MFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAG # A1UdIAEB/wSBlTCBkjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAG # CCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEA # dABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXED # PZ2joSFvs+umzPUxvs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgr # UYJEEvu5U4zM9GASinbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c # 8pl5SpFSAK84Dxf1L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFw # nzJKJ/1Vry/+tuWOM7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFt # w5yjojz6f32WapB4pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk # 7Pf0v35jWSUPei45V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9d # dJgiCGHasFAeb73x4QDf5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zG # y9iCtHLNHfS4hQEegPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3 # yKxO2ii4sanblrKnQqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7c # RDyXUHHXodLFVeNp3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wkn # HNWzfjUeCLraNtvTX4/edIhJEqGCAtIwggI7AgEBMIH8oYHUpIHRMIHOMQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3Nv # ZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBF # U046MEE1Ni1FMzI5LTRENEQxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1w # IFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVALOVuE5sgxzETO4s+poBqI6r1x8zoIGD # MIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG # A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEF # BQACBQDjtNUrMCIYDzIwMjEwMTIyMDgzODAzWhgPMjAyMTAxMjMwODM4MDNaMHcw # PQYKKwYBBAGEWQoEATEvMC0wCgIFAOO01SsCAQAwCgIBAAICH10CAf8wBwIBAAIC # EbEwCgIFAOO2JqsCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAK # MAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQCPnWt5pf1K # MBGPEKhXtZLSpi5Yj5oBjml+waismGfr6VQI6lM3+SfBGbiEufYQSsK6bfnN/+EM # DjPkvcWNdX69aL4cIFC18CkCO33m0JCTVCjOmJyR/KyHd4be18dvCBmKEpWv/rZB # 59luMh4WEhPi8X13e0R+uNGWF9Bt2dZfBDGCAw0wggMJAgEBMIGTMHwxCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29m # dCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABJy9uo++RqBmoAAAAAAEnMA0GCWCG # SAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZI # hvcNAQkEMSIEIBoCoL8o6kfNWBkgSTYTrr844VYDK+cf7o2erStfxDbSMIH6Bgsq # hkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgG5LoSxKGHWoW/wVMlbMztlQ4upAdzEmq # H//vLu0jPiIwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAIT # MwAAAScvbqPvkagZqAAAAAABJzAiBCAwv8UbPW0AMQiIL5P4ZCiUwLUhU5f0PaN8 # 57hZ+8/qMTANBgkqhkiG9w0BAQsFAASCAQCxemfaM+i10x0N+9bZjznsxzJPb2m5 # wbZh7aLKbSBsRzS5c1I9sEoOaJe3w5JNG9H841yUmsHGNjGDFu5BfvzsNkyuX3KK # HxFcU9tiYIvrvssWJfbGIZV1GsHzl+NwpahdHPSlGAL7Fx/7QbAPVrRXeppbDCD0 # By2e9wST2wdkdCqBN7DfMuY2Cz8cEfyUj/DJhniqUxSuPDlXF5dDU8ZnWVXalduf # 5+7j6U72CEXUWOYVUt0JCjTLAMu5D+mYIKKlDCmRG+keL8vo6aIheZOf63y0zdYH # p1JRqcK0e8c7hKUw/+DmR2oX7aezU7ZCF5fRHY6E4Xs42LM91lADdeWR # SIG # End signature block |