DSInternals.Passkeys.psm1
# Load PS host-specific assemblies if ($PSVersionTable.PSVersion.Major -ge 6) { # PowerShell Core Add-Type -Path "$PSScriptRoot/net6.0/DSInternals.Win32.WebAuthn.dll" -ErrorAction Stop } else { # PowerShell Desktop Add-Type -Path "$PSScriptRoot/net48/DSInternals.Win32.WebAuthn.dll" -ErrorAction Stop } # Needed for [Microsoft.Graph.PowerShell.Models.MicrosoftGraphFido2AuthenticationMethod] type Import-Module -Name Microsoft.Graph.Identity.SignIns -ErrorAction Stop <# .SYNOPSIS Retrieves creation options required to generate and register a Microsoft Entra ID-compatible passkey. .PARAMETER UserId The unique identifier of user. .PARAMETER ChallengeTimeout Overrides the timeout of the server-generated challenge returned in the request. The default value is 5 minutes, with the accepted range being between 5 minutes and 30 days. .EXAMPLE PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All' PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' .EXAMPLE PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All' PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' -ChallengeTimeout (New-TimeSpan -Minutes 10) .NOTES Self-service operations aren't supported. More info at https://learn.microsoft.com/en-us/graph/api/fido2authenticationmethod-creationoptions #> function Get-PasskeyRegistrationOptions { [CmdletBinding()] [OutputType([DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions])] param( [Parameter(Mandatory = $true)] [Alias('User')] [string] $UserId, [Parameter(Mandatory = $false)] [Alias('Timeout')] [timespan] $ChallengeTimeout = (New-TimeSpan -Minutes 5) ) try { # Generate the user-specific URL, e.g., https://graph.microsoft.com/beta/users/af4cf208-16e0-429d-b574-2a09c5f30dea/authentication/fido2Methods/creationOptions [string] $credentialOptionsUrl = '/beta/users/{0}/authentication/fido2Methods/creationOptions' -f [uri]::EscapeDataString($UserId) [string] $response = Invoke-MgGraphRequest -Method GET ` -Uri $credentialOptionsUrl ` -Body @{ challengeTimeoutInMinutes = $ChallengeTimeout.TotalMinutes } ` -OutputType Json # Parse JSON response return [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions]::Create($response) } catch { # TODO: PS Error Record ($PSCmdlet.ThrowTerminatingError()) throw } } <# .SYNOPSIS Registers a new passkey in Microsoft Entra ID. .PARAMETER UserId The unique identifier of user. .PARAMETER Passkey The passkey to be registered. .PARAMETER DisplayName Custom name given to the registered passkey. .PARAMETER ChallengeTimeout Overrides the timeout of the server-generated challenge returned in the request. The default value is 5 minutes, with the accepted range being between 5 minutes and 30 days. .EXAMPLE PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All' PS \> Register-Passkey -UserId 'AdeleV@contoso.com' -DisplayName 'YubiKey 5 Nano' .EXAMPLE PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All' PS \> Register-Passkey -UserId 'AdeleV@contoso.com' -DisplayName 'YubiKey 5 Nano' -ChallengeTimeout (New-TimeSpan -Minutes 10) .EXAMPLE PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All' PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' | New-Passkey -DisplayName 'YubiKey 5 Nano' | Register-Passkey -UserId 'AdeleV@contoso.com' .NOTES More info at https://learn.microsoft.com/en-us/graph/api/authentication-post-fido2methods #> function Register-Passkey { [CmdletBinding(DefaultParameterSetName = 'New')] [OutputType([Microsoft.Graph.PowerShell.Models.MicrosoftGraphFido2AuthenticationMethod])] param( [Parameter(Mandatory = $true, ParameterSetName = 'Existing')] [Parameter(Mandatory = $true, ParameterSetName = 'New')] [Alias('User')] [string] $UserId, [Parameter(Mandatory = $true, ParameterSetName = 'Existing', ValueFromPipeline = $true)] [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse] $Passkey, [Parameter(Mandatory = $true, ParameterSetName = 'New')] [string] $DisplayName, [Parameter(Mandatory = $false, ParameterSetName = 'New')] [Alias('Timeout')] [timespan] $ChallengeTimeout = (New-TimeSpan -Minutes 5) ) process { # TODO: Write-Error switch ($PSCmdlet.ParameterSetName) { 'Existing' { # Generate the user-specific URL, e.g., https://graph.microsoft.com/beta/users/af4cf208-16e0-429d-b574-2a09c5f30dea/authentication/fido2Methods [string] $registrationUrl = '/beta/users/{0}/authentication/fido2Methods' -f [uri]::EscapeDataString($UserId) [string] $response = Invoke-MgGraphRequest ` -Method POST ` -Uri $registrationUrl ` -OutputType Json ` -ContentType 'application/json' ` -Body $Passkey.ToString() return [Microsoft.Graph.PowerShell.Models.MicrosoftGraphFido2AuthenticationMethod]::FromJsonString($response) } 'New' { [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions] $registrationOptions = Get-PasskeyRegistrationOptions -UserId $UserId -ChallengeTimeout $ChallengeTimeout [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse] $passkey = New-Passkey -Options $registrationOptions -DisplayName $DisplayName # Recursive call with the 'Existing' parameter set return Register-Passkey -UserId $UserId -Passkey $passkey } } } } <# .SYNOPSIS Creates a new Microsoft Entra ID-compatible passkey. .PARAMETER Options Options required to generate a Microsoft Entra ID-compatible passkey. .PARAMETER DisplayName Custom name given to the registered passkey. .EXAMPLE PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All' PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' | New-Passkey -DisplayName 'YubiKey 5 Nano' | Register-Passkey -UserId 'AdeleV@contoso.com' #> function New-Passkey { [CmdletBinding()] [OutputType([DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse])] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions] $Options, [Parameter(Mandatory = $true)] [string] $DisplayName ) process { try { [DSInternals.Win32.WebAuthn.WebAuthnApi] $api = [DSInternals.Win32.WebAuthn.WebAuthnApi]::new() [DSInternals.Win32.WebAuthn.PublicKeyCredential] $credential = $api.AuthenticatorMakeCredential($Options.PublicKeyOptions) return [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse]::new($credential, $DisplayName) } catch { # TODO: PS Error Record (Write-Error) throw } } } New-Alias -Name Register-MgUserAuthenticationFido2Method -Value Register-Passkey Export-ModuleMember -Function 'Get-PasskeyRegistrationOptions','New-Passkey','Register-Passkey' ` -Alias 'Register-MgUserAuthenticationFido2Method' # SIG # Begin signature block # MIIzsgYJKoZIhvcNAQcCoIIzozCCM58CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA+3c//bO8zbBTO # NwxQEWZ2ydAHpihOYFMdI+ClzxjqNaCCG68wggXMMIIDtKADAgECAhBUmNLR1FsZ # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggbbMIIEw6ADAgECAhMzAAJkjMsg # mbnXW/L3AAAAAmSMMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDIwHhcNMjUwMTE2MDkwMjEyWhcNMjUwMTE5 # MDkwMjEyWjBYMQswCQYDVQQGEwJDWjEPMA0GA1UEBxMGUHJhZ3VlMRswGQYDVQQK # ExJNaWNoYWVsIEdyYWZuZXR0ZXIxGzAZBgNVBAMTEk1pY2hhZWwgR3JhZm5ldHRl # cjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAI0pHXI1mwaOh9dk4tRs # fYgpvXrWHcoeO/wl5qFkbwdow9u0vvJA4HQCkVsu/8dS6uzOx+lVN5gCusXBS3d/ # 4AYChtRiCNDU4j2ji7SlhTIpirxNq871sDKQyifkBqvQ62yOxo0y38vXSSAwrn4h # R+0WshvyFmluf13Yv1yxRGWz7aUCYsxD4Fv7cnh5sZ+BdRepv+1nZ+40sNT84D4/ # M77urP6ZF7plset/+8CJp5al75ArVk43ZNg+pU15FVh2VtNzyxzueSSw5eSLONfM # 1ObQfQSE3R2A23V1FuelZptlOy8IYM8WTQYNkt5ngIscm+EzJo0blf6cR+aEdCVM # H1aC7KYcebK106aiFniYUgr2OnbHeYX2yUuNqyV4+K2O1lTrdpiuQOtf2eIaDabl # PNkDckvux2A2Piwt/VON+RXqDfavJM2jalPe0Q7OlQo26izRqTKZLaV4ptzrOktu # AoInXSlF0YT7nlcEUtjwbBhu3ULP9A7ZAZxsKtT+iliSDQIDAQABo4ICGjCCAhYw # DAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwPQYDVR0lBDYwNAYKKwYBBAGC # N2EBAAYIKwYBBQUHAwMGHCsGAQQBgjdhgpT9t0iDj4fVMIOWt5ISgY3cy3wwHQYD # VR0OBBYEFJN50iPkNNhMsHspt3B99QimBjH0MB8GA1UdIwQYMBaAFCRFmaF3kCp8 # w8qDsG5kFoQq+CxnMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBD # UyUyMEFPQyUyMENBJTIwMDIuY3JsMIGlBggrBgEFBQcBAQSBmDCBlTBkBggrBgEF # BQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNy # b3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAyLmNydDAt # BggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMGYG # A1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAIBgZn # gQwBBAEwDQYJKoZIhvcNAQEMBQADggIBADWxgDGraayhGhpO/rVtIs3mQ7ZrKmsG # A0njH2n4pWGZbtgGBPbrVn9/7ygRG171TUE8CKnezwsiK31o4ynAnh3rjKfnPoh3 # YtGu4BC8bOjY0ykv8qu4UdSVpwGceBLYX3p9EtDkuzu55JxwNbrAkgkbUH3k5EuV # FjOMdf1J+gT6PkXmhtmAg0cGNt71834Uqr5xOHvE3rStudP7BWQJKJdNacLYIdL8 # iW0bL4A25mGTrieA4ZFXHrfBg1Eu3dOhyRpd8+lKIzg5KRxG0d7SpFHZEwJYAyVp # aMEmzfq8QCv4aA9cDrIJaHIA0FfIOo1w6vEQ9OISbiDgO/hFGn6VuqLrl3gdiAxV # bBZCE+XzgLY0XbIhv7MC5XDWNrhMuTIcBlcLaN7Jkqs9aidPmh3oavEPRwpsDbu9 # r6FOLmKbeLhSZDA05HLiUC/UF4rm/hST2nsaIKVyHPM9OH2kuxkTbB7K3jZtmntL # 1E5fN+seHYxYLH0e7/iSyrbJeTnktzldkPMdZHGTtwcYuhr0tpJ9UneB+XfL6evW # 3SoZw9qOgMRX/OabKzIF1QIQ/sXQ5526aafeUgjl7OK/6mnYGfMmp3N/6SacAWds # G3srwa2nne36AZktqrTvOYtC61eApglkVfdfNij4KlUlLAOqDTf+A6F7CZ/m3cG4 # rHgN2CkCECKKMIIHWjCCBUKgAwIBAgITMwAAAASWUEvS2+7LiAAAAAAABDANBgkq # hkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBT # aWduaW5nIFBDQSAyMDIxMB4XDTIxMDQxMzE3MzE1MloXDTI2MDQxMzE3MzE1Mlow # WjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEr # MCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEFPQyBDQSAwMjCCAiIw # DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOHOoOgzomOmwDsAj2wZUBdrY6N3 # JFGbmm+WaKzJ0aeKzpsGQ4k2yKcxZGf5PJOIrwSVdcOf2/6MpCPnlwKmmsTHcgDt # DKHZxFuyJ30Pq05MpBMx8UWwjYOig7E52HP2HS+yCIiZYvJOdbqWhyy+wmJvWDXN # EhWL5WhY9jtB4zvcvzUZnFjY2pmTpUY8VtnFoFLFHWs0h4EQnpPO1dmzP9e2/qPF # l1FvdSKYIEWrJomeuVhBR1ym8oZti24QSumVpkKBXhPhlqylghiv6v+EYk2jDYR1 # 1r1r/v/yOfFLTsVYtw2itX0OmC8iCBh8w+AprXKxor8bqav3K6x7pxjQe//0Jrpd # mT/R3DpmP2qbYFJ8E/ttIPwN+4g37rlcOskti6NP5Kf42/ifLxOBTKiIsMRgci+P # NjzFQQt6nfzWxUGvDJo+np7FPhxKr/Wq/gG3CsLpm2aiSSpkKxmkjXVn5NjaHYHF # jpqu48oW8cGTo5y49P28J7FDXDQHtPb/qoqM8kEHrPAN1Fz3EUG/BvnNMmjtiAon # 1kyu8krslCfPJNZrTdtgjX7W44rYgHmn6GfVZoZ+UX2/kvyuWq1b03C7pLeT3Uw0 # MZeeexCBOgPulxQaXbIzs5C83RIexC5PD1TzI0HzwoCrSfOHNe33dgvfqcRdZREF # BV2P2LQi/jZrPXFlAgMBAAGjggIOMIICCjAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYB # BAGCNxUBBAMCAQAwHQYDVR0OBBYEFCRFmaF3kCp8w8qDsG5kFoQq+CxnMFQGA1Ud # IARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAwe # CgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBTZQSmw # Dw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBnMGWgY6Bhhl9odHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVk # JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNybDCBrgYIKwYBBQUHAQEE # gaEwgZ4wbQYIKwYBBQUHMAKGYWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv # cHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWdu # aW5nJTIwUENBJTIwMjAyMS5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3Nw # Lm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAZy04XZWzDSKJ # HSrc0mvIqPqRDveQnN1TsmP4ULCCHHTMpNoSTsy7fzNVl30MhJQ5P0Lci81+t03T # m+SfpzvLdKc88Iu2WLzIjairwEDudLDDiZ9094Qj6acTTYaBhVcc9lMokOG9rzq3 # LCyvUzhBV1m1DCTm0fTzNMGbAASIbuJOlVS8RA3tBknkF/2ROzx304OOC7n7eCCq # mJp79QrqLKd4JRWLFXoC5zFmVGfFLTvRfEAogKLiWIS+TpQpLIA2/b3vx0ISxZ3p # X4OnULmyBbKgfSJQqJ2CiWfx2jGb2LQO8vRDkSuHMZb03rQlwB2soklx9LnhP0/d # sFRtHLL+VXVMo+sla5ttr5SmAJFyDSrwzgfPrOIfk4EoZVGtgArthVp+yc5U0m6Z # NCBPERLmJpLshPwU5JPd1gzMez8C55+CfuX5L2440NPDnsH6TIYfErj3UCqpmeNC # OFtlMiSjDE23rdeiRYpkqgwoYJwgepcJaXtIH26Pe1O6a6W3wSqegdpNn+2Pk41q # 0GDfjnXDzskAHcRhjwcCUmiRt6IXZJQsYACeWpwsXmJe0o0ORLmumrYyHlYTdCnz # yxT6WM+QkFPiQth+/ceHfzumDhUfWmHuePwhrqe3UVCHy0r9f49Az3OhJX92MlsZ # aFo/MnmN5B62RWgJUTMIQF8j0N6xF/cwggeeMIIFhqADAgECAhMzAAAAB4ejNKN7 # pY4cAAAAAAAHMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu # dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy # MDAeFw0yMTA0MDEyMDA1MjBaFw0zNjA0MDEyMDE1MjBaMGMxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xNDAyBgNVBAMTK01pY3Jv # c29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25pbmcgUENBIDIwMjEwggIiMA0GCSqG # SIb3DQEBAQUAA4ICDwAwggIKAoICAQCy8MCvGYgo4t1UekxJbGkIVQm0Uv96SvjB # 6yUo92cXdylN65Xy96q2YpWCiTas7QPTkGnK9QMKDXB2ygS27EAIQZyAd+M8X+dm # w6SDtzSZXyGkxP8a8Hi6EO9Zcwh5A+wOALNQbNO+iLvpgOnEM7GGB/wm5dYnMEOg # uua1OFfTUITVMIK8faxkP/4fPdEPCXYyy8NJ1fmskNhW5HduNqPZB/NkWbB9xxMq # owAeWvPgHtpzyD3PLGVOmRO4ka0WcsEZqyg6efk3JiV/TEX39uNVGjgbODZhzspH # vKFNU2K5MYfmHh4H1qObU4JKEjKGsqqA6RziybPqhvE74fEp4n1tiY9/ootdU0vP # xRp4BGjQFq28nzawuvaCqUUF2PWxh+o5/TRCb/cHhcYU8Mr8fTiS15kRmwFFzdVP # Z3+JV3s5MulIf3II5FXeghlAH9CvicPhhP+VaSFW3Da/azROdEm5sv+EUwhBrzqt # xoYyE2wmuHKws00x4GGIx7NTWznOm6x/niqVi7a/mxnnMvQq8EMse0vwX2CfqM7L # e/smbRtsEeOtbnJBbtLfoAsC3TdAOnBbUkbUfG78VRclsE7YDDBUbgWt75lDk53y # i7C3n0WkHFU4EZ83i83abd9nHWCqfnYa9qIHPqjOiuAgSOf4+FRcguEBXlD9mAIn # S7b6V0UaNwIDAQABo4ICNTCCAjEwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcV # AQQDAgEAMB0GA1UdDgQWBBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBUBgNVHSAETTBL # MEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1 # AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQH # J89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0 # aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmww # gcMGCCsGAQUFBwEBBIG2MIGzMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZl # cmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIw # MjAuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29t # L29jc3AwDQYJKoZIhvcNAQEMBQADggIBAH8lKp7+1Kvq3WYK21cjTLpebJDjW4Zb # OX3HD5ZiG84vjsFXT0OB+eb+1TiJ55ns0BHluC6itMI2vnwc5wDW1ywdCq3TAmx0 # KWy7xulAP179qX6VSBNQkRXzReFyjvF2BGt6FvKFR/imR4CEESMAG8hSkPYso+Gj # lngM8JPn/ROUrTaeU/BRu/1RFESFVgK2wMz7fU4VTd8NXwGZBe/mFPZG6tWwkdmA # /jLbp0kNUX7elxu2+HtHo0QO5gdiKF+YTYd1BGrmNG8sTURvn09jAhIUJfYNotn7 # OlThtfQjXqe0qrimgY4Vpoq2MgDW9ESUi1o4pzC1zTgIGtdJ/IvY6nqa80jFOTg5 # qzAiRNdsUvzVkoYP7bi4wLCj+ks2GftUct+fGUxXMdBUv5sdr0qFPLPB0b8vq516 # slCfRwaktAxK1S40MCvFbbAXXpAZnU20FaAoDwqq/jwzwd8Wo2J83r7O3onQbDO9 # TyDStgaBNlHzMMQgl95nHBYMelLEHkUnVVVTUsgC0Huj09duNfMaJ9ogxhPNThgq # 3i8w3DAGZ61AMeF0C1M+mU5eucj1Ijod5O2MMPeJQ3/vKBtqGZg4eTtUHt/BPjN7 # 4SsJsyHqAdXVS5c+ItyKWg3Eforhox9k3WgtWTpgV4gkSiS4+A09roSdOI4vrRw+ # p+fL4WrxSK5nMYIXWTCCF1UCAQEwcTBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVy # aWZpZWQgQ1MgQU9DIENBIDAyAhMzAAJkjMsgmbnXW/L3AAAAAmSMMA0GCWCGSAFl # AwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkD # MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ # KoZIhvcNAQkEMSIEIJpBYv55W6BFV7mBdj2dAEV1fmP8ZLqy/0wBi7p23Q+MMA0G # CSqGSIb3DQEBAQUABIIBgFjLYXKDXNVqdiSyChg36FguDFVML24qpQOBdVwwGRro # yLtuVljywctpjrQNMedJbfxM08n3za3pP0xdg/JYEbyYnLR651230DKCQrLC+B10 # BkfTTEe1/MMCexpAfFhuejljvNreMz3lZFUF1DGxGOBHKeUzmS41GhtRz8afGjjr # wgVEZS9pQKKov5LOYd6bOAUpw/A/zGLeMNcFm8Ms/3c7bM5fgPgdTxjkgcoj4ByL # Ow4/1qJrdFvccL0iPjsUyvFAeadCbiTlHGmMYSq5O9k2LHbCdQx0XFhFO6FDLOCc # Q+m+MMMci1vxGQi7QbmZYwoJHk2cZQbdHFiAnoCZwKqa9Yfsf7Dk33CKI6crjLkd # hb4F0TYXz6Ot3RTJne+hKQc/t4xd8NVC86rP3VWZgq22L/3dkhdL0NIEQLcTmlPY # G24yB4e/UwVPXRLEQnc7evWT17/aQJmSSLCbDRmi/olvNz9t4UeDCs/9veyTNcLb # xwphPTvxQz8zKkqzI8VmBKGCFLIwghSuBgorBgEEAYI3AwMBMYIUnjCCFJoGCSqG # SIb3DQEHAqCCFIswghSHAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFqBgsqhkiG9w0B # CRABBKCCAVkEggFVMIIBUQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUA # BCBEcPHjsEHu2XIeBNiXxpPeEDku0BUIcsVpsXTpf1M6UQIGZ2STarkJGBMyMDI1 # MDExNjEwMjg1NS45NTNaMASAAgH0oIHppIHmMIHjMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBP # cGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0OTFB # LTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBT # dGFtcGluZyBBdXRob3JpdHmggg8pMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7J # hwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRp # dHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAw # HhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcN # AQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZH # d5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv # 3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYST # Ncc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgC # sJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt # 4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5r # O9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEf # yTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjN # q5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Sh # u/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9 # WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3 # rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMC # AQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYE # VR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJ # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME # GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl # bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo # b3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAC # hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl # JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+ # bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBes # nFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+C # zb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyr # DvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1 # I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+ # 2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG # 89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5c # cnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnb # eMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDG # Jgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgB # xFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHnzCCBYegAwIBAgITMwAAAENM # zH30mIta1AAAAAAAQzANBgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg # UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0yNDA0MTgxNzU5MTla # Fw0yNTA0MTcxNzU5MTlaMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExp # bWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0OTFBLTA1RTAtRDk0NzE1 # MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRo # b3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCYCpTwGh/YYGsC # Bw1Bfzjt10E/fvUWAM3bPMFqjmgQUgDJFoEr9ID5ySOUaVWyzUTNFSm1meso2cv8 # +ccE8fVlwTjdiqwbD0jANyJqCJyc2KO8Y/0lvZmiv7VE1DAmly7BMmBS0130Yajx # RZA1ASQ3Jj8WFlwWakj+CEoKoJWwRZWPMdDCqFhcaTvSi+8KMNYuRGPViXaUAMLS # Gr2v3fzaanvZzaroWFHs2rW9vXo9nKkvGa/aDa11roYQWgA+NWbu8skNfnKKo4ag # 37PZnk5VQTMw+xil3xCQHrQjoLwczARhnRQQprXAjIN7Pz7PQBKPc+BiGNhIvosi # XgsOaRO4eGPJTXLej0v7g5FFJpnE1vfFtWbxDaSgNiSktRN4aXs+piR3ebeQj5CT # TgIhlY5EqqUgjrKuDFYmbSnSOsLemD+stF83V0vqvpkqC/NOKYX8px2a8KN33OEn # h2LMTMw+/B+6fOoZr770JhbJreNMKcJTBt8oQWExfXuFvHcgBVocqK32hoXvhPCR # QtTx363Ollh8vKeJuZR3M0STpQef32O25SCUa8WxSO6ej3AhzHg9jfpE2/zUxuUM # 29vkwzinGwLE0igSGc8KYkLgzeeAbve5kAIkoFKytVcwjPc5WsAIHtrI4ibe/TIL # /ExH82i1iXuyTeDA6B4aoLH8jFOO2QIDAQABo4IByzCCAccwHQYDVR0OBBYEFIFS # qlmU59vkt1dhEyIJQHCygVA6MB8GA1UdIwQYMBaAFGtpKDo1L0hjQM972K9J6T7Z # PdshMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGlu # ZyUyMENBJTIwMjAyMC5jcmwweQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUFBzAChl1o # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy # MFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcnQwDAYD # VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC # B4AwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt # MAgGBmeBDAEEAjANBgkqhkiG9w0BAQwFAAOCAgEAI+3tMtpW4R3pzYsdyKeYyvhx # L3VpL9mAlxiSbhLqPrRg6DTRrKy+l1sNtKGxsxbgqztFVgzuvGuGCEwuVJRX1CMn # YIk965fF1wJGv031rv1VO8GVqtrnlJn1MnBFU1uaNsDrQrTRA2cI+G/SvIaB+cqc # FJUavTTIJ+j3sPpcHxuaHDAd89P2svCIxBLvccZQOnN7WlAynXRnEvXJCf2nFe0u # YlqX2JymvlF5jwJBxdD/0HkSZKB8hqo/exOdQjKVOflfJrl2GIYsy8AohRVCruSR # Dx7xtYgepn9brEmMr9LNTztTnCUmDwRFL3jCkwyTUQJkcLYm3v0C/v5g5UKi0C3R # Rz/LA5fjZ20imvWjCXh748/NJPi3BdIE4Dc87ol9Pn7RWAwt8R3haGK+MPYOS8zI # hAzumg81MzEKqGtf02g6yBoRz96QsBmlQW9/Eyd/lixGQgqrskjqDNytS4z5RQj5 # DdiFeftqY/ZrRsLT4cMwI+28qaX5SjqQvsVlInow6VZPS4DorNhlnMCAudUJuuNA # eIqwdNtK3iz4ydUuzimEBrOBXSrmhcbmnSfHWdeqd+BEDzuP7Cbaeqcf7GdiXwus # aLs+SxfrmK/bErXmMS0/rXwCWn+JmKDvduaAbu3JLGBDUhcR8OQ2o2ib972jnkRu # ooRuS0VjKgJM6ZngbGExggPUMIID0AIBATB4MGExCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQ # dWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAAQ0zMffSYi1rUAAAA # AABDMA0GCWCGSAFlAwQCAQUAoIIBLTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQ # AQQwLwYJKoZIhvcNAQkEMSIEIN+0D1jVE1qzy59ndbQRs3zkVDKp78+b7uH9hiK7 # T6nzMIHdBgsqhkiG9w0BCRACLzGBzTCByjCBxzCBoAQgF07+WGQ6IhpoWuB2oDRy # iqGOBEeB0p20wOu3uUIFxd4wfDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1Ymxp # YyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjACEzMAAABDTMx99JiLWtQAAAAAAEMw # IgQgDPYurT85RNLeifjP+iqlGfldjhGfw0TB4SzvFtALsQ8wDQYJKoZIhvcNAQEL # BQAEggIAVb6hx2tKjp4mp4NdGVanEB8l34nwB5KblGaQD5f8IPPGQSayuzU+xAvX # XUPOHnfV/lt3GnUFqjncxs0qw0I3XP1WYuUV5HKXxuk3E4MSNYa/Igf9leiXHY4V # QTINcEQ5g1WQiLL1JAWHCBjgN9UEi+4EQf6jms6ZLeHM/mTR3fdA5ebIhUveyWkC # AYsphfs2Ufumx7KEHlI/oSYpeE3/+IbqHl4O4Gsdt5dAoFjrhFthwlpsyrnluWdL # xMa0OPCMsK6bzuN7ZoT/uNGzBvz5UMw3t6DtIvTmuUXIdqpyKLIu+cZrcSvqHO0C # BqYlJP5ZUEGkhErSXLNTNJUmAVbT2SdKbT3sD5i2sSjQQHuJcDS05+ExJseuOlGf # jcmXMWAx44Eeu3B+XdrulYk4r7DX7RUsZLuk/rEX+8c17IYO8KDY5p7Wfjsl8LDW # 8kpqPV5q4xgW/HdaKL27Zp0pyXLiiz2CDRnQoDMG+TnohtNJ7Ksa3Q6IMJ+acrY+ # rrF7g1WbnbqD6bSnISz4lzFn7JI3htnsG+ZZhr/5/bf1rO5XHWZ5xKqm3aJ7ef9j # L+A5ED2Sgz8DO7PUCYEM5ws+XAsEbfAfagWwWElsKKd7zHS1tMnxL4+UdzTbH7AE # 4Mo5fR/gtjxvy2b7LkBFjV9eXjgyDL8acs4XoLKvlWqoScBAXDQ= # SIG # End signature block |