MSTeams.psm1

#Function 1
Function New-TeamsFromCSV 
{
<#
    .SYNOPSIS
    Create MS Teams from CSV file.
 
    .DESCRIPTION
    Using this script, you can create Mirosoft Teams by importing details from csv file and this function use the MicrosoftTeams PowerShell Module.
 
    .EXAMPLE
    New-TeamsFromCSV -Path "C:\temp\TeamsDetails.CSV"
 
    Create Teams from CSV file.
 
    Sample CSV file format
 
    "TeamsName","TeamType","ChannelName","Owners","Members"
    "Testteam","Private","TestChannel;TestChanne2","admin@Tenantname.com","alexw@Tenantname.com"
    "Testteam2","Private","TestChanne3","alexw@Tenantname.com","admin@Tenantname.com"
    "Testteam3","Private","TestChanne2","alland@Tenantname.com","admin@Tenantname.com;AlexW@Tenantname.com;LeeG@Tenantname.com"
 
    Note: CSV Header: "TeamsName","TeamType","ChannelName","Owners","Members"
    You need to use ";" for multiple ChannelName,Owners and Members in the CSV file
 
     
#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string]
        # Provide the CSV file path of the new Teams details.
        $Path 
    )
    function Create-Channel
    {   
       param (   
                 $ChannelName,$GroupId
             )   
        Process
        {
            try
                {
                    $teamchannels = $ChannelName -split ";" 
                    if($teamchannels)
                    {
                        for($i =0; $i -le ($teamchannels.count - 1) ; $i++)
                        {
                            New-TeamChannel -GroupId $GroupId -DisplayName $teamchannels[$i]
                        }
                    }
                }
            Catch
                {
                }
        }
    }

    function Add-Users
    {   
        param(   
                 $Users,$GroupId,$CurrentUsername,$Role
              )   
        Process
        {
        
            try{
                    $teamusers = $Users -split ";" 
                    if($teamusers)
                    {
                        for($j =0; $j -le ($teamusers.count - 1) ; $j++)
                        {
                            if($teamusers[$j] -ne $CurrentUsername)
                            {
                                Add-TeamUser -GroupId $GroupId -User $teamusers[$j] -Role $Role
                            }
                        }
                    }
                }
            Catch
                {
                }
            }
    }

    function Create-NewTeam
    {   
       param (   
                 $ImportPath
             )   
      Process
        {
            Import-Module MicrosoftTeams
            $cred = Get-Credential
            $username = $cred.UserName
            Connect-MicrosoftTeams -Credential $cred
            $teams = Import-Csv -Path $ImportPath
            foreach($team in $teams)
            {
                $getteam= get-team |where-object { $_.displayname -eq $team.TeamsName}
                If($getteam -eq $null)
                {
                    Write-Host "Start creating the team: " $team.TeamsName
                    $group = New-Team -alias $team.TeamsName -displayname $team.TeamsName  -AccessType $team.TeamType
                    Write-Host "Creating channels..."
                    Create-Channel -ChannelName $team.ChannelName -GroupId $group.GroupId
                    Write-Host "Adding team members..."
                    Add-Users -Users $team.Members -GroupId $group.GroupId -CurrentUsername $username  -Role Member 
                    Write-Host "Adding team owners..."
                    Add-Users -Users $team.Owners -GroupId $group.GroupId -CurrentUsername $username  -Role Owner
                    Write-Host "Completed creating the team: " $team.TeamsName
                    $team=$null
                }
             }
        }
    }

Create-NewTeam -ImportPath $Path

}

