Strapper.psm1

$StrapperSession = [pscustomobject]@{
    LogPath = $null
    ErrorPath = $null
    WorkingPath = $null
    ScriptTitle = $null
    IsLoaded = $true
    IsElevated = $false
    LogsToDB = $true
    LogTable = $null
    DBPath = "$PSScriptRoot/Strapper.db"
    Platform = [System.Environment]::OSVersion.Platform
}

if ($MyInvocation.PSCommandPath) {
    $scriptObject = Get-Item -Path $MyInvocation.PSCommandPath
    $StrapperSession.WorkingPath = $($scriptObject.DirectoryName)
    $StrapperSession.LogPath = Join-Path $StrapperSession.WorkingPath "$($scriptObject.BaseName)-log.txt"
    $StrapperSession.ErrorPath = Join-Path $StrapperSession.WorkingPath "$($scriptObject.BaseName)-error.txt"
    $StrapperSession.ScriptTitle = $scriptObject.BaseName
    $StrapperSession.LogTable = "$($scriptObject.BaseName)_log"
} else {
    $StrapperSession.WorkingPath = (Get-Location).Path
    $currentDate = (Get-Date).ToString('yyyyMMdd')
    $StrapperSession.LogPath = Join-Path $StrapperSession.WorkingPath "$currentDate-log.txt"
    $StrapperSession.ErrorPath = Join-Path $StrapperSession.WorkingPath "$currentDate-error.txt"
    $StrapperSession.ScriptTitle = $currentDate
    $StrapperSession.LogTable = "$($currentDate)_log"
}

if ($StrapperSession.Platform -eq 'Win32NT') {
    $StrapperSession.IsElevated = (
        New-Object `
            -TypeName Security.Principal.WindowsPrincipal `
            -ArgumentList ([Security.Principal.WindowsIdentity]::GetCurrent())
    ).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
} else {
    $StrapperSession.IsElevated = $(id -u) -eq 0
}

$enums = @(@(
    "$PSScriptRoot/Enums/StrapperLogLevel.ps1"
) | Get-ChildItem)

$classes = @(@(
    "$PSScriptRoot/Classes/StrapperLog.ps1"
) | Get-ChildItem)

$publicFunctions = @( Get-ChildItem -Path "$PSScriptRoot/Public/*.ps1" -Recurse )
$privateFunctions = @( Get-ChildItem -Path "$PSScriptRoot/Private/*.ps1" -Recurse )
foreach ($importTarget in @($enums + $classes + $publicFunctions + $privateFunctions)) {
    try {
        . $importTarget.FullName
    } catch {
        Write-Error -Message "Failed to import $($importTarget.FullName)"
    }
}

if(!(Test-Path -LiteralPath $StrapperSession.DBPath)) {
    [System.Data.SQLite.SQLiteConnection]::CreateFile($StrapperSession.DBPath)
}
if($IsLinux -or $IsMacOS) {
    chmod 776 $StrapperSession.DBPath
} else {
    $dbPathAcl = Get-Acl -Path $StrapperSession.DBPath
    $worldGroupName = (New-Object System.Security.Principal.SecurityIdentifier('S-1-1-0')).Translate([System.Security.Principal.NTAccount]).Value
    $fsar = [System.Security.AccessControl.FileSystemAccessRule]::new($worldGroupName, "FullControl", "Allow")
    $dbPathAcl.SetAccessRule($fsar)
    Set-Acl -Path $StrapperSession.DBPath -AclObject $dbPathAcl
}
Export-ModuleMember -Variable StrapperSession

