Remove-AaddsResourceForestTrust.ps1

<#PSScriptInfo
 
.VERSION 2.0.0
 
.GUID 28e4c489-94b3-4699-b7c8-1bb701278bb9
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Microsoft-Entra-Domain-Services ForestTrust
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    07/19/2020 - Initial release
    01/09/2024 - Rebrand to Microsoft Entra Domain Services
    06/24/2025 - Updating Entra Domain Services resource API to use the latest version.
#>


<#
 
.SYNOPSIS
    Remove a forest trust from Microsoft Entra Domain Services resource forest.
 
.DESCRIPTION
 
    Remove a forest trust from Microsoft Entra Domain Services resource forest.
 
.PARAMETER ManagedDomainFqdn [MANADATORY]
    The fqdn of the managed domain (e.g aadds.corp.contoso.com).
 
.PARAMETER TrustFqdn [MANADATORY]
    The FQDN of the trusted forest.
    Not used with All switch
 
.PARAMETER All [OPTIONAL]
    Remove all the trusts from the Microsoft Entra Domain Services resource forest
 
.PARAMETER Credential [OPTIONAL]
    The credentials used to authenticate to Azure.
#>


[CmdletBinding()]
Param (
    
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Specific")]
    [Parameter(
        Mandatory=$true,
        ParameterSetName="All")]
        [string]
        $ManagedDomainFqdn,

    [Parameter(
        Mandatory=$true,
        ParameterSetName="Specific")]
        [string]
        $TrustFqdn,
    
    [Parameter(
        Mandatory=$true,
        ParameterSetName="All")]
        [switch]
        $All,    

    [Parameter(
        Mandatory=$false,
        ParameterSetName="Specific")]
    [Parameter(
        Mandatory=$false,
        ParameterSetName="All")]
        [pscredential]
        $Credentials
)


