functions/DailyBuild/Prepare-DailyBuildBranch.ps1

<#
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at https://mozilla.org/MPL/2.0/.
#>


[CmdletBinding()]
param(
    [string]$OrganizationUri = $env:SYSTEM_COLLECTIONURI,
    [string]$Project = $env:SYSTEM_TEAMPROJECTID,
    [string]$RepositoryName = $env:BUILD_REPOSITORY_NAME,
    [string]$DailyBuildBranch = 'daily-build',
    [ValidateSet('merge', 'squash')]
    [string]$MergeStrategy = 'merge',
    [int]$DefaultPriority = 100,
    [string]$Pat = $env:DEVOPS_PAT,
    [switch]$SkipUnchangedPush
)


if ($MyInvocation.InvocationName -eq '.') {
    return
}

$gitArgs = @(
    '-c',
    "http.extraheader=AUTHORIZATION: Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("PAT:$Pat")))"
)

function Resolve-PullRequestPriority {
    param(
        [Parameter(Mandatory = $true)]
        $Labels
    )

    $resolved = $DefaultPriority
    foreach ($label in @($Labels | ForEach-Object { $_.name })) {
        if ($label -match '^priority:(\d+)$') {
            $val = [int]$Matches[1]
            if ($val -lt $resolved) { $resolved = $val }
        }
    }
    return $resolved
}

function Invoke-Git {
    param(
        [Parameter(Mandatory = $true)]
        [string[]]$Args
    )

    & git @gitArgs @Args
    if ($LASTEXITCODE -ne 0) {
        throw "git $($Args -join ' ') failed with exit code $LASTEXITCODE."
    }
}

function Get-CommitIdentity {
    param(
        [Parameter(Mandatory = $true)]
        [string]$Ref
    )

    $identity = & git @gitArgs 'show' '--no-patch' "--format=%an`n%ae" $Ref
    if ($LASTEXITCODE -ne 0) {
        throw "Failed to resolve commit identity for $Ref."
    }

    $identityLines = @($identity | Where-Object { $_ -ne $null })
    if ($identityLines.Count -lt 2) {
        throw "Commit identity for $Ref is incomplete."
    }

    return @{
        Name  = $identityLines[0]
        Email = $identityLines[1]
    }
}

function Invoke-GitWithCommitIdentity {
    param(
        [Parameter(Mandatory = $true)]
        [hashtable]$Identity,
        [Parameter(Mandatory = $true)]
        [string[]]$Args
    )

    & git @gitArgs '-c' "user.name=$($Identity.Name)" '-c' "user.email=$($Identity.Email)" @Args
    if ($LASTEXITCODE -ne 0) {
        throw "git $($Args -join ' ') failed with exit code $LASTEXITCODE."
    }
}

function Get-BuildResultsUrl {
    $collectionUri = if ($env:SYSTEM_COLLECTIONURI) { $env:SYSTEM_COLLECTIONURI } else { $OrganizationUri }
    if ([string]::IsNullOrWhiteSpace($collectionUri)) {
        return ''
    }

    $buildId = $env:BUILD_BUILDID
    if ([string]::IsNullOrWhiteSpace($buildId)) {
        return ''
    }

    $projectName = if ($env:SYSTEM_TEAMPROJECT) { $env:SYSTEM_TEAMPROJECT } else { $Project }
    $baseUri = $collectionUri.TrimEnd('/')
    $queryParts = @{
        "buildId" = $buildId
        'view'    = 'logs'
        "j"       = $env:SYSTEM_JOBID
        "t"       = $env:SYSTEM_TASKINSTANCEID
        "s"       = $env:SYSTEM_STAGEID
    }

    $queryString = ($queryParts.GetEnumerator() | ForEach-Object { "$($_.Key)=$([uri]::EscapeDataString($_.Value))" }) -join '&'

    return "$baseUri/$([Uri]::EscapeDataString($projectName))/_build/results?$queryString"
}

function Set-PullRequestStatus {
    param(
        [Parameter(Mandatory = $true)]
        [int]$PullRequestId,
        [Parameter(Mandatory = $true)]
        [int]$IterationId,
        [Parameter(Mandatory = $true)]
        [ValidateSet('succeeded', 'failed', 'pending', 'notSet', 'error')]
        [string]$State,
        [Parameter(Mandatory = $true)]
        [string]$Description
    )

    $authHeader = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("PAT:$Pat")))"
    $targetUrl = Get-BuildResultsUrl
    $body = @{
        state       = $State
        description = $Description
        iterationId = $IterationId
        context     = @{
            name  = 'daily-build'
            genre = 'daily-build'
        }
        targetUrl   = $targetUrl
    } | ConvertTo-Json
    $uri = "$OrganizationUri/$([Uri]::EscapeDataString($Project))/_apis/git/repositories/$repositoryId/pullRequests/$PullRequestId/statuses?api-version=7.1"
    try {
        Invoke-RestMethod -Uri $uri -Method Post -Body $body -ContentType 'application/json' -Headers @{ Authorization = $authHeader } | Out-Null
    }
 catch {
        Write-Warning "Failed to post status to PR !$PullRequestId : $_"
    }
}

function Get-LatestPullRequestIteration {
    param(
        [Parameter(Mandatory = $true)]
        [int]$PullRequestId
    )

    $authHeader = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("PAT:$Pat")))"
    $uri = "$OrganizationUri/$([Uri]::EscapeDataString($Project))/_apis/git/repositories/$repositoryId/pullRequests/$PullRequestId/iterations?includeCommits=false&api-version=7.1"
    $response = Invoke-RestMethod -Uri $uri -Method Get -Headers @{ Authorization = $authHeader }

    if (-not $response -or -not $response.value -or $response.value.Count -eq 0) {
        throw "No iterations found for PR !$PullRequestId."
    }

    # The API returns iterations in ascending order; the last one is the current iteration.
    return $response.value[-1]
}

