Private/Import-EntraOpsClassificationOverwrites.ps1
|
function Import-EntraOpsClassificationOverwrites { <# .SYNOPSIS Loads classification overwrite definitions from the tenant-specific classification folder and Templates. .DESCRIPTION Shared helper that loads the separated overwrite files and returns normalized overwrite definitions for a specific RBAC system: - Classification_RoleActionOverwrites.json: Down- or upgrade the tier level of individual role definition actions (e.g., "microsoft.directory/bitlockerKeys/key/read" on scope "/*"). An optional ActionType ("Action" or "DataAction", defaults to "Action") declares which plane the actions belong to for RBAC systems that distinguish control/management plane Actions from data plane DataActions (currently Azure). This file is ONLY read from the tenant-specific folder ($FolderClassification/$TenantNameContext) alongside the other customized classification files. A file in the Templates folder is intentionally ignored. Role action overwrites are applied at classification file generation time by Update-EntraOpsClassificationControlPlaneScope (via Invoke-EntraOpsClassificationActionOverwrite) and are baked into the tenant-specific Classification_*.json files. The Get-EntraOpsPrivilegedEAM* cmdlets do not apply them at runtime. - Classification_RoleDefinitionOverwrites.json: Down- or upgrade the tier level of a role definition, identified by RoleDefinitionId and/or RoleDefinitionName (replaces previously hard-coded handling such as ControlPlaneRolesWithoutRoleActions). A named Service replaces or adds only that service; an empty or "*" Service replaces all classifications. A tenant-specific file in $FolderClassification/$TenantNameContext is preferred; otherwise the file in $FolderClassification/Templates is used as fallback. - Classification_ApiPermissionOverwrites.json: Down- or upgrade the tier level of an individual API permission (application or delegated), identified by PermissionValue and, optionally, TargetAppId/PermissionType. Schema is aligned with Classification_ApiPermissions.json entries (PermissionValue/PermissionType/TargetAppId/Category) instead of the RoleDefinitionActions/scope-pattern shape used by Classification_RoleActionOverwrites.json. This file is ONLY read from the tenant-specific folder (no Templates fallback), same as Classification_RoleActionOverwrites.json. Only applicable to RbacSystem "ResourceApps" and applied at classification file generation time by Update-EntraOpsClassificationControlPlaneScope (baked into the tenant-specific Classification_ApiPermissions.json via Invoke-EntraOpsClassificationActionOverwrite, reusing the same nested-schema mechanism as the other RBAC systems). Each file can be split into tagged variants named <BaseName>_<Tag>.json (for example Classification_RoleDefinitionOverwrites_PAW.json), stored in the tenant-specific folder. They are loaded in addition to the base file, in file name order after it, and their entries are applied in that order. For role actions and API permissions, an entry of a later file therefore takes precedence over an entry of an earlier file for the same action or permission. For role definitions, two rules of Invoke-EntraOpsClassificationRoleOverwrite come first: entries matching the role by RoleDefinitionId take precedence over entries matching it only by RoleDefinitionName, and an entry for the whole role (empty or "*" Service) is applied after the service-specific entries and replaces them. File order only decides between entries of the same kind. Entries of different files for the same item are listed in the output so overlaps are visible, once per RBAC system and unchanged file set in a session (repeated loads list them in the verbose output). All files contain a JSON array of overwrite entries. For role definition overwrites, Service scopes the overwrite to that classification service; use an empty or "*" Service to replace the entire role. For other overwrite types, Service (Category for API permission overwrites) is used as the service of the overwritten entry. RbacSystem "ResourceApps" (API permissions) is no longer supported in Classification_RoleActionOverwrites.json - such entries are skipped with a warning. Use Classification_ApiPermissionOverwrites.json instead. Every overwrite entry must contain a Justification to document why the classification has been changed. Entries without a Justification are skipped with a warning. .PARAMETER RbacSystem RBAC system to filter overwrite entries for (e.g., "EntraID", "DeviceManagement", "Defender", "IdentityGovernance", "ResourceApps"). .PARAMETER FolderClassification Base folder for classification files. Defaults to $DefaultFolderClassification. .OUTPUTS [PSCustomObject] with three array properties: RoleActionOverwrites, RoleDefinitionOverwrites and ApiPermissionOverwrites. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$RbacSystem, [Parameter(Mandatory = $false)] [string]$FolderClassification = $DefaultFolderClassification ) $RoleActionOverwrites = [System.Collections.Generic.List[object]]::new() $RoleDefinitionOverwrites = [System.Collections.Generic.List[object]]::new() $ApiPermissionOverwrites = [System.Collections.Generic.List[object]]::new() # Translation between the PermissionType values used on Classification_ApiPermissionOverwrites.json entries # (matching Classification_ApiPermissions.json / AppRoleAssignment.RoleType semantics: "Application"/"Delegated") # and the ResourceScope values used internally by Invoke-EntraOpsClassificationActionOverwrite ("Application"/"Delegation"). $PermissionTypeToResourceScope = @{ 'Application' = 'Application' 'Delegated' = 'Delegation' } # Mapping to derive tag value from tier level name if not explicitly defined $TierLevelTagValueMap = @{ 'ControlPlane' = '0' 'ManagementPlane' = '1' 'WorkloadPlane' = '1' # Tier1 sub-plane (cf. Tier1-WorkloadPlane groups / ObjectAdminTierLevel "1" in PrivilegedEAM exports) 'UserAccess' = '2' } $OverwriteFileMap = [System.Collections.Generic.List[object]]::new() # Tenant-specific classification folder (only available after Connect-EntraOps has set $TenantNameContext) $TenantFolder = if (-not [string]::IsNullOrEmpty($TenantNameContext)) { Join-Path -Path $FolderClassification -ChildPath $TenantNameContext } else { $null } # Role action and API permission overwrites (ResourceApps only): ONLY read from the tenant-specific # folder, no Templates fallback. The base file and every tagged variant (<BaseName>_<Tag>.json) are # loaded in the order of Get-EntraOpsClassificationOverwriteFile. if ($null -ne $TenantFolder) { foreach ($TenantOnlyType in @( @{ Type = 'RoleAction'; BaseName = 'Classification_RoleActionOverwrites.json' }, @{ Type = 'ApiPermission'; BaseName = 'Classification_ApiPermissionOverwrites.json' } )) { $TypeFiles = @(Get-EntraOpsClassificationOverwriteFile -Folder $TenantFolder -BaseName $TenantOnlyType.BaseName) if ($TypeFiles.Count -eq 0) { Write-Verbose "No tenant-specific $($TenantOnlyType.BaseName) (or tagged variant) found in $TenantFolder" } foreach ($TypeFile in $TypeFiles) { Write-Verbose "Using tenant-specific $($TenantOnlyType.Type) overwrites file: $($TypeFile.Path)" $OverwriteFileMap.Add([PSCustomObject]@{ Type = $TenantOnlyType.Type; Path = $TypeFile.Path }) } } } else { Write-Verbose "No tenant context available, skipping tenant-specific role action and API permission overwrites" } # Role definition overwrites: the tenant-specific base file is preferred, the Templates base file is # the fallback. Tagged variants are only read from the tenant-specific folder and are loaded in # addition to whichever base file applies. $RoleDefinitionBaseName = 'Classification_RoleDefinitionOverwrites.json' $RoleDefinitionFilePath = $null if ($null -ne $TenantFolder) { $TenantRoleDefinitionFile = @(Get-EntraOpsClassificationOverwriteFile -Folder $TenantFolder -BaseName $RoleDefinitionBaseName | Where-Object { $null -eq $_.Tag }) if ($TenantRoleDefinitionFile.Count -gt 0) { Write-Verbose "Using tenant-specific role definition overwrites file: $($TenantRoleDefinitionFile[0].Path)" $RoleDefinitionFilePath = $TenantRoleDefinitionFile[0].Path } } if ($null -eq $RoleDefinitionFilePath) { $TemplateRoleDefinitionFilePath = Join-Path -Path $FolderClassification -ChildPath "Templates/$RoleDefinitionBaseName" if (Test-Path -Path $TemplateRoleDefinitionFilePath) { Write-Verbose "Using template role definition overwrites file: $TemplateRoleDefinitionFilePath" $RoleDefinitionFilePath = $TemplateRoleDefinitionFilePath } else { Write-Verbose "No role definition overwrites file found in tenant-specific folder or Templates" } } if ($null -ne $RoleDefinitionFilePath) { $OverwriteFileMap.Add([PSCustomObject]@{ Type = 'RoleDefinition'; Path = $RoleDefinitionFilePath }) } if ($null -ne $TenantFolder) { foreach ($TaggedFile in @(Get-EntraOpsClassificationOverwriteFile -Folder $TenantFolder -BaseName $RoleDefinitionBaseName -TaggedOnly)) { Write-Verbose "Using tenant-specific role definition overwrites file: $($TaggedFile.Path)" $OverwriteFileMap.Add([PSCustomObject]@{ Type = 'RoleDefinition'; Path = $TaggedFile.Path }) } } if ($OverwriteFileMap.Count -eq 0) { return [PSCustomObject]@{ RoleActionOverwrites = @() RoleDefinitionOverwrites = @() ApiPermissionOverwrites = @() } } foreach ($OverwriteFileEntry in $OverwriteFileMap) { if (-not (Test-Path -Path $OverwriteFileEntry.Path)) { Write-Verbose "Classification overwrite file not found: $($OverwriteFileEntry.Path)" continue } $OverwriteFile = Get-Item -Path $OverwriteFileEntry.Path try { $OverwriteJson = @(Get-Content -Path $OverwriteFile.FullName -Raw | ConvertFrom-Json -Depth 10) } catch { Write-Warning "Failed to parse classification overwrite file $($OverwriteFile.FullName): $_" continue } # Resolve tier level for an overwrite entry, returns $null if invalid $ResolveTierLevel = { param($Entry, $EntryDescription) if ([string]::IsNullOrEmpty($Entry.EAMTierLevelName)) { Write-Warning "Skipping classification overwrite ($EntryDescription) in $($OverwriteFile.Name): EAMTierLevelName is missing." return $null } $TagValue = $Entry.EAMTierLevelTagValue if ([string]::IsNullOrEmpty($TagValue)) { if ($TierLevelTagValueMap.ContainsKey($Entry.EAMTierLevelName)) { $TagValue = $TierLevelTagValueMap[$Entry.EAMTierLevelName] } else { Write-Warning "Skipping classification overwrite ($EntryDescription) in $($OverwriteFile.Name): Unknown EAMTierLevelName '$($Entry.EAMTierLevelName)' and no EAMTierLevelTagValue defined." return $null } } return "$TagValue" } #region Role action overwrites $RoleActionEntries = if ($OverwriteFileEntry.Type -eq 'RoleAction') { @($OverwriteJson) } else { @() } foreach ($Entry in $RoleActionEntries) { if ($null -eq $Entry) { continue } if ("$($Entry.RbacSystem)" -ne $RbacSystem) { continue } # RbacSystem "ResourceApps" (API permissions) is no longer supported here - use # Classification_ApiPermissionOverwrites.json instead (schema aligned with Classification_ApiPermissions.json). if ($Entry.RbacSystem -eq 'ResourceApps') { Write-Warning "Skipping ResourceApps entry in $($OverwriteFile.Name): API permission overwrites are no longer supported in Classification_RoleActionOverwrites.json. Move it to Classification_ApiPermissionOverwrites.json." continue } $Actions = @($Entry.RoleDefinitionActions | Where-Object { -not [string]::IsNullOrEmpty($_) }) if ($Actions.Count -eq 0) { Write-Warning "Skipping role action classification overwrite in $($OverwriteFile.Name): RoleDefinitionActions is missing or empty." continue } if ([string]::IsNullOrEmpty($Entry.Justification)) { Write-Warning "Skipping role action classification overwrite for '$($Actions -join ', ')' in $($OverwriteFile.Name): Justification is required to document the classification change." continue } $TagValue = & $ResolveTierLevel $Entry "role actions: $($Actions -join ', ')" if ($null -eq $TagValue) { continue } $Scopes = @($Entry.RoleAssignmentScopeName | Where-Object { -not [string]::IsNullOrEmpty($_) }) if ($Scopes.Count -eq 0) { $Scopes = @("/*") } # Plane of the overwritten actions (Action = control/management plane, DataAction = data plane). # Defaults to "Action" when omitted, matching the same default used on TierLevelDefinition entries. $ActionType = if ("$($Entry.ActionType)" -eq 'DataAction') { 'DataAction' } else { 'Action' } $RoleActionOverwrites.Add([PSCustomObject]@{ 'RbacSystem' = $RbacSystem 'RoleDefinitionActions' = $Actions 'ActionType' = $ActionType 'RoleAssignmentScopeName' = $Scopes 'ResourceAppId' = $null 'ResourceScope' = $null 'EAMTierLevelName' = $Entry.EAMTierLevelName 'EAMTierLevelTagValue' = $TagValue 'Service' = $Entry.Service 'Justification' = $Entry.Justification 'SourceFile' = $OverwriteFile.Name }) | Out-Null } #endregion #region API permission overwrites (ResourceApps only) $ApiPermissionEntries = if ($OverwriteFileEntry.Type -eq 'ApiPermission') { @($OverwriteJson) } else { @() } foreach ($Entry in $ApiPermissionEntries) { if ($null -eq $Entry) { continue } if ("$RbacSystem" -ne 'ResourceApps') { continue } $PermissionValue = "$($Entry.PermissionValue)" if ([string]::IsNullOrEmpty($PermissionValue)) { Write-Warning "Skipping API permission classification overwrite in $($OverwriteFile.Name): PermissionValue is missing." continue } if ([string]::IsNullOrEmpty($Entry.Justification)) { Write-Warning "Skipping API permission classification overwrite for '$PermissionValue' in $($OverwriteFile.Name): Justification is required to document the classification change." continue } $TagValue = & $ResolveTierLevel $Entry "API permission: $PermissionValue" if ($null -eq $TagValue) { continue } $PermissionType = "$($Entry.PermissionType)" $ResourceScope = if (-not [string]::IsNullOrEmpty($PermissionType) -and $PermissionType -ne 'All' -and $PermissionTypeToResourceScope.ContainsKey($PermissionType)) { $PermissionTypeToResourceScope[$PermissionType] } elseif (-not [string]::IsNullOrEmpty($PermissionType) -and $PermissionType -ne 'All') { Write-Warning "API permission classification overwrite for '$PermissionValue' in $($OverwriteFile.Name): Unknown PermissionType '$PermissionType', expected 'Application', 'Delegated' or 'All'. Treating as 'All'." $null } else { $null } $ApiPermissionOverwrites.Add([PSCustomObject]@{ 'RbacSystem' = 'ResourceApps' 'RoleDefinitionActions' = @($PermissionValue) 'RoleAssignmentScopeName' = @("/") 'ResourceAppId' = if (-not [string]::IsNullOrEmpty($Entry.TargetAppId)) { "$($Entry.TargetAppId)" } else { $null } 'ResourceScope' = $ResourceScope 'EAMTierLevelName' = $Entry.EAMTierLevelName 'EAMTierLevelTagValue' = $TagValue 'Service' = $Entry.Category 'Justification' = $Entry.Justification 'SourceFile' = $OverwriteFile.Name }) | Out-Null } #endregion #region Role definition overwrites $RoleDefinitionEntries = if ($OverwriteFileEntry.Type -eq 'RoleDefinition') { @($OverwriteJson) } else { @() } foreach ($Entry in $RoleDefinitionEntries) { if ($null -eq $Entry) { continue } if ("$($Entry.RbacSystem)" -ne $RbacSystem) { continue } if ([string]::IsNullOrEmpty($Entry.RoleDefinitionId) -and [string]::IsNullOrEmpty($Entry.RoleDefinitionName)) { Write-Warning "Skipping role definition classification overwrite in $($OverwriteFile.Name): RoleDefinitionId or RoleDefinitionName is required." continue } $RoleIdentifier = if (-not [string]::IsNullOrEmpty($Entry.RoleDefinitionName)) { $Entry.RoleDefinitionName } else { $Entry.RoleDefinitionId } if ([string]::IsNullOrEmpty($Entry.Justification)) { Write-Warning "Skipping role definition classification overwrite for '$RoleIdentifier' in $($OverwriteFile.Name): Justification is required to document the classification change." continue } $TagValue = & $ResolveTierLevel $Entry "role definition: $RoleIdentifier" if ($null -eq $TagValue) { continue } $Scopes = @($Entry.RoleAssignmentScopeName | Where-Object { -not [string]::IsNullOrEmpty($_) }) $RoleDefinitionOverwrites.Add([PSCustomObject]@{ 'RbacSystem' = $RbacSystem 'RoleDefinitionId' = $Entry.RoleDefinitionId 'RoleDefinitionName' = $Entry.RoleDefinitionName 'RoleAssignmentScopeName' = if ($Scopes.Count -gt 0) { $Scopes } else { $null } 'EAMTierLevelName' = $Entry.EAMTierLevelName 'EAMTierLevelTagValue' = $TagValue 'Service' = $Entry.Service 'Justification' = $Entry.Justification 'SourceFile' = $OverwriteFile.Name }) | Out-Null } #endregion } # Make overlaps between files visible: tagged files usually overlap the base file on purpose, so this # is informational rather than a warning. A role definition entry with ID and name yields two keys with # the same label, so messages are deduplicated. $OverlapMessages = [System.Collections.Generic.List[string]]::new() $ReportOverlaps = { param($Overwrites, [string]$Kind, [scriptblock]$GetKeys, [string]$Rule) $FilesByKey = @{} $LabelByKey = @{} foreach ($Overwrite in $Overwrites) { foreach ($KeyInfo in @(& $GetKeys $Overwrite)) { if (-not $FilesByKey.ContainsKey($KeyInfo.Key)) { $FilesByKey[$KeyInfo.Key] = [System.Collections.Generic.List[string]]::new() $LabelByKey[$KeyInfo.Key] = $KeyInfo.Label } if (-not $FilesByKey[$KeyInfo.Key].Contains($Overwrite.SourceFile)) { $FilesByKey[$KeyInfo.Key].Add($Overwrite.SourceFile) } } } foreach ($Key in @($FilesByKey.Keys | Sort-Object)) { if ($FilesByKey[$Key].Count -lt 2) { continue } $Message = "Classification overwrite overlap ($RbacSystem): $Kind $($LabelByKey[$Key]) is defined in $($FilesByKey[$Key] -join ', '). $Rule" if (-not $OverlapMessages.Contains($Message)) { $OverlapMessages.Add($Message) } } } & $ReportOverlaps $RoleActionOverwrites 'role action' { param($o) foreach ($Action in $o.RoleDefinitionActions) { foreach ($Scope in $o.RoleAssignmentScopeName) { @{ Key = "$($o.ActionType)|$Action|$Scope".ToLowerInvariant(); Label = "'$Action' on '$Scope'" } } } } 'The entry of the last file is applied last and takes precedence.' & $ReportOverlaps $ApiPermissionOverwrites 'API permission' { param($o) @{ Key = "$($o.RoleDefinitionActions[0])|$($o.ResourceScope)|$($o.ResourceAppId)".ToLowerInvariant(); Label = "'$($o.RoleDefinitionActions[0])'" } } 'The entry of the last file is applied last and takes precedence.' & $ReportOverlaps $RoleDefinitionOverwrites 'role definition' { param($o) $Service = if ([string]::IsNullOrEmpty($o.Service) -or $o.Service -eq '*') { '*' } else { "$($o.Service)" } $Role = if (-not [string]::IsNullOrEmpty($o.RoleDefinitionName)) { $o.RoleDefinitionName } else { $o.RoleDefinitionId } foreach ($Identifier in @($o.RoleDefinitionId, $o.RoleDefinitionName) | Where-Object { -not [string]::IsNullOrEmpty($_) }) { @{ Key = "$Identifier|$Service".ToLowerInvariant(); Label = "'$Role' (service '$Service')" } } } 'An entry matching by RoleDefinitionId takes precedence over a name-only match and a whole-role entry (Service empty or "*") over service-specific entries; otherwise the entry of the last file takes precedence.' # A full run loads the overwrites of one RBAC system several times (classification file generation and # the EAM cmdlets), so the overlaps of an unchanged file set are printed once per session. if ($OverlapMessages.Count -gt 0) { if ($null -eq $script:EntraOpsReportedOverwriteOverlaps) { $script:EntraOpsReportedOverwriteOverlaps = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) } $FileSetSignature = @($OverwriteFileMap | ForEach-Object { $Item = Get-Item -LiteralPath $_.Path -ErrorAction SilentlyContinue if ($Item) { "$($Item.FullName)|$($Item.Length)|$($Item.LastWriteTimeUtc.Ticks)" } }) -join ';' $FirstReport = $script:EntraOpsReportedOverwriteOverlaps.Add("$RbacSystem|$FileSetSignature") foreach ($Message in $OverlapMessages) { if ($FirstReport) { Write-Host $Message -ForegroundColor DarkYellow } else { Write-Verbose $Message } } } if ($RoleActionOverwrites.Count -gt 0 -or $RoleDefinitionOverwrites.Count -gt 0 -or $ApiPermissionOverwrites.Count -gt 0) { Write-Verbose "Loaded $($RoleActionOverwrites.Count) role action, $($RoleDefinitionOverwrites.Count) role definition and $($ApiPermissionOverwrites.Count) API permission classification overwrite(s) for $RbacSystem from $(@($OverwriteFileMap.Path) -join ', ')" } return [PSCustomObject]@{ RoleActionOverwrites = @($RoleActionOverwrites) RoleDefinitionOverwrites = @($RoleDefinitionOverwrites) ApiPermissionOverwrites = @($ApiPermissionOverwrites) } } # SIG # Begin signature block # MIIniAYJKoZIhvcNAQcCoIIneTCCJ3UCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAsM5CoHFrfda8t # GvTvXNkutHH8ksSHs1zoTXzeHWovlqCCIDwwggXJMIIEsaADAgECAhAbtY8lKt8j # 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 # ARUwLwYJKoZIhvcNAQkEMSIEIPry4RbSu0h7n8/ObZXi43lls/J7L/DEOVCsek9B # 8jXiMA0GCSqGSIb3DQEBAQUABIIBgD9dH9ptDilKBiXImP7MNzIhVA1IYW5XjV/t # 2svtwH1A8WUUz9alwZTB/QHlYGGiKenCbJv/pfoFTT9Ig5zPqSNWQrd/zf8Oj62e # MHQpmErfJv1qvT/Sc8hdFzVbfC7NAwXJeb7GChphu5JZAGQZDClGov/jSKGlknUK # 0IR8JVdWMHegKxOARYox7Ko09afQ4PTAVNsQl9o9c9DGqu2ZWnnmIPYxfnmoj6Ea # w2CncCNfd3AbuxIxHSubD2zTiFghfFq+mlO5Rk54ITqVJEupA5fKwkRLyB5ZZVTA # Yszy26WfvGGeoujNshlCT3cd4L8Xxc3dTMF395ybUlNXL7SUyuIZAo4NsymwLKg8 # XJoAa6mPHj3wAstjnDkEqZSqwklIw+hpFiOpXE7oZ8NLRpwCy1Hnn4PUGgixGuDJ # MJZgtfw2qhWp3+DkYU3SjIzwAgab9Unh9ABkdl9xQ8vacuLwVKJicj4e5rsUmEU6 # fxyfiWDb4Oej8Tr58RwXY68f73nEHqGCBAIwggP+BgkqhkiG9w0BCQYxggPvMIID # 6wIBATBqMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0 # ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQQIQ # KPB3wRw2vf5fdDJHcCcuAzANBglghkgBZQMEAgIFAKCCAVYwGgYJKoZIhvcNAQkD # MQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjEwMjcwNTM4MjZaMDcG # CyqGSIb3DQEJEAIvMSgwJjAkMCIEIIW+kOEK0kONfMkotq9IsJqyCBd87PiwEmxY # 05EFJcQ8MD8GCSqGSIb3DQEJBDEyBDCOVXaopaEe73VpUGd7PCOFMnQN1mTSL5Th # CyTNVTYO8gnGkaj+ZhC13dkkQd0v25IwgZ8GCyqGSIb3DQEJEAIMMYGPMIGMMIGJ # MIGGBBRXFGhBDKha80JO+RZKUTYQ9NONmDBuMFqkWDBWMQswCQYDVQQGEwJQTDEh # MB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQwIgYDVQQDExtDZXJ0 # dW0gVGltZXN0YW1waW5nIDIwMjEgQ0ECECjwd8EcNr3+X3QyR3AnLgMwDQYJKoZI # hvcNAQEBBQAEggIAT6aucKG97sUSFMOA7oIXY+9wcDxEAW4YmM68j2MSU0GNaSFX # Ip/wOH5+bP4PK+yw6EhTyYkSUTOmYJLlbG6CUA6TvVitvUX5PypTUw8xNaNj1dTC # pB0cP9FpsxKC0QSq17omUCaaajplzl3rHK53+mrvI6gPDAcKMol6VF2iLSu1mTNE # EkaTO/U6+5b+zXy3vYt26Y2v5cYS7Oc3kLHhGpQh1JatGojDtVX1g4r37h3TOlPM # Jp6ASj2yLZDWpil3+QK9ENuE7JtANWTBKYpqJW8fQPCEUIrv+O8/+iE1hNyr46pB # Hum5BcUJg2JoAqZrxkVi8mS3WFguoKtnvV5jVElSc9j84CRGSlJMJTE+1OihdwKS # zjkM3U/YgQ5Is54YbVTF+qMcfUDQIxdO5wqgaz/WCeR6tX30tQi+uxkDdQ63djvs # tFbN1TYk6v5oquD7ubi9l/PBDlXdOkmJDloX13gqGhmRnpvHV3UduC0FgVUkHnZu # 9ixQdWw0rCMg5zmSHTykjLC50jKSYOzCpEocLKALIjXxApPD5ZlSLX8TuLtZx5q1 # 7Vcs4JzNvZr8NKzqXy/YqormMLPlNBDqm1WKMBH2XIj2hi0llg5HDrctwbxrB7cv # qP4Wp4xgxxxL4j/kT04Rd14LXenp9pONXlIyDTmnTpPno4UlTKrKUIYyZhI= # SIG # End signature block |