Internal/Translation/Optimize-M365DocSection.ps1

Function Optimize-M365DocSection(){
    <#
    .DESCRIPTION
    This Script translates as many properties from the Graph API to names used in the UI.
 
    .PARAMETER Data
    M365 documentation section object which should be optimized.
 
     
    .PARAMETER ExcludeValues
    All values are replaced with an empty string.
 
    .EXAMPLE
    $docNew = Optimize-M365DocSection -Section $DocSection
 
    .NOTES
    Author: Thomas Kurth/baseVISION
    Date: 05.04.2021
 
    #>

    [OutputType('DocSection')]
    [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline,Mandatory)]
        [DocSection]$Section,
        [switch]$UseTranslationFiles,
        [switch]$UseCamelCase,
        [int]$MaxStringLengthSettings = 350,
        [switch]$ExcludeEmptyValues,
        [switch]$ExcludeValues,
        [String[]]$ExcludeProperties
    )
    Begin {

    }
    Process {
        ## Manual Variable Definition
        ########################################################
        #$DebugPreference = "Continue"
        $ScriptName = "Optimize-M365DocSection"


        #region Initialization
        ########################################################

        $DataNew = New-Object DocSection
        $DataNew.Title = $Section.Title
        $DataNew.Text = $Section.Text
        $DataNew.SubSections = @()
        $DataNew.Objects = @()
        $DataNew.Transpose = $Section.Transpose

        #endregion

        #region Translate
        ########################################################

        foreach($Section2 in $Section.SubSections){
            $DataNew.SubSections += Optimize-M365DocSection -Section $Section2 -UseTranslationFiles:$UseTranslationFiles -UseCamelCase:$UseCamelCase -MaxStringLengthSettings $MaxStringLengthSettings -ExcludeEmptyValues:$ExcludeEmptyValues -ExcludeValues:$ExcludeValues -ExcludeProperties $ExcludeProperties
        }

        foreach($Object in $Section.Objects){
            
            $ObjectNew = New-Object -Type PSObject


            #Prepare File based translation
            $TypeName = $Object.'@odata.type'
            $TranslationFile = "$PSScriptRoot\..\..\Data\LabelTranslation\$TypeName.json"
            $translateJson = Get-Content $TranslationFile -ErrorAction SilentlyContinue
            if($null -eq $translateJson){
                $translateJson = "{}"
            }
            $translation = $translateJson | ConvertFrom-Json


        
            foreach($p in $Object.psobject.properties) {   
                # Skip excluded properties or empty values if specified.
                if($ExcludeProperties -contains $p.Name){
                    continue
                }
                if([string]::IsNullOrWhiteSpace($p.Value) -and $ExcludeEmptyValues){
                    continue
                }
                

                $Translated = $false
                $Name = $p.Name
                $Value = $p.Value


                #File based translation enabled and odata type available
                if($UseTranslationFiles -and (-not ([String]::IsNullOrWhiteSpace($TypeName)))){
                    if([String]::IsNullOrWhiteSpace($translation."$($p.Name)")){
                        $TranslationValue = switch($p.Name){
                            "displayName" { "Displayname" }
                            "lastModifiedDateTime" { "Modified at" }
                            "@odata.type" { "OData Type" }
                            "supportsScopeTags" { "Support for Scope Tags" }
                            "roleScopeTagIds" {  "Role Scopes Tags" }
                            "deviceManagementApplicabilityRuleOsEdition" {  "Applicability OS Edition" }
                            "deviceManagementApplicabilityRuleOsVersion" {  "Applicability OS Version" }
                            "deviceManagementApplicabilityRuleDeviceMode" {  "Applicability Device Mode" }
                            "createdDateTime" {  "Created at" }
                            "description" {  "Description" }
                            "version" {  "Version" }
                            "id" {'ID'}
                            default { '' }   
                        }
                        if(-not ([String]::IsNullOrWhiteSpace($TranslationValue))){
                            $Name = $TranslationValue
                            $Translated = $true
                        }

                        if([String]::IsNullOrWhiteSpace($TranslationValue)){
                            $ConfigSection = " "
                        } else {
                            $ConfigSection = "Metadata"
                        }
            
                        if($p.TypeNameOfValue -eq "System.Boolean"){
                            $TranslationObject = New-Object PSObject -Property @{
                                Name = $TranslationValue
                                Section = $ConfigSection
                                DataType = $p.TypeNameOfValue
                                ValueTrue = "Block"
                                ValueFalse = "Not Configured"
                            }
                        } else {
                            $TranslationObject = New-Object PSObject -Property @{
                                Name = $TranslationValue
                                Section = $ConfigSection
                                DataType = $p.TypeNameOfValue
                            }
                        }
                        
                        $translation | Add-Member Noteproperty -Name $p.Name -Value $TranslationObject -Force 
                        $translation | ConvertTo-Json | Out-File -FilePath $TranslationFile -Force
                        #Variable set for user information in main function
                        $Script:NewTranslationFiles += $TranslationFile
                    } else { 
                        #Only use translated value if not empty
                        if(-not ([String]::IsNullOrWhiteSpace($translation."$($p.Name)".Name))){
                            if(([String]::IsNullOrWhiteSpace($translation."$($p.Name)".Section))){
                                $Name = "$($translation."$($p.Name)".Name)"
                            } else {
                                $Name = "$($translation."$($p.Name)".Section)\$($translation."$($p.Name)".Name)"
                                $Name = $Name.Replace("/","\")
                            }
                            $Translated = $true
                        }
                    }
                }

                #Camelcase Translation
                if($Translated -eq $false -and $UseCamelCase){
                    #Only use Camel Case converter if not already translated.
                    $TempName = Convert-CamelCaseToDisplayName -Value $p.Name
                    if(-not ([String]::IsNullOrWhiteSpace($TempName))){
                        $Name = $TempName
                    } 
                }
                
                # Optimize Value
                if($p.TypeNameOfValue -eq "System.Boolean"){
                    if(-not ([String]::IsNullOrWhiteSpace($translation."$($p.Name)".Name))){
                        if($p.Value -eq $true){
                            $Value = $translation."$($p.Name)".ValueTrue
                        } else {
                            $Value = $translation."$($p.Name)".ValueFalse
                        }
                    }
                } else {
                    $TempValue = Format-MsGraphData "$($p.Value)"
                    if($TempValue.Length -gt $MaxStringLengthSettings){
                        $Value = "$($TempValue.substring(0, $MaxStringLengthSettings))..."
                    } else {
                        $Value = "$($TempValue) "
                    }
                }
                if($null -eq $Value){
                    $Value = ""
                } else {
                    if($value.GetType().Name -ne "Boolean" -and $value.GetType().Name -ne "System.Boolean"){
                        $value = $value.Trim()
                    }
                }
                if($ExcludeValues){
                    $Value = ""
                }
                
                try{
                    $ObjectNew | Add-Member Noteproperty $Name $Value -ErrorAction Stop
                } catch {
                    $ObjectNew | Add-Member Noteproperty "$Name`2" $Value -ErrorAction Stop
                }     
            }

            $DataNew.Objects += $ObjectNew
        }

        #endregion

        #region Finishing
        ########################################################
        
        return $DataNew

        if($Script:NewTranslationFiles.Count -gt 0 -and $Script:UseTranslation){
            Write-Information "You used the option to translate API properties. Some of the configurations of your tenant could not be translated because translations are missing."
            foreach($file in ($Script:NewTranslationFiles | Select-Object -Unique)){
                Write-Information " - $($file.Replace('Internal\..\',''))"
            }
            Write-Information "You can support the project by translating and submitting the files as issue on the project page. Then it will be included for the future."
            Write-Information "Follow the guide here https://github.com/ThomasKur/IntuneDocumentation/blob/master/AddTranslation.md" 
        }
        
        Write-Information "End Script $Scriptname"
        #endregion
    }
    End {

    }
}


    
# SIG # Begin signature block
# MIIbhQYJKoZIhvcNAQcCoIIbdjCCG3ICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU4u/Y06cJyiLjjNp/fofXNQfe
# IjmgghahMIIE/jCCA+agAwIBAgIQDUJK4L46iP9gQCHOFADw3TANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4XDTIxMDEwMTAwMDAwMFoXDTMxMDEw
# NjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMTCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1DQikRcpja1HXOhFCvQp1dU2UtAxQ
# tSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4/2cLnGP9NmqB+in43Stwhd4CGPN4
# bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT0dHTWjaPxqPhLxs6t2HWc+xObTOK
# fF1FLUuxUOZBOjdWhtyTI433UCXoZObd048vV7WHIOsOjizVI9r0TXhG4wODMSlK
# XAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j6BqrW7EdMMKbaYK02/xWVLwfoYer
# vnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4Gdb+DUmEvQECAwEAAaOCAbgwggG0
# MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG
# AQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9bAcBMCkwJwYIKwYBBQUHAgEWG2h0
# dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAfBgNVHSMEGDAWgBT0tuEgHf4prtLk
# YaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6sGa+vCgtHUQ23eNqerwwcQYDVR0f
# BGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
# ZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz
# c3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6
# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRFRpbWVzdGFtcGluZ0NB
# LmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzctemaI7znGucgDo5nRv1CclF0CiNH
# o6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZO73+RAJmTe1ppA/2uHDPYuj1UUp4
# eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO/PT+t2R3Y18jUmmDgvoaU+2QzI2h
# F3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUIAHa8gQ74wOFcz8QRcucbZEnYIpp1
# FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahzQ1HavWPWH1ub9y4bTxMd90oNcX6X
# t/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5nePk2mOHLKNpbh6aKLzCCBTEwggQZ
# oAMCAQICEAqhJdbWMht+QeQF2jaXwhUwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X
# DTE2MDEwNzEyMDAwMFoXDTMxMDEwNzEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTAT
# BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEx
# MC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVzdGFtcGluZyBD
# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3QMu5LzY9/3am6gpnF
# OVQoV7YjSsQOB0UzURB90Pl9TWh+57ag9I2ziOSXv2MhkJi/E7xX08PhfgjWahQA
# OPcuHjvuzKb2Mln+X2U/4Jvr40ZHBhpVfgsnfsCi9aDg3iI/Dv9+lfvzo7oiPhis
# EeTwmQNtO4V8CdPuXciaC1TjqAlxa+DPIhAPdc9xck4Krd9AOly3UeGheRTGTSQj
# MF287DxgaqwvB8z98OpH2YhQXv1mblZhJymJhFHmgudGUP2UKiyn5HU+upgPhH+f
# MRTWrdXyZMt7HgXQhBlyF/EXBu89zdZN7wZC/aJTKk+FHcQdPK/P2qwQ9d2srOlW
# /5MCAwEAAaOCAc4wggHKMB0GA1UdDgQWBBT0tuEgHf4prtLkYaWyoiWyyBc1bjAf
# BgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzASBgNVHRMBAf8ECDAGAQH/
# AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB5BggrBgEF
# BQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBD
# BggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2Ny
# bDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDig
# NoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
# dENBLmNybDBQBgNVHSAESTBHMDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYc
# aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzALBglghkgBhv1sBwEwDQYJKoZI
# hvcNAQELBQADggEBAHGVEulRh1Zpze/d2nyqY3qzeM8GN0CE70uEv8rPAwL9xafD
# DiBCLK938ysfDCFaKrcFNB1qrpn4J6JmvwmqYN92pDqTD/iy0dh8GWLoXoIlHsS6
# HHssIeLWWywUNUMEaLLbdQLgcseY1jxk5R9IEBhfiThhTWJGJIdjjJFSLK8pieV4
# H9YLFKWA1xJHcLN11ZOFk362kmf7U2GJqPVrlsD0WGkNfMgBsbkodbeZY4UijGHK
# eZR+WfyMD+NvtQEmtmyl7odRIeRYYJu6DC0rbaLEfrvEJStHAgh8Sa4TtuF8QkIo
# xhhWz0E0tmZdtnR79VYzIi8iNrJLokqV2PWmjlIwggWtMIIElaADAgECAhAEP0tn
# 9l4Sf9gdog2gb/SWMA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi
# BgNVBAMTG0RpZ2lDZXJ0IEVWIENvZGUgU2lnbmluZyBDQTAeFw0yMDAzMDYwMDAw
# MDBaFw0yMzAzMTUxMjAwMDBaMIHOMRMwEQYLKwYBBAGCNzwCAQMTAkNIMRowGAYL
# KwYBBAGCNzwCAQITCVNvbG90aHVybjEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6
# YXRpb24xGDAWBgNVBAUTD0NIRS0zMTQuNjM5LjUyMzELMAkGA1UEBhMCQ0gxEjAQ
# BgNVBAgTCVNvbG90aHVybjERMA8GA1UEBwwIRMOkbmlrZW4xFjAUBgNVBAoTDWJh
# c2VWSVNJT04gQUcxFjAUBgNVBAMTDWJhc2VWSVNJT04gQUcwggEiMA0GCSqGSIb3
# DQEBAQUAA4IBDwAwggEKAoIBAQCn0xZCT8yT681HZVY8gtUlURKywy8Nfq8uiv/j
# JJU+/Tf4HHXXJzHo96ZFo/WOWMD3WMWRYRnpj95PZbfLaF+ki/PURRhp9/oT/p5O
# 3zTv4Jqnig7AOeIL5dt9W5Uij9rDOEZhmFpVT08KCKhMNMMu7MhBs+uHBlyQ70j5
# H2IjBjePtEDYcakbv1RNDK5hU+k2UqKZEQSaqt2+riewxS2R4RUvZJ5nRraf4pNY
# qDdem2H0vJ17zHsG+ZB0YFLk/P3i6r4tJEAksYAUkuJsFDt0Yz9xM2qmG2Rr4iw7
# AUTfE5Gx0NNWD/fMWFP/2sD3VkHA8Mz8PAokDfFz21OqYrXPAgMBAAGjggHtMIIB
# 6TAfBgNVHSMEGDAWgBStaQZw/IAbFrOpGJRrlAKGXvcnjDAdBgNVHQ4EFgQURdlk
# /2RkqKDvZs8sol0UhzmJTCowNwYDVR0RBDAwLqAsBggrBgEFBQcIA6AgMB4MHENI
# LVNPTE9USFVSTi1DSEUtMzE0LjYzOS41MjMwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMHMGA1UdHwRsMGowM6AxoC+GLWh0dHA6Ly9jcmwzLmRp
# Z2ljZXJ0LmNvbS9FVkNvZGVTaWduaW5nLWcxLmNybDAzoDGgL4YtaHR0cDovL2Ny
# bDQuZGlnaWNlcnQuY29tL0VWQ29kZVNpZ25pbmctZzEuY3JsMEsGA1UdIAREMEIw
# NwYJYIZIAYb9bAMCMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0
# LmNvbS9DUFMwBwYFZ4EMAQMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNl
# cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEVWQ29kZVNpZ25pbmdDQS5jcnQwDAYD
# VR0TAQH/BAIwADANBgkqhkiG9w0BAQUFAAOCAQEAGYerL9YA8gW4cx7nWEaDFpN2
# XnaY4+90Nl8gaj6aeQj6kwIfjWLWAzByDdVNvxSkrwXdfo3dkG5DNNI3wPR2SE2i
# yImDF6zXTThccBqkwE1x1Tb5qfhaA48jf18f8JbvVgvtbZWXph1b+ALyD2911b34
# Qt6cYmolg19vkmWXZUADRjA11S3VHhhH4GLKeHoE23jSSs69tQPNC1jdS+Rx6yO/
# Ya14UrDwOrJo1qSn2xTilf9s77mSxRJCpL8Cd1PUHPvugUFHLw9nqOQAMUb7cHdD
# UREs7Brvfcyo0qRx7lyKjIM1d0wGtiBz+8kQJcSCdK9S8HGSD3y4R1N++Y8gYTCC
# BrUwggWdoAMCAQICEA3Q4zdKyVvb+mtDSypI7AYwDQYJKoZIhvcNAQEFBQAwbDEL
# MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
# LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
# RVYgUm9vdCBDQTAeFw0xMjA0MTgxMjAwMDBaFw0yNzA0MTgxMjAwMDBaMGUxCzAJ
# BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
# aWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEVWIENvZGUgU2lnbmluZyBD
# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALkGdBxdtCCqqSGoKkJG
# qyUgFyXLIo+QoqAxa4MFda+yDnwSSXtqhmSED4PcZLmxbhYFPhyVuefniG24YoGQ
# edTd9eKW+cO1iCNXShrPcSnpCACPtZjjpzL9rC649JNT9Ao5Q5Gv1Wvo1J9GvY49
# q+L5K9TqAEBmJLfof7REdY14mq4xwTfPTh9b+EVK1z/CyZIGZL7eBoqv0OiKsfAs
# iABvC9yFp0zLBr/WLioybilxr44i8w/Q2JhILagIy7aLI8Jj4LZz6299Jk+L9zQ9
# N4YMt3gn9MKG20NrWvg9PfTosGJWxufteKH7/XpyTzJlxHzDxHegBDIy7Y8/r4bd
# ftECAwEAAaOCA1gwggNUMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQD
# AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMH8GCCsGAQUFBwEBBHMwcTAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEkGCCsGAQUFBzAChj1odHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZS
# b290Q0EuY3J0MIGPBgNVHR8EgYcwgYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyG
# Omh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VF
# VlJvb3RDQS5jcmwwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwDAjCCAaQw
# OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVw
# b3NpdG9yeS5odG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUA
# IABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4A
# cwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQA
# aABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQAC8AQwBQAFMAIABhAG4AZAAgAHQA
# aABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUA
# bgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkA
# IABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUA
# cgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wHQYDVR0OBBYEFK1p
# BnD8gBsWs6kYlGuUAoZe9yeMMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoIAu9j
# ZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQCeW5Y6LhKIrKsBbaSfdeQBh6OlMte8uql+
# o9YUF/fCE2t8c48rauUPJllosI4lm2zv+myTkgjBTc9FnpxG1h50oZsUo/oBL0qx
# AeFyQEgRE2i5Np2RS9fCORIQwcTcu2IUFCphXU84fGYfxhv/rb5Pf5Rbc0MAD01z
# t1HPDvZ3wFvNNIzZYxOqDmER1vKOJ/y0e7i5ESCRhnjqDtQo/yrVJDjoN7Lslruf
# vEoWUOFev1F9I6Ayx8GUnnrJwCaizCWHoBJ+dJ8tjbHI54S+udHp3rtqTohzceEi
# OMskh+lzflGy/5jrTn4v4MoO+rNe0boFQqhIn4P2P8TKqN9ooFBhMYIETjCCBEoC
# AQEweTBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBFViBDb2Rl
# IFNpZ25pbmcgQ0ECEAQ/S2f2XhJ/2B2iDaBv9JYwCQYFKw4DAhoFAKB4MBgGCisG
# AQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFPUf
# ZPJSZo6t0+y0XSt02rJnCVNrMA0GCSqGSIb3DQEBAQUABIIBAJs1fxRQSPKcxjVx
# K+GIDXAuE0Yi0ScR0ieDIA8mZk2n4RHNIOWcLg9HBP5pTuaNk8lmVHpBPjShLkcf
# btvmSO0TXyPus3HmMwanZO81dUaDkQwaixXy7ji6hwlySq1Uw63KzQ8fsNWFhtCg
# cLArAb2SCTK9tpuka0iEudmrPfxImXnoBfRZY2bG9yjCHR5cYxmACiyVNa6tew00
# 9dlAVsfPVISGgJc1hODCLIMkwmUapWtkmLZjEJyTusSQL+r1AH3pJqUGP9zU1crX
# YfF2xdF/WfSfEn1b80aLj6cx1JMHYYa5c63STrpVgWE4BYhDkqZ+G4Bjed5eZkQk
# WsYExXWhggIwMIICLAYJKoZIhvcNAQkGMYICHTCCAhkCAQEwgYYwcjELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVz
# dGFtcGluZyBDQQIQDUJK4L46iP9gQCHOFADw3TANBglghkgBZQMEAgEFAKBpMBgG
# CSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIxMTAyNjA2
# MjQwM1owLwYJKoZIhvcNAQkEMSIEIDPS6hnRuDwyh2oPg448/OTxpt2gyAYXbxzd
# vVbb9KiyMA0GCSqGSIb3DQEBAQUABIIBAGXpOcnU7lviifng6a75dByKbbDRe7+b
# 8J1l8gb5X/MyMS4+LlAqpWk4NUwGR1APg//W0PeM9y7SmSL9YpqdO2uaO2jOJhgS
# s608uajfa8IOFIMhCSzoEShG4FkbptVQB2Ebp1C4TskIFdrErFjsM9HyWxd1Ma/e
# /0nuhknfDvT2dYLZFGbutbubUdApPKLWoF12MKQMUF0SRr4PWda5CHOU+HKXHxGG
# CZzPHHH0/BfvYtXtNspaCvMj1yWYwmF4Y1EeFzbAlPmuxD98mcmEpiVBXx78Cjju
# GSau+95X8nyNQ5zUwAQRc+EK2E+Rt7aIRuzCOdbfMlmg3zkCioz6kLk=
# SIG # End signature block