public/Search-UcmCsOnPremNumberRange.ps1

Function Search-UcmCsOnPremNumberRange {
    <#
        .SYNOPSIS
        Checks to see how many numbers are assigned in a number range to each service
 
        .DESCRIPTION
        Checks to see how many numbers are assigned in a number range to each service, returns a summary of the results or a full listing depending on the presence of the -summary parameter
        Presently only supports number blocks aligned to full number ranges (00-99 for example.)
 
        Note, the function currently performs a search based on a match filter, thus only whole ranges are supported.
        IE: Start +613864086400 End +613864086499, Start +613864086000 End +61386408699 or Start +613864080000 End +61386409999
 
        Attempting to search for subranges will return all items in the whole range.
        For example searching for +61386408640 to +61386408650 will actually return everything between +61386408600 and +61386408699 as the last 2 digits cant be aligned.
 
        .PARAMETER Start (Required)
        The first number in the number range to be searched, can be in the following formats
        tel:+61386408600
        +61386408600
        386408600
 
        .PARAMETER End (Required)
        The last number in the number range to be searched, can be in the following formats
        tel:+61386408699
        +61386408699
        386408699
 
        .PARAMETER Summary
        Only returns the count of each object found in the number range, otherwise a PSCustom Object containing a list of the objects is returned for each object type (see Output)
 
 
            .EXAMPLE
            Search-UcmCsOnPremNumberRange -start "61386408600" -end "61386408699" -summary
 
            .INPUTS
            This function does not accept any input
 
            .OUTPUT
            This Cmdet returns a PSCustomObject with multiple keys to indicate results
            $Return.Status
            $Return.Message
            $Return.Users
            $Return.PrivateLines
            $Return.AnalogDevices
            $Return.CommonAreaPhones
            $Return.ExchangeUM
            $Return.DialInConf
            $Return.ResponseGroups
            $Return.All
 
            Return.Status can return one of four values
            "OK" : Connected to Skype for Business Online
            "Warning" : Reconnected to Skype for Business Online
            "Error" : Not connected to Skype for Business Online
            "Unknown" : Cmdlet reached the end of the function without returning anything, this shouldnt happen, if it does please log an issue on Github
 
            Return.Message returns descriptive text showing the connected tenant, mainly for logging or reporting
 
            $Return.Users
            $Return.PrivateLines
            $Return.AnalogDevices
            $Return.CommonAreaPhones
            $Return.ExchangeUM
            $Return.DialInConf
            $Return.ResponseGroups
 
            Each of the above return either a object count (when using -summary) or a list of the associated objects
 
            $Return.All returns either a total count, or a full list of the located objects.
 
            .LINK
            http://www.UcMadScientist.com
            https://github.com/Atreidae/UcmPsTools
 
            .ACKNOWLEDGEMENTS
            This function is based heavily off Tom Arbuthnot's Get-LyncNumberAssignment (Which I think might use code from Pat Richard)
            https://github.com/tomarbuthnot/Get-LyncNumberAssignment/blob/master/Get-LyncNumberAssignment-0.5.ps1
 
            .NOTES
            Version: 1.0
            Date: 03/08/2021
 
            .VERSION HISTORY
            1.0: Initial Public Release
 
            .REQUIRED FUNCTIONS/MODULES
            Modules
            Lync/SkypeforBusiness (From your Lync/Skype installation media)
            UcmPSTools (Install-Module UcmPsTools) Includes Cmdlets below.
 
            Cmdlets
            Write-UcmLog: https://github.com/Atreidae/UcmPsTools/blob/main/public/Write-UcmLog.ps1
 
            .REQUIRED PERMISIONS
            'CS Read Only Administrator' or better
 
    #>


    Param
        (
            [Parameter(Mandatory, Position=1)] [string]$Start,
            [Parameter(Mandatory, Position=2)] [string]$End,
            [Parameter(Position=3)] [Switch]$summary
        )

    #region FunctionSetup, Set Default Variables for HTML Reporting and Write Log
    $function = 'Search-UcmCsOnPremNumberRange'
    [hashtable]$Return = @{}
    $return.Function = $function
    $return.Status = "Unknown"
    $return.Message = "Function did not return a status message"

    # Log why we were called
    Write-UcmLog -Message "$($MyInvocation.InvocationName) called with $($MyInvocation.Line)" -Severity 1 -Component $function
    Write-UcmLog -Message "Parameters" -Severity 3 -Component $function -LogOnly
    Write-UcmLog -Message "$($PsBoundParameters.Keys)" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "Parameters Values" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "$($PsBoundParameters.Values)" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "Optional Arguments" -Severity 1 -Component $function -LogOnly
    Write-UcmLog -Message "$Args" -Severity 1 -Component $function -LogOnly

    #endregion FunctionSetup

    #region FunctionWork

    #Calculate the match string based on start and end by trying to match strings until an error is encountered
        $MatchError = $false
        $i = 1
        Do
        {
            If ($start -notmatch ($End.substring(0,$i)))
                {
                    #We dont match, decrement $i and set the flag to exit the loop
                    $i = ($i - 1)
                    $MatchError = $true
                }

            Else
                {
                    #keep trying to increment the match number
                    $i = ($i + 1)
                }
        }
        Until ($MatchError-eq $true)

    #Copy URI Check into Match
    $match = "*$($End.substring(0,$i))*"

    Write-UcmLog -Message "Checking for objects containing $match in Skype4B" -Severity 2 -Component $function

    Write-UcmLog -Message "Checking Users" -Severity 1 -Component $function
    Get-CsUser -Filter {LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'User'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)"
        $Return.Users = $output
    }

    Write-UcmLog -Message "Checking User Private Lines" -Severity 1 -Component $function
    Get-CsUser -Filter {PrivateLine -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'PrivateLineUser'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)"
        $Return.PrivateLine = $output
    }

    Write-UcmLog -Message "Checking Analog Devices" -Severity 1 -Component $function
    Get-CsAnalogDevice -Filter {LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'AnalogDevice'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)"
        $OutputCollection += $output
    }

    Write-Verbose -Message 'Checking Common Area Phones'
    Get-CsCommonAreaPhone -Filter {LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'CommonAreaPhone'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)"
        $OutputCollection += $output
    }

    Write-UcmLog -Message "Checking Analog Devices" -Severity 1 -Component $function
    Write-Verbose -Message 'Checking Exchange UM Contact Objects'
    Get-CsExUmContact -Filter {LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'ExUMContact'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)"
        $OutputCollection += $output
    }

    Write-UcmLog -Message "Checking Dialin Conference Numbers" -Severity 1 -Component $function
    Get-CsDialInConferencingAccessNumber -Filter {LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.PrimaryUri
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'DialInConf'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.Pool)"
        $OutputCollection += $output
    }

    Write-UcmLog -Message "Checking Trusted Application Endpoints" -Severity 1 -Component $function
    Get-CsTrustedApplicationEndpoint -Filter {LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'TrustedAppEndPoint'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)"
        $OutputCollection += $output
    }

    # No filter on Get-CSRGSworkflow
    Write-UcmLog -Message "Checking Response Groups" -Severity 1 -Component $function
    Get-CsRgsWorkflow | Where-Object {$_.LineURI -like $match} | ForEach-Object {
        $output           =  New-Object -TypeName PSobject
        $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI
        $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.Name
        $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.PrimaryUri
        $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'ResponseGroup'
        $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.OwnerPool)"
        $OutputCollection += $output
    }

    $OutputCollection #Put the output to the pipeline #TODO https://github.com/Atreidae/UcmPSTools/issues/28

    #Report on Findings
    if ($OutputCollection.count -eq 0)
    {
        Write-UcmLog -Message "Number $UriCheck does not appear to be used in the Skype4B deployment" -Severity 2 -Component $function
        $Return.Status = "OK"
        $Return.Message  = "Number Not Used"
        Return
    }
    Else
    {
        Write-UcmLog -Message "Number $UriCheck is already in use!" -Severity 3 -Component $function
        $Return.Status = "Error"
        $Return.Message  = "Number in use: $OutputCollection"
        Return
    }

    #region FunctionReturn

    #Default Return Variable for my HTML Reporting Fucntion
    Write-UcmLog -Message "Reached end of $function without a Return Statement" -Severity 3 -Component $function
    $return.Status = "Unknown"
    $return.Message = "Function did not encounter return statement"
    Return
    #endregion FunctionReturn
}
# SIG # Begin signature block
# MIIRwgYJKoZIhvcNAQcCoIIRszCCEa8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUX8jv7Bd613E5JUcREw+XOqj/
# mS+ggg4OMIIGsDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0B
# AQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVk
# IFJvb3QgRzQwHhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lD
# ZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEg
# Q0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5
# WRuxiEL1M4zrPYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJP
# DqFX/IiZwZHMgQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXz
# ENOLsvsI8IrgnQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bq
# HPNlaJGiTUyCEUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTC
# fMjqGzLmysL0p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaD
# G7dqZy3SvUQakhCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urO
# kfW+0/tvk2E0XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7AD
# K5GyNnm+960IHnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4
# R+Z1MI3sMJN2FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlN
# Wdt4z4FKPkBHX8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0I
# U0F8WD1Hs/q27IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwHQYDVR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaA
# FOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK
# BggrBgEFBQcDAzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
# Y3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4
# oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv
# b3RHNC5jcmwwHAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcN
# AQEMBQADggIBADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcT
# Ep6QRJ9L/Z6jfCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WT
# auPrINHVUHmImoqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9
# ntSZz0rdKOtfJqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np37
# 5SFTWsPK6Wrxoj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0
# HKKlS43Nb3Y3LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL
# 6TEa/y4ZXDlx4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+1
# 6oh7cGvmoLr9Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8
# M4+uKIw8y4+ICw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrF
# hsP2JjMMB0ug0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy
# 1lKQ/a+FSCH5Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIHVjCC
# BT6gAwIBAgIQDyLHeeRvkUFg5QtSFTT8FjANBgkqhkiG9w0BAQsFADBpMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lD
# ZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEg
# Q0ExMB4XDTIzMDIyMzAwMDAwMFoXDTI2MDIyMzIzNTk1OVowXjELMAkGA1UEBhMC
# QVUxETAPBgNVBAgTCFZpY3RvcmlhMRAwDgYDVQQHEwdCZXJ3aWNrMRQwEgYDVQQK
# EwtKYW1lcyBBcmJlcjEUMBIGA1UEAxMLSmFtZXMgQXJiZXIwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQC47oExh25TrxvApIYdMRYvjOdZCb8WwgeTemm3
# ZY7BElIWu6+gzRGqQe8RFsN7oIgin5pvjTYIToxt1CCag2A5o8L0NtULmxJEegc+
# VaF24DZQqI4qGQGH/Qnglqys6+yPkwLnfeSxpeWe4u49HUUGDFIxHCh42MlCLp/f
# fHT49QhhpO+LyeLnDoUs6DmahyIb6NeE2cW5AYRXEesW7GRNfXzygBSlVWJOgvcy
# V5Y4IvAZVx2hKKMTjYFIz4/RYMg7fwYZEJ2LRJ/GnVazobKAvh6ZBet5KwVNI9EI
# 29DtWQyK/RoPOguTRcB5VuiZVlv0xjBYM7iJuH2Soa3StQYVxL/5gjZCC9WOs4NR
# EIGU3XmHoogFDvoT1vf1izMPFQzdZfgPvy/XXsbgTVo5ncesJ6WtZwqwCXG1K0XW
# IPZqTHolc1MyU6K1bEHO+7YWLpKgM9THl644G7PEhcKpNDsHlfvLVQdYhI55UJtc
# iyMrTw11CNECvk3GK1mrluvKsrxdaH6G3Sp9VVHRtef6OZ5SlzkM5ID4egB2bXRb
# R/69bEuZr5hhm+v2lBSWIbZj/Mva6i/a/TAvy4vvPLo3DRcASkYZDC4T8gDMzmpG
# Xs4jAc9sfTL9z+o5u1PLJHFGRjJ+Wa2CgSftCdbKLjn+AY9m8ipc8jmOBKNY9yGI
# pQWapQIDAQABo4ICAzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0
# TkIwHQYDVR0OBBYEFOBsg1xudlbXVSql8pWbiHoTyZS/MA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu
# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB
# Mzg0MjAyMUNBMS5jcmwwPgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcC
# ARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGUBggrBgEFBQcBAQSBhzCB
# hDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUF
# BzAChlBodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk
# RzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAA
# MA0GCSqGSIb3DQEBCwUAA4ICAQBOh5vRXqTCQzv0T1F2EgDkq5VnljlHsa7Ov/d/
# lpOvr8NebBiatxbhfhPCnToY7BD2f7YVsUuQ+VDdcIYsskcU5spBHcFYidg2jGu4
# 59FGMaS765XStDwGGTN/360gEsNYSnKWYL4+8jYWHlzRO0jHloyWz+gF5dYWzdDJ
# u1dudLIJ0RgrEVJeLSgIBWygLL5EyIzOPlrxztsILMSbdPTQLeBIm7ipOk4EACx1
# hhBVUsUoCAlASH+yCKDU4v2HFd7SzrkRUrf7XJ2Na2YsiHjiTGqHIE86KyvxGDhT
# 3n2/jX23Nh/bkWHurHwTfaTCOQ44ZlAbnZQjBlmrFn5hPMXRpciiQFmrKTPD/nuo
# 9MVnCciHEpHJ63/JZNF/eno1122/wVkL7MuRlCVHN7L/wuNQxQk3ARdIju6OD/Gi
# Mwg0Qih6HVWJtkHK3ExoUKKKUZCOvIeHxzp+K6FWUupPZKUgWzn4AHMxm6zr+Sde
# laIAACqAkxYsDYKbM7WlNi3uIH2HeXqU9uSDt5tgPpImrog/ab4HrhpDfITRgT1c
# cxaWQezpJEPC+kqVD41T3wlEie1Qm4vYWg+oBVEMBxVLh6CYbeppCRTEXRGnAiCH
# /Ma1uwyWnNCWxrhd1uSi6sj4ISzgnFyGCvsI0gavKpS5AQhapJgk6/fULTFeS+Ee
# kRH9FDGCAx4wggMaAgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD
# ZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2ln
# bmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMQIQDyLHeeRvkUFg5QtSFTT8FjAJ
# BgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B
# CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAj
# BgkqhkiG9w0BCQQxFgQUl83QEhjQ2YPZb7tJLijelbSstacwDQYJKoZIhvcNAQEB
# BQAEggIAGFky5rEToX87o4oXngPsuefVlSGqB0aWN2OTj5u416YNN6PDfLkgU0AU
# nikv4QeJjBHRDCUw1kuf9bgedo2cMCkaHiY6/u9+KcWPQUMjvhWV73VSlevlD9Qx
# o9evWnoBRzIdR5et8+bMFsGNOKeijLvmPkIF32RfXW7mvlHVhk74J0r3p4QAlTZb
# AO3TNPw730GF0omWFxBiAwidtspHC6Q04+jffZv7J5ppiaDso5Tf9An9C64VxIoD
# YHxuKexYZ8tgHgHOExNKz3Q2QH7FR8kP43UQeQKnACwNzmMGmmfftMMKn4HAVR8P
# Au9EhsUM1LyFl4LzZcKpT5jXUIWWTs5RAtde0YI6SDQbJl4l7YjDHhOTI/d/taWQ
# HdjkUbdJ7HnnSMs6aNQq8FCkYC5zejSOf5oMuDfLMYfVqDxQtXPPmW/+bOC/vB3D
# K8Oa9QXyR0/22UnYBhrWRQw/+LGCYrLORZVcLM+2ar0t0Uf6iL74gUrF0nmdX+cG
# PaMWCOokHB94/U4OdkUIl+PRLGBKOtknUB958bMxdJA88vMUqciEONrONoqsPJZX
# kDKweaOBRkiJi/3oA+5U9FdhUGV+dznR2PDNFGgYIblP05rcstkLGgnIMCyV0wHC
# h9dxABn/Zq3bbHaZ+res6IsJeQeQDB3X/0Y/++9p4geNd7PU2mc=
# SIG # End signature block