function Resolve-IterationIdForStatus {
    param(
        [Parameter(Mandatory = $true)]
        $PullRequestItem
    )

    if ($PullRequestItem.PSObject.Properties.Name -contains 'Iteration' -and $PullRequestItem.Iteration -and $PullRequestItem.Iteration.Id) {
        return [int]$PullRequestItem.Iteration.Id
    }

    return 1
}

az devops configure --defaults organization=$OrganizationUri project=$Project

# future idea - dependency-aware ordering (depends-on PR list)
$prResponse = az repos pr list --repository "$RepositoryName" --target-branch main --status active --query '[?!isDraft]' --output json
$pr = ($prResponse | ConvertFrom-Json)
$pr = $pr | Where-Object {
    if (!$_.labels) { $_.labels = @() }
    $labelNames = @($_.labels | ForEach-Object { $_.name })
    $labelNames -notcontains 'AutoMergeIgnore'
}

$pr = $pr | Sort-Object -Property @(
    @{ Expression = { Resolve-PullRequestPriority $_.labels }; Ascending = $true },
    @{ Expression = { $_.pullRequestId }; Ascending = $true }
)

$repositoryId = (az repos show --repository "$RepositoryName" --query id --output tsv).Trim()

Invoke-Git @('fetch', 'origin', 'main')
Invoke-Git @('checkout', '-B', $DailyBuildBranch, 'origin/main')
$mergeLabelScriptPath = Join-Path (Split-Path $PSScriptRoot -Parent) 'MergeDriver/Merge-LabelFile.ps1'
if (Test-Path -Path $mergeLabelScriptPath) {
    Invoke-Git @('config', 'merge.d365fo-label.driver', "pwsh -File `"$mergeLabelScriptPath`" -Base %O -Ours %A -Theirs %B -MarkerSize %L -FilePath %P")
}
else {
    Write-Verbose "Merge label driver script not found at $mergeLabelScriptPath. Skipping merge.d365fo-label.driver configuration."
}
$mergedPRs = @()
$skippedPRs = @()

foreach ($item in $pr) {
    if (-not $item.sourceRefName) {
        Write-Warning "Skipping PR $($item.pullRequestId): missing sourceRefName."
        continue
    }

    if ($item.supportsIterations) {
        $iteration = Get-LatestPullRequestIteration -PullRequestId $item.pullRequestId
        $item | Add-Member -MemberType NoteProperty -Name Iteration -Value $iteration
        if ($item.lastMergeSourceCommit.commitId -ne $item.Iteration.sourceRefCommit.commitId) {
            Write-Warning "Skipping PR $($item.pullRequestId): source branch has new commits since last iteration."
            $skippedPRs += $item
            continue
        }
    }

    $sourceBranch = $item.sourceRefName -replace '^refs/heads/', ''
    $resolvedPriority = Resolve-PullRequestPriority $item.labels
    $sourceIdentity = Get-CommitIdentity "origin/$sourceBranch"
    Write-Host "Merging PR $($item.pullRequestId) from $sourceBranch (priority: $resolvedPriority)"

    try {
        switch ($MergeStrategy) {
            'squash' {
                Invoke-Git @('merge', '--squash', "origin/$sourceBranch")
                Invoke-GitWithCommitIdentity $sourceIdentity @('commit', '-m', "Squash PR !$($item.pullRequestId)")
            }
            default {
                Invoke-GitWithCommitIdentity $sourceIdentity @('merge', '--no-ff', "origin/$sourceBranch", '-m', "Merge PR !$($item.pullRequestId)")
            }
        }
        $mergedPRs += $item
    }
 catch {
        Write-Warning "Merge failed for PR $($item.pullRequestId) ($sourceBranch). Skipping."
        & git merge --abort | Out-Null
        & git reset --hard HEAD | Out-Null
        $skippedPRs += $item
        continue
    }
}

$shouldPush = $true
if ($SkipUnchangedPush) {
    # Silently try to fetch the remote daily-build branch (may not exist yet)
    & git @gitArgs fetch origin $DailyBuildBranch 2>$null | Out-Null
    # Check if the remote ref exists
    & git rev-parse --verify "origin/$DailyBuildBranch" 2>$null | Out-Null
    if ($LASTEXITCODE -eq 0) {
        # Compare trees; exit code 0 means no difference
        & git diff --quiet "origin/$DailyBuildBranch" HEAD
        if ($LASTEXITCODE -eq 0) {
            Write-Host "No content changes vs 'origin/$DailyBuildBranch' - skipping push."
            $shouldPush = $false
        }
    }
}

if ($shouldPush) {
    Invoke-Git @('push', '--force', 'origin', $DailyBuildBranch)
}

foreach ($item in $mergedPRs) {
    try {
        $iterationId = Resolve-IterationIdForStatus -PullRequestItem $item
        Set-PullRequestStatus -PullRequestId $item.pullRequestId -IterationId $iterationId -State 'succeeded' -Description "Merged into daily-build (iteration: $iterationId) $($item.lastMergeSourceCommit.commitId)"
    }
 catch {
        Write-Warning "Failed to post status for PR $($item.pullRequestId): $_"
    }
}
foreach ($item in $skippedPRs) {
    try {
        $iterationId = Resolve-IterationIdForStatus -PullRequestItem $item
        Set-PullRequestStatus -PullRequestId $item.pullRequestId -IterationId $iterationId -State 'failed' -Description "Merge conflict - skipped (iteration: $iterationId) $($item.lastMergeSourceCommit.commitId)"
    }
 catch {
        Write-Warning "Failed to post status for PR $($item.pullRequestId): $_"
    }
}

Write-Host ''
Write-Host '=== Daily Build Summary ==='
if ($mergedPRs.Count -gt 0) {
    $mergedList = ($mergedPRs | ForEach-Object { "!$($_.pullRequestId)" }) -join ', '
    Write-Host "Merged: $mergedList"
}
else {
    Write-Host 'Merged: (none)'
}
if ($skippedPRs.Count -gt 0) {
    $skippedList = ($skippedPRs | ForEach-Object { "!$($_.pullRequestId) (merge conflict)" }) -join ', '
    Write-Host "Skipped: $skippedList"
}
else {
    Write-Host 'Skipped: (none)'
}

# SIG # Begin signature block
# MII9CAYJKoZIhvcNAQcCoII8+TCCPPUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAoWKhCzhaLrC99
# qZackd8Ix2t6eAXpP6xDEKclVfNiTqCCIcowggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggaSMIIEeqADAgECAhMzAAHN2pPd
# RvtxAVSpAAAAAc3aMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwNjA3MTgxMTExWhcNMjYwNjEw
# MTgxMTExWjBVMQswCQYDVQQGEwJTSTESMBAGA1UEBxMJTGp1YmxqYW5hMRgwFgYD
# VQQKEw9CRS10ZXJuYSBkLm8uby4xGDAWBgNVBAMTD0JFLXRlcm5hIGQuby5vLjCC
# AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAIuek4u1xxt98HTW6+qLZbQN
# s+tNW5N3QbpBfcBdMIcxChf0d0EI+cFASigGOgAEtE8tMwM/vE3Fu7hm1Vxt7m8a
# 32mQFKxDQuSiZ0p6KdcLO7otoBfIpzUZGyjtFnqcue2nssTF38Z4PwbpZE7daahS
# bVNtJqxeZiCJoxqF9vFFt4Sls0nFVrtzXkW82HrNuHzv+y9qGwmbMD2hhGd15jLO
# YUsQoAWpuB/Qf+N7W3cJZwF9wZe946lOK50c2GZzEI/6yDPHsK6PbuAh6+GupLdB
# gEPk6+4ikYD2AmgodGW7iU3O2fUP1pxxLYyqep+gKYPF5NvTlJTZcEdThOt8eJgk
# Sg4j+MzFwl/7DaiuIJvQCeLauXGBqrsjn1/6KmxUKEBUuSImzHy1mMB0aQCqtfOe
# 8De/gYCLRoPFnuhn42di2b+/FVOylHRGfjH0ote+XjXa22ihgUuYkl79gIFKI6Wx
# zSzeOLid2Hq0CeQvIYYWoAV/oWnXhDjcfCPL4mw9FwIDAQABo4IB1DCCAdAwDAYD
# VR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwOwYDVR0lBDQwMgYKKwYBBAGCN2EB
# AAYIKwYBBQUHAwMGGisGAQQBgjdhpOaoI4H67850gfzolDeutrtWMB0GA1UdDgQW
# BBQFyT8vKd7egKqCrAZDR3KVZHQ9WzAfBgNVHSMEGDAWgBRrJUHe+2t8/RiACi1/
# j3ZdqnM9uDBnBgNVHR8EYDBeMFygWqBYhlZodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBB
# T0MlMjBDQSUyMDA0LmNybDB0BggrBgEFBQcBAQRoMGYwZAYIKwYBBQUHMAKGWGh0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIw
# SUQlMjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwNC5jcnQwVAYDVR0gBE0w
# SzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTANBgkqhkiG9w0BAQwFAAOCAgEA
# nWo4TL4COzXcN0g2Roy9HuhXIcYwow4IYihK5OzzjiWmfxaoLylVGfrJoWuiWaH5
# 4RZIkxRmisk1eFPr8ls95NRxAwd2w5+tGslTnzqFl1Fi2u2JXwpHvjY7AwO+Svyi
# mAp3B+AimN6dJiV0CAgDFUZiHgEvYUwZO37QE7v9p0pa44bHEXoXPImoIFEowNTb
# Ro/sXyNgp9bjbpEbdcCv6z11KpHZGWW637gsZ9lEIY9qoWML81FnQOy8umHKzDt3
# wcK5Urd7B8K5zMX4mUdoxZbm/PNfr2EvMKmuagSANekb6oIp5llHC3UoTwEBlrDt
# frUIf2KvUAREDeGS2GGiQbflyy483C8FZZ44ore25q/9+C4xlSKzJU/Tw4021T1c
# yULVgQge5CLlvGQ+dFJe0ClXClpL6MOlUWTwRjTmyqmzaFSQavL8kSNvpsw8tE68
# Z3DBL0j5Pz+DHS8888BAtbCfNlm85bvYaNTNbV3ieC2il7k7yDHhIhRAj2E4halT
# W3hEGGsS4txGdQbUEvS80Kf3ERgRkKfD5whP06Gx18SwWxd1v1DsDO3yL5gjN9d2
# hxNPxP60c0SdxmPBTsPZZoOOKF+wps7N6jL8FKBjbV6AojUVdwkIg+/hxpQKXqUw
# ouPaqMLANxBmDs491R11/5p/NUHddT9F4bHQXLGq/ywwggaSMIIEeqADAgECAhMz
# AAHN2pPdRvtxAVSpAAAAAc3aMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jv
# c29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwNjA3MTgxMTExWhcN
# MjYwNjEwMTgxMTExWjBVMQswCQYDVQQGEwJTSTESMBAGA1UEBxMJTGp1YmxqYW5h
# MRgwFgYDVQQKEw9CRS10ZXJuYSBkLm8uby4xGDAWBgNVBAMTD0JFLXRlcm5hIGQu
# by5vLjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAIuek4u1xxt98HTW
# 6+qLZbQNs+tNW5N3QbpBfcBdMIcxChf0d0EI+cFASigGOgAEtE8tMwM/vE3Fu7hm
# 1Vxt7m8a32mQFKxDQuSiZ0p6KdcLO7otoBfIpzUZGyjtFnqcue2nssTF38Z4Pwbp
# ZE7daahSbVNtJqxeZiCJoxqF9vFFt4Sls0nFVrtzXkW82HrNuHzv+y9qGwmbMD2h
# hGd15jLOYUsQoAWpuB/Qf+N7W3cJZwF9wZe946lOK50c2GZzEI/6yDPHsK6PbuAh
# 6+GupLdBgEPk6+4ikYD2AmgodGW7iU3O2fUP1pxxLYyqep+gKYPF5NvTlJTZcEdT
# hOt8eJgkSg4j+MzFwl/7DaiuIJvQCeLauXGBqrsjn1/6KmxUKEBUuSImzHy1mMB0
# aQCqtfOe8De/gYCLRoPFnuhn42di2b+/FVOylHRGfjH0ote+XjXa22ihgUuYkl79
# gIFKI6WxzSzeOLid2Hq0CeQvIYYWoAV/oWnXhDjcfCPL4mw9FwIDAQABo4IB1DCC
# AdAwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwOwYDVR0lBDQwMgYKKwYB
# BAGCN2EBAAYIKwYBBQUHAwMGGisGAQQBgjdhpOaoI4H67850gfzolDeutrtWMB0G
# A1UdDgQWBBQFyT8vKd7egKqCrAZDR3KVZHQ9WzAfBgNVHSMEGDAWgBRrJUHe+2t8
# /RiACi1/j3ZdqnM9uDBnBgNVHR8EYDBeMFygWqBYhlZodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIw
# Q1MlMjBBT0MlMjBDQSUyMDA0LmNybDB0BggrBgEFBQcBAQRoMGYwZAYIKwYBBQUH
# MAKGWGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9z
# b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwNC5jcnQwVAYD
# VR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTANBgkqhkiG9w0BAQwF
# AAOCAgEAnWo4TL4COzXcN0g2Roy9HuhXIcYwow4IYihK5OzzjiWmfxaoLylVGfrJ
# oWuiWaH54RZIkxRmisk1eFPr8ls95NRxAwd2w5+tGslTnzqFl1Fi2u2JXwpHvjY7
# AwO+SvyimAp3B+AimN6dJiV0CAgDFUZiHgEvYUwZO37QE7v9p0pa44bHEXoXPImo
# IFEowNTbRo/sXyNgp9bjbpEbdcCv6z11KpHZGWW637gsZ9lEIY9qoWML81FnQOy8
# umHKzDt3wcK5Urd7B8K5zMX4mUdoxZbm/PNfr2EvMKmuagSANekb6oIp5llHC3Uo
# TwEBlrDtfrUIf2KvUAREDeGS2GGiQbflyy483C8FZZ44ore25q/9+C4xlSKzJU/T
# w4021T1cyULVgQge5CLlvGQ+dFJe0ClXClpL6MOlUWTwRjTmyqmzaFSQavL8kSNv
# psw8tE68Z3DBL0j5Pz+DHS8888BAtbCfNlm85bvYaNTNbV3ieC2il7k7yDHhIhRA
# j2E4halTW3hEGGsS4txGdQbUEvS80Kf3ERgRkKfD5whP06Gx18SwWxd1v1DsDO3y
# L5gjN9d2hxNPxP60c0SdxmPBTsPZZoOOKF+wps7N6jL8FKBjbV6AojUVdwkIg+/h
# xpQKXqUwouPaqMLANxBmDs491R11/5p/NUHddT9F4bHQXLGq/ywwggcoMIIFEKAD
# AgECAhMzAAAAFjGSjZICZXuaAAAAAAAWMA0GCSqGSIb3DQEBDAUAMGMxCzAJBgNV
# BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xNDAyBgNVBAMT
# K01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25pbmcgUENBIDIwMjEwHhcN
# MjYwMzI2MTgxMTI5WhcNMzEwMzI2MTgxMTI5WjBaMQswCQYDVQQGEwJVUzEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQg
# SUQgVmVyaWZpZWQgQ1MgQU9DIENBIDA0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEAylX6yNvoCTDP9G0OTlSjXbzgEsy21FDL17n/lZe2BrqHz2mR1aN4
# DBxeYp0/hjEqSHHyGfarV1NVBuvK8vLzW0LTi+DZt9In16aiNfgcogFiztWE9Fp8
# xu1zzrqE3nlrDWb+RZo8QrEXgWb8s8swsl2W7tREHycVkx+Hm1MLQIlva6jH/Xg4
# /8GIYhHzbXiVd2RXomw9s7Qh6/SYRXXfe125wh4EKEyKnNNl+cZUSrVBgWvvjrRw
# QY4if7sAZ805KruBY6WY0Hiba5nWvrq9Qk9o35ViAf8qZ+7u1fbb1vcCWyWLfx9h
# LSdBjjVsSWe0xLvI1j4p3Tjt5czz+1Lc0v5lQ1feB7nFmpbZrK2us0hvAaBCfOyD
# PEEm+735vzuNRYWJFL/PViI+REtjuJMcojEn3veQjIrwrmK0T9oSr8e3oDzK1oAw
# wZMTC4KymTvYUTVDJvL5N8OW/UqIBzsiVYcchZvGhV3yMYKgxeEtIOG4W4Z85Y5k
# pQi5bpjGXFxRg46RdrTaALt1RhRmLR7U0jVSr2aYAd2+Mp2qA5Gz3/loOOdt47eF
# Z3mrAYGYQtbK2SNjQpwgQX4Iy6tOKahCgFhKIcltitvSkpJB77eVWhNWnN2LfqMo
# jszEue7V8EAySxry4PzlxTtFTb3Mw53XyH12BMQf2m9j7jEsHeVSATsCAwEAAaOC
# AdwwggHYMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4E
# FgQUayVB3vtrfP0YgAotf492XapzPbgwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYI
# KwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9S
# ZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTASBgNVHRMB
# Af8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFNlBKbAPD2Ns72nX9c0pnqRIajDmMHAG
# A1UdHwRpMGcwZaBjoGGGX2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv
# Y3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDb2RlJTIwU2lnbmluZyUy
# MFBDQSUyMDIwMjEuY3JsMH0GCCsGAQUFBwEBBHEwbzBtBggrBgEFBQcwAoZhaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJ
# RCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNydDAN
# BgkqhkiG9w0BAQwFAAOCAgEABtVQXlR01UQZY5XGQ9yIjMcD8jI0MizWhJ1buZjg
# 5toUQSXx/BrASwE5qxwHPBeO45pOQp6VD4iILgm8OmfylY+A7KIqttvDUizC3sBX
# xjK4u7sDRiyEguXHKfL1HQAwxCLEtnRPkCPTsJA6b917lA+3foQIHC1XDDpdQLHx
# GbbGXp4Rr0mFK5vxbi6tAahBi/RlzOXPh6PavKPlZ/0vhlkDdsvoJETtebNJCNOZ
# 1Kav3Tg+K4va4FbOrYqRHdGGahoA/gmTYmmVqw0zkGzT53HdhfajrFGttJomK7qE
# +T8CQGiPkEIkxNmSXjCTpDqc4U1IKlTGcGYnRFGSgqrnWnkANPFsJ5EDHysh82lP
# I+PFC3FOIVMLzLL+30rqznvRgHUUAj7xfFnEiuaAx3vFVSTOLb+iigpvdR6i8fSW
# pgYESOkdkn2N57tuhBs57tKwoP++vc/MVpuD1XAtmWi+lZSlahadTbDfGKjMn+bf
# m2xlW9PZ6BSnCRv1MMhpcUZkAZX3gVEMef8rZc2c7BJ4ayRfX0wH43vI9znV+ZRJ
# 3j0xUC0Zb82RQalF5yHkCr93x0IwvZtn6P2dNQyCP6qd3fC4RlVFtAQhtOH0cByT
# R/Iqqghv6qHzL/pMptgMQQ5x8zYEYy+tCThYgYIrq7y4WEDYQfeSlqIxQOrIUJ4I
# JDEwggeeMIIFhqADAgECAhMzAAAAB4ejNKN7pY4cAAAAAAAHMA0GCSqGSIb3DQEB
# DAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9v
# dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMTA0MDEyMDA1MjBaFw0z
# NjA0MDEyMDE1MjBaMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2Rl
# IFNpZ25pbmcgUENBIDIwMjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
# AQCy8MCvGYgo4t1UekxJbGkIVQm0Uv96SvjB6yUo92cXdylN65Xy96q2YpWCiTas
# 7QPTkGnK9QMKDXB2ygS27EAIQZyAd+M8X+dmw6SDtzSZXyGkxP8a8Hi6EO9Zcwh5
# A+wOALNQbNO+iLvpgOnEM7GGB/wm5dYnMEOguua1OFfTUITVMIK8faxkP/4fPdEP
# CXYyy8NJ1fmskNhW5HduNqPZB/NkWbB9xxMqowAeWvPgHtpzyD3PLGVOmRO4ka0W
# csEZqyg6efk3JiV/TEX39uNVGjgbODZhzspHvKFNU2K5MYfmHh4H1qObU4JKEjKG
# sqqA6RziybPqhvE74fEp4n1tiY9/ootdU0vPxRp4BGjQFq28nzawuvaCqUUF2PWx
# h+o5/TRCb/cHhcYU8Mr8fTiS15kRmwFFzdVPZ3+JV3s5MulIf3II5FXeghlAH9Cv
# icPhhP+VaSFW3Da/azROdEm5sv+EUwhBrzqtxoYyE2wmuHKws00x4GGIx7NTWznO
# m6x/niqVi7a/mxnnMvQq8EMse0vwX2CfqM7Le/smbRtsEeOtbnJBbtLfoAsC3TdA
# OnBbUkbUfG78VRclsE7YDDBUbgWt75lDk53yi7C3n0WkHFU4EZ83i83abd9nHWCq
# fnYa9qIHPqjOiuAgSOf4+FRcguEBXlD9mAInS7b6V0UaNwIDAQABo4ICNTCCAjEw
# DgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTZQSmw
# Dw9jbO9p1/XNKZ6kSGow5jBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcC
# ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRv
# cnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB
# Af8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsw
# eaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jv
# c29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmlj
# YXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmwwgcMGCCsGAQUFBwEBBIG2MIGzMIGB
# BggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0
# cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBD
# ZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MC0GCCsGAQUFBzABhiFo
# dHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcNAQEMBQAD
# ggIBAH8lKp7+1Kvq3WYK21cjTLpebJDjW4ZbOX3HD5ZiG84vjsFXT0OB+eb+1TiJ
# 55ns0BHluC6itMI2vnwc5wDW1ywdCq3TAmx0KWy7xulAP179qX6VSBNQkRXzReFy
# jvF2BGt6FvKFR/imR4CEESMAG8hSkPYso+GjlngM8JPn/ROUrTaeU/BRu/1RFESF
# VgK2wMz7fU4VTd8NXwGZBe/mFPZG6tWwkdmA/jLbp0kNUX7elxu2+HtHo0QO5gdi
# KF+YTYd1BGrmNG8sTURvn09jAhIUJfYNotn7OlThtfQjXqe0qrimgY4Vpoq2MgDW
# 9ESUi1o4pzC1zTgIGtdJ/IvY6nqa80jFOTg5qzAiRNdsUvzVkoYP7bi4wLCj+ks2
# GftUct+fGUxXMdBUv5sdr0qFPLPB0b8vq516slCfRwaktAxK1S40MCvFbbAXXpAZ
# nU20FaAoDwqq/jwzwd8Wo2J83r7O3onQbDO9TyDStgaBNlHzMMQgl95nHBYMelLE
# HkUnVVVTUsgC0Huj09duNfMaJ9ogxhPNThgq3i8w3DAGZ61AMeF0C1M+mU5eucj1
# Ijod5O2MMPeJQ3/vKBtqGZg4eTtUHt/BPjN74SsJsyHqAdXVS5c+ItyKWg3Eforh
# ox9k3WgtWTpgV4gkSiS4+A09roSdOI4vrRw+p+fL4WrxSK5nMYIalDCCGpACAQEw
# cTBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDA0AhMz
# AAHN2pPdRvtxAVSpAAAAAc3aMA0GCWCGSAFlAwQCAQUAoF4wEAYKKwYBBAGCNwIB
# DDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIE
# ILFW6sL+ri0/q9u0kqDyXq6Fwd4lpUUYceZgyxSjAKHvMA0GCSqGSIb3DQEBAQUA
# BIIBgD1nYpqBWHjxdstANVuKpODw1bdm5cjZMpVHlMI1JzZwMNoAsnOlpXtViGW5
# bN4/L+dyB35X3wnSLndODdfzVF1V2b5dAp3VflvchbE91yYoAL0JKyw9xj9XdN8S
# ENrrsC7TofZVeR3o0FcttsFm51erINlLrHVqZ/iHPzic/oXUX3w9IkJv6Cp3MKdp
# Z2+mrBh0NDffKTrsb56vEnlRQf5pBaCclvLTwC2SqVhNq9L4RQZmMNdSJZDc0+ND
# bkZ4JNIYopT0k66vfSk22xgzJYRQBLbUltTzMn/lhNQgnlCTaZwcBfho9JhKbw9V
# Hq5LF31ZsaFaxn6eACN0xaHJlgNquuaeQ2T94scZ0ugWb6ohD7lvDlVzLXP5g7U6
# NTh7XQvt9xgSceD6EyKg6Z+pWY8ZTuU8QXLqhT0cZf76e6u7GJOd1JIYuhlEMsFq
# Fc4FOvkgQlZTzBYVK9gpG9NouKqK8tpDIhIeO/8AWivuW7/cNL47uqFWMDuzGgZe
# 0Tr8xqGCGBQwghgQBgorBgEEAYI3AwMBMYIYADCCF/wGCSqGSIb3DQEHAqCCF+0w
# ghfpAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFiBgsqhkiG9w0BCRABBKCCAVEEggFN
# MIIBSQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCCGwChAuHxMayR+
# z41gDh34sN0dMsknVSNifXFVM4E+0gIGagxE/TuyGBMyMDI2MDYwODE4NTUwNC45
# MDlaMASAAgH0oIHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw
# JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046NzgwMC0wNUUwLUQ5NDcxNTAzBgNVBAMT
# LE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oIIP
# ITCCB4IwggVqoAMCAQICEzMAAAAF5c8P/2YuyYcAAAAAAAUwDQYJKoZIhvcNAQEM
# BQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290
# IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIwMTExOTIwMzIzMVoXDTM1
# MTExOTIwNDIzMVowYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0
# YW1waW5nIENBIDIwMjAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCe
# fOdSY/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVGR3eRwV1wb3+yq0OXDEqhUhxqoNv6
# iYWKjkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGcb95WJLiw7HzLiBKrxmDj1EQB/mG5
# eEiRBEp7dDGzxKCnTYocDOcRr9KxqHydajmEkzXHOeRGwU+7qt8Md5l4bVZrXAhK
# +WSk5CihNQsWbzT1nRliVDwunuLkX1hyIWXIArCfrKM3+RHh+Sq5RZ8aYyik2r8H
# xT+l2hmRllBvE2Wok6IEaAJanHr24qoqFM9WLeBUSudz+qL51HwDYyIDPSQ3SeHt
# Kog0ZubDk4hELQSxnfVYXdTGncaBnB60QrEuazvcob9n4yR65pUNBCF5qeA4QwYn
# ilBkfnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFhH8k8YBozrEaXnsSL3kdTD01X+4Lf
# IWOuFzTzuoslBrBILfHNj8RfOxPgjuwNvE6YzauXi4orp4Sm6tF245DaFOSYbWFK
# 5ZgG6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNEobv35Nf6xN6FrA6jF9447+NHvCje
# WLCQZ3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOcPVrr3D9RPHCMS6Ckg8wggTrtIVnY
# 8yjbvGOUsAdZbeXUIQAWMs0d3cRDv09SvwVRd61evQIDAQABo4ICGzCCAhcwDgYD
# VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRraSg6NS9I
# Y0DPe9ivSek+2T3bITBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA
# QwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89Q
# EE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9u
# JTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmwwgZQG
# CCsGAQUFBwEBBIGHMIGEMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlm
# aWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAu
# Y3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbHfm21WhV150x4aPpO4dhEmSUVpbix
# NDmv6TvuIHv1xIs174bNGO/ilWMm+Jx5boAXrJxagRhHQtiFprSjMktTliL4sKZy
# t2i+SXncM23gRezzsoOiBhv14YSd1Klnlkzvgs29XNjT+c8hIfPRe9rvVCMPiH7z
# PZcw5nNjthDQ+zD563I1nUJ6y59TbXWsuyUsqw7wXZoGzZwijWT5oc6GvD3HDokJ
# Y401uhnj3ubBhbkR83RbfMvmzdp3he2bvIUztSOuFzRqrLfEvsPkVHYnvH1wtYyr
# t5vShiKheGpXa2AWpsod4OJyT4/y0dggWi8g/tgbhmQlZqDUf3UqUQsZaLdIu/XS
# jgoZqDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5xvPSwym0Ukr4o5sCcMUcSy6TEP7u
# MV8RX0eH/4JLEpGyae6Ki8JYg5v4fsNGif1OXHJ2IWG+7zyjTDfkmQ1snFOTgyEX
# 8qBpefQbF0fx6URrYiarjmBprwP6ZObwtZXJ23jK3Fg/9uqM3j0P01nzVygTppBa
# bzxPAh/hHhhls6kwo3QLJ6No803jUsZcd4JQxiYHHc+Q/wAMcPUnYKv/q2O444LO
# 1+n6j01z5mggCSlRwD9faBIySAcA9S8h22hIAcRQqIGEjolCK9F6nK9ZyX4lhths
# GHumaABdWzCCB5cwggV/oAMCAQICEzMAAABXJNOV4KLpyTEAAAAAAFcwDQYJKoZI
# hvcNAQEMBQAwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1w
# aW5nIENBIDIwMjAwHhcNMjUxMDIzMjA0NjUzWhcNMjYxMDIyMjA0NjUzWjCB2zEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWlj
# cm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1Mg
# RVNOOjc4MDAtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJT
# QSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
# ADCCAgoCggIBALFspQqTCH24syS2NZD1ztnJl9h0Vr0WwJnikmeXse/4wspnVexG
# qfiHNoqkbVg5CinuYC+iVfNMLZ+QtqhySz8VGBSjRt1JB5ACNtTKAjfmFp4U/Cv2
# Lj4m+vuve9I3W3hSiImTFsHeYZ6V/Sd43rXrhHV26fw3xQSteSbg9yTs1rhdrLkA
# j4KmI0D5P4KavtygirVyUW10gkifWLSE1NiB8Jn3RO5dj32deeMNONaaPnw3k49I
# CTs3Ffyb+ekNDPsNfYwCqPyOTxM6y1dSD0J5j+KK9V+EWyV5PDjV8jjn1zsStlS6
# TcYJJStcgHs2xT9rs6ooWl5FtYfRkCxhDShEp3s8IHUWizTWmLZvAE/6WR2Cd+Zm
# VapGXTCHJKUByZPxdX0i8gynirR+EwuHHNxEilDICLatO2WZu+CQrH4Zq0NYo1TQ
# 4tUpZ/kAWpoAu1r4mW5EJ3HkEavQ2PuoQDcDq2rAGVIla9pD7o9Yxwzl81BuDvUE
# yu9D/6F0qmQDdaE791HxfCUxpgMYPpdWTzs+dDGPehwQ8P92yP8ARjby5Ony1Z68
# RjeQebpxf5WL441myFHcgT1UJzzil7tPEkR22NfTNR6Fl+jzWb/r80nqlXllhynS
# owtxo1Y22xqYviS24smikUsBKqOPbSS77uvXEO3VrG5LGouE1EZ1Y9pjAgMBAAGj
# ggHLMIIBxzAdBgNVHQ4EFgQUjoPJXi01DgIJSGfm416Yg+0SkqcwHwYDVR0jBBgw
# FoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZbaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwUHVibGlj
# JTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5BggrBgEFBQcB
# AQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv
# cHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5n
# JTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG
# AQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQBgjdMg30B
# ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEBDAUAA4IC
# AQBydcB2POmZOUlAQz2NuXf7vWCVWmjWu9bsY1+HMjv1yeLjxDQkjsJEU5zaIDy8
# Uw9BYN8+ExX/9k/9CBUsXbVlbU44c65/liyJ83kWsFIUwhVazwSShFlbIZviIO/5
# weyWyTfPPpbSJgWy+ZE9UrQS3xulJLAHA2zUkMMPdAlF4RrngcZZ0r45AF9aIYjd
# estWwdrNK70MfArHqZdgrgXn03w6zBs1v7czceWGitg/DlsHqk1mXBpSTuGI2TSP
# N3E60IIXx5f/AFzh4/HFi98BBZbUELNsXkWAG9ynZ5e6CFiil1mgWCWOT90D7Igv
# g0zKe3o3WCk629/en94K/sC/zLOf2d7yFmTySb9fKjcONH1Db3kZ8MzEJ8fHTNmx
# rl10Gecuz/Gl0+ByTKN+PambZ+F0MIlBPww6fvjFC9JII73fw3qO169+9TxTz2G+
# E26GYY1dcffsAhw6DqTQgbflbl1O/MrSXSs0NSb9nBD9RfR/f8Ei7DA1L1jBO7vZ
# hhJTjw2TzFa/ALgRLi3W00hHWi8LGQaZc8SwXIMYWfwrN9MgYbhN0Iak9WA2dqWu
# ekXsTwNkmrD3E6E+oCYCehNOgZmds0Ezb1jo7OV0Kh22Ll3KHg3MHtlGguxAzhg/
# BpixPS4qrULLkAjO7+yNsUfrD2U9gMf/OR4yJDPtzM0ytTGCB0YwggdCAgEBMHgw
# YTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
# MDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIw
# MjACEzMAAABXJNOV4KLpyTEAAAAAAFcwDQYJYIZIAWUDBAIBBQCgggSfMBEGCyqG
# SIb3DQEJEAIPMQIFADAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZI
# hvcNAQkFMQ8XDTI2MDYwODE4NTUwNFowLwYJKoZIhvcNAQkEMSIEIOHnv/aci3oQ
# equd3DS4DigbGm+VXxO3F3tqp2E9CiD4MIG5BgsqhkiG9w0BCRACLzGBqTCBpjCB
# ozCBoAQg9TyfZLUFbkxliGyizuH9VVDpVFNvQEQhKQ2ZhUx421IwfDBlpGMwYTEL
# MAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAG
# A1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAC
# EzMAAABXJNOV4KLpyTEAAAAAAFcwggNhBgsqhkiG9w0BCRACEjGCA1AwggNMoYID
# SDCCA0QwggIsAgEBMIIBCaGB4aSB3jCB2zELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0
# aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjc4MDAtMDVFMC1EOTQ3MTUw
# MwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhv
# cml0eaIjCgEBMAcGBSsOAwIaAxUA/S8xOZxCUQFBNkrN8Wiij1x5y8OgZzBlpGMw
# YTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
# MDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIw
# MjAwDQYJKoZIhvcNAQELBQACBQDt0SFPMCIYDzIwMjYwNjA4MTEwOTAzWhgPMjAy
# NjA2MDkxMTA5MDNaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAO3RIU8CAQAwCgIB
# AAICHV4CAf8wBwIBAAICD3gwCgIFAO3Scs8CAQAwNgYKKwYBBAGEWQoEAjEoMCYw
# DAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0B
# AQsFAAOCAQEABYZrHi5F3d243HgUcht3hq2/MHjrFBCooi+A7PoY2zsRJNbbB/q4
# hh+aOwZwce4nrYqC2p/yUinaGtKiIXecDU5CgGUDXnsDyKnmDlsZkqtmqjORlRNX
# +dPtwQq64e+UEim2NcUZqjhk+JDNYyXQccyBclTOZq1VzSnLsFoDdNNvYz7psrdr
# 9jtwrIAumsOztI6/C/ldzcOGA0s4fYbmyp6FDQuhRX9FT3GpejrBdfFmx2ob7lRC
# EaQdk0IpQiAYmER9cGmlEJSwGSJL7a8I320f3MFq8hax0YZHVsSTq5rt2vAdHkAD
# YVH3CjRjO82uH8AuQLl3SAPECmooXNu0eTANBgkqhkiG9w0BAQEFAASCAgAlVdN5
# Ne8x//b/Zn+fTP974IgsECvlFKnScw1Cq/+S9drqbJeE24xKJtTFVfjgQE3vmXIP
# X7livEPqPUUHzCiNHSZqARZxAchy1vLFunhZdBzkhLdFrgVggwaPssAbQ7y7i+dS
# EzUzSS2QJhq3PQtmmvTHRWYEbbKHDBnvKcJ3Zf1mQGsrnxMmCawELbmLVSSPU0t0
# WQaO82tPgPRFB9571V7ooXNXyfW+Z0qvGkQbRv61CCJU/u+rzurhR4bHkbn1Zulo
# miPZKjyH9lhK/6hx6q5iwm8k9w1qetEKdGLfuz+FbO3CjVRPkPGHbXp7eBQn9yPI
# yzk2aE3159cCezDqqzl/aWDhK5s2le690u3ckuLjYzdzKsovrXT+eTON4IJNa76U
# vm0dpuGFYOhqCgphnrlmPZdZfFhvITz085pLXAOOG3erJCC0hqtCdGwZPruMHZQ0
# sFix200+JSIkYxet6BSd0i+yBg4E6/LEYzpxIM7GVF61nh22ALRPq2xuzpUYYKAM
# Nywm+sXTHYZp0n0xbxHe0hnVDcGLzFejrtHkrPo2S+Hrh5zvya5Ar4RYn3vS/nHk
# EhRGH+V3F+9x01e1jzRVh6HyoBT9IEFg4ppEhvcgBkGNMZmrxJs/ay9rBVFucUfa
# 6oXnAHmD2cUBXzCV+VlE6Yu3Cmb/lV/YcdRWnQ==
# SIG # End signature block