FastTrack-GDPR-RequestDsr.psm1

Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue

Function SetDsrObjectValues {
    param
    (
        [string] $TenantID,
        [string] $CompanyName,
        [string] $LogonUserEmail,
        [string] $DsrRequestUserEmail,
        [string] $DsrType,
        [string] $MigrationType
    )

    $RequestUserEmails = New-Object System.Collections.Generic.List``1[System.String]

    if ($DsrRequestUserEmail.Contains(",")) {

        foreach ($userEmail in $DsrRequestUserEmail.Split(",".ToCharArray())) {
            $RequestUserEmails.Add([System.Web.HttpUtility]::HtmlEncode($userEmail));
        }
    }
    else {
        $RequestUserEmails.Add([System.Web.HttpUtility]::HtmlEncode($DsrRequestUserEmail));
    }

    $CustomerIdentity = (New-Object PSObject |
            Add-Member -PassThru NoteProperty TenantId $TenantID |
            Add-Member -PassThru NoteProperty CompanyName $CompanyName |
            Add-Member -PassThru NoteProperty LogOnUserEmail $LogonUserEmail)

    $CustomerObject = (New-Object PSObject |
            Add-Member -PassThru NoteProperty TransactionId ([System.Guid]::Empty) |
            Add-Member -PassThru NoteProperty DSRType $DsrType |
            Add-Member -PassThru NoteProperty Identity $CustomerIdentity |
            Add-Member -PassThru NoteProperty DsrRequestUserEmail $RequestUserEmails.ToArray() |
            Add-Member -PassThru NoteProperty EnvironmentType $global:MsoComOrGov |
            Add-Member -PassThru NoteProperty MigrationType $MigrationType)

    return $CustomerObject
}

Function Submit-FastTrackGdprDsrRequest {
    <#
.SYNOPSIS
    Submit a new GDPR DSR request to remove user sensitive information from the FastTrack environment.
.DESCRIPTION
    The Submit-FastTrackGdprDsrRequest cmdlet submits a new GDPR DSR request to remove user sensitive information from the FastTrack environment.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet.
 
    Once a request is submitted, you can check the status of the request use the Get-FastTrackDsrRequest cmdlet.
.PARAMETER DsrRequestUserEmail
    Email of user to remove from FastTrack
.EXAMPLE
    Submit-FastTrackGdprDsrRequest -DsrRequestUserEmail "abc@contoso.net"
.INPUTS
    System.String
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates a System.Management.Automation.PSObject object that represents the Transaction ID .
.LINK
    Get-FastTrackGdprDsrRequests
    Get-FastTrackGdprDsrStatus
#>

    param
    (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $DsrRequestUserEmail
    )

    try {
        $DsrType = "Delete" #defaulting value for initial release

        if ($global:MsoAdminProperties.Count -eq 0) {
            Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function."
            return
        }
        elseif ($null -eq $global:MsoAdminProperties["MSO-AdminUser"]) {
            Write-Warning "Logged in user is not a global admin for tenant $($global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName)"
            return
        }

        if ($null -ne $global:MsoAdminProperties["MSO-AdminUser"]) {
            Write-Host "Admin user validated... Preparing DSR request..."

            $jsonObj = SetDsrObjectValues -TenantID: $global:MsoAdminProperties["MSO-CompanyTenantInfo"] `
                -CompanyName: $global:MsoAdminProperties["MSO-CompanyInfo"].DisplayName `
                -LogonUserEmail: $global:MsoAdminProperties["MSO-LoggedOnUser"].Account `
                -DsrRequestUserEmail: $DsrRequestUserEmail `
                -DsrType: $DsrType

            $serializedJson = $jsonObj | ConvertTo-Json -Compress: $true
            Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Request formatted for system request."

            $header = @{ }
            $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())
            $header.Add("TENANT_ID", $global:MsoAdminProperties["MSO-CompanyTenantInfo"])
            
            Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Sending DSR Request."

            $JsonResult = Invoke-PostRequest -Uri ([System.String]::Format("{0}DSR/Create", $global:CsiApiBaseUriFormat)) -Headers $header -Body $serializedJson

            if ($null -ne $JsonResult.StatusCode) {
                # Error?
                Write-Warning "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
            }
            else {
                Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Transaction Request Complete"
            }

            return $JsonResult | Add-Member -PassThru NoteProperty Status "Submitted"
        }
        else {
            Write-Warning "SORRY! - The Logon User is not marked as a Global Administrator... We cannot continue!"
        }
    }
    catch {
        Write-Warning -Message:"An error occurred attempting to authenticate with this module"
        Write-Warning -Message: $_.Exception.Message
        Write-Host "Press the [enter] key to close this process"
        Read-Host
    }
}