Process
{

    #
    # Create empty trust settings
    $TrustSettingsValue = [System.Collections.ArrayList]@()
    $azProfile = $null

    Write-Host ([string]::Empty)
    Write-Host ([string]::Empty)
    Write-Host "Authenticating to Azure... " -NoNewline
    #
    # Collect credentials from the user for authentication
    if($null -ne $creds)
    {
        $creds = Get-Credential -ErrorAction SilentlyContinue        
        $azProfile = Connect-AzAccount -Credential $creds -ErrorAction SilentlyContinue
    }
    else
    {
        $azProfile = Connect-AzAccount -ErrorAction SilentlyContinue
    }

    if($null -eq $azProfile)
    {
        # Authentication failed
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not authenticate to Azure. Check your credentials and try again."
        Return
    }
    else
    {
        Write-Host -ForegroundColor Green "[Success!]"
    }
    
    Write-Host "INFO: Authenticated to Azure as $($azProfile.Account.Id)..."


    Write-Host "Getting Microsoft Entra Domain Services instance..." -NoNewline
    $aadds = Get-AzResource -Name $ManagedDomainFqdn -ApiVersion "2022-12-01" -ExpandProperties -ErrorAction SilentlyContinue

    if($null -eq $aadds)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not find an Microsoft Entra Domain Services resource with the name $ManagedDomainFqdn."
        Return

    }

    #region Prerequisites checking...
    Write-Host ([string]::Empty)
    Write-Host "Checking prerequisites..."
    $pass = $true


    Write-Host "Validating resource type..." -NoNewline
    if($aadds.ResourceType -ne "Microsoft.AAD/domainServices")
    {
        $pass = $false
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: The resource is not an Microsoft Entra Domain Services resource (Status:$($aadds.ResourceType)."
    
    }
    else {Write-Host -ForegroundColor Green "[Pass!]"}

    
    Write-Host "Validating service status..." -NoNewline
    if($null -ne $aadds.Properties.ReplicaSets)
    {
        $replicaSetCount = $aadds.Properties.ReplicaSets.Count
    }
    else { $replicaSetCount = 0 }

    $serviceStatus = $null
    if($replicaSetCount -eq 1)
    {
        $serviceStatus = $aadds.Properties.ReplicaSets[0].serviceStatus
    }
    elseif($replicaSetCount -gt 1)
    {
        $syncOwner = $aadds.Properties.SyncOwner
        $primaryReplicaSet = $aadds.Properties.ReplicaSets | Where-Object { $_.ReplicaSetId -eq $syncOwner }
        $serviceStatus = $primaryReplicaSet.serviceStatus
    }
    else { $serviceStatus = $null }

    if($serviceStatus -ne "Running")
    {
        $pass = $false
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: The managed domain $($aadds.Name) must be running (Status:$($aadds.properties.serviceStatus))."
    }
    else { Write-Host -ForegroundColor Green "[Pass!]" }


    Write-Host "Validating domain configuration..." -NoNewline
    if($aadds.properties.domainConfigurationType -ne "ResourceTrusting")
    {
        $pass = $false
        Write-Host -ForegroundColor red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: The managed domain $($aadds.Name) is not a resource forest (Status:$($aadds.properties.domainConfigurationType))."        
    }
    else
    { Write-Host -ForegroundColor Green "[Pass!]"}


    Write-Host "Finding trust name..." -NoNewline
    #
    # Check the $all switch and skip if $true
    if($all -eq $true)
    {
        Write-Host -ForegroundColor Green "[Skip!]" -NoNewline
        Write-Host -ForegroundColor "INFO: All parameter detected."
    }
    else
    {
        # User provided an explicit trust

        #Get the list of current trusts.
        $tempTrustSettingsValue = $aadds.Properties.resourceForestSettings.settings
        if(0 -lt $tempTrustSettingsValue.Count)
        {
            $found = $false

            foreach($tempTrustValue in $tempTrustSettingsValue)
            {    
                #check for matching #fqdn
                if($TrustFqdn -eq $tempTrustValue.trustedDomainFqdn)
                { 
                    $found = $true
                    break;             
                }
            }
    
            if($found)
            { 
                Write-Host -ForegroundColor Green "[Pass!]"
            }
            else
            {
                $pass = $false
                Write-Host -ForegroundColor Red "[Failed!]"
                Write-Host -ForegroundColor Red "The trust $TrustFqdn does not exist in the managed domain $($aadds.Name)."
        
            }
        }
        else # There are no existing trusts to edit
        {
            $pass = $false
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red  "The managed domain $($aadds.Name) does not have any trusts. Use Add-AaddsResourceForestTrust to add a trust."
        }
    }


    if($pass -eq $false)
    {
        Write-Host ([string]::Empty)
        Write-Host -ForegroundColor Red "ERROR: One or more prerequisites checks failed."
        Return
    }
    #endregion

    #
    # TrustSettingsValue is empty. The -all case is covered
    # When -all is false (not present)
    # Add existing trust but leave out the named trust

    if($all -eq $false)
    {
        foreach($tempTrustValue in $tempTrustSettingsValue)
        {        
            # Check for matching #fqdn
            if($TrustFqdn -eq $tempTrustValue.trustedDomainFqdn)
            { 
        
                # Save the old trust for display.
                # Skip adding it to the new trust list
                $oldTrust = $tempTrustValue                
            }        
            else
            {
                $catchOutput = $TrustSettingsValue.Add( $tempTrustValue)
            }
        }
    }

    
    Write-Host ([string]::Empty)
    if($all -eq $true)
    {
        $msg = "Type 'Yes' to confirm you want to delete *ALL* the trust in the $($aadds.Name) managed domain."
    }
    else
    {
        #
        # Show the trust
        Write-Host -ForegroundColor Yellow "Trust Settings"
        Write-Host "FriendlyName: " $oldTrust.FriendlyName
        Write-Host "TrustedDomainFqdn: " $oldTrust.trustedDomainFqdn
        Write-Host "DNS IP Addresses: " $oldTrust.remoteDNSIPs
        
        $msg = "Type 'Yes' to confirm you want to delete the trust $($TrustFqdn) with these settings."
    }

    Write-Host ([string]::Empty)
    $answer = Read-host -Prompt $msg

    if("Yes" -cne $answer)
    {
        Write-Host "User canceled."
        Return 
    }


    # Assign the trust values to the trust settings
    $trustSettings = @{"settings" = $TrustSettingsValue}


    # Assign the trust settings to the ResourceForestSettings
    $resourceForestSettings = @{"resourceForestSettings" = $trustSettings}

    $actionStart = Get-Date

    Write-Host ([string]::Empty)
    Write-Host "Sending request to Azure. This action may take up to five minutes to complete. Please wait..."
    Set-AzResource -ResourceId $aadds.ResourceId -ApiVersion "2022-12-01" -Properties $resourceForestSettings -force
    $actionStop = Get-Date

    Write-Host "Elapsed Time: " ($actionStop - $actionStart)
}
# SIG # Begin signature block
# MIIr8QYJKoZIhvcNAQcCoIIr4jCCK94CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCZ+yfCwFdxy8Yn
# 0srEqXNpscYsnt7kqs985VzeSQeGeqCCEXgwggiIMIIHcKADAgECAhM2AAACBIY2
# eKH0vgR+AAIAAAIEMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yNDExMDgxMjQ2MTVaFw0yNTExMDgxMjQ2MTVaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAPMzJ8+5iuzPEvyWyqvQ8Lg6jR9oaO3Jf5qlRjxeD41Y
# bkqKFvk5zW3XfUzy9FaA4vhKYGTav3Afc6srskrKqEz64RPgkApueunqiytGXfNl
# Q7uP7iJJmBBXAcw23PR7cc6xrPvG+h5LDPHf9VT+iBsGyndA4SYH5oq8KVHF5H3j
# HfxNsgz3+YG5tJ6jH+/NptEg/NSoa3Xh78fBV1qX0PVlBGBFXt97ayY6NBwmWNYv
# UY7uLm3XzTNp7YG0WskxTD+vOij0XIc7rAe3EFpdrnWABFEiyaU591tWx48Iln/+
# TFC4K7alwjymJUcz5ia9YNoQVi3t+TbppVyHedzc6tMCAwEAAaOCBYkwggWFMCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEQMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUw39+RvM9ICQzKxoTRcu71FIzSBIw
# DgYDVR0PAQH/BAQDAgeAMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzNjE2OSs1MDMxNTMwggHmBgNVHR8E
# ggHdMIIB2TCCAdWgggHRoIIBzYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
# aWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8vY3Js
# MS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8v
# Y3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRw
# Oi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFo
# dHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3Js
# hoG9bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEoMiksQ049QlkyUEtJQ1ND
# QTAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNl
# cyxDTj1Db25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/Y2VydGlmaWNhdGVSZXZv
# Y2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50
# MB8GA1UdIwQYMBaAFJZRhOBrb3v+2Aarw/KF5imuavnUMB8GA1UdJQQYMBYGCisG
# AQQBgjdbAwEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUAA4IBAQAqhvUBfHIboRQv
# hZH+qh+g3/ifKd7J5mNS8Xa2FmDB3Nn+aqtVfjg0K3cXYOGQQPTTcBNJGFbrjRy2
# aqwhTqW/w7u1sCFmxMeN/fzHiiIxfCDFcjd2Q4c8N8BuZoZXgr5DONka2VJKTXLh
# g049b9vgWSNVEP8LT2sFfkZ6fuJ7WVWffWSDjWJmvKMjPl4y2boWRQtyN8War2h+
# oFEBEZDMaFZRqu/sDwFpJlarhEJs+qIZsTpKPJnHoCdrgX/MWmJpVqnzSpqajIfz
# CGY6ZQfnDPld6t+A6MLgGX/eGAlXmzLqcUzehzmrZGEEPSn3jrENGOis7Ql9/KtM
# 5d6oErXlMIII6DCCBtCgAwIBAgITHwAAAFHqj/accwyoOwAAAAAAUTANBgkqhkiG
# 9w0BAQsFADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYD
# QU1FMRAwDgYDVQQDEwdhbWVyb290MB4XDTIxMDUyMTE4NDQxNFoXDTI2MDUyMTE4
# NTQxNFowQTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FN
# RTEVMBMGA1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
# MIIBCgKCAQEAyZpSCX0Bno1W1yqXMhT6BUlJZWpa4p3xFeiTHO4vm2Q6C/azR5xw
# xnyYHrkSGDtS2P9X+KDE64V20mmEQkubxnPNeOVnE2RvdPGxgwlq+BhS3ONdVsQP
# j79q7XgHM9HhzB9+qk0PC9KN1zm9p/seyiRS6JF1dbOqRf1pUl7FAVxmgiCFgV8h
# HIb/rDPXig7FDi3S0yEx2CUDVpIq8jEhG8anUFE1WYxM+ni0S5KHwwKPKV4qyGDo
# DO+9AmDoma3Chyu5WDlW5cdtqXTWsGPE3umtnX6AmlldUFLms4OVR4guKf+n5LIB
# CC6bTiocfXPomqYjYTKx7AGMfaVLaaXmhQIDAQABo4IE3DCCBNgwEgYJKwYBBAGC
# NxUBBAUCAwIAAjAjBgkrBgEEAYI3FQIEFgQUEmgkQiFHy9RrvjHPIKTACyN/P0cw
# HQYDVR0OBBYEFJZRhOBrb3v+2Aarw/KF5imuavnUMIIBBAYDVR0lBIH8MIH5Bgcr
# BgEFAgMFBggrBgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcV
# BgYKKwYBBAGCNwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisG
# AQQBgjdAAQEGCysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisG
# AQQBgjcUAgIGCisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEE
# AYI3WwIBBgorBgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEE
# AYI3WwQCMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAS
# BgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHR
# CQsoMIIBaAYDVR0fBIIBXzCCAVswggFXoIIBU6CCAU+GMWh0dHA6Ly9jcmwubWlj
# cm9zb2Z0LmNvbS9wa2lpbmZyYS9jcmwvYW1lcm9vdC5jcmyGI2h0dHA6Ly9jcmwy
# LmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMy5hbWUuZ2JsL2Ny
# bC9hbWVyb290LmNybIYjaHR0cDovL2NybDEuYW1lLmdibC9jcmwvYW1lcm9vdC5j
# cmyGgapsZGFwOi8vL0NOPWFtZXJvb3QsQ049QU1FUm9vdCxDTj1DRFAsQ049UHVi
# bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv
# bixEQz1BTUUsREM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9v
# YmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIB
# nTCCAZkwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp
# bmZyYS9jZXJ0cy9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw
# Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUF
# BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0
# MDcGCCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9BTUVSb290X2Ft
# ZXJvb3QuY3J0MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1B
# SUEsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29u
# ZmlndXJhdGlvbixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmpl
# Y3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4IC
# AQBQECO3Tw/o317Rrd7yadqcswPx1LvIYymkaTN6KcmuRt6HKa0Xe73Ux2/AQ30T
# fgA9GBJngweRykKBusRzyOU17iIubJvy3gA21dwtqtB0DsoEv1U/ptVu2v++doTC
# J/i+GbssVXkgaX8H+6EOGEmT4evp4GbwR4HwWlc+Dvf8HH8PdUA2Z04CvcwIfckS
# ipbNm84jxJ8XjmTFTWscldL9edj2NsY6iGnyJFIyur2PS7VRYyV3p1VAJp91gj1j
# RQtWEyCB8P5g9nE3z8u0ANaU/hjwEQCrdGyravWgnf2JtG+bT26YAokbc8m+32zU
# tXRO+NK3tAjhOu2FdsG3qNrF4sc7y37R/C+7Pcb/cFfhttqsirepZii4xStcjMOD
# YuXzGm3IJs0b0owHG6oKd7ZOGvHpmmh9K8/DLriD/sq8bURD10qi/wuW8zM7IpLg
# 1vcR9dIK2mc0pj44pc6UX0XbttP/VEJgu3lT2eI9VjWtaKjx38xE9woSMyekPRtz
# TwgfuysF9DkJisr+yA4po/FPxpbBw9c/hBf32DH/GFxteS2pmjgKIbMP8sDukmEq
# 3lVvuWNJsybrZwQvQpvaM49fv+JKpLK5YWYEfwksYRR9wU8Hh/ID9hRCEkbUoQ2W
# 7mMpsp2Nbp/kcn4ivfolUy3Q9Yf0scsQ6WTLYpm+AoCUJTGCGc8wghnLAgEBMFgw
# QTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMG
# A1UEAxMMQU1FIENTIENBIDAxAhM2AAACBIY2eKH0vgR+AAIAAAIEMA0GCWCGSAFl
# AwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBhWCenBN8Yrw5+rXmb
# PD+M4BszBDu6ocRZVyMA4B2UTDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMA
# cgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3
# DQEBAQUABIIBAFOqtUOXdQmEmegnujfWKMjWRUButIreacgxBwWiOFfs5OzjFiDe
# e15k52bfY04JvwIz9tNVVwEdmZKlXFnZOjkB5RuAH1bkAiksnmTswJRj/9JPgfYz
# btdyGxqLGlOP94U/YkSG7NDkq9rqYG/6sgaa5sEhRfcgGuZPxNWXaM9dPzBJU1yf
# dcf+rhFuPpjB6PD3WTIU6vFMU74OGu2xVORqrGt2NyRzvf+pL7aMJgQnwubNwUkI
# Y06Q7Hi6HLUEtSnMj7uhacNqJjJ28/xFA6Qwz8SnBxH1awplF5eH3IOLuCkEUnOr
# T3H8eSgCNKdQkePZlbyOGVcSWv/52b/TzzqhgheXMIIXkwYKKwYBBAGCNwMDATGC
# F4Mwghd/BgkqhkiG9w0BBwKgghdwMIIXbAIBAzEPMA0GCWCGSAFlAwQCAQUAMIIB
# UgYLKoZIhvcNAQkQAQSgggFBBIIBPTCCATkCAQEGCisGAQQBhFkKAwEwMTANBglg
# hkgBZQMEAgEFAAQg2zN6fGtjrDC0JLFxQs72Er9L9WKflzmeYe+Pdwkw/XoCBmhL
# ECJocRgTMjAyNTA2MjUxNzI5MzguMDc1WjAEgAIB9KCB0aSBzjCByzELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0
# IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjdG
# MDAtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2
# aWNloIIR7TCCByAwggUIoAMCAQICEzMAAAIG17xROJgj7CwAAQAAAgYwDQYJKoZI
# hvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjUwMTMw
# MTk0MjUwWhcNMjYwNDIyMTk0MjUwWjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0
# aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjdGMDAtMDVFMC1EOTQ3MSUw
# IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEA6USFmyDN0Za9/e3Ix2mMfOZeyPmVVhjAgQjP
# ddQaVOviBlgqpLKoKnn2RRIyszVQ2AvWHICEwM9u+jRoLxApuGXzb/xT8HGkg8+8
# Ww27DqMW8EKB1DUa6Psebm2YU+liXlPexdOvrw4wMP2Ldb1joEU6pj/3Ta/aKiGx
# OaAi2HR98CP56GJrCVXO/eup/ge1ABgFlNrHty8/sXcZzbDV+AkesyDFSU0nsz/9
# kkzXMSU7vZNrJe/78zocSYQkN/K3WhKKoRh6165lZBIUr/ktNAzCXNTiF8an28D4
# zKhFaeyt5JnMwpG7ptQTiCdsLgwGyriXpabXjWY/0ufDUkMOpIX7iQJbqhyt4oJE
# vzrsePakz/q1Pj0Hjbg/hrawqKRbnEZmp0L8SEhjaMZwat1Hg06qYZumiOxjB7RQ
# +gzoyZZZR9YFVlz08or3/uLTfE5jusiIAeLj9NGx/Y5/3cssUo8T0Npxr2bYLap7
# 6t4d00Y0Z5HPntVwdbmrQ2tc1HEu694qHU6cgE3toYJFV95uA4UcyOgOEien2yTP
# YrCx/ABinMporCs2LqQHhUkyddCRBWujIx0GGKIaAhe+0dAgsDDY7xOF3yx7vqij
# 2PBkH7GXYoEPXJVAIsnRZlbetYcraMWT+y5l284w9FXnMs2aC+BKrtV7MwbLpQK+
# S3disHMCAwEAAaOCAUkwggFFMB0GA1UdDgQWBBTtMLCynQxqU/e3MdyMpsqP0gZu
# EjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSg
# UqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3Nv
# ZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEE
# YDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNy
# dDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB
# /wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAdtxmTn3vU4U1Lw9vYuLepQ6cSYaV
# UTJnvlG8mYQRQmYaBk7Yw3aYQAK1NkOtVmIN2FXJdkXSZuT1G2dmwO+85PqrS8Qv
# t3TcVbE3HbcTw0kloMAR8U4+qQpqAzV6JQGLFqbx0BQhw6hHwIgcV9XZml24kz9X
# dF3374EenbIVHKmh/5hX4w2QMS1NbOh3FYArwUCZSe8RBuYxSnbamqSlnG1B8E1a
# l0BmyJR1QpTSd8qlumd1CR/whXGIi1f3uvLq05hrYmcRkmG+EgUjwK0602HhzpUC
# I/+5aFVpn1l9suABlfw/jM8mTMrxcOFci9FYKvehM0CsrXolXgWlRI8UCqNwHD1C
# 0ReFM8/fD9rQjOV2xWd0KI/Ty4N64BV69KCRIX4dralK4UyXdd/ouP33pPc1onKL
# IZcF4BbtNNmVgVcwEhBbqhA+PKsrpWf9oxiQXLWvhXZNpaD9it6Eo+D0EHtTM81W
# TudgFzuNjB5YZt0h6N/0YUPiNQNDcvvbgHoZEB+i68ZK1Tb2RuH9DwCjG6lHFxu8
# c5yidMdB2K+WslhmxymUXDm1Pv9+GaS/Ta1znnVQ15kndspSkpf774tUMDSalyZf
# /oCZEBHraphwFBUJBbXpovDFF0BtsP0Qx118FgIxPqiA2S0P5OM9mdterVmkekQy
# hxpMHgqA7ULc5B0wggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0G
# CSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3Jp
# dHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29m
# dCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9
# uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZr
# BxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk
# 2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxR
# nOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uD
# RedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGa
# RnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fz
# pk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG
# 4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGU
# lNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLE
# hReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0w
# ggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+
# gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNV
# HSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0l
# BAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0P
# BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9
# lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQu
# Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3Js
# MFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJ
# KoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEG
# k5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2
# LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7nd
# n/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSF
# QrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy8
# 7JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8
# x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2f
# pCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz
# /gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQ
# KBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAx
# M328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGby
# oYIDUDCCAjgCAQEwgfmhgdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlv
# bnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3RjAwLTA1RTAtRDk0NzElMCMG
# A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIa
# AxUABGtH9dfFxzP1TXaigbOEF8TZzfeggYMwgYCkfjB8MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T
# dGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAOwGCEMwIhgPMjAyNTA2MjUw
# NTMxNDdaGA8yMDI1MDYyNjA1MzE0N1owdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA
# 7AYIQwIBADAKAgEAAgIDYQIB/zAHAgEAAgITaTAKAgUA7AdZwwIBADA2BgorBgEE
# AYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYag
# MA0GCSqGSIb3DQEBCwUAA4IBAQCzrkmlaBwAmuhU0S0U81h1TrHkm7v6qfdZud9G
# 9B0KDv1gWtBwTngI1mf04O4ls4t0PI+qpzR84K/61k49EtyVGetrwf6LX62z3ePZ
# 9hT8EhQUKhmH/HIjZooLDwFqDUAMKjdW+qu1oqzPqi5L4N+sYri/ikhevt1uE+I+
# iqP5tmUmYE2uR18t9KpA8VZQDW7KqyPx9CBKmMmq7pqRcmjU6rAqP3Ddc+oNTJyW
# agLULNhINxxgCEKxYZCYTjyxPvn85YoPZXvsZpurjYEEDk9U8ILiAMlJC6pOMayP
# J2z9jAe/Vji/f4Dj2/4R4ST44kFc4dsrA+AL8GOY3l4+yjssMYIEDTCCBAkCAQEw
# gZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE
# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIG17xROJgj7CwA
# AQAAAgYwDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B
# CRABBDAvBgkqhkiG9w0BCQQxIgQg+w2fRNT+peRXux4AItyF3lUAsBaBWvcDHMcH
# slOGCO0wgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCDg6PWUiJGenVbSk/hP
# 7mcdlgMuyolzOUdSSDoTSX9L0jCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwAhMzAAACBte8UTiYI+wsAAEAAAIGMCIEIFfc141S/46Gb01oDqID
# iQiVwRbxa6jvf4Mva8gy3tWvMA0GCSqGSIb3DQEBCwUABIICAHoFw0Emo2rCcGLS
# TCMX/rN4NfrAaGsVBS+h/quxtuEIoI8y1UWJFYW6qPqQlrPVC6nLO5FImQxoI9n7
# N/vANlsY+5UDsKsGx+segJuX4RPwJu8gbDmAddl31pT4CLj8BHpQteaEc7ANpkMW
# Ljb1hnn5yiEDd/yHFk+PxuIUBejWSOaYDGmxZuq6nyzT8KeQO+zyEps7PKApGCXY
# n01HRs4oCrIfedPutqJaHCMCzoGHdaIK21eEVzxXTaqVapQwyECmIRyrcywIMS8v
# Vwhaqg5lnYnyruD2qiME0azxEReupo6DoRRu1AUFBnfFfitRnBYx4CobV1ScXQLR
# 3dwrV0dybgo21QIxltYTz3n1legQFZLg7v9JPAfS/qymQV+qWTffqN8Q+1yzHCM4
# FV7oSz86STU5Kpl0yBQo8qsgHemnV2HZrMnZTMun0Ll6Y6XgtmAqI2BlMSHzLY7L
# bbRqhrmW8jEAJpOYiHcefTyafio4Eirwvtogy2C0z6vaZdn9d3iLwpX0Hp4mmBhi
# nG2LRZhzjLy9ScjLU12Bc2vIZ9eQ30O20Bj7BzPazovKibJyXFfPV/2IaY5D8VD8
# 1fp9suEyNW/BvDLVEndYJdap3vxsslBSn5Jct59eWeYtTTMZx2pjZjCPKKFyNovS
# i2FWYo1l8qVKQw8KHHtqtYdUC9fg
# SIG # End signature block