Public/PrivilegedAccess/Export-EntraOpsClassificationAzureRoles.ps1

function Export-EntraOpsClassificationAzureRoles {

    <#
    .SYNOPSIS
        Get a JSON file with all classified Azure RBAC roles.

    .DESCRIPTION
        Read JSON classification file and match Azure RBAC role definitions (Control/Management plane Actions and Data plane DataActions) to export it as JSON.

    .PARAMETER SingleClassification
        Use the highest tier level classification only for each role definition. Default is $True.

    .PARAMETER IncludeCustomRoles
        Include custom role definitions in addition to built-in roles. Default is $False.

    .PARAMETER DefaultScope
        Default role assignment scope used for classification lookup. Default is "/*" (applies to any scope).

    .PARAMETER ClassificationFile
        Path to the JSON classification definition file. Default is "./EntraOps_Classification/Classification_Azure.json".
        When the parameterized file (Classification_Azure.Param.json) is used, the scope placeholders are substituted with the values from Tier0IncludedResourceScope and Tier1IncludedResourceScope.
        Each TierLevelDefinition entry may set an optional "ActionType" property ("Action" or "DataAction", defaults to "Action" when omitted). Its "RoleDefinitionActions"/
        "ExcludedRoleDefinitionActions" patterns are matched only against a role's permissions from that same plane. Azure RBAC Actions and DataActions are separate
        namespaces (e.g. "Microsoft.KeyVault/vaults/write" is an Action, "Microsoft.KeyVault/vaults/secrets/read" is a DataAction), so a pattern authored for one plane is
        never matched against a role's permissions from the other plane - services with both control/management plane and data plane permissions (e.g. Key Vault) use two
        sibling TierLevelDefinition entries, one per ActionType. Wildcards ("*") are supported in either direction within a plane (e.g. a classified pattern
        "Microsoft.KeyVault/*/read" matches a role's literal "Microsoft.KeyVault/vaults/read" action, and a role's wildcard action "Microsoft.KeyVault/vaults/secrets/*"
        matches a classified literal "Microsoft.KeyVault/vaults/secrets/read").

    .PARAMETER Tier0IncludedResourceScope
        List of Azure scopes (management groups, subscriptions, resource groups) which are treated as Control Plane (Tier 0). Used to substitute the <Tier0IncludedResourceScope> placeholder in the parameterized classification file. The tenant root scope ("/") is always included as Control Plane in addition to the scopes provided here.

    .PARAMETER Tier1IncludedResourceScope
        List of Azure scopes (management groups, subscriptions, resource groups) which are treated as Management Plane (Tier 1). Used to substitute the <Tier1IncludedResourceScope> placeholder in the parameterized classification file.

    .PARAMETER RoleDefinitionScope
        Optional scope passed to Get-AzRoleDefinition. Set this to the tenant root ("/") to also include tenant-scoped built-in roles (e.g. Reservations Administrator) which are not returned by the default subscription-scoped query. Default is $null (current Az context default).

    .PARAMETER Exportfile
        Path to the JSON file which should be exported. Default is ".\Classification\Classification_AzureResources.json".

    .EXAMPLE
        Export all classified Azure RBAC roles to the default export path.
        Export-EntraOpsClassificationAzureRoles

    .EXAMPLE
        Export all classified Azure RBAC roles including custom roles.
        Export-EntraOpsClassificationAzureRoles -IncludeCustomRoles $true
    #>


    [cmdletbinding()]
    param
    (
        [Parameter(Mandatory = $false)]
        $SingleClassification = $True
        ,
        [Parameter(Mandatory = $false)]
        $IncludeCustomRoles = $False
        ,
        [Parameter(Mandatory = $false)]
        $DefaultScope = "/*"
        ,
        [Parameter(Mandatory = $false)]
        $ClassificationFile = "./EntraOps_Classification/Classification_Azure.json"
        ,
        [Parameter(Mandatory = $false)]
        [string[]] $Tier0IncludedResourceScope = @()
        ,
        [Parameter(Mandatory = $false)]
        [string[]] $Tier1IncludedResourceScope = @()
        ,
        [Parameter(Mandatory = $false)]
        $RoleDefinitionScope = $null
        ,
        [Parameter(Mandatory = $false)]
        $Exportfile = ".\Classification\Classification_AzureResources.json"
    )

    # Wildcard-aware matching between an Azure role action and a classified action (both directions, case-insensitive)
    function Test-EntraOpsAzureActionMatch {
        param
        (
            [Parameter(Mandatory = $true)] [AllowEmptyString()] [string] $RoleAction,
            [Parameter(Mandatory = $true)] [AllowEmptyString()] [string] $ClassifiedAction
        )

        if ([string]::IsNullOrEmpty($RoleAction) -or [string]::IsNullOrEmpty($ClassifiedAction)) {
            return $false
        }
        # Azure documents */read as control-plane metadata access; it cannot by itself
        # grant a concrete telemetry or other sensitive-read operation.
        if ($RoleAction -eq '*/read' -and $ClassifiedAction -ne '*/read') {
            return $false
        }

        if ($RoleAction -eq $ClassifiedAction) {
            return $true
        }

        $RolePattern = '^' + [Regex]::Escape($RoleAction).Replace('\*', '.*') + '$'
        $ClassifiedPattern = '^' + [Regex]::Escape($ClassifiedAction).Replace('\*', '.*') + '$'

        # Classified definition contains a wildcard which covers the role action (e.g. "Microsoft.Authorization/*/write")
        if ($ClassifiedAction.Contains('*') -and $RoleAction -imatch $ClassifiedPattern) {
            return $true
        }

        # Role action contains a wildcard which covers the classified action (e.g. role grants "Microsoft.Compute/*")
        if ($RoleAction.Contains('*') -and $ClassifiedAction -imatch $RolePattern) {
            return $true
        }

        return $false
    }

    # Determine whether a classified action is removed by a role's NotActions/NotDataActions. Only a NotAction
    # which is equal to or broader than the classified action cancels it (one-directional coverage), so a narrow
    # NotAction (e.g. "Microsoft.Authorization/roleAssignments/write") does not cancel a broad classified wildcard
    # (e.g. "Microsoft.Authorization/*/write").
    function Test-EntraOpsAzureActionExcluded {
        param
        (
            [Parameter(Mandatory = $true)] [AllowEmptyString()] [string] $ClassifiedAction,
            [Parameter(Mandatory = $false)] [string[]] $ExcludedActions = @()
        )

        if ([string]::IsNullOrEmpty($ClassifiedAction)) {
            return $false
        }

        foreach ($ExcludedAction in $ExcludedActions) {
            if ([string]::IsNullOrEmpty($ExcludedAction)) {
                continue
            }
            if ($ExcludedAction -eq $ClassifiedAction) {
                return $true
            }
            $ExcludedPattern = '^' + [Regex]::Escape($ExcludedAction).Replace('\*', '.*') + '$'
            if ($ClassifiedAction -imatch $ExcludedPattern) {
                return $true
            }
        }

        return $false
    }

    # A TierLevelDefinition entry's plane defaults to "Action" when the optional ActionType property is absent,
    # so classification files/entries without any data plane concept (Entra ID, Identity Governance, Device
    # Management, and most Azure services) never need to set it.
    function Get-EntraOpsTierDefinitionActionType {
        param
        (
            [Parameter(Mandatory = $true)] $TierDefinition
        )

        if ($null -ne $TierDefinition.ActionType -and $TierDefinition.ActionType -eq "DataAction") {
            return "DataAction"
        }
        return "Action"
    }

    # Resolve the tier level and service classification for a single Azure role action. Azure RBAC keeps
    # control/management plane Actions and data plane DataActions in entirely separate namespaces (e.g.
    # "Microsoft.KeyVault/vaults/write" is an Action, "Microsoft.KeyVault/vaults/secrets/read" is a DataAction),
    # so a TierLevelDefinition entry is only considered when its own plane (ActionType) matches the plane of the
    # role permission being classified - a pattern authored for one plane is never matched against a role
    # permission from the other plane.
    function Get-EntraOpsAzureActionClassification {
        param
        (
            [Parameter(Mandatory = $true)] [string] $RoleAction,
            [Parameter(Mandatory = $true)] [ValidateSet("Action", "DataAction")] [string] $ActionType,
            [Parameter(Mandatory = $true)] $Classification,
            [Parameter(Mandatory = $true)] [string] $Scope,
            [Parameter(Mandatory = $false)] [string[]] $ExcludedActions = @()
        )

        foreach ($TierLevel in $Classification) {
            foreach ($TierDefinition in $TierLevel.TierLevelDefinition) {

                if ((Get-EntraOpsTierDefinitionActionType -TierDefinition $TierDefinition) -ne $ActionType) {
                    continue
                }

                $ScopeMatch = ($TierDefinition.RoleAssignmentScopeName -contains $Scope) -or ($TierDefinition.RoleAssignmentScopeName -contains "/*")
                if (-not $ScopeMatch) {
                    continue
                }

                # Honor excluded role assignment scopes (e.g. Management Plane definitions which defer to Control Plane on Tier 0 scopes)
                if ($null -ne $TierDefinition.ExcludedRoleAssignmentScopeName -and ($TierDefinition.ExcludedRoleAssignmentScopeName -contains $Scope)) {
                    continue
                }

                $ExcludedMatch = $false
                foreach ($ExcludedAction in $TierDefinition.ExcludedRoleDefinitionActions) {
                    if (Test-EntraOpsAzureActionMatch -RoleAction $RoleAction -ClassifiedAction $ExcludedAction) {
                        $ExcludedMatch = $true
                        break
                    }
                }
                if ($ExcludedMatch) {
                    continue
                }

                foreach ($ClassifiedAction in $TierDefinition.RoleDefinitionActions) {
                    if (Test-EntraOpsAzureActionMatch -RoleAction $RoleAction -ClassifiedAction $ClassifiedAction) {
                        # Skip when the role explicitly removes this capability via NotActions/NotDataActions
                        if (Test-EntraOpsAzureActionExcluded -ClassifiedAction $ClassifiedAction -ExcludedActions $ExcludedActions) {
                            continue
                        }
                        return [PSCustomObject]@{
                            "Service"              = $TierDefinition.Service
                            "EAMTierLevelName"     = $TierLevel.EAMTierLevelName
                            "EAMTierLevelTagValue" = $TierLevel.EAMTierLevelTagValue
                        }
                    }
                }
            }
        }

        return $null
    }

    # Read permission arrays from a role definition, supporting both the legacy flattened properties
    # (Actions/NotActions/DataActions/NotDataActions) and the new Permissions[] structure which replaces
    # them (breaking change announced for Get-AzRoleDefinition / PSRoleDefinition).
    function Get-EntraOpsRolePermission {
        param
        (
            [Parameter(Mandatory = $true)] $RoleDefinition,
            [Parameter(Mandatory = $true)] [ValidateSet("Actions", "NotActions", "DataActions", "NotDataActions")] [string] $PermissionType
        )

        if ($null -ne $RoleDefinition.Permissions -and @($RoleDefinition.Permissions).Count -gt 0) {
            return @($RoleDefinition.Permissions | ForEach-Object { $_.$PermissionType } | Where-Object { $null -ne $_ })
        }

        return @($RoleDefinition.$PermissionType)
    }

    # Get EntraOps Classification (substitute scope placeholders when a parameterized classification file is used)
    # The tenant root scope ("/") is always treated as Control Plane (Tier 0), regardless of the caller-provided
    # Tier0IncludedResourceScope, since it is used both to include it on Control Plane definitions and to exclude
    # it from Management Plane definitions (via <Tier0IncludedResourceScope> in ExcludedRoleAssignmentScopeName).
    $ClassificationContent = Get-Content -Path $ClassificationFile -Raw
    $EffectiveTier0IncludedResourceScope = @("/") + @($Tier0IncludedResourceScope | Where-Object { $_ -ne "/" })
    $Tier0ScopeReplacement = (($EffectiveTier0IncludedResourceScope | ForEach-Object { '"' + $_ + '"' }) -join ", ")
    $Tier1ScopeReplacement = (($Tier1IncludedResourceScope | ForEach-Object { '"' + $_ + '"' }) -join ", ")
    $ClassificationContent = $ClassificationContent.Replace("<Tier0IncludedResourceScope>", $Tier0ScopeReplacement)
    $ClassificationContent = $ClassificationContent.Replace("<Tier1IncludedResourceScope>", $Tier1ScopeReplacement)
    $Classification = $ClassificationContent | ConvertFrom-Json -Depth 10

    # Query Azure RBAC role definitions for mapping ID to name and further details
    Write-Output "Query Azure RBAC role definitions for mapping ID to name and further details"
    if ($null -ne $RoleDefinitionScope -and -not [string]::IsNullOrEmpty($RoleDefinitionScope)) {
        # Query at a specific scope (e.g. the tenant root "/") to also include tenant-scoped built-in roles such as Reservations Administrator
        $AzureRoleDefinitions = Get-AzRoleDefinition -Scope $RoleDefinitionScope
    } else {
        $AzureRoleDefinitions = Get-AzRoleDefinition
    }
    $AzureRoleDefinitions = $AzureRoleDefinitions | Select-Object Id, Name, IsCustom, Description, Actions, NotActions, DataActions, NotDataActions, Permissions

    if ($IncludeCustomRoles -eq $False) {
        $AzureRoleDefinitions = $AzureRoleDefinitions | Where-Object { $_.IsCustom -eq $False }
    }

    $AzureRoles = $AzureRoleDefinitions | ForEach-Object {

        # Combine control/management plane Actions and data plane DataActions for classification
        $RoleActions = Get-EntraOpsRolePermission -RoleDefinition $_ -PermissionType "Actions"
        $RoleNotActions = Get-EntraOpsRolePermission -RoleDefinition $_ -PermissionType "NotActions"
        $RoleDataActions = Get-EntraOpsRolePermission -RoleDefinition $_ -PermissionType "DataActions"
        $RoleNotDataActions = Get-EntraOpsRolePermission -RoleDefinition $_ -PermissionType "NotDataActions"

        $RolePermissionEntries = New-Object System.Collections.ArrayList
        foreach ($Action in $RoleActions) {
            $RolePermissionEntries.Add([PSCustomObject]@{ "Action" = $Action; "ActionType" = "Action"; "ExcludedActions" = $RoleNotActions }) | Out-Null
        }
        foreach ($DataAction in $RoleDataActions) {
            $RolePermissionEntries.Add([PSCustomObject]@{ "Action" = $DataAction; "ActionType" = "DataAction"; "ExcludedActions" = $RoleNotDataActions }) | Out-Null
        }

        $ClassifiedAzureRolePermissions = New-Object System.Collections.ArrayList
        foreach ($RolePermissionEntry in $RolePermissionEntries) {

            $RolePermission = $RolePermissionEntry.Action

            # Apply Classification (matched only against classification patterns authored for the same plane/ActionType)
            $AzureRolePermissionClassification = Get-EntraOpsAzureActionClassification -RoleAction $RolePermission -ActionType $RolePermissionEntry.ActionType -Classification $Classification -Scope $DefaultScope -ExcludedActions $RolePermissionEntry.ExcludedActions

            if ($null -eq $AzureRolePermissionClassification) {
                $AzureRolePermissionClassification = [PSCustomObject]@{
                    "Service"              = "Unclassified"
                    "EAMTierLevelName"     = "Unclassified"
                    "EAMTierLevelTagValue" = "Unclassified"
                }
            }

            $ClassifiedAzureRolePermission = (
                [PSCustomObject]@{
                    "AuthorizedResourceAction" = $RolePermission
                    "ActionType"               = $RolePermissionEntry.ActionType
                    "Category"                 = $AzureRolePermissionClassification.Service
                    "EAMTierLevelName"         = $AzureRolePermissionClassification.EAMTierLevelName
                    "EAMTierLevelTagValue"     = $AzureRolePermissionClassification.EAMTierLevelTagValue
                }
            )
            $ClassifiedAzureRolePermissions.Add($ClassifiedAzureRolePermission) | Out-Null
        }
        $ClassifiedAzureRolePermissions = $ClassifiedAzureRolePermissions | Sort-Object EAMTierLevelTagValue, Category, AuthorizedResourceAction, ActionType

        if ($SingleClassification -eq $True) {
            $RoleDefinitionClassification = ($ClassifiedAzureRolePermissions | Select-Object -ExcludeProperty AuthorizedResourceAction, ActionType, Category -Unique | Sort-Object EAMTierLevelTagValue | Select-Object -First 1)
        } else {
            $FilteredRoleClassifications = ($ClassifiedAzureRolePermissions | Select-Object -ExcludeProperty AuthorizedResourceAction, ActionType -Unique | Sort-Object EAMTierLevelTagValue, Category)
            $RoleDefinitionClassification = [System.Collections.Generic.List[object]]::new()
            $RoleDefinitionClassification.Add($FilteredRoleClassifications)
        }

        # Mark roles with privilege escalation potential as privileged. Besides direct RBAC write access on
        # Microsoft.Authorization (role/deny assignments, elevateAccess, and Azure Policy assignments/exemptions
        # whose DeployIfNotExists/Modify effects run with a managed identity), this also covers indirect escalation
        # paths (control plane AND data plane): abusing managed identities, running code on / logging in to compute
        # that may carry a managed identity, deploying role assignments via blueprint assignments, taking over AKS
        # clusters (cluster credentials, Kubernetes RBAC data actions, or cluster reconfiguration), delegating access
        # to an external tenant via Azure Lighthouse, executing SYSTEM-context code through Azure Policy Guest
        # Configuration, and abusing Azure Automation (runbooks, DSC node configurations, and hybrid runbook workers).
        $PrivilegeEscalationActionPatterns = @(
            '^\*$'
            '^Microsoft\.Authorization/.*(\*|write|delete)$'
            '^Microsoft\.Authorization/elevateAccess/action$'
            '^Microsoft\.ManagedServices/registrationAssignments/(\*|write)$'
            '^Microsoft\.Blueprint/blueprintAssignments/(\*|write|delete)$'
            '^Microsoft\.ManagedIdentity/userAssignedIdentities/.*(write|assign/action|federatedIdentityCredentials/write)$'
            '^Microsoft\.Compute/virtualMachines/(\*|runCommand/action|extensions/write|login/action|loginAsAdmin/action)$'
            '^Microsoft\.Compute/virtualMachineScaleSets/.*(runCommand/action|extensions/write|\*)$'
            '^Microsoft\.HybridCompute/machines/(login/action|loginAsAdmin/action|runCommand/.*)$'
            '^Microsoft\.GuestConfiguration/guestConfigurationAssignments/(\*|write)$'
            '^Microsoft\.ContainerService/managedClusters/(\*|.*Credential/action|.*\*)$'
            '^Microsoft\.ContainerService/fleets/(\*|listCredentials?/action|.*\*)$'
            '^Microsoft\.App/containerApps/(exec|debug)/action$'
            '^Microsoft\.Web/sites/(\*|write)$'
            '^Microsoft\.Logic/(\*|workflows/(\*|write))$'
            '^Microsoft\.Automation/automationAccounts/(\*|runbooks/.*write|jobs/write|nodeConfigurations/write|compilationjobs/write|hybridRunbookWorkerGroups/.*)$'
        )
        # Evaluate control plane Actions (honoring NotActions) and data plane DataActions (honoring NotDataActions)
        $PrivilegeEscalationCandidates = @()
        $PrivilegeEscalationCandidates += $RoleActions | Where-Object { -not (Test-EntraOpsAzureActionExcluded -ClassifiedAction $_ -ExcludedActions $RoleNotActions) }
        $PrivilegeEscalationCandidates += $RoleDataActions | Where-Object { -not (Test-EntraOpsAzureActionExcluded -ClassifiedAction $_ -ExcludedActions $RoleNotDataActions) }
        $isPrivileged = [bool]($PrivilegeEscalationCandidates | Where-Object {
                $Action = $_
                @($PrivilegeEscalationActionPatterns | Where-Object { $Action -imatch $_ }).Count -gt 0
            })

        [PSCustomObject]@{
            "RoleId"                  = $_.Id
            "RoleName"                = $_.Name
            "IsCustom"                = $_.IsCustom
            "isPrivileged"            = $isPrivileged
            "AssignmentMode"          = $null
            "InheritsPermissionsFrom" = $null
            "RichDescription"         = $_.Description
            "RolePermissions"         = @($ClassifiedAzureRolePermissions)
            "Classification"          = $RoleDefinitionClassification
        }
    }

    $AzureRoles = $AzureRoles | Sort-Object RoleName, RoleId
    $AzureRoles | ConvertTo-Json -Depth 10 | Out-File $Exportfile -Force
}

