public/New-AppVentiXShortcutUserSetting.ps1

<#
.SYNOPSIS
    Creates an AppVentiX UserSetting XML file for a Shortcuts configuration.
.DESCRIPTION
    Builds and saves an AppVentiX UserSetting XML file that defines one or more shortcuts,
    including executable path, arguments, working directory, desktop placement, and icon data.
    Supports two input modes:
 
    - ShortcutEntries mode: accepts an array of hashtables describing individual shortcut entries.
    - InputObject mode: accepts a pre-structured PSCustomObject (e.g. from Get-IvantiWCShortcut),
      which includes shortcut metadata and icon data (base64) ready for direct use.
 
    Icon data handling:
    - If the InputObject or ShortcutEntry already contains base64 icon data, it is used as-is.
    - If icon data is absent and an IconFile path is provided, the function generates all icon
      sizes (16, 32, 48, 256 and default 32) from that file.
    - If neither is available, a warning is issued and icon fields are left empty.
.PARAMETER FriendlyName
    Display name for the AppVentiX UserSetting.
.PARAMETER Description
    Optional description for the UserSetting.
.PARAMETER ExecutionOrder
    Execution order for the UserSetting. Defaults to 0.
.PARAMETER ProcessAtLogin
    Whether the setting is applied at login. Defaults to $true.
.PARAMETER ProcessAtRefresh
    Whether the setting is applied at refresh. Defaults to $true.
.PARAMETER ProcessAtReconnectAndUnlock
    Whether the setting is applied at reconnect and unlock. Defaults to $false.
.PARAMETER MachineGroupFriendlyName
    One or more machine group friendly names to apply the setting to. Defaults to 'All Machine Groups'.
.PARAMETER ShortcutEntries
    Array of hashtables describing shortcut entries. Each entry must contain: ShortcutName, ExecutablePath.
    Optional keys: Arguments, WorkingDirectory, PlaceOnDesktop, IconData, IconData16, IconData32,
    IconData48, IconData256, IconFile.
.PARAMETER InputObject
    Pre-structured PSCustomObject containing shortcut metadata and entries.
.PARAMETER IconFile
    Path to a PNG, ICO, or EXE file used as icon source when icon data is absent in the entries.
    The function will generate all required icon sizes from this file.
.PARAMETER ConfigShare
    Path to the AppVentiX config share. Defaults to the module variable.
.LINK
    Get-AppVentiXUserSettings
 
.LINK
    New-AppVentiXDriveMappingUserSetting
 
.LINK
    New-AppVentiXEnvironmentVariableUserSetting
 
.LINK
    New-AppVentiXGroupPolicyUserSetting
 
.LINK
    New-AppVentiXPrinterMappingUserSetting
 
.LINK
    New-AppVentiXRegistryUserSetting
 
.LINK
    Set-AppVentiXUserSettingFolder
 
.LINK
    Set-AppVentiXUserSettingsAssignment
 
.NOTES
    Function : New-AppVentiXShortcutUserSetting
    Author : John Billekens
    Copyright : (c) John Billekens Consultancy & AppVentiX
    Version : 2026.321.1000
#>