#function 2
Function Export-ArchivedTeams
{  
<#
    .SYNOPSIS
    Export Archived Teams into CSV file.
 
    .DESCRIPTION
    Using this script, you can Export archived Mirosoft Teams into csv file and this function use the SharePointPnPPowerShellOnline Module.
 
    .EXAMPLE
    Export-ArchivedTeams -ExportPath "C:\temp\ArchivedTeamsDetails.CSV"
 
    Export Archived Teams into CSV file.
 
     
#>
 
    [CmdletBinding()]
    param(
            [Parameter(Mandatory=$true)]
            [string]
            # Provide the CSV file path to export Archived Teams details.
            $ExportPath 
         )  
    process{
            Connect-PnPOnline -Scopes "Group.Read.All","Group.ReadWrite.All"
            $accesstoken =Get-PnPAccessToken
            $group = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri  "https://graph.microsoft.com/beta/groups?`$filter=resourceProvisioningOptions/any(c:c+eq+`'Team`')" -Method Get
            $TeamsList = @()
            
            $i=1
            do
            {
                foreach($value in $group.value)
                {
                    Write-Progress -Activity "Get All Groups" -status "Found Group $i" -percentComplete ($i / $group.value.count*100)                
            
                        $id= $value.id
                        Try
                        {
                            $team = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri  https://graph.microsoft.com/beta/teams/$id -Method Get
                            if($team -ne $null -and $team.isArchived -eq $true)
                            {
                                $Teams = "" | Select "TeamsName","TeamType"
                                        
                                $Teams.TeamsName = $value.displayname
                                $Teams.TeamType = $value.visibility
                                     
                                $TeamsList+= $Teams
                                $Teams=$null
                            }
                        }
                        Catch
                        {
                            $team = $null
                        }
                        $i++
                }
        
                if ($group.'@odata.nextLink' -eq $null )
                {
                    break
                }
                else
                {
                    $group = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri $group.'@odata.nextLink' -Method Get
                }
            }while($true);
            $TeamsList
            $TeamsList |Export-csv $ExportPath -NoTypeInformation
        }
}
#Function 3
function Export-TeamsList
{
<#
    .SYNOPSIS
    Export Microsoft Teams into CSV file.
 
    .DESCRIPTION
    Using this script, you can Export Mirosoft Teams into csv file and this function use the SharePointPnPPowerShellOnline Module.
 
    .EXAMPLE
    Export-TeamsList -ExportPath "C:\temp\TeamsList.CSV"
 
    Export Microsoft Teams into CSV file.
 
     
#>
    
    [CmdletBinding()]
    param(
            [Parameter(Mandatory=$true)]
            [string]
            # Provide the CSV file path to export Teams details.
            $ExportPath 
         )
        
    process{
                Connect-PnPOnline -Scopes "Group.Read.All","User.ReadBasic.All"
                $accesstoken =Get-PnPAccessToken
                $MTeams = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri  "https://graph.microsoft.com/beta/groups?`$filter=resourceProvisioningOptions/any(c:c+eq+`'Team`')" -Method Get
                $TeamsList = @()
                $i=1
                do
                {
                    foreach($value in $MTeams.value)
                    {
        
                            Write-Progress -Activity "Get All Teams" -status "Found Teams $i"              
                   
                            $id= $value.id
                            Try
                            {
                                $team = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri  https://graph.microsoft.com/beta/Groups/$id/channels -Method Get
                                 
                            }
                            Catch
                            {
                                
                            }                  
                 
                            $Owner = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri  https://graph.microsoft.com/v1.0/Groups/$id/owners -Method Get
                            $Members = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri  https://graph.microsoft.com/v1.0/Groups/$id/Members -Method Get 
                            $Teams = "" | Select "TeamsName","TeamType","Channelcount","ChannelName","Owners","MembersCount","Members"
                            $Teams.TeamsName = $value.displayname
                            $Teams.TeamType = $value.visibility
                            $Teams.ChannelCount = $team.value.id.count
                            $Teams.ChannelName = $team.value.displayName -join ";"
                            $Teams.Owners = $Owner.value.userPrincipalName -join ";"
                            $Teams.MembersCount = $Members.value.userPrincipalName.count 
                            $Teams.Members = $Members.value.userPrincipalName -join ";" 
                            $TeamsList+= $Teams
                            $teamaccesstype=$null
                            $errorMessage =$null
                            $Teams=$null
                            $team =$null
                            $i++
                    }
                    if ($MTeams.'@odata.nextLink' -eq $null )
                    {
                        break
                    }
                    else
                    {
                       $MTeams = Invoke-RestMethod -Headers @{Authorization = "Bearer $accesstoken"} -Uri $MTeams.'@odata.nextLink' -Method Get
                    }
                }while($true);
                $TeamsList
                $TeamsList | Export-csv $ExportPath -NoTypeInformation
            }
}
#Function 4
Function Apply-TeamsPolicyFromCSV
{
<#
    .SYNOPSIS
    Apply teams policy to user accounts from CSV file.
 
    .DESCRIPTION
    Using this script, you can Apply teams policy to user accounts and this function use the SkypeOnlineConnector Module.
 
    .EXAMPLE
    Apply-TeamsPolicyFromCSV -Path "C:\temp\TeamsPolicy.CSV"
 
    Apply teams policy to user account from CSV file.
 
    Sample CSV file format
    Ex:
 
    UserPricipalName,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy
    admin@tenantname.com,Tag:AllowCalling,Tag:AllOn,Tag:Default,Tag:SfBWithTeamsCollabWithNotify
    alexw@tenantname.com,Tag:DisallowCalling,Global,Tag:EduFaculty,Global
    alland@tenantname.com,Global,Global,Global,Global
 
    Note: CSV Header: UserPricipalName,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy
 
 
     
#>
 
    [CmdletBinding()]

    param(
            [Parameter(Mandatory=$True)]
            [string]$Path
            # Provide the CSV file path of the teams policy details.
         )
     #connect Csonline
     $credential = Get-Credential
     $session = New-CsOnlineSession -Credential $credential
     Import-PSSession $session
     
     # Importing policy from csv file
     $Users=Import-Csv $Path
     foreach($User in $Users)
     {
    
        $UserPrincipalName=$User.UserPricipalName
        $CallingPolicy=$User.TeamsCallingPolicy
        $MeetingPolicy=$User.TeamsMeetingPolicy
        $MessagingPolicy=$User.TeamsMessagingPolicy
        $UpgradePolicy=$User.TeamsUpgradePolicy
    
         Get-CsOnlineUser|ForEach-Object{
            $OnlineUser=$_
            #Apply teams policy
            if($userprincipalname -eq $OnlineUser.userprincipalname){

                    if($CallingPolicy -eq 'Global'){
                        Grant-CsTeamsCallingPolicy   -Identity $UserPrincipalName -PolicyName $null
                    }
                    else{
                        Grant-CsTeamsCallingPolicy   -Identity $UserPrincipalName -PolicyName $CallingPolicy 
                    }
                    if($MeetingPolicy -eq 'Global'){
                        Grant-CsTeamsMeetingPolicy   -Identity $UserPrincipalName -PolicyName $null
                    }
                    else{
                        Grant-CsTeamsMeetingPolicy   -Identity $UserPrincipalName -PolicyName $MeetingPolicy
                    }
                    if($MessagingPolicy -eq 'Global'){
                        Grant-CsTeamsMessagingPolicy -Identity $UserPrincipalName -PolicyName $null
                    }
                    else{
                        Grant-CsTeamsMessagingPolicy -Identity $UserPrincipalName -PolicyName $MessagingPolicy
                    }
                    if($UpgradePolicy -eq 'Global'){
                   
                       Grant-CsTeamsUpgradePolicy   -Identity $UserPrincipalName -PolicyName $null   
                    }
                    else{
                        Grant-CsTeamsUpgradePolicy   -Identity $UserPrincipalName -PolicyName $UpgradePolicy
                    }
             }
             Else
             {
             Write-Host  $UserPrincipalName "user is not available in the Azure Active directory"  
             }
         }
    }
    #Creating some delay
    Start-Sleep -Seconds 90

    #Checking given policy is applied or not.
    foreach($User in $Users){
        $UserPrincipalName=$User.UserPricipalName
        Get-CsOnlineUser|ForEach-Object{
            $OnlineUser=$_
            if($userprincipalname -eq $OnlineUser.userprincipalname){
                New-Object -TypeName PSObject -Property @{
                UserPrincipalname = $OnlineUser.userprincipalname
                TeamsCallingPolicy = $OnlineUser.TeamsCallingPolicy
                TeamsMeetingPolicy = $OnlineUser.TeamsMeetingPolicy
                TeamsMessagingPolicy = $OnlineUser.TeamsMessagingPolicy
                TeamsUpgradePolicy = $OnlineUser.TeamsUpgradePolicy} 
            }
        }|Select-Object userprincipalname,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy
    }
         

}