# SIG # Begin signature block
# MIIniAYJKoZIhvcNAQcCoIIneTCCJ3UCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCArLvNTvyQ2NWXQ
# OFW3uC+6wtfBO9yXwOPRr/PL3f3YlKCCIDwwggXJMIIEsaADAgECAhAbtY8lKt8j
# AEkoya49fu0nMA0GCSqGSIb3DQEBDAUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
# ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
# dGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5l
# dHdvcmsgQ0EwHhcNMjEwNTMxMDY0MzA2WhcNMjkwOTE3MDY0MzA2WjCBgDELMAkG
# A1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAl
# BgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMb
# Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMIICIjANBgkqhkiG9w0BAQEFAAOC
# Ag8AMIICCgKCAgEAvfl4+ObVgAxknYYblmRnPyI6HnUBfe/7XGeMycxca6mR5rlC
# 5SBLm9qbe7mZXdmbgEvXhEArJ9PoujC7Pgkap0mV7ytAJMKXx6fumyXvqAoAl4Va
# qp3cKcniNQfrcE1K1sGzVrihQTib0fsxf4/gX+GxPw+OFklg1waNGPmqJhCrKtPQ
# 0WeNG0a+RzDVLnLRxWPa52N5RH5LYySJhi40PylMUosqp8DikSiJucBb+R3Z5yet
# /5oCl8HGUJKbAiy9qbk0WQq/hEr/3/6zn+vZnuCYI+yma3cWKtvMrTscpIfcRnNe
# GWJoRVfkkIJCu0LW8GHgwaM9ZqNd9BjuiMmNF0UpmTJ1AjHuKSbIawLmtWJFfzcV
# WiNoidQ+3k4nsPBADLxNF8tNorMe0AZa3faTz1d1mfX6hhpneLO/lv403L3nUlbl
# s+V1e9dBkQXcXWnjlQ1DufyDljmVe2yAWk8TcsbXfSl6RLpSpCrVQUYJIP4ioLZb
# MI28iQzV13D4h1L92u+sUS4Hs07+0AnacO+Y+lbmbdu1V0vc5SwlFcieLnhO+Nqc
# noYsylfzGuXIkosagpZ6w7xQEmnYDlpGizrrJvojybawgb5CAKT41v4wLsfSRvbl
# jnX98sy50IdbzAYQYLuDNbdeZ95H7JlI8aShFf6tjGKOOVVPORa5sWOd/7cCAwEA
# AaOCAT4wggE6MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLahVDkCw6A/joq8
# +tT4HKbROg79MB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C84oQ3RnX3MA4GA1Ud
# DwEB/wQEAwIBBjAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmNlcnR1bS5w
# bC9jdG5jYS5jcmwwawYIKwYBBQUHAQEEXzBdMCgGCCsGAQUFBzABhhxodHRwOi8v
# c3ViY2Eub2NzcC1jZXJ0dW0uY29tMDEGCCsGAQUFBzAChiVodHRwOi8vcmVwb3Np
# dG9yeS5jZXJ0dW0ucGwvY3RuY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQG
# CCsGAQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEM
# BQADggEBAFHCoVgWIhCL/IYx1MIy01z4S6Ivaj5N+KsIHu3V6PrnCA3st8YeDrJ1
# BXqxC/rXdGoABh+kzqrya33YEcARCNQOTWHFOqj6seHjmOriY/1B9ZN9DbxdkjuR
# mmW60F9MvkyNaAMQFtXx0ASKhTP5N+dbLiZpQjy6zbzUeulNndrnQ/tjUoCFBMQl
# lVXwfqefAcVbKPjgzoZwpic7Ofs4LphTZSJ1Ldf23SIikZbr3WjtP6MZl9M7JYjs
# NhI9qX7OAo0FmpKnJ25FspxihjcNpDOO16hO0EoXQ0zF8ads0h5YbBRRfopUofbv
# n3l6XYGaFpAP4bvxSgD5+d2+7arszgowggZrMIIEU6ADAgECAhBX5gfP8LabvnxC
# XoItEBa/MA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhB
# c3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNp
# Z25pbmcgMjAyMSBDQTAeFw0yNjEwMDYwODI4MjNaFw0yNzEwMDYwODI4MjJaMIGQ
# MQswCQYDVQQGEwJERTEdMBsGA1UECAwUUmhpbmVsYW5kLVBhbGF0aW5hdGUxEjAQ
# BgNVBAcMCUxhaG5zdGVpbjEeMBwGA1UECgwVT3BlbiBTb3VyY2UgRGV2ZWxvcGVy
# MS4wLAYDVQQDDCVPcGVuIFNvdXJjZSBEZXZlbG9wZXIgVGhvbWFzIE5hdW5oZWlt
# MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAphp2ljSmVsRB6gvkEq7A
# DUMENpKZiDFoAfF1ktD1nCwaVyI+bJ0ROjHwAn4iJgS+vlBDPOUIw2GLHkiqUhOg
# HSwzg6gj45GNmt6zxsKP0zPlhMB/fb0zmz7/F7e3yfKCXLfhbHuk0Es9gJ+8Wmet
# 9StVwwSE/K0MpW06GKA9nPWyE4N/ADwigDIj9rsTKJR4cve9w8G1b3zohpUc/qMr
# onab+HVw5r9b3sOBnnaXC6zvrX4fovRz1ztwfWjRjILLoFG6mW/TuK5F2ICD3Rhl
# 9R2rJWWWhzTDMsQlzvX+/SaM74q3OFpIVNdhvtmWU9pKUBRAyYMijcDqKEFGSzrc
# 8JFmGMpP5TuroWF+N21d3px2eARvW1mV0DCfFAH+Og20SH/gVW6/ltQQEkH/z/Zt
# 49ARyJrgESLOQtlMCIYSoKISdkk4ml4VUS1E/PcbzXEYj3a7m6DOxcd3WuY03UT9
# cnk3p0LMN6LeLYAZgVY+HRloZlH+kW2SkOHNuWgtXvZhAgMBAAGjggF4MIIBdDAM
# BgNVHRMBAf8EAjAAMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jY3NjYTIwMjEu
# Y3JsLmNlcnR1bS5wbC9jY3NjYTIwMjEuY3JsMHMGCCsGAQUFBwEBBGcwZTAsBggr
# BgEFBQcwAYYgaHR0cDovL2Njc2NhMjAyMS5vY3NwLWNlcnR1bS5jb20wNQYIKwYB
# BQUHMAKGKWh0dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jY3NjYTIwMjEuY2Vy
# MB8GA1UdIwQYMBaAFN10XUwA23ufoHTKsW73PMAywHDNMB0GA1UdDgQWBBTBvGyH
# MXj1dMbVnxuof9oP4PY7cDBLBgNVHSAERDBCMAgGBmeBDAEEATA2BgsqhGgBhvZ3
# AgUBBDAnMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF
# AAOCAgEAkC165c7/r6y3VeEEpNXas9bQs6ZpKPdJffHkf9xoPi4kWvAIWGc4ocG1
# DJLb18RXiDYShDmT5sb/6I08FeipKi2DNJkuOq6yOTJ3S7+hNFIZCyd6i7WKO8ea
# P5I+FAbyJP4+5coZoMg45bUa9JoocaJCm+5n7WiCfN7/EQpClW5Trm4+ZMbp7EMN
# F1uLJgGCMnN0SsoUarp7PHlqupMxMC4Uhhe+lAP2ytcSIU81L97/qjrADbLWqICk
# 9il5iGM+aZndguq/cmfH9rJj4GRZHWnG6WwnzYD9+KgYlRI6em+/9dq+IRiXe2Bs
# thUuIaFW7U2gWw8tBTEYm1UBLHdJx+L1gjJCLs5KT/wy5wU32wZxNDqPUQejUC1x
# GvU3cKqmLgRq+yNf3gFVfzqIoggyM3U9wQvnk7nBtCkpjXS2hdx4yxzcmrlWsDHr
# z6+6/jeyQySzbYUlFmKnc4n9Mw2soHOajEua5poFARVRS5KgUBuiiQ21YFNYzWBo
# qGuECaaAI/C5rGxapMJ3dAOBnHw6NLqBet+ZXBJEccX5y89MLlOQu+jDmJP8HieR
# qDLlwfhVZnw4RY8Rus43NZBwhNlVuOUXqocHKmJhKNlekda3qsJj93eQBQOxKJcc
# w5O08q9jukpH2+yzFAj+7ll33DuNUgWptogc4Awtbx3glzcEvJQwggaCMIIEaqAD
# AgECAhAo8HfBHDa9/l90MkdwJy4DMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYT
# AlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMT
# G0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQTAeFw0yNjAzMTEwNzM0NTRaFw0z
# NjAyMjcwNzM0NTRaMFAxCzAJBgNVBAYTAlBMMSEwHwYDVQQKDBhBc3NlY28gRGF0
# YSBTeXN0ZW1zIFMuQS4xHjAcBgNVBAMMFUNlcnR1bSBUaW1lc3RhbXAgMjAyNjCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALi9zfBw+xI12hi2F9uNQBNO
# STkTIi13fuh3DiWybI5392bBfJw6tO7zDs7UqP/rejVf4xFTU3XNOPsuOFkP5SPF
# snWwn3VJL+NhNhsuujvYsQtaQnvNo1wk46reTgws1L8OFEdKaxgyqT4zOQx81mLw
# NZSqXNU9Rrb9oAJWJF4Mydz+C1ebu0D0+vgM3tqAQ8TU203fqgKCPqIdHloaFqH9
# eyR+8tnpmy2hnnN59ZOtmsuHeRwf5iTOhlhf0d/qqquLOSIGPgGVL1Hj5XBUox2O
# E7tQRr+l/xxNbL6OuwBO4Aa2EbuxYg37cpXv5i2/lTL4NASB/duf9W4fjA3Ro+GP
# +bC54n2OYiM3Cq8z92ejx8F5HWO2e4/75eC95B9tMw/eq7109GDyW2+2ut5Bn0o8
# MXJTERkyystWbqcnUkomA97qfiDCwvpWuOMdfTOksXe9S+xDxOJaCbiyTivgPulx
# cT+tfQTRXBr5UwtPvc+INnafOEilzVHA11tv+pHcylryxBc08cUihf/ttqkZS0bm
# x3VxQay8uohaTp0//ECA9vYGW51SKdJMJhXvKyIdBLy8WYNchTt8yRITv9Adxg9J
# qGujh+TnP1bW3aQjFtlEl7SzgNeI8OVA/CJAWWUuRT3Au9ToOpHy/flrrknhN4he
# Ew7/6ILMv4HSsj0YZ4otAgMBAAGjggFQMIIBTDB1BggrBgEFBQcBAQRpMGcwOwYI
# KwYBBQUHMAKGL2h0dHA6Ly9zdWJjYS5yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdHNj
# YTIwMjEuY2VyMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u
# Y29tMB8GA1UdIwQYMBaAFL5UAi+/QGxzQ86sCSVOnkNEGu7gMAwGA1UdEwEB/wQC
# MAAwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL3N1YmNhLmNybC5jZXJ0dW0ucGwv
# Y3RzY2EyMDIxLmNybDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8E
# BAMCB4AwIgYDVR0gBBswGTAIBgZngQwBBAIwDQYLKoRoAYb2dwIFAQswHQYDVR0O
# BBYEFCM5aiirmhKnpKfyH/lFmr+N/oIDMA0GCSqGSIb3DQEBDAUAA4ICAQBm/pOb
# rAveTqYFPCSthxNVwBHTW4TfuBQY2KGCdMlH6ALjVPYf2XARNGMTXScR0JQ2/c2L
# xLpoHHhRwxFf3d933DhFS165rYj6iPSQKm41rc9AMpTCjMdmai1aK9o870pOzTzL
# RhWFVIxm+5Qf+t4V5z14tPoUsAWdfRKD1Zzvzfe5AHlE9rxOZcGROiULxs3Edf7Z
# J8RZI0jzD9juj2oEX2XS7BVKuNCK1W0h1mjapv028yqo8UtZh5/1Ib48Yyp88BDY
# Shh5PSGUUuS5tYXVfcduIPBe3PdNTYRYdT5VNxkwLgjMzIcr/6SH2fejFJDjnCxj
# vXLuarErJg/IdI+hXdGIBDVOGv1zrkF4ktoQvFZIp5DIAYh0GwyUhc87qqn5UaYT
# j2+iyiBDSNh7aGCrkuAnqg7Qh7frhX+QhMGeJ9SpLpnG76qN85hLyjvYR6gRYiLT
# j8G4fxjqV400/buPw0rBo9yJZyq/8cGdCOLPOYf9qpefTcrZKeO9pg+UJHx8UABb
# aTqizRxm8sUSEycccCCFhIit3AI/3wGuSOADeiA676NcQ7+dsP04YvzvdN7pTZNy
# g672WpBDJdg0eItHl4yomvNeIOWh1qs4QqOW6TI8Ocsi4uSDTLorxLUDnBTwKQzz
# pxd1YUctEgRh32R0J9FkFkeEruJU94RljFr1uDCCBrkwggShoAMCAQICEQCZo4AK
# JlU7ZavcboSms+o5MA0GCSqGSIb3DQEBDAUAMIGAMQswCQYDVQQGEwJQTDEiMCAG
# A1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVt
# IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3Rl
# ZCBOZXR3b3JrIENBIDIwHhcNMjEwNTE5MDUzMjE4WhcNMzYwNTE4MDUzMjE4WjBW
# MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu
# MSQwIgYDVQQDExtDZXJ0dW0gQ29kZSBTaWduaW5nIDIwMjEgQ0EwggIiMA0GCSqG
# SIb3DQEBAQUAA4ICDwAwggIKAoICAQCdI88EMCM7wUYs5zNzPmNdenW6vlxNur3r
# Lfi+5OZ+U3iZIB+AspO+CC/bj+taJUbMbFP1gQBJUzDUCPx7BNLgid1TyztVLn52
# NKgxxu8gpyTr6EjWyGzKU/gnIu+bHAse1LCitX3CaOE13rbuHbtrxF2tPU8f253Q
# gX6eO8yTbGps1Mg+yda3DcTsOYOhSYNCJiL+5wnjZ9weoGRtvFgMHtJg6i671OPX
# IciiHO4Lwo2p9xh/tnj+JmCQEn5QU0NxzrOiRna4kjFaA9ZcwSaG7WAxeC/xoZSx
# F1oK1UPZtKVt+yrsGKqWONoK6f5EmBOAVEK2y4ATDSkb34UD7JA32f+Rm0wsr5aj
# zftDhA5mBipVZDjHpwzv8bTKzCDUSUuUmPo1govD0RwFcTtMXcfJtm1i+P2UNXad
# PyYVKRxKQATHN3imsfBiNRdN5kiVVeqP55piqgxOkyt+HkwIA4gbmSc3hD8ke66t
# 9MjlcNg73rZZlrLHsAIV/nJ0mmgSjBI/TthoGJDydekOQ2tQD2Dup/+sKQptalDl
# ui59SerVSJg8gAeV7N/ia4mrGoiez+SqV3olVfxyLFt3o/OQOnBmjhKUANoKLYlK
# mUpKEFI0PfoT8Q1W/y6s9LTI6ekbi0igEbFUIBE8KDUGfIwnisEkBw5KcBZ3XwnH
# mfznwlKo8QIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
# 3XRdTADbe5+gdMqxbvc8wDLAcM0wHwYDVR0jBBgwFoAUtqFUOQLDoD+Oirz61Pgc
# ptE6Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMDAGA1Ud
# HwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5jcmwwbAYI
# KwYBBQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0
# dW0uY29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwv
# Y3RuY2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0
# cDovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQB1iFgP5Y9Q
# KJpTnxDsQ/z0O23JmoZifZdEOEmQvo/79PQg9nLF/GJe6ZiUBEyDBHMtFRK0mXj3
# Qv3gL0sYXe+PPMfwmreJHvgFGWQ7XwnfMh2YIpBrkvJnjwh8gIlNlUl4KENTK5DL
# qsYPEtRQCw7R6p4s2EtWyDDr/M58iY2UBEqfUU/ujR9NuPyKk0bEcEi62JGxauFY
# zZ/yld13fHaZskIoq2XazjaD0pQkcQiIueL0HKiohS6XgZuUtCKA7S6CHttZEsOb
# QJ1j2s0urIDdqF7xaXFVaTHKtAuMfwi0jXtF3JJphrJfc+FFILgCbX/uYBPBlbBI
# P4Ht4xxk2GmfzMn7oxPITpigQFJFWuzTMUUgdRHTxaTSKRJ/6Uh7ki/pFjf9sUAS
# WgxT69QF9Ki4JF5nBIujxZ2sOU9e1HSCJwOfK07t5nnzbs1LbHuAIGJsRJiQ6HX/
# DW1XFOlXY1rc9HufFhWU+7Uk+hFkJsfzqBz3pRO+5aI6u5abI4Qws4YaeJH7H7M8
# X/YNoaArZbV4Ql+jarKsE0+8XvC4DJB+IVcvC9Ydqahi09mjQse4fxfef0L7E3hh
# o2O3bLDM6v60rIRUCi2fJT2/IRU5ohgyTch4GuYWefSBsp5NPJh4QRTP9DC3gc5Q
# EKtbrTY0Ka87Web7/zScvLmvQBm8JDFpDjCCBrkwggShoAMCAQICEQDn/2nHOzXO
# S5Em2HR8aKWHMA0GCSqGSIb3DQEBDAUAMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UE
# ChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
# cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBO
# ZXR3b3JrIENBIDIwHhcNMjEwNTE5MDUzMjA3WhcNMzYwNTE4MDUzMjA3WjBWMQsw
# CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQw
# IgYDVQQDExtDZXJ0dW0gVGltZXN0YW1waW5nIDIwMjEgQ0EwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDpEh8ENe25XXrFppVBvoplf0530W0lddNmjtv4
# YSh/f7eDQKFaIqc7tHj7ox+u8vIsJZlroakUeMS3i3T8aJRC+eQs4FF0GqvkM6+W
# ZO8kmzZfxmZaBYmMLs8FktgFYCzywmXeQ1fEExflee2OpbHVk665eXRHjH7MYZIz
# Nnjl2m8Hy8ulB9mR8wL/W0v0pjKNT6G0sfrx1kk+3OGosFUb7yWNnVkWKU4qSxLv
# 16kJ6oVJ4BSbZ4xMak6JLeB8szrK9vwGDpvGDnKCUMYL3NuviwH1x4gZG0JAXU3x
# 2pOAz91JWKJSAmRy/l0s0l5bEYKolg+DMqVhlOANd8Yh5mkQWaMEvBRE/kAGzIqg
# WhwzN2OsKIVtO8mf5sPWSrvyplSABAYa13rMYnzwfg08nljZHghquCJYCa/xHK9a
# cev9UD7Y+usr15d7mrszzxhF1JOr1Mpup2chNSBlyOObhlSO16rwrffVrg/SzaKf
# SndS5swRhr8bnDqNJY9TNyEYvBYpgF95K7p0g4LguR4A++Z1nFIHWVY5v0fNVZmg
# zxD9uVo/gta3onGOQj3JCxgYx0KrCXu4yc9QiVwTFLWbNdHFSjBCt5/8Q9pLuRhV
# ocdCunhcHudMS1CGQ/Rn0+7P+fzMgWdRKfEOh/hjLrnQ8BdJiYrZNxvIOhM2aa3z
# EDHNwwIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUvlQC
# L79AbHNDzqwJJU6eQ0Qa7uAwHwYDVR0jBBgwFoAUtqFUOQLDoD+Oirz61PgcptE6
# Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMDAGA1UdHwQp
# MCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5jcmwwbAYIKwYB
# BQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u
# Y29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY3Ru
# Y2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0cDov
# L3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQC4k1l3yUwV/ZQH
# CKCneqAs8EGTnwEUJLdDpokN/dMhKjK0rR5qX8nIIHzxpQR3TAw2IRw1Uxsr2Pli
# G3bCFqSdQTUbfaTq6V3vBzEebDru9QFjqlKnxCF2h1jhLNFFplbPJiW+JSnJTh1f
# KEqEdKdxgl9rVTvlxfEJ7exOn25MGbd/wGPwuSmMxRJVO0wnqgS7kmoJjNF9zqee
# hFSDDP8ZVkWg4EZ2tIS0M3uZmByRr+1Lkwjjt8AtW83mVnZTyTsOb+FNfwJY7DS4
# FmWhkRbgcHRetreoTirPOr/ozyDKhT8MTSTf6Lttg6s6T/u08mDWw6HK04ZRDfQ9
# sb77QV8mKgO44WGP31vXnVKoWVJpFBjPvjL8/Zck/5wXX2iqjOaLStFOR/IQki+E
# hn4zlcgVm22ZVCBPF+l8nAwUUShCtKuSU7GmZLKCmmxQMkSiWILTm8EtVD6AxnJh
# oq8EnhjEEyUoflkeRF2WhFiVQOmWTwZRr44IxWGkNJC6tTorW5rl2Zl+2e9JLPYf
# 3pStAPMDoPKIjVXd6NW2+fZrNUBeDo2eOa5Fn7Brs/HLQff5Xgris5MeUbdVgDrF
# 8uxO6cLPvZPo63j62SsNg55pTWk9fUIF9iPoRbb4QurjoY/woI1RAOKtYtTic6aA
# Jq3u83RIPpGXBSJKwx4KJAOZnCDCtTGCBqIwggaeAgEBMGowVjELMAkGA1UEBhMC
# UEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIGA1UEAxMb
# Q2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBAhBX5gfP8LabvnxCXoItEBa/MA0G
# CWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZI
# hvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcC
# ARUwLwYJKoZIhvcNAQkEMSIEIBsYPZQO2AzOVHAH/B+3rzb4y7xxRB0zrp7CuVM+
# 1rq1MA0GCSqGSIb3DQEBAQUABIIBgItmm++yzX0Mac/CBM7PlPmg8b///0SoE9W8
# QZa6w1B2mmuJTqMI7vjbzdhK2emzH1MjpQEQ6p4ObBfeDbiC+5TI9VqZz2oD6D4R
# jf83kow8efFLecZvKsr0HNri5TpuD0bC375wEsDEPUkHq5SP4w2l0sZpDW66sTa0
# LFcExEtvgXQEJblcOWiNu87H29mv1QRA74C+y70FYXLrsTWc8rPkKg7eboemVthe
# jNDTfMEF3C0so9zTWFPTCk4r2DcxsgXkoz58RXxs4aRVnXHDVVl6uORAOkvSB4c2
# ZBkHAxR5ZhwO68HXj0XAjkrX7Nc3Mli7/olwvBFwIRu3YlL+ewIELxpWRhRswNZS
# J6wAn3ItUl8JnyloSKpWU/vpmgEusq8+Dfy8omdjU3E8uutepnIyVoF7NrrWiSHT
# dKLJMYlx/ZG7Fdy4lE02GRy9xjbgWUVOhH4Wc7f+s9Zdv16h9/Fztes+T0RBE+y2
# Y1E8AZ4w32KKx9NOGGLAtwpac6gSFaGCBAIwggP+BgkqhkiG9w0BCQYxggPvMIID
# 6wIBATBqMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0
# ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQQIQ
# KPB3wRw2vf5fdDJHcCcuAzANBglghkgBZQMEAgIFAKCCAVYwGgYJKoZIhvcNAQkD
# MQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjEwMTMwOTQwNThaMDcG
# CyqGSIb3DQEJEAIvMSgwJjAkMCIEIIW+kOEK0kONfMkotq9IsJqyCBd87PiwEmxY
# 05EFJcQ8MD8GCSqGSIb3DQEJBDEyBDDb21+jgTSzZJzxwlKYJT0yMHCQB9O4BO64
# ilDx4HNJOaA1pfN3URXEzzU8j7yYF5QwgZ8GCyqGSIb3DQEJEAIMMYGPMIGMMIGJ
# MIGGBBRXFGhBDKha80JO+RZKUTYQ9NONmDBuMFqkWDBWMQswCQYDVQQGEwJQTDEh
# MB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQwIgYDVQQDExtDZXJ0
# dW0gVGltZXN0YW1waW5nIDIwMjEgQ0ECECjwd8EcNr3+X3QyR3AnLgMwDQYJKoZI
# hvcNAQEBBQAEggIAWumPYbAKhjQdSBggZMKjIS5ecZ6Po8VGiDTgHJJB5p4qtmER
# Fq00B1uqzDwN4JEmhgHSwvRfQw2g1lZSdfaYoptenOIGRNuhvjNHt8q9px+Nm2pg
# rQ18nB3h9X5wqiY3/ZGFE2QPknAJZj1B+q6HKVHCRgWtdzfUtw3SO+jTcPmjBJtP
# OQxBiQm++W9voujuAY1Vd0nezBR8Ix3SJqUH/9u2adYf2RTwWy+Hyzer7n7Viwzr
# TlFlt9d48pP0fplqXw2wKBRqKkypYJGNYhaO2SK7YeQI78Eevc6a66J4SkyYQBGW
# uLlhLzm6nBGOn7GvKyMd+ZAZBDeAaNzOzbvxKrJ70I0r0MFaDe5U8iKs+CyO7Jin
# xziusrvAjudTlm0vDDJC1n+3Kj2+VJGYVqKDHhj+/DCXq1H14uNclearIo/D+nYj
# zQtccH1qtTLufnH0qHHos1YyT06KNU6fk6Ted4+x1MmYHIRGeWAHi/rreNbRA9dH
# v4tGAycJlQ6yFPdE2YvFC6OtJNjrEOGlEBJiQ4ytZTedCPwN9103ud4Fsen5kFRJ
# n2c+lSxZJZMkFIRG5+BSH+hiTMiKEaq2llgFHeRM917K3G7GEKkekQhe/E01/nMu
# VCQ+Q5dtquQy7SZylvV+E0Y/rmG2oFrF92QyJG9UGfqYhQJZsu0Gac+mRts=
# SIG # End signature block