Functions_v7/ConvertFrom-XurrentWebHookPayload.ps1

function ConvertFrom-XurrentWebHookPayload
{
    [CmdletBinding(DefaultParameterSetName = 'string')]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'string', Position = 0)]
        [string]$PayloadString,
        [Parameter(Mandatory = $true, ParameterSetName = 'path', Position = 0)]
        [string]$PayloadPath,
        [Parameter(Mandatory = $false, ParameterSetName = 'string', Position = 1)]
        [Parameter(Mandatory = $false, ParameterSetName = 'path', Position = 1)]
        [string]$CertPublicKey
    )
    
    Write-Verbose -Message "ParameterSetName $($PSCmdlet.ParameterSetName)"
    if ($PSCmdlet.ParameterSetName -eq 'path')
    {
        $PayloadString = get-content $PayloadPath
    }
    try
    {
        $payloadJson = $PayloadString | ConvertFrom-Json
        $tokenParts = $payloadJson.jwt -split '\.'
        $headerEncoded = $tokenParts[0]
        $payloadEncoded = $tokenParts[1]
        $signatureEncoded = $tokenParts[2]
        
        while ($headerEncoded.Length % 4) { Write-Debug -Message "Invalid length for a Base-64 char array or string, adding ="; $headerEncoded += "=" }
        while ($payloadEncoded.Length % 4) { Write-Debug -Message "Invalid length for a Base-64 char array or string, adding ="; $payloadEncoded += "=" }
        while ($signatureEncoded.Length % 4) { Write-Debug -Message "Invalid length for a Base-64 char array or string, adding ="; $signatureEncoded += "=" }
        
        $HeaderObj = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String(($headerEncoded).Replace('_', '/').Replace('-', '+'))) | ConvertFrom-Json
        if ($headerObj.typ -ne 'JWT')
        {
            Write-Error 'payload is not a jwt' -ErrorAction Stop
        }
        
        $PayloadObj = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String(($payloadEncoded).Replace('_', '/').Replace('-', '+'))) | ConvertFrom-Json
        
        $PayloadObj.exp = (Get-Date 01.01.1970).AddSeconds($PayloadObj.exp)
        $PayloadObj.nbf = (Get-Date 01.01.1970).AddSeconds($PayloadObj.nbf)
        $PayloadObj.iat = (Get-Date 01.01.1970).AddSeconds($PayloadObj.iat)
        
        if (-not [string]::IsNullOrEmpty($CertPublicKey))
        {
            if ($headerObj.alg -ne 'RS256')
            {
                Write-Error 'alg not RS256 as expected' -ErrorAction Stop
            }
            # Decoding Base64url to the original byte array
            $signatureBytes = [Convert]::FromBase64String(($signatureEncoded).Replace('_', '/').Replace('-', '+'))
            
            # Decode Base64 PEM key
            $publicKeyBytes = [Convert]::FromBase64String($CertPublicKey)
            
            # Create RSA Key
            $rsa = [System.Security.Cryptography.RSA]::Create()
            $rsa.ImportSubjectPublicKeyInfo($publicKeyBytes, [ref]0)
            
            # Verify the Signature
            $sha256 = New-Object System.Security.Cryptography.SHA256CryptoServiceProvider
            # Computing SHA-256 hash of the JWT parts 1 and 2 - header and payload
            $computed = $SHA256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($tokenParts[0] + "." + $tokenParts[1]))
            # Decoding Base64url to the original byte array
            $signed = $tokenParts[2].replace('-', '+').replace('_', '/')
            while ($signed.Length % 4) { Write-Debug -Message "Invalid length for a Base-64 char array or string, adding ="; $signed += "=" }
            $bytes = [Convert]::FromBase64String($signed) # Conversion completed
            
            $SignatureObj = [PSCustomObject]::new(@{
                    isValid   = $rsa.VerifyHash($computed, $bytes, [System.Security.Cryptography.HashAlgorithmName]::SHA256, [System.Security.Cryptography.RSASignaturePadding]::Pkcs1)
                    PublcKey  = $CertPublicKey
                    Signature = $signatureEncoded
                })
        }
        $XurrentEnvironment = Find-XurrentEnvironment -AccountURL $PayloadObj.iss
        $Obj = [PSCustomObject]::new(@{
                Header        = $HeaderObj
                Payload        = $PayloadObj
                Signature   = $SignatureObj
                Environment = $XurrentEnvironment.Environment
                Region        = $XurrentEnvironment.Region
                Account        = $PayloadObj.data.account_id
            })
        
        return $Obj
    }
    catch
    {
        Write-Error $_
        return
    }
    
}
# SIG # Begin signature block
# MIIeIgYJKoZIhvcNAQcCoIIeEzCCHg8CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC+Gam9zt3U3hyF
# wPGOcGDoyZghPDlTIborX3CXwdkZ5qCCGGcwggLjMIIBy6ADAgECAhBCCNCn9wPq
# pUWzhBFHlrjQMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNVBAMMCVJvbWFuIEVuejAe
# Fw0yNTAxMjgxODU2MDBaFw0zNTAxMjgxOTA1NTlaMBQxEjAQBgNVBAMMCVJvbWFu
# IEVuejCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALt5S9z43iR8NBGw
# YEauedJQedy94yOW/rOaYoX9Sn8YUkT6R9uEdnt5SbAHDw50q+76c2Sx0jPUMMn9
# V/15cyJbMu9Ej3+AiMfFi/opqzyhci/k46fd5ewdAJk5GGBHHJ5hO5zegTtEQWyX
# 2PMn3WE7B6Uy8FxQrxl+1e3DO1sDT/zhn8qeWEzTjM4/p3YFwR1pc7mX2DLLFybB
# V71DYeAWvjGF0z/dfi7ib1mLMsN4spML41umn+F/TQtf7QP68ft3ludk8Gd1e7D7
# sWDK+J6AN3iga6evVTucJB200eHFofh7HTdcncH/6ue/d4NvDvKjLjN295lMiWU8
# W7ojGCUCAwEAAaMxMC8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBTsDKDLy1wE
# 1KpSirF8sbQKlb4PFzANBgkqhkiG9w0BAQsFAAOCAQEAV02VHByfqH3B7iP49kHp
# Un3DQ3thGaizIFL/prPdgzqJiAuBY/VMNY97/5tKIyzX5pEGoVeyR2wZKTGYu5xR
# aOLxhqk8TtPd2h1H4o8Tpsas6c5VsfbHKaPtdC2xRWJIK9f+LQmrQ8EQ/xNuuNv0
# InccOrm9L8z2P1JHde2LZD7qfM3N8h5WOCrV3QRb09WkMESJcHMoGVTAvUYj2iq0
# MZkXwwaNTcwD/zIxp1C2Z9VqX8etAPQHUeX2uPrJQdSHnrNaiNJAbUWBg3ZAKk4G
# ciK9DmWaN4ukbHpuj7dSZOW21q2thw0F+K7Rn3A2CJ+stdn8JD9n/8i/9tuetSVR
# 7TCCAxkwggIBoAMCAQICECgf8HLUn66mQrAI0KycNMIwDQYJKoZIhvcNAQEFBQAw
# FDESMBAGA1UEAwwJUm9tYW4gRW56MB4XDTI1MDEyODE5MzAzM1oXDTI2MDEyODE5
# NTAzM1owFDESMBAGA1UEAwwJUm9tYW4gRW56MIIBIjANBgkqhkiG9w0BAQEFAAOC
# AQ8AMIIBCgKCAQEAz+j0Awf9ccGPIKAfYQ5ZUmtjZuuFNnIjHb9gtjeSNJ8BluHB
# HKF8tSCwvpMrevoOy0xpeg/khZSvQ+Hx7M4oHeV0A2mK3M3ut8JvLxWEDlon41hD
# CEhUcT+vD/9fXHUecbRBGpSGcBghkgfM3euU3MhpJNoVE3ZPp3q4Us5A2t5B99PR
# T2q1kcZyP/M0Z6ww8KHPBiJueK3frwPAxuIXEOBuYEIRWE3sugozFIQXUvpSiT4W
# 7CXqYDIALlSpd51Ir/tT7Yx1UzR2oz7BKW6jrL9t3guTDnJ0WyQVFWRRUKiysvCA
# +VHySpg4U72CSjccjXTVxFsI0KLXqi2dA7xPCQIDAQABo2cwZTAOBgNVHQ8BAf8E
# BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHwYDVR0jBBgwFoAU7Aygy8tcBNSq
# UoqxfLG0CpW+DxcwHQYDVR0OBBYEFO6xfVS2jp6QRsW08nYw70j3fyy/MA0GCSqG
# SIb3DQEBBQUAA4IBAQBs22lqOGJLfdTyGQo9Jgmn96B7WR1inhEnOM66UU44U51a
# L/LJYcGUI27PUFTG6tXad38v6fJj8o1otrYye16UIsFyxAO4UtiXH/dFQukp/YWl
# /SP69DlYjOAaNu7lqxK7JfIzfSPgsoZjp7KmT4WHO5Zs7F8C9qYab5/hZGAKLg8W
# 6Tk2pAdNhleScgvW2pW0podkDBDVjBng4ItyYe0KigHzH4KtYeFqRnzM/29NMAOq
# o4eYPwH2jMTRwjDDqhF8h9IfgoT3LD0nZK0bmy9PRzBqyLmaR4EmZ1b3ziDes+ak
# p5tXqY28722FtIKI2WKiUZ7WTUEcXdaoTxEQ6noVMIIFgzCCA2ugAwIBAgIORea7
# A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMXR2xvYmFsU2ln
# biBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
# b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYD
# VQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2ln
# bjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRIxutbPK6DuEGSMxSkb3/pKszG
# sIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE3nOUTvOniX9PeGMI
# yBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbFvuJt
# MgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ay
# d2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGB
# zVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02
# oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2SXcwvHE35absIQh1/OZhFj93
# 1dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguyCLNhZglqsQY6ZZZZwPA1
# /cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP0f/fMBH5
# hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvc
# E+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBh
# MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWj
# kxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdT
# oDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLNnsAEoJFp5lzQhN7craJP6Ed4
# 1mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0lV7Ae46ZeBZD
# E1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
# BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN
# 25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/Q
# cYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGyt
# Xm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZpnOZ7BN9uBmm23goJSFmH63sU
# YHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/TuTAjB0yPEL+GltmZ
# WrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItKoZB0
# JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5
# d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeD
# BVrJpBAwggZZMIIEQaADAgECAg0B7BySQN79LkBdfEd0MA0GCSqGSIb3DQEBDAUA
# MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFI2MRMwEQYDVQQKEwpH
# bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTE4MDYyMDAwMDAwMFoX
# DTM0MTIxMDAwMDAwMFowWzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNp
# Z24gbnYtc2ExMTAvBgNVBAMTKEdsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0g
# U0hBMzg0IC0gRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDwAuIw
# I/rgG+GadLOvdYNfqUdSx2E6Y3w5I3ltdPwx5HQSGZb6zidiW64HiifuV6PENe2z
# NMeswwzrgGZt0ShKwSy7uXDycq6M95laXXauv0SofEEkjo+6xU//NkGrpy39eE5D
# iP6TGRfZ7jHPvIo7bmrEiPDul/bc8xigS5kcDoenJuGIyaDlmeKe9JxMP11b7Lbv
# 0mXPRQtUPbFUUweLmW64VJmKqDGSO/J6ffwOWN+BauGwbB5lgirUIceU/kKWO/EL
# sX9/RpgOhz16ZevRVqkuvftYPbWF+lOZTVt07XJLog2CNxkM0KvqWsHvD9WZuT/0
# TzXxnA/TNxNS2SU07Zbv+GfqCL6PSXr/kLHU9ykV1/kNXdaHQx50xHAotIB7vSqb
# u4ThDqxvDbm19m1W/oodCT4kDmcmx/yyDaCUsLKUzHvmZ/6mWLLU2EESwVX9bpHF
# u7FMCEue1EIGbxsY1TbqZK7O/fUF5uJm0A4FIayxEQYjGeT7BTRE6giunUlnEYuC
# 5a1ahqdm/TMDAd6ZJflxbumcXQJMYDzPAo8B/XLukvGnEt5CEk3sqSbldwKsDlcM
# CdFhniaI/MiyTdtk8EWfusE/VKPYdgKVbGqNyiJc9gwE4yn6S7Ac0zd0hNkdZqs0
# c48efXxeltY9GbCX6oxQkW2vV4Z+EDcdaxoU3wIDAQABo4IBKTCCASUwDgYDVR0P
# AQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFOoWxmnn48tX
# RTkzpPBAvtDDvWWWMB8GA1UdIwQYMBaAFK5sBaOTE+Ki5+LXHNbH8H/IZ1OgMD4G
# CCsGAQUFBwEBBDIwMDAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AyLmdsb2JhbHNp
# Z24uY29tL3Jvb3RyNjA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLmdsb2Jh
# bHNpZ24uY29tL3Jvb3QtcjYuY3JsMEcGA1UdIARAMD4wPAYEVR0gADA0MDIGCCsG
# AQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAN
# BgkqhkiG9w0BAQwFAAOCAgEAf+KI2VdnK0JfgacJC7rEuygYVtZMv9sbB3DG+wsJ
# rQA6YDMfOcYWaxlASSUIHuSb99akDY8elvKGohfeQb9P4byrze7AI4zGhf5LFST5
# GETsH8KkrNCyz+zCVmUdvX/23oLIt59h07VGSJiXAmd6FpVK22LG0LMCzDRIRVXd
# 7OlKn14U7XIQcXZw0g+W8+o3V5SRGK/cjZk4GVjCqaF+om4VJuq0+X8q5+dIZGkv
# 0pqhcvb3JEt0Wn1yhjWzAlcfi5z8u6xM3vreU0yD/RKxtklVT3WdrG9KyC5qucqI
# wxIwTrIIc59eodaZzul9S5YszBZrGM3kWTeGCSziRdayzW6CdaXajR63Wy+ILj19
# 8fKRMAWcznt8oMWsr1EG8BHHHTDFUVZg6HyVPSLj1QokUyeXgPpIiScseeI85Zse
# 46qEgok+wEr1If5iEO0dMPz2zOpIJ3yLdUJ/a8vzpWuVHwRYNAqJ7YJQ5NF7qMnm
# vkiqK1XZjbclIA4bUaDUY6qD6mxyYUrJ+kPExlfFnbY8sIuwuRwx773vFNgUQGwg
# HcIt6AvGjW2MtnHtUiH+PvafnzkarqzSL3ogsfSsqh3iLRSd+pZqHcY8yvPZHL9T
# TaRHWXyVxENB+SXiLBB+gfkNlKd98rUJ9dhgckBQlSDUQ0S++qCV5yBZtnjGpGqq
# IpswggZ7MIIEY6ADAgECAhABB2SbCLCn/n3WVKjy9Cn2MA0GCSqGSIb3DQEBCwUA
# MFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTEwLwYD
# VQQDEyhHbG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIFNIQTM4NCAtIEc0MB4X
# DTIzMTEwNzE3MTM0MFoXDTM0MTIwOTE3MTM0MFowbDELMAkGA1UEBhMCQkUxGTAX
# BgNVBAoMEEdsb2JhbFNpZ24gbnYtc2ExQjBABgNVBAMMOUdsb2JhbHNpZ24gVFNB
# IGZvciBNUyBBdXRoZW50aWNvZGUgQWR2YW5jZWQgLSBHNCAtIDIwMjMxMTCCAaIw
# DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALmomz6pptxC00Gfik1DRwn5aIsT
# +3WPmVzKgEJh74664XHWR5CtmU1jA7bvqSaj+zbqbhRH99dNRHSyKl6dMl8EaK+3
# yc9bCycvKE6C3o61s4n65xFJyCdAXpNvCSHG1l+Y87e6oUByrt0P384hQgRUOOrK
# It0DuRqh4LcclyhzLCCNP2aydpnaOsn2cpZSdNh9ZW7gIm/+r0b9fq9OyImBMqGY
# K49357Kj1ZqfH9GDIE5N70w7UXuRI+GDSqJvuATmZBRLLjt86bX9s242REA29b4h
# 5ujQ+n73qE5GrJSw0Cl04rGXqn848YnierfKbAUwGFhvfVt+OpHUfG9O/+kxfqWC
# NeEu/wpg6lKFV4d65CqvPKLfedvgeY/fke3/Jj12QEvfG0v2gqjqgyitU7a3ltcd
# LYzvv32KnpR8U6lkBGt8zBZnGTGCkun0OrzUiKi9ju5PEnnY/+CWkFB+ARX/8ONs
# Xhr0r0DF5Sc9Rvg6QTj/OUi03AYB+zsIKGhpqQIDAQABo4IBqDCCAaQwDgYDVR0P
# AQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMB0GA1UdDgQWBBT4o6fl
# I3VW0aWlO4luFnHLVdaICTBWBgNVHSAETzBNMAgGBmeBDAEEAjBBBgkrBgEEAaAy
# AR4wNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVw
# b3NpdG9yeS8wDAYDVR0TAQH/BAIwADCBkAYIKwYBBQUHAQEEgYMwgYAwOQYIKwYB
# BQUHMAGGLWh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NhL2dzdHNhY2FzaGEz
# ODRnNDBDBggrBgEFBQcwAoY3aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9j
# YWNlcnQvZ3N0c2FjYXNoYTM4NGc0LmNydDAfBgNVHSMEGDAWgBTqFsZp5+PLV0U5
# M6TwQL7Qw71lljBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vY3JsLmdsb2JhbHNp
# Z24uY29tL2NhL2dzdHNhY2FzaGEzODRnNC5jcmwwDQYJKoZIhvcNAQELBQADggIB
# AHArWS5rBVK1Jlchtc8Q6JrwrMtyVGhtVUWZljlYRxvQaWsobPCTi6ZEy3jJq05i
# xIIfBZDerAaWO66gRg2BhuyQcNyyNS7LVS1DR2+Lek5BP/6yIZxAMditj5U3GoLr
# yLcOp6FcGqrAakn9D4oEBybC2Q7PJgN9MEW/bFB6D+kkNkyApOgiQStgZrysC88y
# yIB/KkbHnMLlHw/WVfkCDGHFvGKPXaMiYetqmHiwZC8JsA3JuAgcWl4GMCRdcYN2
# OP1IaphdP0JIbyyENvzm/pLC0nBjQYO19KAKZVrVQfSDqDAbyNZbbkDow83mN+LJ
# 6VVci1PE7uHfu9O1kYq7Z3O1CPCoSKsOG+BEcL7iBOcRqeE/UEGaDGYKVkXBBUH5
# QhX9BKaRtfpMFop+fgWaoYd0VP3Hp8Dmk2edpB0qXDoEtU7VFx6j4o3uPjwKgU9Z
# MfsF/5gZ05i4BthIm0mT4QLHbbIsitzqXtvUb/0HrB48NlF38T4skmT1mPBPK5oQ
# 89pfOPpKQsl/YKObSaEzCxDOwk+l07KAWBkm+kMJSrV11Z7Yrw2vHrb7S0l4/V+x
# 6obteup3utHs54Y1Cflau5bh9gpX+f3W/iQaAFC9nk3IkRg37NIozg+ul0Ydwnxg
# y7uaZK6WtbnlynrletZ4QSTeZsn2UBdFpX/TH+oe2u/oMYIFETCCBQ0CAQEwKDAU
# MRIwEAYDVQQDDAlSb21hbiBFbnoCECgf8HLUn66mQrAI0KycNMIwDQYJYIZIAWUD
# BAIBBQCgTDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQx
# IgQg/FmAovi0l2oiv4XvkpeqLLJMooTxKh3l7vnVpXNKB6IwDQYJKoZIhvcNAQEB
# BQAEggEAZVZQIgorNQct044lccEsi5/a3PulOH++lssAaVNL0/8GGCxZlDNa7WH8
# BdZYhQ3fr7VdwKwdsmCBvQpjpGVMdLP1EBb0Q/z0qkqynvpdty/joQHJYneDA36q
# MVXSvffTCYfqdZHm0VuhVR+3foiFaZ1R1AX29R/sedKIeDX2cAHMA12bfVpj7lg1
# NtY63xBPAUp3EZvFAsneqj88o8oCIBQbLB2lBeVpzeaWpsmITn8kFKJzwnVOErrN
# V3QYLB5lOpL/aGuJjOsqvnajL2My/22Za4lawgvHXFwfQMjevQkhjt4zfhYghNKb
# rbVhJ0UcAw0aElSB5L7aQkS5w1T90qGCA2wwggNoBgkqhkiG9w0BCQYxggNZMIID
# VQIBATBvMFsxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNh
# MTEwLwYDVQQDEyhHbG9iYWxTaWduIFRpbWVzdGFtcGluZyBDQSAtIFNIQTM4NCAt
# IEc0AhABB2SbCLCn/n3WVKjy9Cn2MAsGCWCGSAFlAwQCAaCCAT0wGAYJKoZIhvcN
# AQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjUwMTI5MTMyODEyWjAr
# BgkqhkiG9w0BCTQxHjAcMAsGCWCGSAFlAwQCAaENBgkqhkiG9w0BAQsFADAvBgkq
# hkiG9w0BCQQxIgQgq8Zv5N3RYJG4lLeNP19yBHlluH7F3DIqJGWVUG7pRYwwgaQG
# CyqGSIb3DQEJEAIMMYGUMIGRMIGOMIGLBBRE05OczRuIf4Z6zNqB7K8PZfzSWTBz
# MF+kXTBbMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEx
# MC8GA1UEAxMoR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBTSEEzODQgLSBH
# NAIQAQdkmwiwp/591lSo8vQp9jANBgkqhkiG9w0BAQsFAASCAYBsxV/1PiygLbfJ
# 6Wqi16yvNESBIbQ/cPsDKTcKjJB0WonwqCI1fjN5R+oduB/E7cGvhDVfpQ5vmmLh
# tnoAW9W+9dD2XfhvCzm2buhOGFUSSroVHz08TYiSlE/1lZug85vZfDyYuekb5bIi
# E68cHEMRvYYJMDlboyj4C8r4f25U1kvs3ozgL5UCerQawiMdSWfX6imkh8o7dVcB
# gImB0LgLEpVotiJ7zIBveNsrx9dUODqQ9Fr90i2MqxoJVcKGNDaUg4SiN4toeN+4
# 6qBXlNiqvoBJ7DiYfVGcY8MqOTk/TqovvwFeVi5rZ11Y8nnMRI+/JWXrqGtW/ra9
# q98PHICR//76k9aZnnYhC9PAw9DkIllNhlHmjT7SqjIgGkrfka/2cmxwT1foJn1S
# 25fuMzPbhLEC4UpH1Qg8t93WIXSjGa6kNEKgYQ0kdIYv5HIVAu6ggVRso7eKL5cU
# WzP92QEyZ2xO6iC0ASMX5RCkfpKAzmIVaO/k4vj7Gy9Z6iZwZvY=
# SIG # End signature block