#Function 5
Function Export-TeamsPolicy
{
<#
    ..SYNOPSIS
    Export Microsoft Teams policy from the user accounts into CSV file.
 
    .DESCRIPTION
    Using this script, you can Export Mirosoft Teams policy into csv file and this function use the SkypeOnlineConnector Module.
 
    .EXAMPLE
    Export-TeamsPolicy -Path "C:\temp\TeamsPolicyDetails.CSV"
 
    Export Microsoft Teams policy from the user accounts into CSV file.
 
 
     
#>
 
     [CmdletBinding()]
     param(
            [Parameter(Mandatory=$true)]
            [string]
            # Provide the CSV file path to export Teams policy details.
            $Path
          )
   
     #Connect Csonline
     $credential = Get-Credential
     $session = New-CsOnlineSession -Credential $credential
     Import-PSSession $session
     
     #Get CsOnline User
     $GetTeams = Get-CsOnlineUser|ForEach-Object{
                                                    $OnlineUser=$_
                                                    New-Object -TypeName PSObject -Property @{
                                                                                                UserPrincipalname = $OnlineUser.userprincipalname
                                                                                                TeamsCallingPolicy =  If($OnlineUser.TeamsCallingPolicy -eq $null){ "Global" } else {$OnlineUser.TeamsCallingPolicy}
                                                                                                TeamsMeetingPolicy =  If($OnlineUser.TeamsMeetingPolicy -eq $null){ "Global" } else {$OnlineUser.TeamsMeetingPolicy}
                                                                                                TeamsMessagingPolicy = If($OnlineUser.TeamsMessagingPolicy-eq $null){ "Global" } else {$OnlineUser.TeamsMessagingPolicy}
                                                                                                TeamsUpgradePolicy =  If($OnlineUser.TeamsUpgradePolicy-eq $null){ "Global" } else {$OnlineUser.TeamsUpgradePolicy}
                
                                                                                              } 
                                                 }|Select-Object userprincipalname,TeamsCallingPolicy,TeamsMeetingPolicy,TeamsMessagingPolicy,TeamsUpgradePolicy 
        
      $GetTeamsPolicy
      $GetTeamsPolicy |Export-Csv -Path $Path -NoTypeInformation
 }



