public/Invoke-Maester.ps1
<#
.SYNOPSIS This is the main Maester command that runs the tests and generates a report of the results. .DESCRIPTION Using Invoke-Maester is the easiest way to run the Pester tests and generate a report of the results. For more advanced configuration, you can directly use the Pester module and the Get-MtHtmlReport function. By default, Invoke-Maester runs all *.Tests.ps1 files in the current directory and all subdirectories recursively. .PARAMETER IncludeLongRunning Include tests that can take a long time to run in tenants with a large number of objects. .PARAMETER IncludePreview Include tests that are still being tested or are dependent on preview APIs. .PARAMETER NoLogo Do not show the Maester logo. .PARAMETER NonInteractive This will suppress the logo when Maester starts and prevent the test results from being opened in the default browser. .EXAMPLE Invoke-Maester Runs all the test files under the current folder (except for those tagged as LongRunning and Preview) and generates a report of the results in the ./test-results folder. .EXAMPLE Invoke-Maester ./maester-tests Runs all the tests in the folder ./tests/Maester (except for those tagged as LongRunning and Preview) and generates a report of the results in the default ./test-results folder. .EXAMPLE Invoke-Maester -Tag 'CA' -IncludeLongRunning Runs the tests with the tag "CA" and includes long-running tests. Generates a report of the results in the default ./test-results folder. .EXAMPLE Invoke-Maester -Tag 'CA', 'App' -IncludePreview Runs the tests with the tags 'CA' and 'App' and includes preview tests. Generates a report of the results in the default ./test-results folder. .EXAMPLE Invoke-Maester -OutputFolder './my-test-results' Runs tests and generates a report of the results in the ./my-test-results folder. .EXAMPLE Invoke-Maester -OutputHtmlFile './test-results/TestResults.html' Runs the tests and generates a report of the results in the specified file. .EXAMPLE Invoke-Maester -Path ./tests/EIDSCA Runs tests in the EIDSCA folder. .EXAMPLE Invoke-Maester -MailRecipient john@contoso.com Runs the tests and sends a report of the results to an email recipient. .EXAMPLE Invoke-Maester -TeamId '00000000-0000-0000-0000-000000000000' -TeamChannelId '19%3A00000000000000000000000000000000%40thread.tacv2' Runs the tests and posts a summary of the results to a Teams channel. .EXAMPLE Invoke-Maester -TeamChannelWebhookUri 'https://some-url.logic.azure.com/workflows/invoke?api-version=2016-06-01' Runs the tests and posts a summary of the results to a Teams channel. .EXAMPLE Invoke-Maester -Verbosity Normal Shows results of tests as they are run, including details on failed tests. .EXAMPLE ```powershell $configuration = New-PesterConfiguration $configuration.Run.Path = './tests/Maester' $configuration.Filter.Tag = 'CA' $configuration.Filter.ExcludeTag = 'App' Invoke-Maester -PesterConfiguration $configuration ``` Runs Pester tests in the ./tests/Maester folder that include the 'CA' tag and exclude the 'App' tag. .EXAMPLE ```powershell Connect-Maester -Service All Invoke-Maester -IncludeLongRunning -IncludePreview ``` Connect to all tested services and run all tests, including the long-running and preview tests. .LINK https://maester.dev/docs/commands/Invoke-Maester #> function Invoke-Maester { [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Justification = 'Colors are beautiful')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '', Justification = 'Incorrectly flags ExportCsv and ExportExcel as unused')] [Alias("Invoke-MtMaester")] [CmdletBinding()] param ( # Specifies path to files containing tests. The value is a path\file name or a name pattern. Wildcards are permitted. [Parameter(Position = 0)] [string] $Path, # Only run the tests that match this tag(s). [string[]] $Tag, # Exclude the tests that match this tag(s). [string[]] $ExcludeTag, # Include long running tests. [switch] $IncludeLongRunning, # Include preview tests. [switch] $IncludePreview, # The path to the file to save the test results in html format. The filename should include an .html extension. [string] $OutputHtmlFile, # The path to the file to save the test results in markdown format. The filename should include a .md extension. [string] $OutputMarkdownFile, # The path to the file to save the test results in json format. The filename should include a .json extension. [string] $OutputJsonFile, # The folder to save the test results in. If no -Output* is set, defaults to ./test-results. # If set, other -Output* parameters are ignored and all formats will be generated (markdown, html, json) with a timestamp and saved in the folder. [string] $OutputFolder, # The filename prefix to use for all the files in the output folder. e.g. 'TestResults' will generate TestResults.html, TestResults.md, TestResults.json. [string] $OutputFolderFileName, # An optional [PesterConfiguration] object for advanced configuration. # Default is New-PesterConfiguration # For help on each option see New-PesterConfiguration, or inspect the object it returns. # See [Pester Configuration](https://pester.dev/docs/usage/Configuration) for more information. [PesterConfiguration] $PesterConfiguration, # Set the Pester verbosity level. Default is 'None'. # None : Shows only the final summary. # Normal : Focus on successful containers and failed tests/blocks. Shows basic discovery information and the summary of all tests. # Detailed : Similar to Normal, but this level shows all blocks and tests, including successful. # Diagnostic: Very verbose, but useful when troubleshooting tests. This level behaves like Detailed, but also enables debug messages. [ValidateSet('None', 'Normal', 'Detailed', 'Diagnostic')] [string] $Verbosity = 'None', # Run the tests in non-interactive mode. This will prevent the test results from being opened in the default browser. [switch] $NonInteractive, # Passes the output of the Maester tests to the console. [switch] $PassThru, # Optional: The email addresses of the report recipients. e.g. john@contoso.com # No email will be sent if this parameter is not provided. [string[]] $MailRecipient, # If sending the report to an email recipient, provide a Uri to the detailed test results page. [string] $MailTestResultsUri, # The user id of the sender of the mail. Defaults to the current user. # This is required when using application permissions. [string] $MailUserId, # Optional: The Teams team where the test results should be posted. # To get the TeamId, right-click on the channel in Teams and select 'Get link to channel'. Use the value of groupId. e.g. ?groupId=<TeamId> [string] $TeamId, # Optional: The channel where the results message should be posted. e.g. 19%3A00000000000000000000000000000000%40thread.tacv2 # To get the TeamChannelId, right-click on the channel in Teams and select 'Get link to channel'. Use the value found between channel and the channel name. e.g. /channel/<TeamChannelId>/my%20channel [string] $TeamChannelId, # Optional: The webhook Uri where the results message should be posted. e.g. https://some-url/?value=123 # To get the Webhook Uri, right-click on the channel in Teams and select 'Workflow'. Create a workflow using the 'Post to a channel when a webhook request is received' template. Use the value after 'complete.' [string] $TeamChannelWebhookUri, # Skip the graph connection check. # This is used for running tests that does not require a Graph connection. [switch] $SkipGraphConnect, # Disable Telemetry # If set, telemetry information will not be logged. [switch] $DisableTelemetry, # Skip the version check. # If set, the version check will not be performed. [switch] $SkipVersionCheck, # Export the results to a CSV file. [Parameter(HelpMessage = 'Export the results to a CSV file. Use with -OutputFolder to specify the folder.')] [switch] $ExportCsv, # Export the results to an Excel file. [Parameter(HelpMessage = 'Export the results to an Excel file. Use with -OutputFolder to specify the folder.')] [switch] $ExportExcel, # Do not show the Maester logo. [Parameter(HelpMessage = 'Do not show the logo when starting Maester.')] [switch] $NoLogo, # The root directory for configuration drift tracking. [Parameter(HelpMessage = 'Specify drift root directory, see https://maester.dev/docs/tests/MT.1060')] [string] $DriftRoot ) function GetDefaultFileName() { $timestamp = Get-Date -Format "yyyy-MM-dd-HHmmss" return "TestResults-$timestamp.html" } function ValidateAndSetOutputFiles($out) { $result = $null if (![string]::IsNullOrEmpty($out.OutputHtmlFile)) { if ($out.OutputHtmlFile.EndsWith(".html") -eq $false) { $result = "The OutputHtmlFile parameter must have an .html extension." } } if (![string]::IsNullOrEmpty($out.OutputMarkdownFile)) { if ($out.OutputMarkdownFile.EndsWith(".md") -eq $false) { $result = "The OutputMarkdownFile parameter must have an .md extension." } } if (![string]::IsNullOrEmpty($out.OutputJsonFile)) { if ($out.OutputJsonFile.EndsWith(".json") -eq $false) { $result = "The OutputJsonFile parameter must have a .json extension." } } $someOutputFileHasValue = ![string]::IsNullOrEmpty($out.OutputHtmlFile) -or ` ![string]::IsNullOrEmpty($out.OutputMarkdownFile) -or ![string]::IsNullOrEmpty($out.OutputJsonFile) if ([string]::IsNullOrEmpty($out.OutputFolder) -and !$someOutputFileHasValue) { # No outputs specified. Set default folder. $out.OutputFolder = "./test-results" } if (![string]::IsNullOrEmpty($out.OutputFolder)) { # Create the output folder if it doesn't exist. New-Item -Path $out.OutputFolder -ItemType Directory -Force | Out-Null if ([string]::IsNullOrEmpty($out.OutputFolderFileName)) { # Generate a default filename. $timestamp = Get-Date -Format "yyyy-MM-dd-HHmmss" $out.OutputFolderFileName = "TestResults-$timestamp" } $out.OutputHtmlFile = Join-Path $out.OutputFolder "$($out.OutputFolderFileName).html" $out.OutputMarkdownFile = Join-Path $out.OutputFolder "$($out.OutputFolderFileName).md" $out.OutputJsonFile = Join-Path $out.OutputFolder "$($out.OutputFolderFileName).json" if($ExportCsv.IsPresent) { $out.OutputCsvFile = Join-Path $out.OutputFolder "$($out.OutputFolderFileName).csv" } if($ExportExcel.IsPresent) { $out.OutputExcelFile = Join-Path $out.OutputFolder "$($out.OutputFolderFileName).xlsx" } } return $result } function GetPesterConfiguration($Path, $Tag, $ExcludeTag, $PesterConfiguration) { if (!$PesterConfiguration) { $PesterConfiguration = New-PesterConfiguration } $PesterConfiguration.Run.PassThru = $true $PesterConfiguration.Output.Verbosity = $Verbosity if ($Path) { $PesterConfiguration.Run.Path = $Path } else { if (Test-Path -Path "./powershell/tests/pester.ps1") { # Internal dev, exclude Maester's core tests $PesterConfiguration.Run.Path = "./tests" } } if ($Tag) { $PesterConfiguration.Filter.Tag = $Tag } if ($ExcludeTag) { $PesterConfiguration.Filter.ExcludeTag = $ExcludeTag } return $PesterConfiguration } $version = Get-MtModuleVersion if ( $NonInteractive.IsPresent -or $NoLogo.IsPresent ) { Write-Verbose "Running Maester v$Version" } else { # ASCII Art using style "ANSI Shadow" $motd = @" ███╗ ███╗ █████╗ ███████╗███████╗████████╗███████╗██████╗ ████╗ ████║██╔══██╗██╔════╝██╔════╝╚══██╔══╝██╔════╝██╔══██╗ ██╔████╔██║███████║█████╗ ███████╗ ██║ █████╗ ██████╔╝ ██║╚██╔╝██║██╔══██║██╔══╝ ╚════██║ ██║ ██╔══╝ ██╔══██╗ ██║ ╚═╝ ██║██║ ██║███████╗███████║ ██║ ███████╗██║ ██║ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ v$version "@ Write-Host -ForegroundColor Green $motd } # Reset the graph cache and urls to avoid stale data. Clear-ModuleVariable if (-not $DisableTelemetry) { Write-Telemetry -EventName InvokeMaester } $isMail = $null -ne $MailRecipient $isTeamsChannelMessage = -not ([String]::IsNullOrEmpty($TeamId) -or [String]::IsNullOrEmpty($TeamChannelId)) $isWebUri = -not ([String]::IsNullOrEmpty($TeamChannelWebhookUri)) if ($SkipGraphConnect) { Write-Host "🔥 Skipping graph connection check" -ForegroundColor Yellow } else { if (!(Test-MtContext -SendMail:$isMail -SendTeamsMessage:$isTeamsChannelMessage)) { if ($NonInteractive.IsPresent -or $NoLogo.IsPresent) { Write-Host " ⚠️ Non-interactive mode: running with missing permissions" -ForegroundColor Yellow } else { return } } } # Initialize MtSession after Graph connected. Initialize-MtSession if ($isWebUri) { # Check if TeamChannelWebhookUri is a valid URL. $urlPattern = '^(https)://[^\s/$.?#].[^\s]*$' if (-not ($TeamChannelWebhookUri -match $urlPattern)) { Write-Output "⚠️ Invalid Webhook URL: $TeamChannelWebhookUri" return } } $out = [PSCustomObject]@{ OutputFolder = $OutputFolder OutputFolderFileName = $OutputFolderFileName OutputHtmlFile = $OutputHtmlFile OutputMarkdownFile = $OutputMarkdownFile OutputJsonFile = $OutputJsonFile OutputCsvFile = $null OutputExcelFile = $null } $result = ValidateAndSetOutputFiles $out if ($result) { Write-Error -Message $result return } # Exclude LongRunning tests unless: $IncludeLongRunning is present, or LongRunning is in $Tag, or CAWhatIf is in $Tag. if ( (-not $IncludeLongRunning.IsPresent) -and "LongRunning" -notin $Tag -and "CAWhatIf" -notin $Tag ) { $ExcludeTag += "LongRunning" } # If $Tag is not set and IncludePreview is not passed, run all tests except the ones with the "Preview" tag. if (-not $Tag) { if (-not $IncludePreview.IsPresent) { $ExcludeTag += "Preview" } } # Include tests tagged as "Preview" if "Full" is included in $Tag. Included for backward compatibility with deprecated tags. if ("Full" -in $Tag) { $Tag += "Preview" } # Warn about deprecated tag usage. $DeprecatedTags = @('All','Full') $UsedDeprecatedTags = $DeprecatedTags | Where-Object { $Tag -contains $_ -or $ExcludeTag -contains $_ } if ($UsedDeprecatedTags) { Write-Warning "The 'All' and 'Full' tags are being deprecated and will be removed in a future release. Please use the following tags instead: `n`nLongRunning: Tests that can take a long time to run when the tenant has a large number of objects. Replaces 'Full'.`nPreview : Tests that are still being tested or are dependent on preview APIs. Replaces 'All'." } $pesterConfig = GetPesterConfiguration -Path $Path -Tag $Tag -ExcludeTag $ExcludeTag -PesterConfiguration $PesterConfiguration $Path = $pesterConfig.Run.Path.value Write-Verbose "Merged configuration: $($pesterConfig | ConvertTo-Json -Depth 5 -Compress)" if ( Test-Path -Path $Path -PathType Leaf ) { Write-Host "The path '$Path' is a file. Please provide a folder path." -ForegroundColor Red Write-Host "💫 Update-MaesterTests" -NoNewline -ForegroundColor Green Write-Host " → Get the latest tests built by the Maester team and community." -ForegroundColor Yellow return } if ( -not ( Test-Path -Path $Path -PathType Container ) ) { Write-Host "The path '$Path' does not exist." -ForegroundColor Red Write-Host "💫 Update-MaesterTests" -NoNewline -ForegroundColor Green Write-Host " → Get the latest tests built by the Maester team and community." -ForegroundColor Yellow return } if ( -not ( Get-ChildItem -Path "$Path\*.Tests.ps1" -Recurse ) ) { Write-Host "No test files found in the path '$Path'." -ForegroundColor Red Write-Host "💫 Update-MaesterTests" -NoNewline -ForegroundColor Green Write-Host " → Get the latest tests built by the Maester team and community." -ForegroundColor Yellow return } # If DriftRoot is specified, set the environment variable for drift tests. if ($DriftRoot) { $DriftRoot = (Resolve-Path -Path $DriftRoot -ErrorAction SilentlyContinue).Path if (-not (Test-Path -Path $DriftRoot)) { Write-Warning "❌ The specified drift root directory '$DriftRoot' does not exist." } else { Set-Item -Path Env:\MAESTER_FOLDER_DRIFT -Value $DriftRoot Write-Verbose "🧪 Drift root directory set to: $DriftRoot" } } else { # Set the default drift root directory. # Set-Item -Path Env:\MAESTER_FOLDER_DRIFT -Value $(Join-Path -Path (Get-Location) -ChildPath "drift") } $maesterResults = $null Set-MtProgressView Write-MtProgress -Activity "Starting Maester" -Status "Reading Maester config..." -Force Write-Verbose "Reading Maester config from: $Path" $__MtSession.MaesterConfig = Get-MtMaesterConfig -Path $Path Write-MtProgress -Activity "Starting Maester" -Status "Discovering tests to run..." -Force $pesterResults = Invoke-Pester -Configuration $pesterConfig if ($pesterResults) { Write-MtProgress -Activity "Processing test results" -Status "$($pesterResults.TotalCount) test(s)" -Force $maesterResults = ConvertTo-MtMaesterResult $PesterResults if (![string]::IsNullOrEmpty($out.OutputJsonFile)) { $maesterResults | ConvertTo-Json -Depth 5 -WarningAction SilentlyContinue | Out-File -FilePath $out.OutputJsonFile -Encoding UTF8 } if (![string]::IsNullOrEmpty($out.OutputMarkdownFile)) { Write-MtProgress -Activity "Creating markdown report" $output = Get-MtMarkdownReport -MaesterResults $maesterResults $output | Out-File -FilePath $out.OutputMarkdownFile -Encoding UTF8 } if (![string]::IsNullOrEmpty($out.OutputCsvFile)) { Write-MtProgress -Activity "Creating CSV" Convert-MtResultsToFlatObject -InputObject $maesterResults -CsvFilePath $out.OutputCsvFile } if (![string]::IsNullOrEmpty($out.OutputExcelFile)) { Write-MtProgress -Activity "Creating Excel workbook" Convert-MtResultsToFlatObject -InputObject $maesterResults -ExcelFilePath $out.OutputExcelFile } if (![string]::IsNullOrEmpty($out.OutputHtmlFile)) { Write-MtProgress -Activity "Creating html report" $output = Get-MtHtmlReport -MaesterResults $maesterResults $output | Out-File -FilePath $out.OutputHtmlFile -Encoding UTF8 Write-Host "🔥 Maester test report generated at $($out.OutputHtmlFile)" -ForegroundColor Green if ( ( Get-MtUserInteractive ) -and ( -not $NonInteractive ) ) { # Open test results in the default browser. Invoke-Item $out.OutputHtmlFile | Out-Null } } if ($MailRecipient) { Write-MtProgress -Activity "Sending mail" Send-MtMail -MaesterResults $maesterResults -Recipient $MailRecipient -TestResultsUri $MailTestResultsUri -UserId $MailUserId } if ($TeamId -and $TeamChannelId) { Write-MtProgress -Activity "Sending Teams message" Send-MtTeamsMessage -MaesterResults $maesterResults -TeamId $TeamId -TeamChannelId $TeamChannelId -TestResultsUri $MailTestResultsUri } if ($TeamChannelWebhookUri) { Write-MtProgress -Activity "Sending Teams message" Send-MtTeamsMessage -MaesterResults $maesterResults -TeamChannelWebhookUri $TeamChannelWebhookUri -TestResultsUri $MailTestResultsUri } if ($Verbosity -eq 'None') { # Show final summary. Write-Host "`nTests Passed ✅: $($pesterResults.PassedCount), " -NoNewline -ForegroundColor Green Write-Host "Failed ❌: $($pesterResults.FailedCount), " -NoNewline -ForegroundColor Red Write-Host "Skipped ⚫: $($pesterResults.SkippedCount) " -NoNewline -ForegroundColor DarkGray Write-Host "Not Run ⚫: $($pesterResults.NotRunCount)`n" -ForegroundColor DarkGray } if (-not $SkipVersionCheck -and 'Next' -ne $version) { # Don't check version if running in dev. Get-IsNewMaesterVersionAvailable | Out-Null } Write-MtProgress -Activity "🔥 Completed tests" -Status "Total $($pesterResults.TotalCount) " -Completed -Force # Clear progress bar. } Reset-MtProgressView if ($PassThru) { return $maesterResults } } # SIG # Begin signature block # MIIu5AYJKoZIhvcNAQcCoIIu1TCCLtECAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCMVgNs/d8/dbMN # o+pdzDvq99H2yBOvh3HYw+rm0EsQv6CCE5EwggWQMIIDeKADAgECAhAFmxtXno4h # MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z # ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 # IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z # G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ # anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s # Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL # 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb # BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3 # JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c # AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx # YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0 # viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL # T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud # EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf # Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk # aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS # PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK # 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB # cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp # 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg # dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri # RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7 # 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5 # nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3 # i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H # EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G # CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 # IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz # ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C # 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce # 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da # E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T # SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA # FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh # D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM # 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z # 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05 # huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY # mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP # /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T # AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD # VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG # A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY # aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj # ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV # HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU # cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN # BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry # sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL # IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf # Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh # OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh # dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV # 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j # wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH # Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC # XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l # /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW # eE4wggdFMIIFLaADAgECAhAP1Kd7fuviGgjvj8ZCqpTVMA0GCSqGSIb3DQEBCwUA # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz # ODQgMjAyMSBDQTEwHhcNMjUwNDEwMDAwMDAwWhcNMjgwNzA2MjM1OTU5WjBNMQsw # CQYDVQQGEwJERTEQMA4GA1UEBxMHSGFtYnVyZzEVMBMGA1UEChMMRmFiaWFuIEJh # ZGVyMRUwEwYDVQQDEwxGYWJpYW4gQmFkZXIwggIiMA0GCSqGSIb3DQEBAQUAA4IC # DwAwggIKAoICAQCJI0Z1dyHcnutVp/vdHkC2p3oq9xB8JqGYqLRMR/SoBLgI5i+V # 3AWxu45/ue9MKtlBRlV5d7UAgVoFd9E/aB/aExr0Oj69sPmuI+O2zPozn6UMc9ci # tp8L2JRHNpN9KWuA06dmUD/VYPRgqmNtGQFW57XaEJ8klHPDxGuigxzudqJveifK # QjRoRlSileoVhyjlt6tEyorfRgd1VVWFxkso1qVEjn3ucml+DzrA+ZKiDp//C8+N # TMu9qMecEsXWPk4qhCla7MO1XpDJb8NE/4WY+PYFrwpxSwiBisWlpA8cgf7i7dhI # 4P9kTMZz8Cl5OB8/DrsZuv0Fxwmmu88b4uo7nI3HwzfnU/wkNO92g8cywdXHgMDp # IT++srZXnSQG+Pc4TFAQ8dHHBHxabqTSoZpNYQXQySVSvbpavpcAOhgBg4x2gefD # Y7Y+iEoLXxwFMIQE908pFHj6+iLlmiKHWLt5eSXtwXoJ83XykFlUXTQ9WW+eo9YI # lB0GZrwq/4g6nx7mWVG3lIcbfF7oDLUt1d7FhqhWHboYTlRMfkVpOz3TCjma9PY3 # R34n7ejn6cF+kkBK6EX3otlmBtb2sXdPModfceLJbfoU0X1la5tExpQjDHbQ8p/5 # HZLFQ0aGe7BDqBKW3HvIQjw81KMUXBToYvODHXiTNlQl1AZHpZCAf/YnKQIDAQAB # o4ICAzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0O # BBYEFM+bqr/hMxUPyRKDe3JjUSSVDqK/MD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkw # JwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8B # Af8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGg # T4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29k # ZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9j # cmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB # NDA5NlNIQTM4NDIwMjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEF # BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRw # Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2ln # bmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3 # DQEBCwUAA4ICAQBKBhy38Rsh6QNW5pFN6JD9MFjRO9NBJGtwVo1J4/DGrtBVQuyV # wQC9eB1LFgUsKcUWb0hjnS2/J0W3sC9Tt9LHVvhyh+g0Vba+kq3hE284I0C33gaG # P0Orfepx03oSOX/js0OK3+M5f47bSpeOP4t30ms7STRQKK4KQIAN2MBv3uZ0zO/5 # 695DjB9N1chLPEm82Vn6jtdrq3IJTpPBfksd3V8Ex215LiJLeU2E5EuIfiu/PI22 # M8L4zpXkXlZRUXCfppQA7vjQtzFudl2PqqVVb4+4gyAu/bWRNkVx+D6lAN0hMewh # PiFwKDoPwO+cycQ5I6IaFEHONcEEANov6XoaCxQoIoXMd3tm3VEl5Wr9yXEEL+hn # CpcPmGE1d1iloJC0/Uf/TCsf1dSYd2vY4aRdess1GAidk2T27SrkmoHpdvZdYdNA # ts2doFCTyI6sV2c/jYMpL2NJOYWbhq5AxOuu+DLiw1kDsc/KPmrTuSzBGb7nBuJs # 0QHR4toabNeYUGyKzMJGeibhy434gfyXXLKOWaik8NceybN4M1kROqHL/+PtB5zf # Z1me2ygRrKtaP6RJXGvc8EcP5CEdlQOL6tiCg2ARMTYNxnsiLN9mRU9hkzo9BSJ4 # Vm+C6RKABzZj0whAObyqL/PceLKuAqvGoXbhGx8fXhKEgbnSoJ3VsqROFjGCGqkw # ghqlAgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu # MUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0 # MDk2IFNIQTM4NCAyMDIxIENBMQIQD9Sne37r4hoI74/GQqqU1TANBglghkgBZQME # AgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM # BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqG # SIb3DQEJBDEiBCDtSWydB8OsieHLBd7Sf+95rPPRlnizmtQP1qZXwtX+tTANBgkq # hkiG9w0BAQEFAASCAgBs0l9UhOu4TRclon5nO0YjjJVDmdcQAPIxFxxiUgVDw1/U # ziz19Dx10CAHmg3+i5voJ+X//2UH4DJwzf7pWnLGHYwTlshm7SQfWUDuNonTovBL # oZ+Et58JgXhZ7EEAbSkS6pCIufa74Ime2iClQ4tyM/LpDSWR78/rH6jgXFGz8ooC # M70gkDFz2Dw14VY0xsYdFHCWWVkoPcSSEHDtwo8ZeDft7sRwWMdVq7Ql7XUrosp9 # xIq3KiSWg01b2u95SqIfQB4Tv6P5OlicvhdHU+KwNGbs8pBK5lN5IFXRPgZWQU1W # Pn1ojABB2cGfVU0bT5HFuV5a+WS92B1NA1DEeeVMMgFnfMF9A6vKkZWwuHc5Ryep # 9MtolypKbjUgjgFain12i9TmpRpmZ5j8mlfCAxmedClZp+w7H67neHlcjYajqXqZ # gu/gCU8EtAM1kOvAZ0C3TZDWGEFAydsy5NxaFSKxWNTx/xIRzg/gECreeSYAjmPp # QrssR+leclK+L7JWpvHfu+mTOjrAO0Usjmd9gGRF8UTxrqOpQQd/orV2IJgW/Ze5 # HoPzLIUdvXG8wK/Xu/RJOUdBL+CYX09vxqEp7Rr+1coeJDucQ0fLSFldrp9QJbNG # ucRbZKo4X69gMr+zfxsp4Brg4W8FZoD1sbgDcIOUn/9FoCVYUVMgM0F4nrwGkaGC # F3YwghdyBgorBgEEAYI3AwMBMYIXYjCCF14GCSqGSIb3DQEHAqCCF08wghdLAgED # MQ8wDQYJYIZIAWUDBAIBBQAwdwYLKoZIhvcNAQkQAQSgaARmMGQCAQEGCWCGSAGG # /WwHATAxMA0GCWCGSAFlAwQCAQUABCDBYez49of5w/6wzSJMNnLX7ZiXX+No/OqV # jCJDBwje/gIQPzSOMQ+YYAFIqOWDOrp06RgPMjAyNTA5MTYwOTQyMTNaoIITOjCC # Bu0wggTVoAMCAQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcNAQELBQAwaTEL # MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhE # aWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAy # MDI1IENBMTAeFw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTlaMGMxCzAJBgNV # BAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNl # cnQgU0hBMjU2IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAyMDI1IDEwggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0OquYFazK1e6b1H/ # hnAKAd/KN8wZQjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fGTfr6PHRNv6T7 # zsf1Y/E3IU8kgNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6qJnuzK8Vcn0D # vbDMemQFoxQ2Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXUP/5wWWURK+If # xiOg8W9lKMqzdIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKLkzGBTpx6EYev # vOi7XOc4zyh1uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6lPAw/p4oDSRZr # eiwB7x9ykrjS6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ6SXiLSvw4Smz # 8U07hqF+8CTXaETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T+dYaNcwafsVC # GZKUhQPL1naFKBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2ePZD5pPIssosz # QyF4//3DoK2O65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03UuT1j7FnrqVrOz # aQoVJOeeStPeldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe2LnwJKa8TIlw # CUNVwppwn4D3/Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIwADAdBgNVHQ4E # FgQU5Dv88jHt/f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729TSunkBnx6yuKQ # VvYv1Ensy04wDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI # MIGVBggrBgEFBQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln # aWNlcnQuY29tMF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAy # NUNBMS5jcnQwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIw # MjVDQTEuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkq # hkiG9w0BAQsFAAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYiT9s1i6UKtW+F # ERp8FgXRGQ/YAavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+Dui4I4PCvHpQ # uPqFgqp1PzC/ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7JIIgt0GCFD9kt # x0LxxtRQ7vllKluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARzFAWgeW3az2xe # jEWLNN4eKGxDJ8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJAxZMVBrTE2oi0 # fcI8VMbtoRAmaaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG/syTRLLhAezu # /3Lr00GrJzPQFnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/5cHelAK2/gTl # QJINqDr6JfwyYHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXMZUXBhtCyIaeh # r0XkBoDIGMUG1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWMts0VlRYxe5nK # +At+DI96HAlXHAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyCYG2j+bdpxo/1 # Cy4uPcU3AWVPGrbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVzgiFI7Gq3zWcw # gga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0GCSqGSIb3DQEBCwUAMGIx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBH # NDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTlaMGkxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1 # c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHTCphBcr48RsAcrHXbo0Zo # dLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPhof6pvF4uGjwjqNjfEvUi # 6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mAxAHeHYNnQxqXmRinvuNg # xVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBvMgEdgkFiDNYiOTx4OtiF # cMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps0wjUjsZvkgFkriK9tUKJ # m/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF83bRVFLeGkuAhHiGPMvS # GmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXiUOeSLsJygoLPp66bkDX1 # ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOMCZIVNSaz7BX8VtYGqLt9 # MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydPpOjL6s36czwzsucuoKs7 # Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrUG2ZdSoQbU2rMkpLiQ6bG # RinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+sdFUeEY0qVjPKOWug/G6 # X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAd # BgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYDVR0jBBgwFoAU7NfjgtJx # XWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF # BwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln # aWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJo # dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy # bDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQEL # BQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WIGjB/T8ObXAZz8OjuhUxj # aaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+IQhQE7jU/kXjjytJgnn0 # hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8Myb9rEVKChHyfpzee5kH0 # F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2th9y1IsA0QF8dTXqvcnT # mpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjajV/gxdEkMx1NKU4uHQcKf # ZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2Lr3ty9qIijanrUR3anzE # wlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFzeGxcytL5TTLL4ZaoBdqbh # OhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG7uEBYTptMSbhdhGQDpOX # gpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+NJpud/v4+7RWsWCiKi9EO # LLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckTetiSuEtQvLsNz3Qbp7wG # WqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszWkPZPubdcMIIFjTCCBHWg # AwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcN # MjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMG # A1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw # HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp # pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+ # n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYykt # zuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw # 2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6Qu # BX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC # 5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK # 3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3 # IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEP # lAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98 # THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3l # GwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJx # XWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8w # DgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0 # cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1Ud # HwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz # c3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEB # DAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi # 7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqL # sl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo # 0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVg # HAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnw # toeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYIDfDCCA3gCAQEwfTBpMQswCQYDVQQG # EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 # IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0Ex # AhAKgO8YS43xBYLRxHanlXRoMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJ # AzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjUwOTE2MDk0MjEzWjAr # BgsqhkiG9w0BCRACDDEcMBowGDAWBBTdYjCshgotMGvaOLFoeVIwB/tBfjAvBgkq # hkiG9w0BCQQxIgQgP1R68cWO0q6ymXY+Kw9QRvy3501y1MKYzQ2NQf/EgPMwNwYL # KoZIhvcNAQkQAi8xKDAmMCQwIgQgSqA/oizXXITFXJOPgo5na5yuyrM/420mmqM0 # 8UYRCjMwDQYJKoZIhvcNAQEBBQAEggIANFI+Ejs8xFNAGkPE6LbUVXxr6fJdwUCj # fveKUqxVHZzjJkzOwD7w7aF4dYuqiZ/RlxDYB9YMx2yWPl2R5V6p8wK/vv520gIu # dHKm7I2l3CGk17RXzRVpQ2Y0D+IPvj/41qpbT3z4GJCrk/zftGtfqkDwTnimEIQ0 # DqWklROd3J5VpQBBwsJtd2k4UXFVIuGw+esHb16OSyjKeCBA66C5eFtq11P9txuD # GGp7iQSjmihEe7+Lepd5EusEYhGXTzlTKLJgNkFVegqKm+y5ClYlycpu7N1mlGGQ # 8keChJum8vM64gPryrhRWDKCNLyW1Y3rLkxVmgJWaONdwBrVy4j8zIFDD8N+itIK # 3UYi6IeQI/3jAzsUJd05Uic4rOJWtVqNcpDnT+uAh6qFfXDn3uSV3HCx3qrRtVzO # EwNnryf+xd48O5wNs2stzQwF1Hp2yCTkOE75SFMitrz6VZn6WX/YMbtVQjntrtRn # XgbUBqVn6uoNk8QWtGiHKGDD4wllUW38e6Hy42FtYfCg8LoBizXxjMWiDmhRX+ow # Zhu9W9mMGdvdlRCk3uR3oU/6UK13mkB/S99vGlCOPsQy1ZPun8iJWKsK4K9sRETG # r6J5tzoXvkuiAjVrUORvJVQhRuVjeUoYxeP/zkAv+6sVTJOK5MlqTCfx27faIsyf # 3MLUsiBcrNo= # SIG # End signature block |