function New-AppVentiXShortcutUserSetting {
    [CmdletBinding()]
    [Alias("New-AppVentiXShortcut")]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [string]$FriendlyName,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [string]$Description,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [int]$ExecutionOrder = 0,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [bool]$ProcessAtLogin = $true,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [bool]$ProcessAtRefresh = $true,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [bool]$ProcessAtReconnectAndUnlock = $false,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [string[]]$MachineGroupFriendlyName = @("All Machine Groups"),

        [Parameter(Mandatory = $true, ParameterSetName = "ShortcutEntries")]
        [hashtable[]]$ShortcutEntries = @(),

        [Parameter(Mandatory = $true, ParameterSetName = "InputObject")]
        [PSCustomObject]$InputObject,

        [Parameter(Mandatory = $false, ParameterSetName = "ShortcutEntries")]
        [Parameter(Mandatory = $false, ParameterSetName = "InputObject")]
        [ValidateScript({ Test-Path $_ -PathType Leaf })]
        [string]$IconFile,

        [Parameter(DontShow)]
        [ValidateNotNullOrEmpty()]
        [string]$ConfigShare = $Script:AppVentix.ConfigShare
    )

    #region functions

    function ConvertFrom-IconFilePath {
        <#
        .SYNOPSIS
            Converts an image file to a base64 PNG string, optionally resized.
        #>

        [CmdletBinding()]
        [OutputType([string])]
        param(
            [Parameter(Mandatory = $true)]
            [string]$Path,

            [Parameter(Mandatory = $false)]
            [ValidateRange(16, 256)]
            [int]$Size = 32
        )
        try {
            Add-Type -AssemblyName System.Drawing -ErrorAction Stop
            $originalImage = [System.Drawing.Image]::FromFile($Path)
            if ($originalImage.Width -eq $Size -and $originalImage.Height -eq $Size) {
                $ms = New-Object System.IO.MemoryStream
                $originalImage.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
                $result = [Convert]::ToBase64String($ms.ToArray())
                $ms.Dispose()
            } else {
                $resized = New-Object System.Drawing.Bitmap $Size, $Size
                $g = [System.Drawing.Graphics]::FromImage($resized)
                $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
                $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality
                $g.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality
                $g.DrawImage($originalImage, 0, 0, $Size, $Size)
                $g.Dispose()
                $ms = New-Object System.IO.MemoryStream
                $resized.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
                $result = [Convert]::ToBase64String($ms.ToArray())
                $ms.Dispose()
                $resized.Dispose()
            }
            $originalImage.Dispose()
            return $result
        } catch {
            Write-Error "Failed to convert icon file '$Path' to Base64: $_"
            return ""
        }
    }

    function New-ShortcutUserSettingXml {
        [CmdletBinding()]
        param ()

        $XmlDoc = New-Object System.Xml.XmlDocument

        $Root = $XmlDoc.CreateElement("UserSetting")
        [void]$XmlDoc.AppendChild($Root)

        function Add-TextElement {
            param (
                [System.Xml.XmlElement]$Parent,
                [string]$Name,
                [string]$Text
            )
            $el = $XmlDoc.CreateElement($Name)
            $el.InnerText = $Text
            [void]$Parent.AppendChild($el)
            return $el
        }

        [void](Add-TextElement -Parent $Root -Name "Id"                          -Text $SettingId)
        [void](Add-TextElement -Parent $Root -Name "FriendlyName"                -Text $FriendlyName)
        [void](Add-TextElement -Parent $Root -Name "Description"                 -Text $Description)
        [void](Add-TextElement -Parent $Root -Name "Type"                        -Text $Type)
        [void](Add-TextElement -Parent $Root -Name "ExecutionOrder"              -Text $ExecutionOrder)
        [void](Add-TextElement -Parent $Root -Name "CreatedDate"                 -Text $CreatedDate)
        [void](Add-TextElement -Parent $Root -Name "LastModifiedDate"            -Text $LastModifiedDate)
        [void](Add-TextElement -Parent $Root -Name "ProcessAtLogin"              -Text (ConvertTo-BooleanString -Value $ProcessAtLogin))
        [void](Add-TextElement -Parent $Root -Name "ProcessAtRefresh"            -Text (ConvertTo-BooleanString -Value $ProcessAtRefresh))
        [void](Add-TextElement -Parent $Root -Name "ProcessAtReconnectAndUnlock" -Text (ConvertTo-BooleanString -Value $ProcessAtReconnectAndUnlock))

        $MachineGroupsElement = $XmlDoc.CreateElement("MachineGroups")
        foreach ($Group in $MachineGroups) {
            [void](Add-TextElement -Parent $MachineGroupsElement -Name "MachineGroup" -Text $Group)
        }
        [void]$Root.AppendChild($MachineGroupsElement)

        $MachineGroupFriendlyNamesElement = $XmlDoc.CreateElement("MachineGroupFriendlyNames")
        foreach ($GroupFriendlyName in $MachineGroupFriendlyNames) {
            [void](Add-TextElement -Parent $MachineGroupFriendlyNamesElement -Name "FriendlyName" -Text $GroupFriendlyName)
        }
        [void]$Root.AppendChild($MachineGroupFriendlyNamesElement)

        $ShortcutEntriesElement = $XmlDoc.CreateElement("ShortcutEntries")
        foreach ($EntryData in $NewShortcutEntries) {
            $ShortcutEntryElement = $XmlDoc.CreateElement("ShortcutEntry")
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "ShortcutName"     -Text $EntryData.ShortcutName)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "ExecutablePath"   -Text $EntryData.ExecutablePath)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "Arguments"        -Text $EntryData.Arguments)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "WorkingDirectory" -Text $EntryData.WorkingDirectory)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "PlaceOnDesktop"   -Text (ConvertTo-BooleanString -Value ([bool]$EntryData.PlaceOnDesktop)))
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "IconData"         -Text $EntryData.IconData)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "IconData16"       -Text $EntryData.IconData16)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "IconData32"       -Text $EntryData.IconData32)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "IconData48"       -Text $EntryData.IconData48)
            [void](Add-TextElement -Parent $ShortcutEntryElement -Name "IconData256"      -Text $EntryData.IconData256)
            [void]$ShortcutEntriesElement.AppendChild($ShortcutEntryElement)
        }
        [void]$Root.AppendChild($ShortcutEntriesElement)

        return $XmlDoc
    }
    #endregion functions

    if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) {

        $SettingId = [guid]::NewGuid().ToString()
        $Type = "Shortcuts"
        $userSettingsPath = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentix.UserSettingsPath

        # Process InputObject
        if ($PSBoundParameters.ContainsKey("InputObject")) {
            Write-Verbose "Processing InputObject parameter..."
            if (-not [string]::IsNullOrEmpty($InputObject.FriendlyName)) {
                $FriendlyName = $InputObject.FriendlyName
            }
            if (-not [string]::IsNullOrEmpty($InputObject.Description)) {
                $Description = $InputObject.Description
            }
            if ($PSBoundParameters.ContainsKey("ProcessAtLogin") -eq $false -and $null -ne $InputObject.ProcessAtLogin) {
                $ProcessAtLogin = [bool]$InputObject.ProcessAtLogin
            }
            if ($PSBoundParameters.ContainsKey("ProcessAtRefresh") -eq $false -and $null -ne $InputObject.ProcessAtRefresh) {
                $ProcessAtRefresh = [bool]$InputObject.ProcessAtRefresh
            }
            if ($PSBoundParameters.ContainsKey("ProcessAtReconnectAndUnlock") -eq $false -and $null -ne $InputObject.ProcessAtReconnectAndUnlock) {
                $ProcessAtReconnectAndUnlock = [bool]$InputObject.ProcessAtReconnectAndUnlock
            }
            $ShortcutEntries = @(
                $InputObject.ShortcutEntries | ForEach-Object {
                    @{
                        ShortcutName     = "$($_.ShortcutName)"
                        ExecutablePath   = "$($_.ExecutablePath)"
                        Arguments        = "$($_.Arguments)"
                        WorkingDirectory = "$($_.WorkingDirectory)"
                        PlaceOnDesktop   = $_.PlaceOnDesktop
                        IconData         = "$($_.IconData)"
                        IconData16       = "$($_.IconData16)"
                        IconData32       = "$($_.IconData32)"
                        IconData48       = "$($_.IconData48)"
                        IconData256      = "$($_.IconData256)"
                    }
                }
            )
        }

        # Resolve MachineGroups
        if ($MachineGroupFriendlyName.Count -gt 0) {
            if ($MachineGroupFriendlyName -notcontains "All Machine Groups" -and $MachineGroupFriendlyName -notcontains "All" -and $MachineGroupFriendlyName.Count -gt 0) {
                $AvailableGroups = Get-AppVentiXMachineGroup
                $MachineGroups = @()
                $MachineGroupFriendlyNames = @()
                foreach ($Group in $MachineGroupFriendlyName) {
                    $selectedGroup = $AvailableGroups | Where-Object { $_.FriendlyName -ieq $Group }
                    if ($selectedGroup) {
                        $MachineGroups += $selectedGroup.GroupName.ToString()
                        $MachineGroupFriendlyNames += $selectedGroup.FriendlyName.ToString()
                    }
                }
            } else {
                $MachineGroups = @("All")
                $MachineGroupFriendlyNames = @("All Machine Groups")
            }
        } else {
            $MachineGroups = @("All")
            $MachineGroupFriendlyNames = @("All Machine Groups")
        }

        #region --- Build $NewShortcutEntries ---
        $NewShortcutEntries = @()

        foreach ($entry in $ShortcutEntries) {
            if (-not ($entry.ContainsKey("ShortcutName") -and $entry.ContainsKey("ExecutablePath"))) {
                Write-Error "Each shortcut entry must be a hashtable containing at least the keys: ShortcutName, ExecutablePath"
                return
            }

            $NewEntry = [ordered]@{
                ShortcutName     = "$($entry.ShortcutName)"
                ExecutablePath   = "$($entry.ExecutablePath)"
                Arguments        = "$($entry.Arguments)"
                WorkingDirectory = "$($entry.WorkingDirectory)"
                PlaceOnDesktop   = $false
                IconData         = "$($entry.IconData)"
                IconData16       = "$($entry.IconData16)"
                IconData32       = "$($entry.IconData32)"
                IconData48       = "$($entry.IconData48)"
                IconData256      = "$($entry.IconData256)"
            }

            # Normalize PlaceOnDesktop
            switch ($entry.PlaceOnDesktop) {
                "True"  { $NewEntry.PlaceOnDesktop = $true }
                "False" { $NewEntry.PlaceOnDesktop = $false }
                "1"     { $NewEntry.PlaceOnDesktop = $true }
                "0"     { $NewEntry.PlaceOnDesktop = $false }
                $true   { $NewEntry.PlaceOnDesktop = $true }
                $false  { $NewEntry.PlaceOnDesktop = $false }
                default { $NewEntry.PlaceOnDesktop = $false }
            }

            # Icon resolution: use base64 from entry if present, otherwise fall back to IconFile
            $iconSizes = @{ IconData = 32; IconData16 = 16; IconData32 = 32; IconData48 = 48; IconData256 = 256 }
            $hasAnyIconData = $iconSizes.Keys | Where-Object { -not [string]::IsNullOrEmpty($NewEntry[$_]) }

            if (-not $hasAnyIconData) {
                if ($PSBoundParameters.ContainsKey("IconFile")) {
                    Write-Verbose "No icon data in entry '$($NewEntry.ShortcutName)'. Generating from IconFile '$IconFile'."
                    foreach ($iconField in $iconSizes.GetEnumerator()) {
                        $NewEntry[$iconField.Key] = ConvertFrom-IconFilePath -Path $IconFile -Size $iconField.Value
                    }
                } else {
                    Write-Warning "No icon data found for shortcut '$($NewEntry.ShortcutName)' and no -IconFile specified. Icon fields will be empty."
                }
            } elseif ($PSBoundParameters.ContainsKey("IconFile")) {
                Write-Verbose "Entry '$($NewEntry.ShortcutName)' already contains icon data. -IconFile parameter will be ignored for this entry."
            }

            $NewShortcutEntries += $NewEntry
        }
        #endregion --- Build $NewShortcutEntries ---

        $policyFilename = "$($Type)-$($SettingId).xml"
        $policyFullname = Join-Path -Path $userSettingsPath -ChildPath $policyFilename

        $CreatedDate = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
        $LastModifiedDate = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

        if ([string]::IsNullOrEmpty($FriendlyName)) {
            Write-Error "FriendlyName is required. Please provide a value for the FriendlyName parameter or include it in the InputObject."
            return
        }

        try {
            Write-Verbose "Building UserSetting XML..."

            $XmlDocument = New-ShortcutUserSettingXml

            $XmlWriterSettings = New-Object System.Xml.XmlWriterSettings
            $XmlWriterSettings.Indent = $true
            $XmlWriterSettings.IndentChars = " "
            $XmlWriterSettings.Encoding = [System.Text.Encoding]::UTF8
            $XmlWriterSettings.OmitXmlDeclaration = $true

            Write-Verbose "Saving UserSetting XML to $policyFullname"
            $XmlWriter = [System.Xml.XmlWriter]::Create($policyFullname, $XmlWriterSettings)
            $XmlDocument.Save($XmlWriter)
            $XmlWriter.Close()

            Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "New Shortcut User Setting '$FriendlyName' added with $($NewShortcutEntries.Count) shortcut(s)."

            Write-Output (
                [PSCustomObject]@{
                    Id           = $SettingId
                    FriendlyName = $FriendlyName
                    FileName     = $policyFilename
                }
            )
        } catch {
            Write-Error "Failed to generate XML: $($_.Exception.Message)"
        }
    } else {
        Write-Warning 'AppVentiX is not licensed!'
    }
}