# SIG # Begin signature block
# MIIVHwYJKoZIhvcNAQcCoIIVEDCCFQwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU9pRcI9vrKa96Dd8MDTxmaKwd
# g6agghAPMIIEmTCCA4GgAwIBAgIPFojwOSVeY45pFDkH5jMLMA0GCSqGSIb3DQEB
# BQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg
# TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNV
# BAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJG
# aXJzdC1PYmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhDEL
# MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
# BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKjAoBgNVBAMT
# IUNPTU9ETyBTSEEtMSBUaW1lIFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBAOnpPd/XNwjJHjiyUlNCbSLxscQGBGue/YJ0UEN9
# xqC7H075AnEmse9D2IOMSPznD5d6muuc3qajDjscRBh1jnilF2n+SRik4rtcTv6O
# KlR6UPDV9syR55l51955lNeWM/4Og74iv2MWLKPdKBuvPavql9LxvwQQ5z1IRf0f
# aGXBf1mZacAiMQxibqdcZQEhsGPEIhgn7ub80gA9Ry6ouIZWXQTcExclbhzfRA8V
# zbfbpVd2Qm8AaIKZ0uPB3vCLlFdM7AiQIiHOIiuYDELmQpOUmJPv/QbZP7xbm1Q8
# ILHuatZHesWrgOkwmt7xpD9VTQoJNIp1KdJprZcPUL/4ygkCAwEAAaOB9DCB8TAf
# BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUjmstM2v0
# M6eTsxOapeAK9xI1aogwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwFgYD
# VR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny
# bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDA1BggrBgEF
# BQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20w
# DQYJKoZIhvcNAQEFBQADggEBALozJEBAjHzbWJ+zYJiy9cAx/usfblD2CuDk5oGt
# Joei3/2z2vRz8wD7KRuJGxU+22tSkyvErDmB1zxnV5o5NuAoCJrjOU+biQl/e8Vh
# f1mJMiUKaq4aPvCiJ6i2w7iH9xYESEE9XNjsn00gMQTZZaHtzWkHUxY93TYCCojr
# QOUGMAu4Fkvc77xVCf/GPhIudrPczkLv+XZX4bcKBUCYWJpdcRaTcYxlgepv84n3
# +3OttOe/2Y5vqgtPJfO44dXddZhogfiqwNGAwsTEOYnB9smebNd0+dmX+E/CmgrN
# Xo/4GengpZ/E8JIh5i15Jcki+cPwOoRXrToW9GOUEB1d0MYwggWKMIIEcqADAgEC
# AhARdWBE0+bdVK7ZFcy3SRIpMA0GCSqGSIb3DQEBCwUAMH0xCzAJBgNVBAYTAkdC
# MRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQx
# GjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMwIQYDVQQDExpDT01PRE8gUlNB
# IENvZGUgU2lnbmluZyBDQTAeFw0xNzA3MjYwMDAwMDBaFw0yMDA3MjUyMzU5NTla
# MIHKMQswCQYDVQQGEwJJTjEPMA0GA1UEEQwGNjI3MDA3MRMwEQYDVQQIDApUQU1J
# TCBOQURVMRQwEgYDVQQHDAtUSVJVTkVMVkVMSTEaMBgGA1UECQwRQjI0NyBOR08g
# QiBDT0xPTlkxKjAoBgNVBAoMIUpJSkkgVEVDSE5PTE9HSUVTIFBSSVZBVEUgTElN
# SVRFRDELMAkGA1UECwwCSVQxKjAoBgNVBAMMIUpJSkkgVEVDSE5PTE9HSUVTIFBS
# SVZBVEUgTElNSVRFRDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKfu
# a/Kh5t7t8PBAdZWuNwFy/TEwj6kctrQGgMyg9CuK96almy7SyHmsFc/dcESxTzg6
# DirwrO9hZdfAup4RyblXSF7KqHlAd4o5MAb/+9jpHhcz0T10QKPUTXX7Wk1ZqJ+g
# PVvlER9OiKcxC4PP+xQ8Ej2bbGvBO74HQxD3fM7VLvqXPuPSFt2j+O7QTATfjJ/S
# xFUaulzB2vUza57PIetJ8QZolA/hpMGmaIX9dwWs+q/Og7MTO2/cC+NQIBUieKfO
# vahw3D+KMmpPJHyA6LkNIXD/TqW5Zql6MJebgyH2gs8x8IPT6ZlgEK8OTXWSwI0o
# JVai/xtyaeLEKn4WbNECAwEAAaOCAbYwggGyMB8GA1UdIwQYMBaAFCmRYP+KTfrr
# +aZquM/55ku9Sc4SMB0GA1UdDgQWBBS9vYgyTH/kBe9uOfi3EV3eCgzppzAOBgNV
# HQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzAR
# BglghkgBhvhCAQEEBAMCBBAwRgYDVR0gBD8wPTA7BgwrBgEEAbIxAQIBAwIwKzAp
# BggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5ldC9DUFMwQwYDVR0f
# BDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29k
# ZVNpZ25pbmdDQS5jcmwwdAYIKwYBBQUHAQEEaDBmMD4GCCsGAQUFBzAChjJodHRw
# Oi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FDb2RlU2lnbmluZ0NBLmNydDAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMCcGA1UdEQQgMB6B
# HHBlcnVtYWxAamlqaXRlY2hub2xvZ2llcy5jb20wDQYJKoZIhvcNAQELBQADggEB
# ADyAXEEZ43JAzNpmMUPX+uKnWkI4ftxoOYrfAjPRPrNYVpVQNXiiYAk4NLVV0x7u
# Gdu08rAzrH9zYqSf3TLIxYFr1ZRf5N/sgYOkgSbaNICs+W9iyJs6n+05fx346y96
# UgVv1ZPzuKkRTXTf5lXvPPwsA8cuHl36mzazMe1Y44zG1yfI+xW7Hj7LTdbW5Stp
# Arbab1zvwUsJV+Bwi3Btc44YeeRW0awXaCdYxgln3Nvmbe95Nfa5B+EPyTnIcMaF
# vFBSuJhx4knsXgTAtkuRm8yJSWly1KK24xzfBMLXxKpNMfJHjC1R+MYkEp/O61TR
# EWm0dBeUBVjGU5Ip+4DKEvowggXgMIIDyKADAgECAhAufIfMDpNKUv6U/Ry3zTSv
# MA0GCSqGSIb3DQEBDAUAMIGFMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl
# ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8g
# Q0EgTGltaXRlZDErMCkGA1UEAxMiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1
# dGhvcml0eTAeFw0xMzA1MDkwMDAwMDBaFw0yODA1MDgyMzU5NTlaMH0xCzAJBgNV
# BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh
# bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMwIQYDVQQDExpDT01P
# RE8gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
# AQoCggEBAKaYkGN3kTR/itHd6WcxEevMHv0xHbO5Ylc/k7xb458eJDIRJ2u8UZGn
# z56eJbNfgagYDx0eIDAO+2F7hgmz4/2iaJ0cLJ2/cuPkdaDlNSOOyYruGgxkx9hC
# oXu1UgNLOrCOI0tLY+AilDd71XmQChQYUSzm/sES8Bw/YWEKjKLc9sMwqs0oGHVI
# wXlaCM27jFWM99R2kDozRlBzmFz0hUprD4DdXta9/akvwCX1+XjXjV8QwkRVPJA8
# MUbLcK4HqQrjr8EBb5AaI+JfONvGCF1Hs4NB8C4ANxS5Eqp5klLNhw972GIppH4w
# vRu1jHK0SPLj6CH5XkxieYsCBp9/1QsCAwEAAaOCAVEwggFNMB8GA1UdIwQYMBaA
# FLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBQpkWD/ik366/mmarjP+eZL
# vUnOEjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE
# DDAKBggrBgEFBQcDAzARBgNVHSAECjAIMAYGBFUdIAAwTAYDVR0fBEUwQzBBoD+g
# PYY7aHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ2VydGlmaWNhdGlv
# bkF1dGhvcml0eS5jcmwwcQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRw
# Oi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FBZGRUcnVzdENBLmNydDAkBggr
# BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
# A4ICAQACPwI5w+74yjuJ3gxtTbHxTpJPr8I4LATMxWMRqwljr6ui1wI/zG8Zwz3W
# GgiU/yXYqYinKxAa4JuxByIaURw61OHpCb/mJHSvHnsWMW4j71RRLVIC4nUIBUzx
# t1HhUQDGh/Zs7hBEdldq8d9YayGqSdR8N069/7Z1VEAYNldnEc1PAuT+89r8dRfb
# 7Lf3ZQkjSR9DV4PqfiB3YchN8rtlTaj3hUUHr3ppJ2WQKUCL33s6UTmMqB9wea1t
# QiCizwxsA4xMzXMHlOdajjoEuqKhfB/LYzoVp9QVG6dSRzKp9L9kR9GqH1NOMjBz
# wm+3eIKdXP9Gu2siHYgL+BuqNKb8jPXdf2WMjDFXMdA27Eehz8uLqO8cGFjFBnfK
# S5tRr0wISnqP4qNS4o6OzCbkstjlOMKo7caBnDVrqVhhSgqXtEtCtlWdvpnncG1Z
# +G0qDH8ZYF8MmohsMKxSCZAWG/8rndvQIMqJ6ih+Mo4Z33tIMx7XZfiuyfiDFJN2
# fWTQjs6+NX3/cjFNn569HmwvqI8MBlD7jCezdsn05tfDNOKMhyGGYf6/VXThIXcD
# Cmhsu+TJqebPWSXrfOxFDnlmaOgizbjvmIVNlhE8CYrQf7woKBP7aspUjZJczcJl
# mAaezkhb1LU3k0ZBfAfdz/pD77pnYf99SeC7MH1cgOPmFjlLpzGCBHowggR2AgEB
# MIGRMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx
# EDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMw
# IQYDVQQDExpDT01PRE8gUlNBIENvZGUgU2lnbmluZyBDQQIQEXVgRNPm3VSu2RXM
# t0kSKTAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkq
# hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGC
# NwIBFTAjBgkqhkiG9w0BCQQxFgQUk4zAOe6LSmFxYm3emziFQCv6pDEwDQYJKoZI
# hvcNAQEBBQAEggEAbaaTjrY1OInpibZp7sTpvGUFzR9uFMF5FUrkj4VozqJfJxUi
# cVH9VYXT5CV8jNj4bVkAMr1q5IRltz7LPc1MmaVt3/q67LtZzuvjhlyKTQcwQ9ET
# e/digReg8aDXpe+3gc7saG9DAtsfxmEAStjS29maAx1qjf7SKf3xbHWm0S+5e4+U
# Uz+7yna0NWK3R6uuvd4h1KNr+FOjcsgMPkzKVDPD5uQxEr50a8iLYS7y+hBkn3sR
# Vap7C20qNjvC77GZdqY3OsA1Z1WOWc1zVGubnhNKQd9NhPT522t6shNDpZ0MsFGm
# uy+LynthAhXXigQ94dpR5JPxawIcNbT2T1jrb6GCAkMwggI/BgkqhkiG9w0BCQYx
# ggIwMIICLAIBATCBqTCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYD
# VQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3
# b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMT
# FFVUTi1VU0VSRmlyc3QtT2JqZWN0Ag8WiPA5JV5jjmkUOQfmMwswCQYFKw4DAhoF
# AKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4
# MDkxNzA2NTcyNFowIwYJKoZIhvcNAQkEMRYEFHRnAF7b9bEjy+EvaKUMICrU3Qjf
# MA0GCSqGSIb3DQEBAQUABIIBAD+gB6+46PVRT7HcFvYnTmYDnvQ1rWHnWdQpIBJ+
# NCTXFPTN8stX7ji/NHAYlcxBJj/juLYEzFh6eusaBqO3VOzixQxWMFevXRf+UaUO
# 0fSUmiB9mS2K1ePuoqpD2CjJCUFSAr/xP83TKOnCXAUHb6qJQ1NbOL+atNoWDNnb
# JQzX6apEyoHYXJgbay6GueRONTn5E1OnvPryM4s50/lAIcZHuBBpneS66HYPlUgJ
# BEDfnc8QlCjsEJpkBGg/+OXL+MqNYWOcotxCTRAuiEpPRRXaBGx6zpqDGafpSI82
# 0iszw38/DHaFShJp26Y1fBo/0Ns7QW5l+V8hzf3lcSYH4b8=
# SIG # End signature block