functions/Start-WUGDiscoveryWizard.ps1

<#
.SYNOPSIS
    Start-WUGDiscoveryWizard

.DESCRIPTION
    One-shot interactive setup wizard for WhatsUpGoldPS discovery providers.

    Guides you through selecting a provider, configuring targets and credentials,
    running the initial discovery, and optionally scheduling it to run
    automatically via Windows Task Scheduler.

    This is the single entry point for discovery. Install the module, run this
    command, and you are guided through everything:

      1. Select a provider (Azure, AWS, Proxmox, CiscoWLC, etc.)
      2. The provider collects targets and credentials (saved to DPAPI vault)
      3. Discovery runs and you choose an action (Dashboard, PushToWUG, etc.)
      4. Optionally schedule the provider to run daily at 2 AM (or custom)

    Credentials are saved to the DPAPI vault so scheduled runs work
    non-interactively without storing secrets in plain text.

.PARAMETER Provider
    Provider name to launch directly (skips menu).

.PARAMETER VaultScope
    Scope for DPAPI vault storage (LocalMachine or CurrentUser).
    LocalMachine allows scheduled tasks to run as SYSTEM.

.PARAMETER NonInteractive
    Run in non-interactive mode. Requires -Provider.
    Uses saved vault credentials, defaults action to Dashboard.

.EXAMPLE
    Start-WUGDiscoveryWizard

    Interactive menu: pick a provider, configure, run, and schedule.

.EXAMPLE
    Start-WUGDiscoveryWizard -Provider Azure

    Launches Azure discovery setup directly.

.EXAMPLE
    Start-WUGDiscoveryWizard -Provider CiscoWLC -VaultScope LocalMachine

    Launches CiscoWLC with LocalMachine vault for SYSTEM task support.

.NOTES
    Author : jason@wug.ninja
    Created : 2026-07-07
    Requires: PowerShell 5.1+, WhatsUpGoldPS module
    See also: Get-WUGDiscoveryProvider

.LINK
    https://github.com/jayyx2/WhatsUpGoldPS
#>

[CmdletBinding()]
param()