# SIG # Begin signature block
# MII5ywYJKoZIhvcNAQcCoII5vDCCObgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB2r8NkB3wccHAt
# PF4zFyrn63gJzYZ/CgBHbWiSBNBIMqCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAQAyV2c
# /A5Hn0e8AAAABADJMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMwHhcNMjYwNzI5MTQwMjI5WhcNMjYwODAx
# MTQwMjI5WjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP
# MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE
# AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB
# gQDVQ19o3p/y4kmo6Cgzl5XnAmMuffaR4qoZUctU5tkQgCI5yxoNAzWZaO92jiDL
# L3h8wmfUN9aoD69R8rJxBhTSbo74QTNUtJVjkktxLtFZCaxv6LtycY28DEBWweuo
# /4z0vMo8o6ldlTznE/cspYj+AmXtbO0mAZMhOWXPYI0D3KIeupBoenPJy5EbCs+I
# u3zKin0c15uK6dWyhJ5cwhfrgbFmZoBzAMt3jESW8Y1XlnOP73xSPm8cHummLH6C
# BhbSlUv7VZ/g+3k0fWk2JPMK8xMwUTRjjDvPjAPMFcfBiVauNSH6r2FexxaU9I6c
# An2krGI/WCJdguZ82aDSisTLXcniYhh5WwCigEfb6CkSxgXO1kO6/YNIjSmy4+KA
# lHhjFrV5xQlu01XPQG6Fp5mCSHFXEUOjfmGqrbudPhJnko6WnAvJ18e69FSmTi2e
# yfI+S6CDQHBvjHDm/TGU++G08mSzPSrjVz2PNMZevM8p5xcj3kFU0TLdM0zPuSYl
# PfkCAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG
# A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6
# gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUIn8KdvFB1h2L3a6RONhihT4Cgw8wHwYDVR0j
# BBgwFoAUpEMMf3ZapYXnPo0oDwwXokVpcMYwZwYDVR0fBGAwXjBcoFqgWIZWaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl
# MjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEE
# aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENB
# JTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# DQYJKoZIhvcNAQEMBQADggIBAMHQvt6PV1e0ZrIPYfGym7+3eXy1vjGMk0urt1B2
# 8ysT9tm5EPg35zenkUOl5VTZZqtzvZo4D4hD4a6uAJMW5D0RyuTYjyEOYq5jk2gh
# hfcKM0eeaAln72lmZ5rqPJ7UInJlw/yaYTFPddwAqiFPDL5eDtNMtLjGoFNiKq/e
# ct9QCeVx7UeBs+WqvkFrKcCFZvD7Rk3GFwyBKRKjgvo6tgO9ZQDC5+Jvw4Z0/qt9
# jZeRfsEM2Xq9AcAbLBIbqnxSqsLhWm3r9/rtqyoyEkqpOV/3npY3Kif1HJKl0tJh
# Zhrg/1hnViGEtmX01F9ag460PUuUqO5+LCMlGx1S55WtIpLNYD0may3UkfNrOvw7
# JgoGw2+sDHb7cHMnCR1KGE23m28IImpIJ4/Y8AVb0ojJi9agZsl05Obz0UcpLH03
# fYOYKYP8e8EULXyff/hSoZqIkfjTEsZMnw1FEipRb0Q1gIskoK9WZdxruELJ/FOJ
# X6sodqgo3wIUJQf2IhFVXcaS4qG+COiO5+nFVfkOcxhr8krXjgz6nC8MXZOajACj
# ntvNC0uAZajWnV2SYWcxBWoHBRPCod2Xq3zgLEGfV5LONdKESYDNdZ6RlOhDjbZS
# jgFWr7hezSEuTb2K/1pq9DgOEaJXXBlAiPd9Htk0WrlWoKwC4psrfthcWseWRoXH
# rpphMIIGpTCCBI2gAwIBAgITMwAEAMldnPwOR59HvAAAAAQAyTANBgkqhkiG9w0B
# AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAz
# MB4XDTI2MDcyOTE0MDIyOVoXDTI2MDgwMTE0MDIyOVowaDELMAkGA1UEBhMCTkwx
# FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE
# ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN
# BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA1UNfaN6f8uJJqOgoM5eV5wJjLn32
# keKqGVHLVObZEIAiOcsaDQM1mWjvdo4gyy94fMJn1DfWqA+vUfKycQYU0m6O+EEz
# VLSVY5JLcS7RWQmsb+i7cnGNvAxAVsHrqP+M9LzKPKOpXZU85xP3LKWI/gJl7Wzt
# JgGTITllz2CNA9yiHrqQaHpzycuRGwrPiLt8yop9HNebiunVsoSeXMIX64GxZmaA
# cwDLd4xElvGNV5Zzj+98Uj5vHB7ppix+ggYW0pVL+1Wf4Pt5NH1pNiTzCvMTMFE0
# Y4w7z4wDzBXHwYlWrjUh+q9hXscWlPSOnAJ9pKxiP1giXYLmfNmg0orEy13J4mIY
# eVsAooBH2+gpEsYFztZDuv2DSI0psuPigJR4Yxa1ecUJbtNVz0BuhaeZgkhxVxFD
# o35hqq27nT4SZ5KOlpwLydfHuvRUpk4tnsnyPkugg0Bwb4xw5v0xlPvhtPJksz0q
# 41c9jzTGXrzPKecXI95BVNEy3TNMz7kmJT35AgMBAAGjggHUMIIB0DAMBgNVHRMB
# Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr
# BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFCJ/
# CnbxQdYdi92ukTjYYoU+AoMPMB8GA1UdIwQYMBaAFKRDDH92WqWF5z6NKA8MF6JF
# aXDGMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy
# MENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy
# MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQDB0L7e
# j1dXtGayD2Hxspu/t3l8tb4xjJNLq7dQdvMrE/bZuRD4N+c3p5FDpeVU2Warc72a
# OA+IQ+GurgCTFuQ9Ecrk2I8hDmKuY5NoIYX3CjNHnmgJZ+9pZmea6jye1CJyZcP8
# mmExT3XcAKohTwy+Xg7TTLS4xqBTYiqv3nLfUAnlce1HgbPlqr5BaynAhWbw+0ZN
# xhcMgSkSo4L6OrYDvWUAwufib8OGdP6rfY2XkX7BDNl6vQHAGywSG6p8UqrC4Vpt
# 6/f67asqMhJKqTlf956WNyon9RySpdLSYWYa4P9YZ1YhhLZl9NRfWoOOtD1LlKju
# fiwjJRsdUueVrSKSzWA9Jmst1JHzazr8OyYKBsNvrAx2+3BzJwkdShhNt5tvCCJq
# SCeP2PAFW9KIyYvWoGbJdOTm89FHKSx9N32DmCmD/HvBFC18n3/4UqGaiJH40xLG
# TJ8NRRIqUW9ENYCLJKCvVmXca7hCyfxTiV+rKHaoKN8CFCUH9iIRVV3GkuKhvgjo
# jufpxVX5DnMYa/JK144M+pwvDF2TmowAo57bzQtLgGWo1p1dkmFnMQVqBwUTwqHd
# l6t84CxBn1eSzjXShEmAzXWekZToQ422Uo4BVq+4Xs0hLk29iv9aavQ4DhGiV1wZ
# QIj3fR7ZNFq5VqCsAuKbK37YXFrHlkaFx66aYTCCBygwggUQoAMCAQICEzMAAAAY
# DeuRVamKAJgAAAAAABgwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0
# IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx
# MzJaFw0zMTAzMjYxODExMzJaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll
# ZCBDUyBBT0MgQ0EgMDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDI
# gNpgNFaiif2VWeWP5I6PnFXxJ/lB37fJR55GCvR7GLZBMkBijbiKVwgpBI3xM5nf
# 484znH/qncJ+OCq6y3jgnQW+R8Zd7U+7LjlrmcskalzSQ0ghMxEpnBW8/HHs2V8Z
# JzQk6HP+SDsbvsL7LdlH/eO2l4mknhDBwr0Z/Q966TvEth5b8kCxj1vqiV4YNthL
# GRqZR9u2fK/yBMWu83p6O4uo2Edg++gEew5IL7vnnnKFqmSh/R9vPJy3WF1YcZew
# AUx8sXZNUnx3ZhVg59l2LpitPiwzE6FMqIsqaEvVe3MzuFd2a/uWDZH6VbDyUiRK
# 78mIg1DQYA9zDEyyBFcNI+nxVSzglvL6u7PRuNqgcV3sf6ELxw89ysQM/Z4R1hRF
# WXRpyOWKKAKtfBHTk0UnNiPcxmLMMYs8jeUjOidfVPjTIry/UVwnwxdlkK85cZfB
# EMYZ/DBNOwdomP459Y1n8izKkbhsa+p4lw+cQVxATBFx9ggR79HhryT7HDmpPLvk
# JvBZ4wW4CW32UT2SMyDe28nIOU3m+hfHlVeKcLBQcym5VoRDjIcCVI7uqgGW2PNM
# E0cfei8zCwCy6HCsssJWFS7eg/YbFhnATJcyWfMrkNuAbMfMN8Npg8crS6jVVowy
# D0GG5zdgi+uQVcSK/638mA1xEYK3pnIoQgO09uuDBwIDAQABo4IB3DCCAdgwDgYD
# VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSkQwx/dlql
# hec+jSgPDBeiRWlwxjBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl
# oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z
# b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy
# MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp
# ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB
# DAUAA4ICAQBxxyBW+X6mhdRiSwD9PMMWcGUAnx5/QUwnNvZdFGEX+4DRDIr9WCh4
# C87wHtw+lg1D3uzK10DstPX0LFLBFAC3vWMYX4ImXwoLhoR0xlN8mUdorJ3bgnpC
# JWuI1531Z1rCwPuUrSkBxfOIGDk3p2ECb3Ho/xHi5PRSR/OUrWuQHwXiaXMTuXu3
# IRLezwVkZpFmNwYRD57R9Nx2F/yM7tzOY0Hh0hGCaYEK38/6FrS0SXadXWyDUCfn
# 5XOGACRjUCnHx+JQUG0f4SHD+iblpAI0gl+ZHnVmdXXxHTZeTa0CYCIhFxKP2922
# s0g6zLmeiV13LWUmtt/UF7TrWXpMi2/0UNniaDoH7rnPGRV5xVX8uXy4sZii4asw
# zqPM7Y7+mzcranqZ8EjZk5gjLhQ3A2sZaprlOu8CaRmyfcIiVH7zVfgAvm81MWXF
# ziAf7my7QOvnyEFPGddq8MSfPtfRyw/Uq3uH6KpoaJNIfPYH6fceZSi53Rat1A9g
# rExq3ROjhhSpTcchuBItAMNVPxoKNbUm+iR/X3XkL+9WQginjyHe+hXLclY8vAGX
# FD1p40PqMIpAYsmEJBFKW9df4//1N5oQDr/FY9IBJl/oSS979i5rtT7NZz9KvYra
# CPRBGs0QCy+sWvgQa0coM70QJVLeVwmSxUO/0od0w9Qry7bSLrxGoDCCB54wggWG
# oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG
# A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE
# AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj
# YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy
# MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ
# Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji
# 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN
# cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I
# u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ
# 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm
# JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG
# 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF
# xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc
# Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b
# Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV
# FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K
# 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E
# BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p
# nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ
# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
# GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl
# bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo
# b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC
# hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m
# dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl
# JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv
# Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U
# q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0
# wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH
# +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN
# 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0
# byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN
# OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx
# 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+
# PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ
# e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD
# f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX
# iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghcxMIIXLQIBATBxMFoxCzAJBgNV
# BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT
# Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMCEzMABADJXZz8Dkef
# R7wAAAAEAMkwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq
# hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgnRkP03pqLYC7
# jt2yI+Z29COrbz/5g6r0j/nRnJy21towDQYJKoZIhvcNAQEBBQAEggGALse+X1Cp
# 2Ll3rd//z7ObT1Jtubvms7EmDkbqOdIRmbEGlpWViDM/pffz3v2WDSlbiPh2Dv2a
# 39HnBDDa/CWusFypp1OI04c4Ym7R0eqpW1ZW+WZvaUAoW5owNU/eyghbqfIhNdu3
# fB9BUJsqyUrozDE93zCUT5gRM0pOVFVTkmBVMy7kOWFhGhIAwX/wCi08WRlBcECF
# pFvf6e9Fd3oyJDmRf1Wjn9AGuIjzXK40XhXcdo1bGDU8/prA+CU6LoY+yrTQjMxy
# KQrGWYCPjMSTwmU2rdvXego32zb39WfxOGtq7qpyYwlVvCo7Al/zG+yFRjq6uc3X
# 5JFHnqDFuYHr3X5db3AJpG6Z3ixDFkj6DqJoeSJgmKy45NHfmFXlpdhEw516aBG6
# KITkdMIfXvXQEH3jYegtqTQe8SmyTLti1956W0uQrvcIiGLDJ4gcA2H67PcmAbls
# fRlQkr3AQZ15Xw0tE1jDSZPcdExAq4Gv0cPcvhgR/QS4jxko5ABUvnP0oYIUsTCC
# FK0GCisGAQQBgjcDAwExghSdMIIUmQYJKoZIhvcNAQcCoIIUijCCFIYCAQMxDzAN
# BglghkgBZQMEAgEFADCCAWkGCyqGSIb3DQEJEAEEoIIBWASCAVQwggFQAgEBBgor
# BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIP3tewvTCqfOW70eoVcSfCjiUpJT
# W52hDqDaKP2teroCAgZqY0xk7sMYEjIwMjYwNzI5MTcyMjM1LjcyWjAEgAIB9KCB
# 6aSB5jCB4zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG
# A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYD
# VQQLEx5uU2hpZWxkIFRTUyBFU046N0IxQS0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1p
# Y3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oIIPKTCC
# B4IwggVqoAMCAQICEzMAAAAF5c8P/2YuyYcAAAAAAAUwDQYJKoZIhvcNAQEMBQAw
# dzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFI
# MEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENl
# cnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIwMTExOTIwMzIzMVoXDTM1MTEx
# OTIwNDIzMVowYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1w
# aW5nIENBIDIwMjAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCefOdS
# Y/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVGR3eRwV1wb3+yq0OXDEqhUhxqoNv6iYWK
# jkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGcb95WJLiw7HzLiBKrxmDj1EQB/mG5eEiR
# BEp7dDGzxKCnTYocDOcRr9KxqHydajmEkzXHOeRGwU+7qt8Md5l4bVZrXAhK+WSk
# 5CihNQsWbzT1nRliVDwunuLkX1hyIWXIArCfrKM3+RHh+Sq5RZ8aYyik2r8HxT+l
# 2hmRllBvE2Wok6IEaAJanHr24qoqFM9WLeBUSudz+qL51HwDYyIDPSQ3SeHtKog0
# ZubDk4hELQSxnfVYXdTGncaBnB60QrEuazvcob9n4yR65pUNBCF5qeA4QwYnilBk
# fnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFhH8k8YBozrEaXnsSL3kdTD01X+4LfIWOu
# FzTzuoslBrBILfHNj8RfOxPgjuwNvE6YzauXi4orp4Sm6tF245DaFOSYbWFK5ZgG
# 6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNEobv35Nf6xN6FrA6jF9447+NHvCjeWLCQ
# Z3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOcPVrr3D9RPHCMS6Ckg8wggTrtIVnY8yjb
# vGOUsAdZbeXUIQAWMs0d3cRDv09SvwVRd61evQIDAQABo4ICGzCCAhcwDgYDVR0P
# AQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRraSg6NS9IY0DP
# e9ivSek+2T3bITBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt
# MBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBB
# MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9o
# qKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIw
# Um9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmwwgZQGCCsG
# AQUFBwEBBIGHMIGEMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNh
# dGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0
# MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbHfm21WhV150x4aPpO4dhEmSUVpbixNDmv
# 6TvuIHv1xIs174bNGO/ilWMm+Jx5boAXrJxagRhHQtiFprSjMktTliL4sKZyt2i+
# SXncM23gRezzsoOiBhv14YSd1Klnlkzvgs29XNjT+c8hIfPRe9rvVCMPiH7zPZcw
# 5nNjthDQ+zD563I1nUJ6y59TbXWsuyUsqw7wXZoGzZwijWT5oc6GvD3HDokJY401
# uhnj3ubBhbkR83RbfMvmzdp3he2bvIUztSOuFzRqrLfEvsPkVHYnvH1wtYyrt5vS
# hiKheGpXa2AWpsod4OJyT4/y0dggWi8g/tgbhmQlZqDUf3UqUQsZaLdIu/XSjgoZ
# qDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5xvPSwym0Ukr4o5sCcMUcSy6TEP7uMV8R
# X0eH/4JLEpGyae6Ki8JYg5v4fsNGif1OXHJ2IWG+7zyjTDfkmQ1snFOTgyEX8qBp
# efQbF0fx6URrYiarjmBprwP6ZObwtZXJ23jK3Fg/9uqM3j0P01nzVygTppBabzxP
# Ah/hHhhls6kwo3QLJ6No803jUsZcd4JQxiYHHc+Q/wAMcPUnYKv/q2O444LO1+n6
# j01z5mggCSlRwD9faBIySAcA9S8h22hIAcRQqIGEjolCK9F6nK9ZyX4lhthsGHum
# aABdWzCCB58wggWHoAMCAQICEzMAAABZfNpx6Y1e9cAAAAAAAFkwDQYJKoZIhvcN
# AQEMBQAwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n
# IENBIDIwMjAwHhcNMjYwMTA4MTg1OTAxWhcNMjcwMTA3MTg1OTAxWjCB4zELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9z
# b2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hpZWxk
# IFRTUyBFU046N0IxQS0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJs
# aWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
# AAOCAg8AMIICCgKCAgEApi7n/jR4Rf6FP7mMVrXjpuJ3d0Dguddie2+Q/cIbDgsY
# BEWGe8sxIn9W2y5vMNp4WebvJvYpIzvRaYdCmt0JWqm9QfuXS4HiM3Du6sugBH2Q
# ocsTRWUyUNK0NLFQEjerCx2uO92a9XST73+eO4MSJKXMlN/sOjB3Urds7ht5HJoW
# FH5jy3KYQI6qU4B99isbbBl1UznX5BIFJ748TKSvwLo6eepKKm4Xx9m8Jvr+G6TR
# mbpnCxqLFIcgBPYgQa9LtzrcibyNXdrxHQrqLbKLDQ02WdNKnDL9l+/uLCwsHCF9
# uMFOf5c6XqY/MNdBDdX5JE/3FdsYo6wFPHMaJ3tooAfDejgCGX1QZYsf2Q0/dVSi
# QToliSOV+m5QZnqBDKoN7B/EPhWhgiWim3gdnTFC+pqO4nH5yvwtH8hnnqAsubDI
# zN17n6+2MGiKWvL+BJnBUbCCS+QiCko8FAcaxIHTLezOvtjvARvq/TJlqXVdS9ae
# fPeKdNpJawIWss9XBWZfLedxjn93blWk6SG36br3sZY1u+w06EA4dFp+0T2P+GGS
# gzpGzIl8EueGoxwD/Bxq9/miPk17JFB0Zl4spyWz1ywpLewFTM+J3HHaKI0f0I9o
# Or9sskQ5dqxiiFcydGKe759STzWzxU7sNBIXp9+fmipIehXyV/UDHq76R1KFvwEC
# AwEAAaOCAcswggHHMB0GA1UdDgQWBBSPlucLXwPS+WdJGEI6I4MYa5c2djAfBgNV
# HSMEGDAWgBRraSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6Bdhlto
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQ
# dWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsG
# AQUFBwEBBG0wazBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh
# bXBpbmclMjBDQSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAww
# CgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGC
# N0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEM
# BQADggIBAEQyHML9lyOkb/NRETvPZinm+tTFSOwTldre3/ZEa8RLC9uayTdsseFI
# UBqOCjZdDzGgYM/exSEoIs94gJJuRW/pXyxKnx8nwmizrKtrB/ZhWKzy1xX447tT
# 1LokY9DOmY+dx/NBzid7V+pnj4eIppsgMSgV111BPYSCST1/PEJj8RnnZq8nbt1J
# +sj8gObKf1XXQ7eJCmDYX4L281OuTudWCgOgdr35DelivQgcadKa3mKuAZPjfrOj
# ladc/wXEyGzAfVqLKJJmJXOGivXQL0LnZw/cLz88SgwpRey0uOg87RMyR5b/UWvX
# zopcPjlBGAGjTEiaC1ZN3NYWeUP6nv6IMEi5Ks1xFcNFi6r9phloOFZIjRJh08hZ
# WHle9e5YDfVryhDRI76g9rc2TzSTTzrjCKLInUqxtKdpp5+D2+yl6CGuljyWMLDF
# 8JS3HkdBE2AAk4jwgoAIrh3TXgyTSGVE7SVBVEd6CoiDb0rpeqRzfrRbZkkZRyy2
# UqiSRWPooAeMbKstE/N6lh+JlQmriBfLFum8pvVcnYU3brzZpSg1ej1HJErVyHR/
# rqTr7KPzyTO+4Lv68la00Oz9SkgzoeGbSRTrglQnswwRBwBzuSl+3sabth5Er6gq
# CpSBhcJ+bNtfyclclmc9rwANZWwiqy40DEIjQJleRQuh+qjkF7rPMYID1DCCA9AC
# AQEweDBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg
# Q0EgMjAyMAITMwAAAFl82nHpjV71wAAAAAAAWTANBglghkgBZQMEAgEFAKCCAS0w
# GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCDv2bbj
# q7vNtumBAxJrYhiWCm23REJuO+BHB3WPsgcv+zCB3QYLKoZIhvcNAQkQAi8xgc0w
# gcowgccwgaAEIMtFurHbhumxxcQn4eOP3GtxRXDtHw7LIx9IHZgYrf68MHwwZaRj
# MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# MjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAy
# MDIwAhMzAAAAWXzacemNXvXAAAAAAABZMCIEICg33i2nvROZwhizv813FL2CggN9
# kW7Fg02Af0bdrPz6MA0GCSqGSIb3DQEBCwUABIICAFygV5eH+GOuTzKMQ0u7ck7c
# 9XKvmEOpt7hwX0jKmQbaCpMyA5x7Gf3ChFYKb2q/dnlwu0+Jwh0CCrDdLsxZ+xu5
# 1UrDIgxsxbF0mGXxCj6Uswy+YVOW0crsF7NydF2B2is3Npm85QqlgcSjGgcL1R/K
# ClmO4dX/jp5zvdih7kGep9bVz5PFfexIfT2RrAKe9gNifz+RoQRCrzLkbvplw61x
# saEHDKdWOlDndrKyaYl5R1ciG9Slq4fY7953ju3u8uU8hRgGZXYQwmgyq4+8Pa8I
# MkN3oOpGqchk+/LZTZe9o5UfmhP6F+Tvt/Eked8DUupDaXJCzt6Vb71ili8X3bY0
# SubSvhl3KqQMdzJw7lBC27lNw0j0kGYR/sVwCpPU6kuZkLMnKQxZLhyTHH6eB8NY
# k2gIUsb2RhCg8PrVJpX1eUey7psoC9R7D0VBTsMGMXqW6irZ81U2kriqeYWKWuQm
# b03TNKsiTF3Re+qowpARprvBWpzFQQD9tGunuxEDmic64NxPJB9OyFi9pF4ljSPX
# Iz6ejtG2t46E40AeB6jSwBziPYOd3LJ4FWjdCJ5AnkXRiKVOFVzWAJcw1iUbAAjI
# R7036N9VBVpEVtYiLfeRooY59nm7viYYoKB2P48doHCX1Hq2vIx7TmXAoefX/T77
# tSiqhWZXAsU3JLjNy6o2
# SIG # End signature block