Function Get-FastTrackGdprDsrRequest {
    <#
.SYNOPSIS
    Get the status of a GDPR DSR request from the FastTrack environment.
.DESCRIPTION
    The Get-FastTrackGdprDsrStatus cmdlet Get the status of a GDPR DSR request from the FastTrack environment.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet.
 
    Once a request is submitted, you can check the status of the request use the Get-FastTrackDsrRequest cmdlet.
.PARAMETER TransactionId
    Unique transaction identifier
.EXAMPLE
    Get-FastTrackGdprDsrStatus -DataServiceRequestId "RequestId"
    Get-FastTrackGdprDsrStatus
.INPUTS
    System.String
.OUTPUTS
    System.Management.Automation.PSObject
        This cmdlet generates a System.Management.Automation.PSObject object that represents FastTrack GDPR DSR status.
.LINK
    Submit-FastTrackGdprDsrRequest
    Get-FastTrackGdprDsrRequests
#>

    param
    (
        [Parameter(Mandatory = $false, ValueFromPipeline = $true)]
        [string] $TransactionId
    )

    try {
        if ($global:MsoAdminProperties.Count -eq 0) {
            Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function."
            return
        }

        if ($null -ne $global:MsoAdminProperties["MSO-AdminUser"]) {
            Write-Host "Admin user validated... Preparing DSR request..."

            [string] $TenantId = $global:MsoAdminProperties["MSO-CompanyTenantInfo"]
            [string] $query = "environmentType=$global:MsoComOrGov"

            $header = @{ }
            $header.Add("Authorization", $global:MsoAdminProperties["AuthorizationResult"].CreateAuthorizationHeader())
            $header.Add("TENANT_ID", $global:MsoAdminProperties["MSO-CompanyTenantInfo"])
            
            Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Sending DSR Request."

            if ($TransactionId -ne [string]::Empty) {
                $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}/{1}/DSR/Status/TransactionId/{2}?{3}", $global:CsiApiBaseUriFormat, $TenantId, $TransactionId, $query)) -Headers $header
            }
            else {
                $JsonResult = Invoke-GetRequest -Uri ([System.String]::Format("{0}/{1}/DSR?{2}", $global:CsiApiBaseUriFormat, $TenantId, $query)) -Headers $header
            }

            if ($null -ne $JsonResult.StatusCode) {
                # Error?
                Write-Warning "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Request failed! : $($JsonResult.StatusCode) - Error Message: $($JsonResult)"
            }
            else {
                Write-Host "[$(Get-Date -Format:'MMM-dd-yyyy HH:mm:ss')] - Transaction Request Complete"
            }

            return $JsonResult
        }
        else {
            Write-Warning "SORRY! - The Logon User is not marked as a Global Administrator... We cannot continue!"
        }
    }
    catch {
        Write-Warning -Message:"An error occurred attempting to authenticate with this module"
        Write-Warning -Message: $_.Exception.Message
        Write-Host "Press the [enter] key to close this process"
        Read-Host
    }
}
# SIG # Begin signature block
# MIIkTQYJKoZIhvcNAQcCoIIkPjCCJDoCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDuTGxpuj9tH5Cw
# 0HknM0VJI2SrMjE+OXzGL5tKYtFrOqCCDXYwggX0MIID3KADAgECAhMzAAABUMiP
# lnfeTPFHAAAAAAFQMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMTkwNTAyMjEzNzQ1WhcNMjAwNTAyMjEzNzQ1WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQCh2V193EGtu49awDgcJ1E8WB5mAim/gAFVpWUVOlk/haZWAiffh/k3W/GPhgYl
# t2WH/FQS4BcGpeWRb2Wi4seOUWb5lbgIuUKBORF0iiEiPNMLueuD3PAChl/h3WE2
# N1T8zsQg6UMrWtNRdby48xCI6zdD+26yNei3tOccrOWWullOehpBF5Z4vp8Xvq1n
# ysaSkGgAZNaKrb3F6et3V5Tq+gJ0DaLm/TGxATcTJ1mrHJOx+cHorSIeGKKzwa19
# uBuUbGALZx8Isus+3KiK7h2YcZ+AHU+qeUCLbKhU3l97Kg9E6/dvAMa+42/BXSmZ
# 9+F3WfagixcbNWGaZA1Pn8mPAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUGxNB+9SPshuMPQ+xlMnFMiKVkDgw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzQ1NDEzNDAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBADSrnbMt49ZGUc9KnW7S
# VkzITe55ApMwgxE8jl06lBkMZLd9QatyUt6g2/0RG0boaMHpWzypk6pGDLRD5y/P
# 6sj6fQYkrGihAw3W4ObLE3rrY8e5GPTrp/AlMFzsywHhD0+ETwgU8PuMvwQfB6ak
# 2ejWP0M1a1tkyAHfEMEGKd7RVPRmlLX+kPkJoFPz/uSlKxXi/acGH1qISQc0pkRt
# UE/ufrfpR+LlEOPg5aNZdAwIJAuDWInMeQM7kIoUTShSAJTzT58mrwVXgrfBbZnA
# NpsC/v8/amGL43MhTN0V2sWBHZNL7N0X9Z2qldu+jj8HdaNRGQyuru1W+IjNV914
# nk3qp9T/bZmy0elNYkCdNFjapARu6TZ0wwlEkvFW0HuzwtQ2gGDddGuhRFQRrdbU
# 68ifXf3dtvUDb0Nr+tnw9k0mV4s9jkTraDBaSJV0v1ixeR6WEBgGcc+uL/rHnci8
# 9cMcZqqcY8gGw0T1GpdDbWYLsYsqfPu5ZP4ga0kZa/ne7Bi3zu8XZ72kM893t5Ib
# Z96/2xp2Q+I6vIVfZJ7fh7vQ3OcLAZDvN+y6jNq3jtnQSYHuhX+Du074DXhQeVTB
# qTzBiuZPbnJhmI525u1GVoGemw0fqwk4cpeh3d1cDMN5eWlmqEdRwgaWozpj3a4I
# BzxVWkDJSJ4ZEq2odtK6eoYcMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCFi0wghYpAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAAFQyI+Wd95M8UcAAAAAAVAwDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIBaKoojYbWsTCpCsOBd63IV+
# FJxHJ1urkw9GbI7gnbdgMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAACH0aRbVvWMxxqwcEKG7ctEHEd8NGK/IMumpE0CmaCgZWWdF+ARwvZiC
# gMH7EGZfEC/m7S09YZkq++1d0XJSP9u27VTxxL8D07AuBKdgz/m9dkvy3CnrwGrg
# EESu4z46KUgJJ4pdVo5/3t0pALW8w8FsNAmHUPcy3DORk8PN6OardrrErVbKSj2w
# Evf1pUmB/Hna9GbifN863YUy9PfAvFGISH7g40cg8BRpAy3WAvvedfB+h5zh9n33
# pWYAb8pYSzcn2biaXU+49tA44lLWtD8BgQanMY+0GY5C++sW7ZbEq+Gx2dqcKNOh
# ZXWH8hFw4YiF4RcPCjWMO7le/8i7j6GCE7cwghOzBgorBgEEAYI3AwMBMYITozCC
# E58GCSqGSIb3DQEHAqCCE5AwghOMAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFYBgsq
# hkiG9w0BCRABBKCCAUcEggFDMIIBPwIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCCqhlbwVL/n4CIfAtL9uDhbIDZZ+UK5o5GxITLLlmPRbwIGXfqF8CI/
# GBMyMDIwMDEwOTA2NDkzMS42MTlaMAcCAQGAAgH0oIHUpIHRMIHOMQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQg
# T3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046
# QkJFQy0zMENBLTJEQkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNl
# cnZpY2Wggg8fMIIE9TCCA92gAwIBAgITMwAAAP8vnmsFEdNrlwAAAAAA/zANBgkq
# hkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xOTA5
# MDYyMDQxMDlaFw0yMDEyMDQyMDQxMDlaMIHOMQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQ
# dWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046QkJFQy0zMENBLTJE
# QkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuCOuILcP+LfUEqGIrXGvCr+mEFRpy
# 20gxNNMkZI+kViE/rsYH3eItmQfawIndfP1bKp+1J2b3mXXJ7qqwMYlflpc4qTc/
# HgOByIa3tFmUEWN/jDBKzE9FucFHKgPT8gtEnVGOg9h3ES3zIJj18d+sVVcbpgmu
# tvJKopGl1u9vTNwLxdH3S4t+ov1SgOgsTF0CblJiu/zdiwsQzstk+3nQPjk+Dlwf
# EC5kwOricPV0QMaC/q+Buj+4rBUAvDKb/NvBqRtJptmT9S5HZOXidFMm2i2SJVK0
# sEamOw69Jaj1mB5bksyMP0PFttGYVxh02dTBDG6AbmTCEr9bKrgPBjWxAgMBAAGj
# ggEbMIIBFzAdBgNVHQ4EFgQUzhnW8N+xfFZ8o+3bxTZyMEBX1gEwHwYDVR0jBBgw
# FoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENB
# XzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAx
# MC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDAN
# BgkqhkiG9w0BAQsFAAOCAQEApAnaQljuFW4UjErMgHn4LWHVod53qtw/9FERINhT
# 6tH/Ed6n6AzDcfeBdr4taaxo5dB+juWM6nDQwd99kInuKk7fqRlxd7ZmJlkFQ6MA
# dLzdJDGXSkS7I3aR7E/pKnBV1Y6gbICuPeM1CTPYSO26ryfWM36/PGu1Iv1JGNkJ
# OG82X2J3SiACPFIzCaexAK4P9bEPc8GhqdHdxc7x0fVeOw+EvBanHFa82hmz2HC/
# JMaI4yR7JtRgKjZZTuOIWBqkXmDFcFaTgfFl4jJLdwQCdkMb4wfLgVdc/Jym4nJr
# qBZFTb0mkAYb6OkK1h6gNobk69mFO5yjDTiw8hPGZRorkjCCBnEwggRZoAMCAQIC
# CmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRp
# ZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIx
# NDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG
# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3
# DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF
# ++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRD
# DNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSx
# z5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1
# rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16Hgc
# sOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB
# 4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqF
# bVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYD
# VR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB
# BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
# ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCB
# kjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQe
# MiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQA
# LiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUx
# vs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GAS
# inbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1
# L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWO
# M7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4
# pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45
# V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x
# 4QDf5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEe
# gPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKn
# QqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp
# 3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvT
# X4/edIhJEqGCA60wggKVAgEBMIH+oYHUpIHRMIHOMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9u
# cyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046QkJFQy0zMENB
# LTJEQkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiJQoB
# ATAJBgUrDgMCGgUAAxUAAjbENWjPNg9MFMx7uLG8Osg6dx2ggd4wgdukgdgwgdUx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1p
# Y3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMScwJQYDVQQLEx5uQ2lwaGVy
# IE5UUyBFU046NERFOS0wQzVFLTNFMDkxKzApBgNVBAMTIk1pY3Jvc29mdCBUaW1l
# IFNvdXJjZSBNYXN0ZXIgQ2xvY2swDQYJKoZIhvcNAQEFBQACBQDhwE9eMCIYDzIw
# MjAwMTA4MjA1MzUwWhgPMjAyMDAxMDkyMDUzNTBaMHQwOgYKKwYBBAGEWQoEATEs
# MCowCgIFAOHAT14CAQAwBwIBAAICHxowBwIBAAICGpYwCgIFAOHBoN4CAQAwNgYK
# KwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAaAKMAgCAQACAxbjYKEKMAgCAQAC
# AwehIDANBgkqhkiG9w0BAQUFAAOCAQEAHjGsM0yQ4WkiVDiU+CgB+3AYXoSktRme
# YanzsSt70MxiA8L05q0b8jT+DMr24xTN/WTA/Aajdo+YlT8ul6wj+LoKBAbxD39z
# G5QanvYlx/8vrhfPracMz0ZSjICuu29qswzHVKK2KCNs7vmvhAcvXZFhNCjdIFvS
# /t/1QLsXbiFEPAJ5BADVIdPuvJ3JYiNwJK1MkqMU7n/+MTPzdX/VrbZGV9PSJXoL
# AJMtXivxdpxv8LHukKFCvhtXpnBurtf1/FhtD6SV0fEx7enhS7Dv+LnhkpEO21l0
# PSIy3PJMqZ/cmzNOQpN8U9MIhC0x4PF0/TH9t/VXyaNciI6yPjGiTDGCAvUwggLx
# AgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk
# BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAA/y+eawUR
# 02uXAAAAAAD/MA0GCWCGSAFlAwQCAQUAoIIBMjAaBgkqhkiG9w0BCQMxDQYLKoZI
# hvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIGJmXTDUNRMtLda2GtNfpNUIEPNwMgBW
# CXGafw3hcuPgMIHiBgsqhkiG9w0BCRACDDGB0jCBzzCBzDCBsQQUAjbENWjPNg9M
# FMx7uLG8Osg6dx0wgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx
# MAITMwAAAP8vnmsFEdNrlwAAAAAA/zAWBBT56mLMM6QzyBIqvHOqysBQ5XcXtjAN
# BgkqhkiG9w0BAQsFAASCAQBwT4u5oQqP4g5v2v1OzLzFDnPsll6o110O+fes2v3u
# dYtwQ5Cs6feI4LcQ43ERVuuSKZYXrmUfr0J99rUBtqfA19t63a8lYeGEfLbm6MQO
# xiu6EOIET2gNSHgetaTBr7dBoaXdNpBKHY0Lu5rY46c0LtB6KQ/uP37+6PxOdaZw
# 1Lrzga9pLH73JLwUicnfZtRqgXb06AGm59yx83N94bTkLJhk9xAUqNjtkGaHPjeq
# kjRp/R+0f2ETUQ7nQja1B40S1aU3FzVCFcguoU7USUq0hlWbJAwdOiYv2JFWoAo4
# tiz4yVyJ5mC2NsabIGLZuwzBDjLOtxifOFnX1wGCTbFN
# SIG # End signature block