function Start-WUGDiscoveryWizard {
    [CmdletBinding()]
    param(
        [ValidateSet('AWS', 'Azure', 'Bigleaf', 'CiscoWLC', 'CUCM', 'Docker',
                     'F5', 'Fortinet', 'GCP', 'HyperV', 'LoadMaster', 'MSSQL',
                     'Nutanix', 'NvidiaSmi', 'OCI', 'Proxmox', 'VMware', 'WindowsAttributes',
                     'WindowsDiskIO')]
        [string]$Provider,

        [ValidateSet('LocalMachine', 'CurrentUser')]
        [string]$VaultScope,

        [switch]$NonInteractive
    )

    $ErrorActionPreference = 'Stop'
    $scriptDir = Split-Path $PSScriptRoot -Parent
    $discoveryDir = Join-Path $scriptDir 'helpers\discovery'

    if (-not (Test-Path $discoveryDir)) {
        throw "Discovery helpers directory not found: $discoveryDir"
    }

    $providerDescriptions = @{
        AWS                = 'Amazon Web Services (EC2, RDS, ELB)'
        Azure              = 'Microsoft Azure (VMs, App Services, Databases)'
        Bigleaf            = 'Bigleaf Networks SD-WAN'
        CiscoWLC           = 'Cisco Wireless LAN Controller'
        CUCM               = 'Cisco Unified Communications Manager'
        Docker             = 'Docker Container Hosts'
        F5                 = 'F5 BIG-IP Load Balancers'
        Fortinet           = 'FortiGate Firewalls'
        GCP                = 'Google Cloud Platform'
        HyperV             = 'Microsoft Hyper-V Virtual Machines'
        LoadMaster         = 'Kemp LoadMaster Load Balancers'
        MSSQL              = 'Microsoft SQL Server'
        Nutanix            = 'Nutanix AHV Virtual Machines'
        NvidiaSmi          = 'NVIDIA GPU Monitoring (nvidia-smi via SSH)'
        OCI                = 'Oracle Cloud Infrastructure'
        Proxmox            = 'Proxmox VE Virtual Machines'
        VMware             = 'VMware vSphere / ESXi'
        WindowsAttributes  = 'Windows Server Attributes (OS, Hardware, BIOS)'
        WindowsDiskIO      = 'Windows Disk I/O Performance Monitors'
    }

    # Scan for available providers
    $providers = @()
    $setupFiles = @(Get-ChildItem -Path $discoveryDir -Filter 'Setup-*-Discovery.ps1' -ErrorAction SilentlyContinue)
    foreach ($file in $setupFiles) {
        if ($file.BaseName -match '^Setup-(.+)-Discovery$') {
            $providers += @{
                Name     = $Matches[1]
                FileName = $file.BaseName
                FullPath = $file.FullName
            }
        }
    }
    $providers = @($providers | Sort-Object -Property Name)

    if (-not $providers -or $providers.Count -eq 0) {
        Write-Error "No discovery providers found in $discoveryDir"
        return
    }

    # ── Step 1: Select provider ──────────────────────────────────────────────
    $selectedProvider = $null

    if ($Provider) {
        $selectedProvider = $providers | Where-Object { $_.Name -eq $Provider }
        if (-not $selectedProvider) {
            Write-Error "Provider '$Provider' not found"
            return
        }
    }
    else {
        Write-Host "`n" -ForegroundColor Cyan
        Write-Host " +================================================================+" -ForegroundColor Cyan
        Write-Host " | WhatsUpGoldPS Discovery Wizard |" -ForegroundColor Cyan
        Write-Host " +================================================================+" -ForegroundColor Cyan
        Write-Host "`n Select a discovery provider to configure:`n" -ForegroundColor White

        $index = 1
        foreach ($prov in $providers) {
            $desc = $providerDescriptions[$prov.Name]
            if (-not $desc) { $desc = $prov.Name }
            Write-Host " [$($index.ToString().PadLeft(2))] $($prov.Name.PadRight(18)) - $desc" -ForegroundColor Green
            $index++
        }

        Write-Host "`n [ 0] Exit" -ForegroundColor Yellow
        Write-Host ""

        $choice = Read-Host " Selection"

        $choiceNum = 0
        if (-not [int]::TryParse($choice, [ref]$choiceNum) -or $choiceNum -lt 0 -or $choiceNum -ge $index) {
            Write-Host "`n Invalid selection.`n" -ForegroundColor Red
            return
        }
        if ($choiceNum -eq 0) {
            Write-Host "`n Cancelled.`n" -ForegroundColor Yellow
            return
        }

        $selectedProvider = $providers[$choiceNum - 1]
    }

    $provName = $selectedProvider.Name

    # Providers that need a target (IP/hostname) for discovery
    $targetProviders = @('CiscoWLC', 'CUCM', 'Docker', 'F5', 'Fortinet',
                         'HyperV', 'LoadMaster', 'Nutanix', 'NvidiaSmi', 'Proxmox', 'VMware')
    $collectedTarget = $null
    if ($provName -in $targetProviders -and -not $NonInteractive) {
        Write-Host " Enter target IP/hostname for $provName discovery." -ForegroundColor Yellow
        Write-Host " Separate multiple with commas (e.g. 10.0.0.1, 10.0.0.2)" -ForegroundColor DarkGray
        $targetInput = Read-Host " Target"
        if ($targetInput) {
            $collectedTarget = @($targetInput -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ })
        }
    }

    # SNMP-based providers: ask for SNMP version before running the script
    $snmpProviders = @('CUCM', 'CiscoWLC')
    $collectedSnmpVersion = $null
    if ($provName -in $snmpProviders -and -not $NonInteractive) {
        Write-Host ''
        Write-Host ' SNMP version:' -ForegroundColor Yellow
        Write-Host ' [1] SNMP v2c (community string)' -ForegroundColor Green
        Write-Host ' [2] SNMP v3 (user/auth/privacy)' -ForegroundColor Green
        Write-Host ''
        $snmpChoice = Read-Host ' Choice (default: 1)'
        if ($snmpChoice -eq '2') {
            $collectedSnmpVersion = 3
        }
        else {
            $collectedSnmpVersion = 2
        }
    }

    # ── Step 2: Run the provider ─────────────────────────────────────────────
    Write-Host "`n" -ForegroundColor Cyan
    Write-Host " +================================================================+" -ForegroundColor Cyan
    Write-Host " | Setting up: $($provName.PadRight(46))|" -ForegroundColor Cyan
    Write-Host " +================================================================+" -ForegroundColor Cyan
    Write-Host ""

    $splat = @{}
    if ($VaultScope) { $splat['VaultScope'] = $VaultScope }
    if ($NonInteractive) { $splat['NonInteractive'] = $true }
    if ($collectedTarget) { $splat['Target'] = $collectedTarget }
    if ($collectedSnmpVersion) { $splat['SnmpVersion'] = $collectedSnmpVersion }

    $savedEAP = $ErrorActionPreference
    $ErrorActionPreference = 'Continue'
    try { & $selectedProvider.FullPath @splat }
    catch { Write-Warning "Provider error: $_" }
    finally { $ErrorActionPreference = $savedEAP }

    if ($NonInteractive) { return }

    # ── Step 3: Offer to schedule ────────────────────────────────────────────
    Write-Host ""
    Write-Host " +================================================================+" -ForegroundColor Cyan
    Write-Host " | Schedule Recurring Discovery |" -ForegroundColor Cyan
    Write-Host " +================================================================+" -ForegroundColor Cyan
    Write-Host ""
    Write-Host " Schedule $provName to run automatically?" -ForegroundColor White
    Write-Host " Uses your saved vault credentials so discovery runs unattended." -ForegroundColor DarkGray
    Write-Host ""
    Write-Host " [1] Yes - daily at 2:00 AM (recommended)" -ForegroundColor Green
    Write-Host " [2] Yes - custom time and frequency" -ForegroundColor Green
    Write-Host " [3] No - run manually when needed" -ForegroundColor Yellow
    Write-Host ""

    $schedChoice = Read-Host " Choice (default: 3)"

    if ($schedChoice -ne '1' -and $schedChoice -ne '2') {
        Write-Host ""
        Write-Host " No scheduled task created. Run the wizard again anytime." -ForegroundColor DarkGray
        Write-Host ""
        return
    }

    $registerScript = Join-Path $discoveryDir 'Register-DiscoveryScheduledTask.ps1'
    if (-not (Test-Path $registerScript)) {
        Write-Warning "Register-DiscoveryScheduledTask.ps1 not found at: $registerScript"
        return
    }

    $taskSplat = @{
        Mode     = 'Provider'
        Provider = $provName
        Action   = 'Dashboard'
    }

    # Reuse target collected earlier for scheduling
    if ($collectedTarget -and $collectedTarget.Count -gt 0) {
        $taskSplat['Target'] = $collectedTarget
    }

    # Pass SNMP version as AuthMethod for SNMP-based providers
    # Register-DiscoveryScheduledTask maps SnmpV2/SnmpV3 to -SnmpVersion for CUCM/CiscoWLC
    if ($collectedSnmpVersion) {
        $taskSplat['AuthMethod'] = if ($collectedSnmpVersion -eq 3) { 'SnmpV3' } else { 'SnmpV2' }
    }

    if ($schedChoice -eq '2') {
        Write-Host ""
        Write-Host " Frequency:" -ForegroundColor White
        Write-Host " [1] Daily (default)" -ForegroundColor Green
        Write-Host " [2] Hourly" -ForegroundColor Green
        Write-Host " [3] At startup" -ForegroundColor Green
        $freqChoice = Read-Host " Choice (default: 1)"
        switch ($freqChoice) {
            '2' {
                $taskSplat['TriggerType'] = 'Hourly'
                $intervalInput = Read-Host " Repeat every N minutes (default: 60)"
                if ($intervalInput -match '^\d+$') {
                    $taskSplat['RepeatIntervalMinutes'] = [int]$intervalInput
                }
            }
            '3' { $taskSplat['TriggerType'] = 'AtStartup' }
            default { $taskSplat['TriggerType'] = 'Daily' }
        }

        if (-not $taskSplat.ContainsKey('TriggerType') -or $taskSplat['TriggerType'] -ne 'AtStartup') {
            $timeInput = Read-Host " Time of day HH:mm (default: 02:00)"
            if ($timeInput -match '^\d{1,2}:\d{2}$') {
                $taskSplat['TimeOfDay'] = $timeInput
            }
        }

        Write-Host ""
        Write-Host " Action on each run:" -ForegroundColor White
        Write-Host " [1] Dashboard - generate HTML dashboard (default)" -ForegroundColor Green
        Write-Host " [2] PushToWUG - push devices/monitors to WhatsUp Gold" -ForegroundColor Green
        Write-Host " [3] DashboardAndPush - both" -ForegroundColor Green
        Write-Host " [4] ExportJSON - export plan to JSON" -ForegroundColor Green
        $actChoice = Read-Host " Choice (default: 1)"
        switch ($actChoice) {
            '2' { $taskSplat['Action'] = 'PushToWUG' }
            '3' { $taskSplat['Action'] = 'DashboardAndPush' }
            '4' { $taskSplat['Action'] = 'ExportJSON' }
            default { $taskSplat['Action'] = 'Dashboard' }
        }
    }

    $taskSplat['SkipVaultPopulate'] = $true
    $taskSplat['ExecutionPolicy'] = 'RemoteSigned'
    # Note: we do NOT set UseSystemVault. The task runs as the current user
    # so it can access the same CurrentUser DPAPI vault where credentials
    # were just saved during the interactive provider run above.

    # Build the manual command string with full absolute path
    $registerScriptFull = (Resolve-Path $registerScript -ErrorAction SilentlyContinue).Path
    if (-not $registerScriptFull) { $registerScriptFull = $registerScript }
    $manualCmd = "& '$registerScriptFull' -Mode Provider -Provider $provName -Action $($taskSplat['Action']) -ExecutionPolicy RemoteSigned -SkipVaultPopulate"
    if ($collectedTarget -and $collectedTarget.Count -gt 0) {
        $targetStr = ($collectedTarget | ForEach-Object { "'$_'" }) -join ','
        $manualCmd += " -Target $targetStr"
    }
    if ($taskSplat.ContainsKey('TriggerType'))     { $manualCmd += " -TriggerType $($taskSplat['TriggerType'])" }
    if ($taskSplat.ContainsKey('TimeOfDay'))        { $manualCmd += " -TimeOfDay '$($taskSplat['TimeOfDay'])'" }

    Write-Host ""
    Write-Host " Registering scheduled task..." -ForegroundColor Cyan

    $savedEAP2 = $ErrorActionPreference
    $ErrorActionPreference = 'Continue'
    & $registerScript @taskSplat
    $ErrorActionPreference = $savedEAP2

    # Verify the task actually exists
    $taskName = "DiscoverySync-$provName"
    $taskExists = $false
    try {
        $existingTask = Get-ScheduledTask -TaskName $taskName -TaskPath '\WhatsUpGoldPS\' -ErrorAction SilentlyContinue
        if ($existingTask) { $taskExists = $true }
    }
    catch { }

    Write-Host ""
    if ($taskExists) {
        Write-Host " $provName discovery is now scheduled." -ForegroundColor Green
        Write-Host " View tasks: Get-ScheduledTask -TaskPath '\WhatsUpGoldPS\'" -ForegroundColor DarkGray
        Write-Host " Remove task: & '$registerScriptFull' -Remove '$taskName'" -ForegroundColor DarkGray
        Write-Host ""
        Write-Host " Re-register (elevated):" -ForegroundColor DarkGray
        Write-Host " $manualCmd" -ForegroundColor White
    }
    else {
        Write-Host " Task registration failed (may require Administrator)." -ForegroundColor Red
        Write-Host ""
        Write-Host " Run this command in an elevated (Administrator) PowerShell:" -ForegroundColor Yellow
        Write-Host " $manualCmd" -ForegroundColor White
    }

    Write-Host ""

} # End of function Start-WUGDi
# SIG # Begin signature block
# MIIr+wYJKoZIhvcNAQcCoIIr7DCCK+gCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBSHZddZYoIjGJd
# vhBhIoYv8yo5TBF7RXyZ6wlmWPIHrKCCJQ0wggVvMIIEV6ADAgECAhBI/JO0YFWU
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
# dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
# EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
# IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
# hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
# J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
# P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
# me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
# T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
# RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
# mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
# QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
# OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
# AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
# AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
# VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
# HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
# VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
# ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
# KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
# hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
# OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
# J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
# pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
# d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
# +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggWNMIIEdaADAgECAhAOmxiO
# +dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi
# BgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAw
# MDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERp
# Z2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsb
# hA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iT
# cMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGb
# NOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclP
# XuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCr
# VYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFP
# ObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTv
# kpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWM
# cCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls
# 5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBR
# a2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6
# MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qY
# rhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8E
# BAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5k
# aWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDig
# NoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
# dENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCg
# v0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQT
# SnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh
# 65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSw
# uKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAO
# QGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjD
# TZ9ztwGpn1eqXijiuZQwggYaMIIEAqADAgECAhBiHW0MUgGeO5B5FSCJIRwKMA0G
# CSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExp
# bWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290
# IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFQxCzAJBgNVBAYT
# AkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28g
# UHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IB
# jwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjIztNsfvxYB5UXeWUzCxEe
# AEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFigOMYzB2OKhdqfWGV
# oYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/36F09fy1tsB8je/RV0mIk
# 8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05ZwmRmTnAO5/arnY83jeNzh
# P06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp4VqpB3MV/h53yl41
# aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8rNyfQJy/aOs5b4s+
# ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ1f9+YEQIQty/NQd/
# 2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh2n5HirY4jKnFH/9g
# Rvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhA
# QnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritUpimqF6TNDDAOBgNVHQ8B
# Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcD
# AzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1UdHwREMEIwQKA+oDyG
# Omh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5n
# Um9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUFBzAChjpodHRwOi8v
# Y3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RSNDYu
# cDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG
# 9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURhw1aVcdGRP4Wh60BAscjW
# 4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWTsyNyBBsMLHqafvIh
# rCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajjcw5+w/KeFvPYfLF/ldYp
# mlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNcWbWDRF/3sBp6fWXhz7Dc
# ML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalOhOfCipnx8CaLZeVme5yE
# Lg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJszkyeiaerlphwoKx1uHRz
# NyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z76mKnzAfZxCl/3dq3dUNw
# 4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGvspbOrTfOXyXvmPL6
# E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHHj95Ejza63zdrEcxWLDX6
# xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2Bev6SivBBOHY+uqiirZt
# g0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/L9Uo2bC5a4CH2RwwggY+
# MIIEpqADAgECAhAHnODk0RR/hc05c892LTfrMA0GCSqGSIb3DQEBDAUAMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjYwMjA5MDAwMDAw
# WhcNMjkwNDIxMjM1OTU5WjBVMQswCQYDVQQGEwJVUzEUMBIGA1UECAwLQ29ubmVj
# dGljdXQxFzAVBgNVBAoMDkphc29uIEFsYmVyaW5vMRcwFQYDVQQDDA5KYXNvbiBB
# bGJlcmlubzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPN6aN4B1yYW
# kI5b5TBj3I0VV/peETrHb6EY4BHGxt8Ap+eT+WpEpJyEtRYPxEmNJL3A38Bkg7mw
# zPE3/1NK570ZBCuBjSAn4mSDIgIuXZnvyBO9W1OQs5d67MlJLUAEufl18tOr3ST1
# DeO9gSjQSAE5Nql0QDxPnm93OZBon+Fz3CmE+z3MwAe2h4KdtRAnCqwM+/V7iBdb
# w+JOxolpx+7RVjGyProTENIG3pe/hKvPb501lf8uBAADLdjZr5ip8vIWbf857Yw1
# Bu10nVI7HW3eE8Cl5//d1ribHlzTzQLfttW+k+DaFsKZBBL56l4YAlIVRsrOiE1k
# dHYYx6IGrEA809R7+TZA9DzGqyFiv9qmJAbL4fDwetDeyIq+Oztz1LvEdy8Rcd0J
# BY+J4S0eDEFIA3X0N8VcLeAwabKb9AjulKXwUeqCJLvN79CJ90UTZb2+I+tamj0d
# n+IKMEsJ4v4Ggx72sxFr9+6XziodtTg5Luf2xd6+PhhamOxF2px9LObhBLLEMyRs
# CHZIzVZOFKu9BpHQH7ufGB+Sa80Tli0/6LEyn9+bMYWi2ttn6lLOPThXMiQaooRU
# q6q2u3+F4SaPlxVFLI7OJVMhar6nW6joBvELTJPmANSMjDSRFDfHRCdGbZsL/keE
# LJNy+jZctF6VvxQEjFM8/bazu6qYhrA7AgMBAAGjggGJMIIBhTAfBgNVHSMEGDAW
# gBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQU6YF0o0D5AVhKHbVocr8G
# aSIBibAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYI
# KwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIBAwIwJTAjBggrBgEFBQcC
# ARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQBMEkGA1UdHwRCMEAw
# PqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVT
# aWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBEBggrBgEFBQcwAoY4aHR0
# cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIz
# Ni5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqG
# SIb3DQEBDAUAA4IBgQAEIsm4xnOd/tZMVrKwi3doAXvCwOA/RYQnFJD7R/bSQRu3
# wXEK4o9SIefye18B/q4fhBkhNAJuEvTQAGfqbbpxow03J5PrDTp1WPCWbXKX8Oz9
# vGWJFyJxRGftkdzZ57JE00synEMS8XCwLO9P32MyR9Z9URrpiLPJ9rQjfHMb1BUd
# vaNayomm7aWLAnD+X7jm6o8sNT5An1cwEAob7obWDM6sX93wphwJNBJAstH9Ozs6
# LwISOX6sKS7CKm9N3Kp8hOUue0ZHAtZdFl6o5u12wy+zzieGEI50fKnN77FfNKFO
# WKlS6OJwlArcbFegB5K89LcE5iNSmaM3VMB2ADV1FEcjGSHw4lTg1Wx+WMAMdl/7
# nbvfFxJ9uu5tNiT54B0s+lZO/HztwXYQUczdsFon3pjsNrsk9ZlalBi5SHkIu+F6
# g7tWiEv3rtVApmJRnLkUr2Xq2a4nbslUCt4jKs5UX4V1nSX8OM++AXoyVGO+iTj7
# z+pl6XE9Gw/Td6WKKKswgga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0G
# CSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTla
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEy
# NTYgMjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHT
# CphBcr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPh
# of6pvF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mA
# xAHeHYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBv
# MgEdgkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps
# 0wjUjsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF
# 83bRVFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXi
# UOeSLsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOM
# CZIVNSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydP
# pOjL6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrU
# G2ZdSoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+
# sdFUeEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0T
# AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYD
# VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG
# A1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY
# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj
# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV
# HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1s
# BwEwDQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WI
# GjB/T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+
# IQhQE7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8M
# yb9rEVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2
# th9y1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjaj
# V/gxdEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2
# Lr3ty9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFze
# GxcytL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG
# 7uEBYTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+N
# Jpud/v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckT
# etiSuEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszW
# kPZPubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC0cR2p5V0aDANBgkqhkiG9w0B
# AQsFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/
# BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYg
# U0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVow
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIw
# MjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANBGrC0Sxp7Q6q5g
# VrMrV7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA69HFTBdwbHwBSOeLpvPnZ8ZN
# +vo8dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6wW2R6kSu9RJt/4QhguSssp3qo
# me7MrxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00Cll8pjrUcCV3K3E0zz09ldQ/
# /nBZZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOMA3CoB/iUSROUINDT98oksouT
# MYFOnHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmotuQhcg9tw2YD3w6ySSSu+3qU8
# DD+nigNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1OpbybpMe46YceNA0LfNsnqcnp
# JeItK/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeHVZlc4seAO+6d2sC26/PQPdP5
# 1ho1zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1roSrgHjSHlq8xymLnjCbSLZ49
# kPmk8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSUROwnu7zER6EaJ+AliL7ojTdS5P
# WPsWeupWs7NpChUk555K096V1hE0yZIXe+giAwW00aHzrDchIc2bQhpp0IoKRR7Y
# ufAkprxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAA
# MB0GA1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM6DAfBgNVHSMEGDAWgBTvb1NK
# 6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYI
# KwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZT
# SEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2
# U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9
# bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcEua5gQezRCESeY0ByIfjk9iJP
# 2zWLpQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/YmRDfxT7C0k8FUFqNh+tshgb4O
# 6Lgjg8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8AQ/UdKFOtj7YMTmqPO9mzskg
# iC3QYIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/EABgfZXLWU0ziTN6R3ygQBHMU
# BaB5bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQVTeLni2nHkX/QqvXnNb+YkDF
# kxUGtMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gVutDojBIFeRlqAcuEVT0cKsb+
# zJNEsuEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85EE8LUkqRhoS3Y50OHgaY7T/l
# wd6UArb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hggt8l2Yv7roancJIFcbojBcxl
# RcGG0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJgKf47CdxVRd/ndUlQ05oxYy2
# zRWVFjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLvUxxVZE/rptb7IRE2lskKPIJg
# baP5t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7POGT75qaL6vdCvHlshtjdNXOC
# IUjsarfNZzGCBkQwggZAAgEBMGgwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1Nl
# Y3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWdu
# aW5nIENBIFIzNgIQB5zg5NEUf4XNOXPPdi036zANBglghkgBZQMEAgEFAKCBhDAY
# BgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3
# AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEi
# BCCMqwV2ao2c8lVY0G4EvpSdm2dPJJsNRje0MHZf2gVRSzANBgkqhkiG9w0BAQEF
# AASCAgCtsoJxvx1Df/bhD0qHj+nchmms0HKQKGki5powBszfYYNUVmssDalXcA49
# uV2UwBG5BltdvRIlTc4nHUKdy/TH96/fgoQu/r3dOFSWJ2dZQZdv9LLasdk0zLh8
# UoJTmBEUZHK0dI4CF051C+kDUF7/MLr0Be1hkGxTenxu0hW+9W+rCphoJqakW9u6
# 2exDqgDifiOv/HD3C6JlRuyMwMhbYYZRYrhax73IGsYI4B+V4SCX5cIqE0yO/u2r
# OGpGTjHbvU7k07I96hohS3gV80Ee+waQB+YlmJyp++fdlW9XcE0EWzJ3kfzq4pm2
# FjY/rCu0ADWidwYm+aK2YyvXiYq/na9WIzcmWZmt84KIRKNZethQD4oiyTkGkjPS
# Ym+CjIIY3R0gWcqzVr9AKZI3KkhX3+iay8sih+dIdMKcNlDnySFO/C+ezjSJ+tqv
# 9B6K1+H52ST/sTCHCtgrvOrsuXfNXdYQl4umxAaBeKKaeNrgwXorrkUIEY+eueNQ
# GJQA9LMUvEwxUWXgMQJSMEyyWFFiCMKLwElB0nedGerJH1PRb22lJVHePhs/D3Jg
# qI3Rp4FaosCklAd4i+IYfK0O6OfCH0fqKrdDu3KC+qLhnItMHHyKnH9c9k1irbf9
# p+Hn2O4DZLierN3OMOFvFoVTHm7/T/Oh5GEMu3R3s526W/iveaGCAyYwggMiBgkq
# hkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5E
# aWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1l
# U3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTECEAqA7xhLjfEFgtHEdqeV
# dGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwG
# CSqGSIb3DQEJBTEPFw0yNjA3MzAxOTEyMjdaMC8GCSqGSIb3DQEJBDEiBCAuhgfe
# XgL3Gcf0Mb0C7Tm3co+siVSOztrBao6sR10f4TANBgkqhkiG9w0BAQEFAASCAgBk
# 615gBT6R4g+bkO0shGNrapzYd7nnj26KYPFtYI6HlHYUlmmN7XU+c6jv0niy9HR9
# laYuRzLFhZ2YJa7DLKdhRiYBalj2I7uYhjZZNiKiex21pgc9P+cM1klZt2BJgJed
# rOsfciIqs7Fxlbvtd5QDGJvy8ZcSu3zZgO9rfJe/5gI35w/x497ZR8StCNeKNy2b
# WYRjQIPuRvecEpq554H+p4VHKadAgVKvvRXJ86e60gLj+8qqz2DEWZSUSxcsbCDs
# +l7BsOpzI7EY2Qqlr9ISujO2f//yAZq9QmgSEJDsVnY/fUWl5o0XzDp1WzaPdx3u
# q9fJylRFnH2bIp4x6zBLl4+JgF+CtWg5AizfmMDrKWLVp8nzBqzvYIg2r7prT08m
# Afbzl8Ncw11A5FcizTr3qsZTqm2qQqNK2+4UYeqG8CCWfhiAO8WNwCGu37bwI+sE
# XhGGlVM5CUUDb1htOzCEboyzrX/qIUNev9uGmnIJMp6tNLLgT+Caapkom4RJv/Sd
# h/NzG/6A2V60LLT4nr9mEWXqOljee7DyJy4WC/ct+kXOHEb6wU7f1jF7p/+J3vSB
# oeOE3WT4KNOjrq+jywzJICjmy3CbkuRORySy6LwJXr9TPXBm0Zh3ahSBii2iqTI+
# PY4A0fwzBJaS8vygb7hsF8xJEAAFQ3v9DKJSJ/yBIA==
# SIG # End signature block