# SIG # Begin signature block
# MIIlhAYJKoZIhvcNAQcCoIIldTCCJXECAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBbgOdAXCrsVA/o
# EQVsvye0zIXqfyya5vry6SbzhwMfmKCCEtEwggXdMIIDxaADAgECAgh7LJvTFoAy
# mTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
# EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8G
# A1UEAwwoU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTAe
# Fw0xNjAyMTIxNzM5MzlaFw00MTAyMTIxNzM5MzlaMHwxCzAJBgNVBAYTAlVTMQ4w
# DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENv
# cnBvcmF0aW9uMTEwLwYDVQQDDChTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBB
# dXRob3JpdHkgUlNBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA+Q/d
# oyt9y9Aq/uxnhabnLhu6d+Hj9a+k7PpKXZHEV0drGHdrdvL9k+Q9D8IWngtmw1aU
# nheDhc5W7/IW/QBi9SIJVOhlF05BueBPRpeqG8i4bmJeabFf2yoCfvxsyvNB2O3Q
# 6Pw/YUjtsAMUHRAOSxngu07shmX/NvNeZwILnYZVYf16OO3+4hkAt2+hUGJ1dDyg
# +sglkrRueiLH+B6h47LdkTGrKx0E/6VKBDfphaQzK/3i1lU0fBmkSmjHsqjTt8qh
# k4jrwZe8jPkd2SKEJHTHBD1qqSmTzOu4W+H+XyWqNFjIwSNUnRuYEcM4nH49hmyl
# D0CGfAL0XAJPKMuucZ8POsgz/hElNer8usVgPdl8GNWyqdN1eANyIso6wx/vLOUu
# qfqeLLZRRv2vA9bqYGjqhRY2a4XpHsCz3cQk3IAqgUFtlD7I4MmBQQCeXr9/xQiY
# ohgsQkCz+W84J0tOgPQ9gUfgiHzqHM61dVxRLhwrfxpyKOcAtdF0xtfkn60Hk7ZT
# NTX8N+TD9l0WviFz3pIK+KBjaryWkmo++LxlVZve9Q2JJgT8JRqmJWnLwm3KfOJZ
# X5es6+8uyLzXG1k8K8zyGciTaydjGc/86Sb4ynGbf5P+NGeETpnr/LN4CTNwumam
# du0bc+sapQ3EIhMglFYKTixsTrH9z5wJuqIz7YcCAwEAAaNjMGEwHQYDVR0OBBYE
# FN0ECQei9Xp9UlMSkpXuOIAlDaZZMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgw
# FoAU3QQJB6L1en1SUxKSle44gCUNplkwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
# DQEBCwUAA4ICAQAgGBGUKfsmnRweHnBh8ZVyk3EkrWiTWI4yrxuzcAP8JSt0hZA9
# eGr0uYullzu1GJG7Hqf5QFuR+VWZrx4R0Fwdp2bjsZQHDDI5puobsHnYHZxwROOK
# 3cT5lR+KOEM/AYWlR6c9RrK85SJo93uc2Cw+CiHILTOsv8WBmTF0wXVxxb6x8CNF
# 9J1r/BljnaO8BMYYCyW7U4kPs4BQ3kXuRH+rlHhkmNP2KN2H2HBldPsOuRPrpw9h
# qTKWzN677WNMGLupQPegVG4giHF1GOp6tDRy4CMnd1y2kOqGJUCr7zMPy5+CvqIg
# +/a1LRrmwoWxdA/7yGUCpFIBR91JIsG/2OtrrH7e7GMzFbcjCI/GD41BWt2OxbmP
# 5UU/eNu60htAsf5xTT/ggaK6XrTsFeCT3QgffuFVmQsh3pOeCvvmo0m9NjD+53ey
# oHWXtS2BiBdlIPfakACfyVLMMso1fPU9D9gr1/UmbMkGNJYW6nBZGjJ5eQu2iH8P
# Ukg9v2zYokQu0U63cljTiROV/kSr+NeLG26cvCygW9VqAK9fN+HV+hALmJyG5yaP
# zvDsbopXC4DjTrLAoGNhkLpVaDd0araS25+hhiK2ZScO7LafQmDkZ8K12kELxNOL
# YRu8+h+RK9dEB166KazZxenvU0ha64DxKFghzbAGVfsnP1OQcKkEHlcnuTCCBnIw
# ggRaoAMCAQICCGQzUdPHOJ8IMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVT
# MQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NM
# IENvcnBvcmF0aW9uMTEwLwYDVQQDDChTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlv
# biBBdXRob3JpdHkgUlNBMB4XDTE2MDYyNDIwNDQzMFoXDTMxMDYyNDIwNDQzMFow
# eDELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9u
# MREwDwYDVQQKDAhTU0wgQ29ycDE0MDIGA1UEAwwrU1NMLmNvbSBDb2RlIFNpZ25p
# bmcgSW50ZXJtZWRpYXRlIENBIFJTQSBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
# ADCCAgoCggIBAJ+DE3OqsMZtIcvbi3qHdNBx3I6Xcprku4g0tN2AA8YvRaR0mr8e
# D1Dqnm1485/6USapPZ3RspRXPvs5iRuRK1bvZ8vmC+MOOYzGNfSMPd0l6QGsF0J9
# WBZA3PnVKEQdlWQwYTpk8pfXc0x9eyMCbfN161U9b6otxK++dKxd/mq2/OpceekP
# Q5y1UgUP7z6xsY/QSa2m40IZVD/zLw6hy3z+E/kjOdolHLg+AEo6bzIwN2Qex651
# B9hV0hjJDoq8o1zwfAqnhYHCDq+PmVzTYCW8g1ppHCUTzXL165yAm9wsZ8TdyQmY
# 1XPrxCGj5TKOPi9SmMZgN2SMsm9KVHIYzCeH+s11omMhTLU9ZP0rpptVryZMYLS5
# XP6rQ72t0BNmUB8L0omm/9eABvHDEQIzM2EX91Yfji87aOcV8XdWSimeA9rCKyZh
# MlugVuVJKY02p/XHUqJWAyAvOHiAvfYGrkE0y5RFvZvHiRgfC7r/qa5qQJkT3e9Q
# 3wG68gTW0DHfNDheV1vIOB5W1KxIpu3/+bjBO+3CJL5EYKd3zdU9mFm0Q+qqYH3N
# wuUv8ev11CDVlzRuXQRrBRHS05KMCSdE7U81MUZ+dBkFYuyJ4+ojcJjk0S/UihMY
# RpNl5Vhz00w9J3oiP8P4o1W3+eaHguxFHsVuOnyxTrmraPebY9WRQbypAgMBAAGj
# gfswgfgwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTdBAkHovV6fVJTEpKV
# 7jiAJQ2mWTAwBggrBgEFBQcBAQQkMCIwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3Nw
# cy5zc2wuY29tMBEGA1UdIAQKMAgwBgYEVR0gADATBgNVHSUEDDAKBggrBgEFBQcD
# AzA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3Jscy5zc2wuY29tL3NzbC5jb20t
# cnNhLVJvb3RDQS5jcmwwHQYDVR0OBBYEFFTC/hCVAJPNavXnwNfZsku4jwzjMA4G
# A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEA9Q8mh3CvmaLK9dbJ8I1m
# PTmC04gj2IK/j1SEJ7bTgwfXnieJTYSOVNEg7mBD21dCPMewlfa+zOqjPY5PBsYr
# WYZ/63MbyuVAJuA9b8z2vXHGzX0OIEA51gXSr5QIv3/CUbcrtXuDIfBj2uWc4Wku
# dR1Oy2Ee9aUz3wKdFdntaZNXukZFLoC8Zb7nEj7eR/+QnBCt9laypNT61vwuvJch
# s3aD0pH6BlDRsYAogP7brQ9n7fh93NlwW3q6aLWzSmYXj+fw51fdaf68XuHVjJ8T
# u5WaFft5K4XVbT5nR24bB1z7VEUPFhEuEcOwvLVuHDNXlB7+QjRGjjFQTtszV5X6
# OOTmEturWC5Ft9kiyvRaR0ksKOhPjEI8ZGjp5kOsGZGpxxOCX/xxCje3nVB7PF33
# olKCNeS159MKb2v+jfmk19UdS+d9Ygj42desmUnbtYRBFC72LmCXU0ua/vGIenS6
# nnXp4NqnycwsO3tMCnjPlPc2YLaDPIpUy04NaCqUEXUmFOogN8zreRd2VXhxbeJJ
# ODM32+RsWccjYua8zi5US/1eAyrI3R5LcUTQdT4xYmWLKabtJOF6HYQ0f6QXfLSs
# fT81WMvDvxrdn1RWbUXlU/OIiisxo8o+UNEANOwnCMNnxlzoaL/PLhZluDxm/zuy
# lauajZ3MlPDteFB/7GRHo50wggZ2MIIEXqADAgECAhAhw65pJ8430IAeozVxNmcC
# MA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQ
# MA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxNDAyBgNVBAMMK1NT
# TC5jb20gQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBDQSBSU0EgUjEwHhcNMjMw
# OTA3MTYyNDAzWhcNMjQwOTA2MTYyNDAzWjB/MQswCQYDVQQGEwJVUzEQMA4GA1UE
# CAwHRmxvcmlkYTEaMBgGA1UEBwwRQWx0YW1vbnRlIFNwcmluZ3MxIDAeBgNVBAoM
# F1Byb3ZhbCBUZWNobm9sb2dpZXMgSW5jMSAwHgYDVQQDDBdQcm92YWwgVGVjaG5v
# bG9naWVzIEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKr0IQn+
# /jLR4pu0N3TPJaAu31BLTo5myZZxgEqw8daUfcUC3/K20pDCwTzjIEe3Rb/5xrs5
# NQhnlCrrVslrLU2vWlWIuDzrdahSapAH66AbHc9fwsHUCdpWRKglgDoaaAo4KDYS
# yR5BkRqlS4Zc/MbH7+T4hYWrmWGd6DiuQuROdyaTLG6mu+TB7clKMSl0aakOccYl
# 23+1RNPN9QIDv3Hv6V6C6mpqPJ/z7wSnHGH/ELiGcexIGDCoWon2H9/su6nbAn/R
# FR+4iwjGeIa9a7oDFs5e6Nk0ulR/PjMHVGhxMAm1dV2Fsd2lrP1pGA15k8GWi/h+
# V6u5C1toJtnFzy8E+q45U/6zyo2PQd4HlPzw9auzy9l6X4tMtMEQD55G8TR/+VYx
# 7ruJa9VCl477XcOY99oPyaWOYiliU7NbqtYcINHNun6xyDSC3pRidNOMHkovEXmn
# 3sAEYOgDLkNo7sljfXdWd/kawVXEOtZ7WqjdKcysZEdE6MrwGRtruufFdQIDAQAB
# o4IBczCCAW8wDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBRUwv4QlQCTzWr158DX
# 2bJLuI8M4zBYBggrBgEFBQcBAQRMMEowSAYIKwYBBQUHMAKGPGh0dHA6Ly9jZXJ0
# LnNzbC5jb20vU1NMY29tLVN1YkNBLUNvZGVTaWduaW5nLVJTQS00MDk2LVIxLmNl
# cjBRBgNVHSAESjBIMAgGBmeBDAEEATA8BgwrBgEEAYKpMAEDAwEwLDAqBggrBgEF
# BQcCARYeaHR0cHM6Ly93d3cuc3NsLmNvbS9yZXBvc2l0b3J5MBMGA1UdJQQMMAoG
# CCsGAQUFBwMDME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9jcmxzLnNzbC5jb20v
# U1NMY29tLVN1YkNBLUNvZGVTaWduaW5nLVJTQS00MDk2LVIxLmNybDAdBgNVHQ4E
# FgQUUP7qIdXcLTXxzeyjVjLWVrTdt+AwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3
# DQEBCwUAA4ICAQCW0L2RCITI/Hk1s2w0KVkTsMkgJ0GEEh19ZTZ3BcnYfaqNxe3u
# OeHCFGxHtB01MU7Ee8zObjiF/vt7wSlb3ln8eDT/VD/lD/ASP5QEAXf2SOXfkoTx
# G2N7gJAlqx5alnND71lb/NcLEF6/1ZAn+w4CSKsyfEHn7uMlP1HRew9dcksjXuFr
# czUnCh3kJp2qfsH7xN3JskuZyctZNHjNDur8XGEBVM3ddTPJDPyBuoV/VN90N559
# yNUn3G/mG8XPukLZBY7B/IO3AcAexhtotOgHgdodZaiW0lCuGdSAmHfMpZWE689G
# vAKNdlWUhLwt8agYN4zw0ObWClDJtwWqjTmv2mW1i4gxDyHZcrPNE70NIhzn536f
# zXMZVWc/5KTlxfB0RQPCSv5YQ/f3AsOeJSR7IMoikqE2GeCwhW0tVzENvXPIy1/G
# bjgQAiG+PKk93VDtgyZ3GFVuUV058olSqtUhJvbuDBSnrR7pdJMEOC4NRZ2rV1LC
# cz6IEzEsbq1hmdLffDm8ZVBwQXcolcf/ExwNMo2RAkI29t+VDrFsVGm+4rdo0cAF
# Yn/DwP1Ku1L4sKxdrrMJcpKi9ucd31sVTP5TbBGbiOhss+pMiY9eC2UIReeIKuZd
# aKh0JeSPvPFQRO9kFbZZXemsk9zq4UdRzAwQk80IL31WpXqwYB4S+dU0jjGCEgkw
# ghIFAgEBMIGMMHgxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UE
# BwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxNDAyBgNVBAMMK1NTTC5jb20g
# Q29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBDQSBSU0EgUjECECHDrmknzjfQgB6j
# NXE2ZwIwDQYJYIZIAWUDBAIBBQCgga8wFAYKKwYBBAGCNwIBDDEGMAShAoAAMBkG
# CSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEE
# AYI3AgEVMC0GCSqGSIb3DQEJNDEgMB4wDQYJYIZIAWUDBAIBBQChDQYJKoZIhvcN
# AQELBQAwLwYJKoZIhvcNAQkEMSIEICKrm+doScLNAv7eeKHC7mBTrSLJHNslwML5
# maNNlqOcMA0GCSqGSIb3DQEBCwUABIIBgKNoYSYbwOIiy7Wd+sTH8ma9xMXHD6jq
# K1WkBIQSE/ZV6Fwdw9Fk7xQATKZd3wk2nfaDqjPwp3MN1NWJftvQ85viXAztB8sR
# j2LswcrKwukE7Q9eyp6kOsie9Y/OIFl2n3fY5wesLY9FjhghZaz+0JZfptERVaRe
# xUe7Qm6kfO4JBWLTrwgiK+oUDqOeYWTV2TVRp64IXzSS6eB+kJdr7iD8dalSXFQ5
# DA7pJdX1y0aqXcuMMjQ2c6Kqk4AskccFaEzElJ/jC0AlrSJ/U9VOhZrFXV9d/6Rp
# WO1T3uHdsbT5GisPMn2jJHVOC/IbRpxeABUigeXBDs5azYZqCnMHQda1+UR0FzEj
# RyRpGISeQnGK0R3v28ZzkwAkZyXkmy/Z4LSYKLcwQU3M/797/Hm8PnDS6HHTeUb+
# aS3hfxGDDyK7yE386kXtxZx+PsAHDFzymz0LEIBLGNt1TaUAn3mMqMmp82T51jrd
# w35tjhmUJ1cDOFO00+NbKow91dZfxMCvVqGCDxswgg8XBgorBgEEAYI3AwMBMYIP
# BzCCDwMGCSqGSIb3DQEHAqCCDvQwgg7wAgEDMQ0wCwYJYIZIAWUDBAIBMH8GCyqG
# SIb3DQEJEAEEoHAEbjBsAgEBBgwrBgEEAYKpMAEDBgEwMTANBglghkgBZQMEAgEF
# AAQgy46b0Z1LmcixxRKvFTl2Vsfhna4T7cyJEJ0q8KIqoeQCCH2f6tfLGqdyGA8y
# MDIzMTExNTE5MzEyN1owAwIBAQIGAYvUd5DMoIIL/TCCBPkwggLhoAMCAQICEBrW
# CKfWNLXN3pfLo8zw0EswDQYJKoZIhvcNAQELBQAwczELMAkGA1UEBhMCVVMxDjAM
# BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMREwDwYDVQQKDAhTU0wgQ29y
# cDEvMC0GA1UEAwwmU1NMLmNvbSBUaW1lc3RhbXBpbmcgSXNzdWluZyBSU0EgQ0Eg
# UjEwHhcNMjIxMjA5MTgzMDUxWhcNMzIxMjA2MTgzMDUwWjBrMQswCQYDVQQGEwJV
# UzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xETAPBgNVBAoMCFNT
# TCBDb3JwMScwJQYDVQQDDB5TU0wuY29tIFRpbWVzdGFtcGluZyBVbml0IDIwMjIw
# WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATefPqSJZSy2TTZyF4GhypEr9YCY44K
# Qr+4/R2+4QOHyAxCLyYMIolVLQzaqOySeI6nI4j/+L1aB3Jv9HeBPTu4o4IBWjCC
# AVYwHwYDVR0jBBgwFoAUDJ0QJY6apxuZh0PPCH7hvYGQ9M8wUQYIKwYBBQUHAQEE
# RTBDMEEGCCsGAQUFBzAChjVodHRwOi8vY2VydC5zc2wuY29tL1NTTC5jb20tdGlt
# ZVN0YW1waW5nLUktUlNBLVIxLmNlcjBRBgNVHSAESjBIMDwGDCsGAQQBgqkwAQMG
# ATAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5zc2wuY29tL3JlcG9zaXRvcnkw
# CAYGZ4EMAQQCMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMEYGA1UdHwQ/MD0wO6A5
# oDeGNWh0dHA6Ly9jcmxzLnNzbC5jb20vU1NMLmNvbS10aW1lU3RhbXBpbmctSS1S
# U0EtUjEuY3JsMB0GA1UdDgQWBBQFupPR3+IUrCAqhlkxfyhyDq2sXzAOBgNVHQ8B
# Af8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAFqotJYQYw1EaMzHk5NlJLaJzxDf
# 3njeZNS3iMrOvZPAMnJxzPeIWGqneI6rxGdOwewqS3gYcCPZKEag2WVTjrhBpFtN
# 5oCdbnaCQuWcJHvf3H104NBhYsqkCrMwWoo3E2Udaw49PBeZoZFMykPraTG/I3W7
# 6FoP1BuzI9xhSG56DzRn3lIwIg80JgimsRASJEwcw4K2Uk0a1aO3hJ8/RHhZ7EZ2
# bSEQfyym66kUbuGsksxzbgtCSZpk76XLfT+rSOIL5SY+WCIiVd+FrUPfLhFMSzxj
# wbVuRA5FLdcL7+p9kuSggpUI+m2fzwropdX6GHpp5EfYdpWGZDdB9R+fbKiLC54g
# bzd2ubArEn1QHOwe5K1qXqjYrelatIbNlA5NUS7BJmmcjlLtiGMfqw/fmSfGOvo1
# le1HFnRFj1QJYX9rYku2iTtjGS6jiUAmP6Q2yiunn8nNVtgUYCorD5NsgbmVEqzc
# cIIkKImW9IxWHOSFGu41ZswpSGKDABcdq+NcUVTwjg6QlvGi3rQtAVZKaXWzbbZS
# iR7hM0CDtcPwXPKdhbtdGkJmvCvBfX357q7+dmkB3XHYLteoxEfClzMRMJ9AKF0q
# Sh6hf4PTg9WbLwFNCClWQeM9CXtpi5EWD3wu5DlfIDpInNwUZDPOrVO0DGu9+msd
# 72naMPXZTl+cvrv9MIIG/DCCBOSgAwIBAgIQbVIYcIfoI02FYADQgI+TVjANBgkq
# hkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNV
# BAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwo
# U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTAeFw0xOTEx
# MTMxODUwMDVaFw0zNDExMTIxODUwMDVaMHMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
# DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxLzAt
# BgNVBAMMJlNTTC5jb20gVGltZXN0YW1waW5nIElzc3VpbmcgUlNBIENBIFIxMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArlEQE9L5PCCgIIXeyVAcZMnh
# /cXpNP8KfzFI6HJaxV6oYf3xh/dRXPu35tDBwhOwPsJjoqgY/Tg6yQGBqt65t94w
# px0rAgTVgEGMqGri6vCI6rEtSZVy9vagzTDHcGfFDc0Eu71mTAyeNCUhjaYTBkyA
# Nqp9m6IRrYEXOKdd/eREsqVDmhryd7dBTS9wbipm+mHLTHEFBdrKqKDM3fPYdBOr
# o3bwQ6OmcDZ1qMY+2Jn1o0l4N9wORrmPcpuEGTOThFYKPHm8/wfoMocgizTYYeDG
# /+MbwkwjFZjWKwb4hoHT2WK8pvGW/OE0Apkrl9CZSy2ulitWjuqpcCEm2/W1RofO
# unpCm5Qv10T9tIALtQo73GHIlIDU6xhYPH/ACYEDzgnNfwgnWiUmMISaUnYXijp0
# IBEoDZmGT4RTguiCmjAFF5OVNbY03BQoBb7wK17SuGswFlDjtWN33ZXSAS+i45My
# 1AmCTZBV6obAVXDzLgdJ1A1ryyXz4prLYyfJReEuhAsVp5VouzhJVcE57dRrUanm
# Pcnb7xi57VPhXnCuw26hw1Hd+ulK3jJEgbc3rwHPWqqGT541TI7xaldaWDo85k4l
# R2bQHPNGwHxXuSy3yczyOg57TcqqG6cE3r0KR6jwzfaqjTvN695GsPAPY/h2YksN
# gF+XBnUD9JBtL4c34AcCAwEAAaOCAYEwggF9MBIGA1UdEwEB/wQIMAYBAf8CAQAw
# HwYDVR0jBBgwFoAU3QQJB6L1en1SUxKSle44gCUNplkwgYMGCCsGAQUFBwEBBHcw
# dTBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5zc2wuY29tL3JlcG9zaXRvcnkvU1NM
# Y29tUm9vdENlcnRpZmljYXRpb25BdXRob3JpdHlSU0EuY3J0MCAGCCsGAQUFBzAB
# hhRodHRwOi8vb2NzcHMuc3NsLmNvbTA/BgNVHSAEODA2MDQGBFUdIAAwLDAqBggr
# BgEFBQcCARYeaHR0cHM6Ly93d3cuc3NsLmNvbS9yZXBvc2l0b3J5MBMGA1UdJQQM
# MAoGCCsGAQUFBwMIMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmxzLnNzbC5j
# b20vc3NsLmNvbS1yc2EtUm9vdENBLmNybDAdBgNVHQ4EFgQUDJ0QJY6apxuZh0PP
# CH7hvYGQ9M8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQCSGXUN
# plpCzxkH2fL8lPrAm/AV6USWWi9xM91Q5RN7mZN3D8T7cm1Xy7qmnItFukgdtiUz
# LbQokDJyFTrF1pyLgGw/2hU3FJEywSN8crPsBGo812lyWFgAg0uOwUYw7WJQ1teI
# CycX/Fug0KB94xwxhsvJBiRTpQyhu/2Kyu1Bnx7QQBA1XupcmfhbQrK5O3Q/yIi/
# /kN0OkhQEiS0NlyPPYoRboHWC++wogzV6yNjBbKUBrMFxABqR7mkA0x1Kfy3Ud08
# qyLC5Z86C7JFBrMBfyhfPpKVlIiiTQuKz1rTa8ZW12ERoHRHcfEjI1EwwpZXXK5J
# 5RcW6h7FZq/cZE9kLRZhvnRKtb+X7CCtLx2h61ozDJmifYvuKhiUg9LLWH0Or9D3
# XU+xKRsRnfOuwHWuhWch8G7kEmnTG9CtD9Dgtq+68KgVHtAWjKk2ui1s1iLYAYxn
# Dm13jMZm0KpRM9mLQHBK5Gb4dFgAQwxOFPBslf99hXWgLyYE33vTIi9p0gYqGHv4
# OZh1ElgGsvyKdUUJkAr5hfbDX6pYScJI8v9VNYm1JEyFAV9x4MpskL6kE2Sy8rOq
# S9rQnVnIyPWLi8N9K4GZvPit/Oy+8nFL6q5kN2SZbox5d69YYFe+rN1sDD4CpNWw
# BBTI/q0V4pkgvhL99IV2XasjHZf4peSrHdL4RjGCAlgwggJUAgEBMIGHMHMxCzAJ
# BgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjERMA8G
# A1UECgwIU1NMIENvcnAxLzAtBgNVBAMMJlNTTC5jb20gVGltZXN0YW1waW5nIElz
# c3VpbmcgUlNBIENBIFIxAhAa1gin1jS1zd6Xy6PM8NBLMAsGCWCGSAFlAwQCAaCC
# AWEwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0y
# MzExMTUxOTMxMjdaMCgGCSqGSIb3DQEJNDEbMBkwCwYJYIZIAWUDBAIBoQoGCCqG
# SM49BAMCMC8GCSqGSIb3DQEJBDEiBCCtY2wm5AXQEDc3NyUtGYTHWFE93yShu9HM
# FBvlOTFLWDCByQYLKoZIhvcNAQkQAi8xgbkwgbYwgbMwgbAEII3FxCVC0k8Vz/XI
# GW7UWoNo1MrWvcvkIaneI1Cdi9MiMIGLMHekdTBzMQswCQYDVQQGEwJVUzEOMAwG
# A1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xETAPBgNVBAoMCFNTTCBDb3Jw
# MS8wLQYDVQQDDCZTU0wuY29tIFRpbWVzdGFtcGluZyBJc3N1aW5nIFJTQSBDQSBS
# MQIQGtYIp9Y0tc3el8ujzPDQSzAKBggqhkjOPQQDAgRHMEUCIFtW8JNz3uGbPDNJ
# +S/W+UQXnTO05QiQNXEpBHXYWvI2AiEA4kCUY7sDbgtuLkAFtQUeBSzb6UHhRgdV
# TmH39S325YU=
# SIG # End signature block