Migrate-Aadds.ps1
<#PSScriptInfo
.VERSION 1.8 .GUID 723874e6-7a38-4bde-b7f5-8627c18fd10c .AUTHOR aaddsfb@microsoft.com .COMPANYNAME Microsoft Corporation .COPYRIGHT (c) Microsoft Corporation .TAGS Azure-AD-Domain-Services Migration .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES 10/18/2019 - Initial release 12/04/2019 - Ensure well-formed subnetids during abort 01/17/2020 - Parameter type fix 02/12/2020 - Add support for MFA and some message fixes 03/31/2020 - Improve retry conditions 07/19/2020 - Minor ApiVersion fix 08/21/2020 - Adding file based logging 09/24/2020 - Add a reminder for reviewing online migration document 01/21/2021 - Bug fix to find the AAD managed domain resource accurately 02/17/2021 - Add a check for NSG setup on the target subnet #> <# .SYNOPSIS Migrates an Azure AD Domain Services from a classic virtual network to an Azure Resource Manager virtual network. .DESCRIPTION Migrates an Azure AD Domain Services from a classic virtual network to an Azure Resource Manager virtual network. .PARAMETER Prepare [MANADATORY] Causes the script to prepare the classic Azure AD Domain Services resource for migration. .PARAMETER Commit [MANADATORY] Causes the script to commit the migration for the prepared classic Azure AD Domain Services resource. .PARAMETER Abort [MANADATORY] Causes the script to abort the migration and reverts the classic Azure AD Domain Services to a running state. .PARAMETER ManagedDomainFqdn [MANADATORY] The fqdn of the managed domain (aadds.corp.contoso.com). .PARAMETER VirtualNetworkResourceGroupName [MANDATORY] The name of the Azure Resource Manager resource group that hosts the virtual network to which Azure AD Domain Services will be moved. .PARAMETER VirtualNetworkName [MANDATORY] The name of the Azure Resource Manager virtual network to which Azure AD Domain Services will be moved. .PARAMETER VirtualSubnetName [MANADATORY] The name of the Azure Resource Manager virtual subnet to which Azure AD Domain Services will be moved. .PARAMETER ClassicVirtualNetworkName [MANADATORY] The name of the Classic Virtual Network on which Azure AD Domain Services was enabled. This is only required for Abort case .PARAMETER SubscriptionId [OPTIONAL] The Azure subscription that hosts the Azure AD Domain Services resource. .PARAMETER Credential [OPTIONAL] The credentials used to authenticate to Azure. #> [CmdletBinding()] Param ( [Parameter( Mandatory=$true, ParameterSetName="Prepare")] [switch] $Prepare, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [switch] $Commit, [Parameter( Mandatory=$true, ParameterSetName="Abort")] [switch] $Abort, [Parameter( Mandatory=$true, ParameterSetName="Prepare")] [Parameter( Mandatory=$true, ParameterSetName="Commit")] [Parameter( Mandatory=$true, ParameterSetName="Abort")] [string] $ManagedDomainFqdn, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [string] $VirtualNetworkResourceGroupName, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [string] $VirtualNetworkName, [Parameter( Mandatory=$true, ParameterSetName="Abort")] [string] $ClassicVirtualNetworkName, [Parameter( Mandatory=$true, ParameterSetName="Commit")] [string] $VirtualSubnetName, [Parameter( Mandatory=$false, ParameterSetName="Prepare")] [Parameter( Mandatory=$false, ParameterSetName="Commit")] [Parameter( Mandatory=$false, ParameterSetName="Abort")] [string] $SubscriptionId, [Parameter( Mandatory=$false, ParameterSetName="Prepare")] [Parameter( Mandatory=$false, ParameterSetName="Commit")] [Parameter( Mandatory=$false, ParameterSetName="Abort")] [pscredential] $Credentials ) Process { enum actionType { Unknown Prepare Commit Abort } ## Create a log folder where the log files will be kept. $currentLocation = Get-Location $logsDirectory = "$currentLocation\Logs" New-Item -ItemType Directory -Path $logsDirectory -Force | Out-Null $dateFormat = $($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) $global:filePath = "$logsDirectory\MigrationLogs-$dateFormat.txt" Write-Host "Log File Path: $global:filePath" if(!(Test-Path -Path $global:filePath)) { ## Create the file if it does not exists $global:sw = New-Object System.IO.StreamWriter $global:filePath } ## Function to write log message to a file Function LogToFile { Param([string]$message, [bool]$force = $false) if ($null -eq $global:sw.BaseStream) { $fStream = New-Object IO.FileStream $global:filePath ,'Append','Write','Read' $global:sw = New-Object System.IO.StreamWriter $fStream } $global:sw.WriteLine($message) if ($force -eq $true) { $global:sw.Close() } } ## Function to write log message to file as well as output Function LogToFileAndOutput { Param([string]$message, [string]$messageType = "Info") switch($messageType) { "Info" { Write-Host $message break } "Success" { Write-Host -ForegroundColor Green $message break } "Warning" { Write-Host -ForegroundColor Yellow $message break } "Error" { Write-Host -ForegroundColor Red $message break } Default { $message = "UNKNOWN MessageType: $messageType. Message: $message" Write-Host $message break } } LogToFile -message $message -force $true } ## Log message to output as well as file Function LogInfo { Param([string]$message) $message = "$($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) :: INFO :: $message" LogToFileAndOutput -message $message -messageType "Info" } ## Log Progress message to output as well as file Function LogProgress { Param([string]$currentOp,[int]$percentComplete) $lastUpdateTime = $($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) if($currentOp -eq $null) { Write-Progress -Activity "Migration" -Status ("Last Updated: $lastUpdateTime") -Completed $message = "$($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) :: PROGRESS :: Activity: Migration. Status LastUpdated: $lastUpdateTime, Status: Completed" } else { Write-Progress -Activity "Migration" -Status ("Last Updated: $lastUpdateTime") -CurrentOperation $currentOp -PercentComplete $percentComplete $message = "$($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) :: PROGRESS :: Activity: Migration. Status LastUpdated: $lastUpdateTime, Current Operation: $currentOp, PercentComplete: $percentComplete" } LogInfo -message $message } ## Log Success message to output as well as file Function LogSuccess { Param([string]$message) $message = "$($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) :: SUCCESS :: $message" LogToFileAndOutput -message $message -messageType "Success" } ## Log Warning message to output as well as file Function LogWarning { Param([string]$message) $message = "$($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) :: WARNING :: $message" LogToFileAndOutput -message $message -messageType "Warning" } ## Log Error message to output as well as file Function LogError { Param([string]$message) $message = "$($(Get-Date).ToUniversalTime().ToString('MM-dd-yyyyTHH-mm-ss')) :: ERROR :: $message" LogToFileAndOutput -message $message -messageType "Error" } Function GetAaddsResource { Param([string]$domainName) LogInfo ("Getting Resource Information for Resource Name: {0}"-f $domainName) $resources = Get-AzResource -ResourceType "Microsoft.AAD/DomainServices" -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue foreach($resource in $resources) { if($resource.Name -eq $domainName) { LogInfo("Resource Found") return $resource } else { LogWarning("Resource: {0} did not match the domainName: {1}" -f $resource.Name, $domainName) } } LogError("Resource Not Found") return $null } $subscription = $null $aadds = $null $creds = $null $azProfile = $null $action =[actionType]::Unknown LogInfo("Arguments Passed") foreach($boundparam in $PSBoundParameters.GetEnumerator()) { LogInfo("{0} :: {1}" -f $boundparam.Key,$boundparam.Value) } # # Check for the requested action if($true -eq $Prepare) { $action = [actionType]::Prepare } elseif($true -eq $Commit) { $action = [actionType]::Commit } elseif($true -eq $Abort) { $action = [actionType]::Abort } if($action -eq [actionType]::Unknown) { LogError "Unknown action type." return } ## check for subscriptionID if($SubscriptionId) { $subscription = $SubscriptionId } LogInfo ([string]::Empty) LogInfo ([string]::Empty) LogInfo "Authenticating to Azure... " # # Collect credentials from the user for authentication if($null -eq $Credentials) { $azProfile = Connect-AzAccount -ErrorAction SilentlyContinue } else { $azProfile = Connect-AzAccount -Credential $Credentials -ErrorAction SilentlyContinue } if($null -eq $azProfile) { # Authentication failed LogError "[Failed!]" LogError "Could not authenticate to Azure. Check your credentials and try again." Return } else { LogSuccess "[Success!]" } LogInfo ("Authenticated to Azure as {0}..." -f $azProfile.Context.Account.Id) # # Check for user provided subscription Id if($null -eq $subscription) { # # Locate Azure AD Domain Services in a subscription # Use the first instance found as there should only be one instance per tenant LogInfo "Searching for Azure AD Domain Services instance..." ($AzSubs = Get-AzSubscription) | Out-Null foreach($azsub in $AzSubs) { (Select-AzSubscription $azsub.Id) | Out-Null $aadds = GetAaddsResource -domainName $ManagedDomainFqdn if($null -ne $aadds) { # Found Azure AD Domain Services in this subscription # Add to the subscription List $subscription = $azsub.Id break } } if($null -eq $subscription) { LogError "[Failed!]" LogError ("Could not find a subscription that has the specified Azure AD Domain Services with managed domain name: {0}" -f $ManagedDomainFqdn) return } else { LogSuccess "[Found!]" } } else { Select-AzSubscription $subscription -ErrorAction SilentlyContinue $aadds = GetAaddsResource -domainName $ManagedDomainFqdn } # # Validate the resource is Azure AD Domain Services $pass = $true LogInfo "Validating AADDS Resource..." if($aadds -eq $null) { $pass = $false LogError "[Failed!]" LogError ("Unable to find Azure AD Domain services Resource for DomainName: {0}" -f $ManagedDomainFqdn) } else { LogSuccess "[Pass!]" } # # Validate service status LogInfo "Validating service status..." # # If the action is commit, this should equal PreparedForMigration or FailedToPerformMigration. # If the action is abort, this should equal PreparedForMigration, FailedToRollbackMigration or FailedToPerformMigration. # If the action is prepare, this should equal Running or FailedToPrepareForMigration. if("commit" -eq $action) { if("PreparedForMigration" -ne $aadds.properties.serviceStatus -and "FailedToPerformMigration" -ne $aadds.properties.serviceStatus) { $pass = $false LogError "[Failed!]" LogError ("The managed domain {0} must be prepared prior to this command (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus) } else { LogSuccess "[Pass!]" } } elseif("abort" -eq $action) { if("PreparedForMigration" -ne $aadds.properties.serviceStatus -and "FailedToRollbackMigration" -ne $aadds.properties.serviceStatus -and "FailedToPerformMigration" -ne $aadds.properties.serviceStatus) { $pass = $false LogError "[Failed!]" LogError ("The managed domain {0} must be prepared prior to this command (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus) } else { LogSuccess "[Pass!]" } } else { if( ("FailedToPrepareForMigration" -ne $aadds.Properties.ServiceStatus -and "Running" -ne $aadds.properties.serviceStatus) ) { $pass = $false LogError "[Failed!]" LogError ("The managed domain {0} is not in a state that can be prepared (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus) } else { LogSuccess "[Pass!]" } } if($pass -eq $false) { LogError "One or more prerequisites checks failed." Return } # # Do work based on the action $actionStart = Get-Date switch($action) { "Prepare" { LogInfo ([String]::Empty) LogInfo "It is important you let the script complete" LogInfo "The preparation may take up to 30 minutes. Please wait..." LogInfo ([String]::Empty) LogWarning "IMPORTANT! Please review https://docs.microsoft.com/en-us/azure/active-directory-domain-services/migrate-from-classic-vnet carefully before you proceed with the migration. Please ensure that the virtual network, that the managed domain will be migrated to, meets the requirements (https://docs.microsoft.com/en-us/azure/active-directory-domain-services/migrate-from-classic-vnet#restrictions-on-available-virtual-networks)." LogInfo ([String]::Empty) $consent = Read-Host -Prompt ("Do you want to prepare {0} for migration: (Y/N)" -f $ManagedDomainFqdn) if("Y" -ne $consent) { LogWarning "[Canceled!] The user canceled the migration." return } LogInfo "Processing your request... " # Prepare the instance (Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $null} -ApiVersion 2017-06-01 -Force) | Out-Null LogInfo -Foreground Green "[Preparation complete!]" LogInfo "Validating ..." $confirm = $null $confirm = GetAaddsResource -domainName $ManagedDomainFqdn if($null -eq $confirm) { LogWarning "[Undetermined!]" LogWarning "The script could not validate the preparation status." LogWarning ( "Please run {0} and check the serviceStatus value is 'PreparedForMigration'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).Properties" ) return } ## Check the properties for successful migration if($confirm.properties.serviceStatus -ne "PreparedForMigration") { LogError "[Failed!]" LogError ("The managed domain {0} did not prepare (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus) } else { LogSuccess "[Pass!]" LogInfo ([String]::Empty) LogInfo ([String]::Empty) LogInfo "Please turn off all virtual machines joined to Azure AD Domain Services." LogInfo "You may turn on these virtual machines after you complete the migration." LogInfo ([String]::Empty) LogInfo "When ready to complete the migration, run 'Migrate-Aadds' using the '-Commit' parameter." LogInfo "To complete the command, you will need to have the name of your new Azure Resource Manager virtual network and subnet." LogInfo ([String]::Empty) } break } "Commit" { $vnet = $null $subnet = $null # # Virtual network resource group name must exist to proceed if($null -eq $VirtualNetworkResourceGroupName) { LogError "The virtual network resource group name cannot be blank or null." return } # # Virtual network is valid LogInfo "Validating virtual network..." if($null -eq $VirtualNetworkName) { LogError "[Failed!]" LogError ("Missing the name of the virtual network (VirtualNetwork:{0})." -f $VirtualNetworkName) return } else { # # Get the virtual network $vnet = Get-AzVirtualNetwork -Name $VirtualNetworkName -ResourceGroupName $VirtualNetworkResourceGroupName -ErrorAction SilentlyContinue if($null -eq $vnet) { LogError "[Failed!]" LogError ("Could not find the virtual network (VirtualNetwork:{0})." -f $VirtualNetworkName) return } } LogSuccess "[Pass!]" # # Virtual subnet is valid LogInfo "Validating virtual subnet..." if($null -eq $VirtualSubnetName) { LogError "[Failed!]" LogError ("Missing the name of the virtual subnet (VirtualSubnet:{0})." -f $VirtualSubnetName) return } else { # # Get the virtual subnet $subnet = Get-AzVirtualNetworkSubnetConfig -Name $VirtualSubnetName -VirtualNetwork $vnet -ErrorAction SilentlyContinue if($null -eq $subnet) { LogError "[Failed!]" LogError ("Could not find the virtual subnet (VirtualSubnet:{0}." -f $VirtualSubnetName) return } if($null -eq $subnet.NetworkSecurityGroup) { LogError "[Failed!]" LogError ("Could not find any network security group attached to the subnet (VirtualSubnet:{0}." -f $VirtualSubnetName) LogError ("IMPORTANT! Please ensure that the virtual network, that the managed domain will be migrated to, meets the requirements and then try again. (https://docs.microsoft.com/en-us/azure/active-directory-domain-services/migrate-from-classic-vnet#restrictions-on-available-virtual-networks).") return } } LogSuccess "[Pass!]" # # Commit the move to the Azure AD Domain Services resource LogInfo ([String]::Empty) LogInfo -ForegroundColor Cyan "IMPORTANT! DO NOT convert your classic virtual network while this script runs." LogInfo -ForegroundColor Cyan "Perform that operation after the migration is complete." LogInfo ([String]::Empty) LogInfo -ForegroundColor Cyan "It is important you let the script complete" LogInfo -ForegroundColor Cyan "The migration may take up to three (3) hours. Please wait..." LogInfo ([String]::Empty) LogInfo -ForegroundColor Cyan "IMPORTANT! Once started, you cannot stop the migration process nor can you revert the process once the migration completes." LogInfo ([String]::Empty) LogWarning "IMPORTANT! Please review https://docs.microsoft.com/en-us/azure/active-directory-domain-services/migrate-from-classic-vnet carefully before you proceed with the migration. Please ensure that the virtual network, that the managed domain will be migrated to, meets the requirements (https://docs.microsoft.com/en-us/azure/active-directory-domain-services/migrate-from-classic-vnet#restrictions-on-available-virtual-networks)." $consent = Read-Host -Prompt ("Do you want to migrate {0} (Y/N)" -f $ManagedDomainFqdn) if("Y" -ne $consent) { LogWarning "[Canceled!] The user canceled the migration." return } # # run the command in the background $job = Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $subnet.Id} -ApiVersion 2017-06-01 -Force -AsJob LogInfo "Migration in progess. Progress refreshes every 2 minutes ..." LogInfo ([String]::Empty) LogProgress -currentOp "Starting..." -percentComplete 0 do { Start-Sleep -Seconds 120 $properties = (Get-AzResource -ResourceId $aadds.ResourceId -ApiVersion 2017-06-01).Properties $migrationProgress = $properties.MigrationProperties.MigrationProgress [int] $percentComplete = $migrationProgress.CompletionPercentage # # Precaution to ensure Write-Progress does not error if(101 -lt $percentComplete) { $percentComplete = 100 } LogProgress -currentOp ("{0}" -f $migrationProgress.ProgressMessage) -percentComplete $percentComplete } while ("PerformingMigration" -eq $properties.ServiceStatus) if("Completed" -ne $job.State) { LogInfo ([string]::Empty) LogError "Migration did not complete successfully." LogError ("{0}" -f $job.ChildJobs[0].JobStateInfo.Reason) } else { LogProgress -currentOp $null -percentComplete $percentComplete LogSuccess "[Migration Complete!]" } # # Validate the migration was successful LogInfo "Validating ..." # Waiting to give time to refresh the state of Azure AD Domain Services resource. Start-Sleep -Seconds 10 $confirm = $null $confirm = GetAaddsResource -domainName $ManagedDomainFqdn if($null -eq $confirm) { LogWarning "[Undetermined!]" LogWarning "The script could not validate the Commit status." LogWarning ( "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).Properties") return } # # Check the properties for successful migration if($confirm.properties.serviceStatus -ne "Running") { LogError "[Failed!]" LogError ("The managed domain {0} did not migrate successfully (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus) } else { LogSuccess "[Pass!]" LogInfo ([String]::Empty) LogInfo ([String]::Empty) LogInfo "Migration of the first domain controller for Azure AD Domain Services completed successfully." LogInfo ("Migration of the second domain controller is active and should complete at approximately {0}." -f ([System.DateTime]::Now.AddHours(1).ToString("G"))) LogInfo ("After the second domain controller completes its migration, please update the DNS settings on the {0} virtual network." -f $VirtualNetworkName) LogInfo ([String]::Empty) } break } "Abort" { # # use the oldSubnetID property from the instance to rollback LogInfo "It is important you let the script complete" $oldSubnetId = $aadds.Properties.migrationProperties.oldSubnetID if($aadds.Properties.migrationProperties.oldSubnetID -inotmatch "/") { LogInfo "Old SubnetId is not in resource format. Value: $oldSubnetId... Converting to Resource format" #Get Vnet ResourceId $classicVnet = Get-AzResource -ResourceName $ClassicVirtualNetworkName $classicVnetResourceId = $classicVnet.ResourceId $oldSubnetName = $aadds.Properties.migrationProperties.oldSubnetID $oldSubnetId = $classicVnetResourceId + "/subnets/" + "$oldSubnetName" } LogInfo "Old SubnetId: $oldSubnetID" LogInfo "This process may take up to 30 minutes. Please wait..." LogInfo ([String]::Empty) $consent = Read-Host -Prompt ("Do you want to abort the migration for {0} (Y/N)" -f $ManagedDomainFqdn) if("Y" -ne $consent) { LogWarning "[Canceled!] The user canceled the migration." return } LogInfo "Processing your request... " (Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $oldSubnetId} -ApiVersion 2017-06-01 -Force) | Out-Null # # Validate LogInfo -Foreground Green "[Process Complete!]" LogInfo "Validating ..." $confirm = $null $confirm = GetAaddsResource -domainName $ManagedDomainFqdn if($null -eq $confirm) { LogWarning "[Undetermined!]" LogWarning "The script could not validate the abort status." LogWarning ( "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).Properties") return } # # Check the properties for successful migration if($confirm.properties.serviceStatus -ne "Running") { LogError "[Failed!]" LogError ("The managed domain {0} did not abort its preparation for migration (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus) } else { LogSuccess "[Pass!]" LogInfo ([String]::Empty) LogInfo ([String]::Empty) LogInfo "This instance of Azure AD Domain Services has returned to its original classic virtual network." LogInfo ([String]::Empty) } break } default { LogError "Unknown Command." } } $actionStop = Get-Date LogInfo "Elapsed Time: " ($actionStop - $actionStart) } # End Process # SIG # Begin signature block # MIInNgYJKoZIhvcNAQcCoIInJzCCJyMCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBt11FdZbe2Vffn # yKjJTOscMEM7a6GTmhSnOqE7sgiJD6CCEW8wggiBMIIHaaADAgECAhM2AAABPzCK # lRMtCL+aAAEAAAE/MA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH # QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe # Fw0yMDEwMjEyMDQ3MDRaFw0yMTA5MTUyMTQzMDNaMC8xLTArBgNVBAMTJE1pY3Jv # c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB # BQADggEPADCCAQoCggEBAJpvBH0LkDd+hfLIN8Kwz5bk/L6XR52eQ/s9XjXHa8PJ # wfimUYJ8RBtNkC/M4m1Ixv0m6DcC7mx5sOjQDOM0mMDZa54hUMjTkIsgpecnYJ8i # PI5mk3ShAJFW4yKlbCDto6N4cy2xc2j5MB5ohzB1TfZkTOwFHBeC9ap7cX9Vj4NW # 8BXhm9VUxViN7+Jjo0uP9EO1rs37r9lQ9HVR2Xzj599H54CryZ8+RcLLeqQOoa9b # v8cYSjBY35WZbkilD9652CmEaF9hFiYCVu0Wqe/5vMh0rPlm+nNF4k6iLZRDrlXM # NVgo539LRHSsdmOsKTM6SiSqmAs1W1sEKqN2I9N91c0CAwEAAaOCBYIwggV+MCkG # CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE # AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D # AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov # L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B # TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0 # dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy # MENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt # ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw # MSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ # MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYI # KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B # TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwga0GCCsGAQUFBzAChoGg # bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy # MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9 # QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm # aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUJEfL21aLeiu+mTZZ3CuOXoSQkOcw # DgYDVR0PAQH/BAQDAgeAMFAGA1UdEQRJMEekRTBDMSkwJwYDVQQLEyBNaWNyb3Nv # ZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEWMBQGA1UEBRMNMjM2MTY5KzQ2MjUy # MjCCAdQGA1UdHwSCAcswggHHMIIBw6CCAb+gggG7hjxodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpaW5mcmEvQ1JML0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmwxLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmwyLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmwzLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0 # dHA6Ly9jcmw0LmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGgbps # ZGFwOi8vL0NOPUFNRSUyMENTJTIwQ0ElMjAwMSxDTj1CWTJQS0lDU0NBMDEsQ049 # Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNv # bmZpZ3VyYXRpb24sREM9QU1FLERDPUdCTD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25M # aXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwHwYDVR0j # BBgwFoAUG2aiGfyb66XahI8YmOkQpMN7kr0wHwYDVR0lBBgwFgYKKwYBBAGCN1sD # AQYIKwYBBQUHAwMwDQYJKoZIhvcNAQELBQADggEBABPepyb7+92pEKeePZ5YG3NK # 5S18A8KPUaZoX1mnPo7fYVuHE9C0Nst5aU8sRV8bLEDvlvY+OxWYvXakeIG90XYG # xmHxXVDDBdQf53rjOyMFTJRx2gcCDLayEiNnT1w2lCuFhUrEg9wTBsrExW7qB3bs # eIT+VXb5CsO4XmTUnew3IcU7V2IUTHKZ292KWOUTvmNZ6xyiEmXjLTzi/lGL+aSv # cHKfKB8egQaJJqTQBWxyAbqybVgMfS6WS1NMDUfoJEu1Qz/o3n/AkVdwEUxaMf6a # EiGrRGp9/zIE3XEUDfHcCb0tVSZwziwnhTCP9usgyuFtiBkhaG+LVKelFz0fLsEw # ggjmMIIGzqADAgECAhMfAAAAFLTFH8bygL5xAAAAAAAUMA0GCSqGSIb3DQEBCwUA # MDwxEzARBgoJkiaJk/IsZAEZFgNHQkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxEDAO # BgNVBAMTB2FtZXJvb3QwHhcNMTYwOTE1MjEzMzAzWhcNMjEwOTE1MjE0MzAzWjBB # MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRUwEwYD # VQQDEwxBTUUgQ1MgQ0EgMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDVV4EC1vn60PcbgLndN80k3GZh/OGJcq0pDNIbG5q/rrRtNLVUR4MONKcWGyae # VvoaQ8J5iYInBaBkaz7ehYnzJp3f/9Wg/31tcbxrPNMmZPY8UzXIrFRdQmCLsj3L # cLiWX8BN8HBsYZFcP7Y92R2VWnEpbN40Q9XBsK3FaNSEevoRzL1Ho7beP7b9FJlK # B/Nhy0PMNaE1/Q+8Y9+WbfU9KTj6jNxrffv87O7T6doMqDmL/MUeF9IlmSrl088b # oLzAOt2LAeHobkgasx3ZBeea8R+O2k+oT4bwx5ZuzNpbGXESNAlALo8HCf7xC3hW # qVzRqbdnd8HDyTNG6c6zwyf/AgMBAAGjggTaMIIE1jAQBgkrBgEEAYI3FQEEAwIB # ATAjBgkrBgEEAYI3FQIEFgQUkfwzzkKe9pPm4n1U1wgYu7jXcWUwHQYDVR0OBBYE # FBtmohn8m+ul2oSPGJjpEKTDe5K9MIIBBAYDVR0lBIH8MIH5BgcrBgEFAgMFBggr # BgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcVBgYKKwYBBAGC # NwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisGAQQBgjdAAQEG # CysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisGAQQBgjcUAgIG # CisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEEAYI3WwIBBgor # BgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEEAYI3WwQCMBkG # CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjASBgNVHRMBAf8E # CDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHRCQsoMIIBaAYD # VR0fBIIBXzCCAVswggFXoIIBU6CCAU+GI2h0dHA6Ly9jcmwxLmFtZS5nYmwvY3Js # L2FtZXJvb3QuY3JshjFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEv # Y3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9hbWVyb290 # LmNybIYjaHR0cDovL2NybDMuYW1lLmdibC9jcmwvYW1lcm9vdC5jcmyGgapsZGFw # Oi8vL0NOPWFtZXJvb3QsQ049QU1FUk9PVCxDTj1DRFAsQ049UHVibGljJTIwS2V5 # JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1BTUUs # REM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFz # cz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIBnTCCAZkwNwYI # KwYBBQUHMAKGK2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNRVJPT1RfYW1lcm9v # dC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp # bmZyYS9jZXJ0cy9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw # Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUF # BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0 # MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1BSUEsQ049UHVi # bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv # bixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1j # ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4ICAQAot0qGmo8f # pAFozcIA6pCLygDhZB5ktbdA5c2ZabtQDTXwNARrXJOoRBu4Pk6VHVa78Xbz0OZc # 1N2xkzgZMoRpl6EiJVoygu8Qm27mHoJPJ9ao9603I4mpHWwaqh3RfCfn8b/NxNhL # Gfkrc3wp2VwOtkAjJ+rfJoQlgcacD14n9/VGt9smB6j9ECEgJy0443B+mwFdyCJO # 5OaUP+TQOqiC/MmA+r0Y6QjJf93GTsiQ/Nf+fjzizTMdHggpTnxTcbWg9JCZnk4c # C+AdoQBKR03kTbQfIm/nM3t275BjTx8j5UhyLqlqAt9cdhpNfdkn8xQz1dT6hTnL # iowvNOPUkgbQtV+4crzKgHuHaKfJN7tufqHYbw3FnTZopnTFr6f8mehco2xpU8bV # KhO4i0yxdXmlC0hKGwGqdeoWNjdskyUyEih8xyOK47BEJb6mtn4+hi8TY/4wvuCz # cvrkZn0F0oXd9JbdO+ak66M9DbevNKV71YbEUnTZ81toX0Ltsbji4PMyhlTg/669 # BoHsoTg4yoC9hh8XLW2/V2lUg3+qHHQf/2g2I4mm5lnf1mJsu30NduyrmrDIeZ0l # dqKzHAHnfAmyFSNzWLvrGoU9Q0ZvwRlDdoUqXbD0Hju98GL6dTew3S2mcs+17Dgs # dargsEPm6I1lUE5iixnoEqFKWTX5j/TLUjGCFR0wghUZAgEBMFgwQTETMBEGCgmS # JomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMGA1UEAxMMQU1F # IENTIENBIDAxAhM2AAABPzCKlRMtCL+aAAEAAAE/MA0GCWCGSAFlAwQCAQUAoIGu # MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor # BgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCPaMcuC3jkduyJmUdskeAOg0GL7UPa # uAbgCanwEqQzUzBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBm # AHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIB # AFai9JbIe4cV94UaeAiWU1bqp4GBg6mcp6IWsqgCwJeGnKRvsTtatTUTpAxA/jtP # L9XCL2MDsOFx+UsXt/Ykz1kB8n6XB1zInSODWNMrbI93wIMqulo85wrNRDYy45mE # i4CLA6QWnDnlBd9evVXGfHAK60WDAJ70I92oituspjfRYAa25XahJheTZPynvOD/ # hKt1s5/jRgfGeVrNQz/8D8EDnLwUWSUdLrq9fJkU/opd6b4uMr+ZVA72T4rf7NCC # DOn4TtUUGwQzxFykR5bHBr1zfPY/tCpxs0pVSiNthnYNC5+8e7LcWF1E0FrguHKH # WJt+umcR6HQRb+fciyhRCouhghLlMIIS4QYKKwYBBAGCNwMDATGCEtEwghLNBgkq # hkiG9w0BBwKgghK+MIISugIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBUQYLKoZIhvcN # AQkQAQSgggFABIIBPDCCATgCAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEF # AAQgyXZgVOG78r+FXj0aTwYSQLpe1LXCXfIsaRMNpjdkBNcCBmCumwHztRgTMjAy # MTA2MjIwNDIyMTMuMzgyWjAEgAIB9KCB0KSBzTCByjELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046MTJCQy1FM0FFLTc0 # RUIxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wggg48MIIE # 8TCCA9mgAwIBAgITMwAAAVPSgnJFbFfjiwAAAAABUzANBgkqhkiG9w0BAQsFADB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yMDExMTIxODI2MDVaFw0y # MjAyMTExODI2MDVaMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYD # VQQLEx1UaGFsZXMgVFNTIEVTTjoxMkJDLUUzQUUtNzRFQjElMCMGA1UEAxMcTWlj # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEP # ADCCAQoCggEBALXrtnQHsxv5s0IC5cLoQYmwW+BUHqLfT+OXiCa1TChAbnPdanFA # c0mP63Yjh+kRNBAujGKgdKJH6dskVGdPdYKNzpTBsYEydAmDODNVeh9U8cgKKaJg # 0SIfLzo+8ISlZPy9vqN8Vxo5Wgx77jA3Y2puU5YDijrCYRBQWatukpkH5xFUkXtY # TUvo0N9GI8T1dF9GT7PNl34wmGzd5ZGvuNV0bXS9USVXeGrRgXN+GjuC4/cvRszG # KRHLek97hbqDtDB/kxzEOkzQBq3P0I2SxwA/KHiNk4XR/t2IvUEYRP9zi+nyJBOV # 8qoSEJu3cWL8ernhzBeMTVpTHNC9rlv95u0CAwEAAaOCARswggEXMB0GA1UdDgQW # BBTGootzSCqpszAZQLfgcG2sMVZEdTAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYb # xTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j # b20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmww # WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNV # HRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IB # AQCUaL15fPogRD7HAXNJolHcnEexqJ6DKb0OxFdyl93t+uVNRn/mJWTIWrxhfIqg # Qj7ttU7MmVN/c8XxR1gLLjKxZp7qzMj5uzPb1uhihGXBJrF1A6D2HCVfUyR90yeE # n4iLDfkRVinusxWN032LppkeV0o/88NA2767MQehso0ulmzF74sj+B3G4iIUkM7c # 715O6fTvFYd+GcjEnbBLvLk8Qel3FlNBfae9ZHRuN2a3mvqHLlfSw0PVdmJpTZqm # XVZv0drZuc7gDyWt7vBmNL6LxcFVUloTgteZxMV5CWVmV2+rzIGa8OjjC+MU4VVy # SrIFKkIwwmlGrOSh0YPEnTo0MIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg # VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC # ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m # K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm # gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5 # hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm # wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB # wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD # AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE # DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo # dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D # ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC # hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1 # dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw # gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j # cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A # UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL # BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ # at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1 # mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv # SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/ # amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW # hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua # 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio # SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH # czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw # 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P # 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSoYICzjCCAjcC # AQEwgfihgdCkgc0wgcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNV # BAsTHVRoYWxlcyBUU1MgRVNOOjEyQkMtRTNBRS03NEVCMSUwIwYDVQQDExxNaWNy # b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQCKSk3txw7W # T08oIYK9pBYrInnRm6CBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMA0GCSqGSIb3DQEBBQUAAgUA5HtfhDAiGA8yMDIxMDYyMjAyNTcwOFoYDzIw # MjEwNjIzMDI1NzA4WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDke1+EAgEAMAoC # AQACAh+oAgH/MAcCAQACAhHBMAoCBQDkfLEEAgEAMDYGCisGAQQBhFkKBAIxKDAm # MAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcN # AQEFBQADgYEAWL+TI2/GvQ1G4hVYR4YPhFeWscvDkVELqTFbJX9bvO4mRUaapyZC # 0zUTXn0pFttl2AxbYiItJrCp0rVDK15qTCMWigYTEmn86xND7Iu8Rv7Z/WZ33fIp # FETO2GpiUPyFLkRFo/vA/9OxiS1SqVNM5Cn6+9K7tErMyg2GDIhR3MkxggMNMIID # CQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw # JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAVPSgnJF # bFfjiwAAAAABUzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqG # SIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCBC3hgbcNfIS7Khbf58CQFKWwZ0s+df # ESRAfK4mVFYbiDCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIFDBCo85tCAI # CfyXoZBDppodLIMcb2wOH2rEBWiNtY8AMIGYMIGApH4wfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTACEzMAAAFT0oJyRWxX44sAAAAAAVMwIgQgFxqjz+FSVt7J # fm55muvmt4cGm73ben57zlWzm+gZYCAwDQYJKoZIhvcNAQELBQAEggEAWg4WrBfU # 1a++n5lpdu2rQTqrFbZCKM1y51EDc6pPeTV7odn27KqfQttleCX19Ow8KWNDnbDv # Y7q9sA3nc7jKjht6RZTC/nvxGF34F0deF0Ap3e7/lTh3z3ABYi3ybKPgVQ/yqqPl # uXiC+ETJPNNFcWPx8WhRr5G6I2fXe2idSG7Ls6rzs5wA9eBrEx+Ti7iY3MZbMT9s # cs9m8Cr3vhLdrT1PaOmC/soa1MMaQHl7ENz6H7FBDgjowG+VKoDRobuzqKXo04/n # TlNOhZN6NpJBDppNYAeyOLx4bQ4CXmzelVcFZNMBtF/UXBfLBX1QP42KBe4dFN7n # vVIqpnH6RMXPRA== # SIG # End signature block |