Remediation/RemediationAction.ps1

using module "..\MCCA.psm1"

class Action : RemediationAction
{

    $OutputDirectory=$null
    $DisplayReport=$True

    Action()
    {
        $this.Name="Action"
    }

    RunOutput($Checks,$Collection)
    {
    <#
 
        OUTPUT GENERATION / Header
 
    #>


    # Obtain the tenant domain and date for the report
    #$TenantDomain = ($Collection["AcceptedDomains"] | Where-Object {$_.InitialDomain -eq $True}).DomainName

    # Misc
    $ReportTitle = "Microsoft Compliance Configuration Analyzer Remediation Report"

    
    

    # Output start
    $output = "<!doctype html>
    <html lang='en'>
   
    <head>
        <!-- Required meta tags -->
        <meta charset='utf-8'>
        <meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'>
        <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css' crossorigin='anonymous'>
        <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css' integrity='sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T' crossorigin='anonymous'>
        <script src='https://code.jquery.com/jquery-3.3.1.slim.min.js' integrity='sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo' crossorigin='anonymous'></script>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js' integrity='sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1' crossorigin='anonymous'></script>
        <script src='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js' integrity='sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM' crossorigin='anonymous'></script>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/js/all.js'></script>
        <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
        <script src='https://cdn.jsdelivr.net/clipboard.js/1.5.3/clipboard.min.js'></script>
        <style>
        .w3-code, .w3-codespan,#w3-exerciseform .exerciseprecontainer
        .w3-code {font-size:14px;}
        .w3-codespan {font-size:15px;}
         
        .navbar-custom {
            background-color: #005494;
            color: white;
            padding-bottom: 10px;
        }
        .card-header {
            background-color: #0078D4;
            color: white;
            }
          
        .codetable{
            background-color:#FFFFFF;
            border: 1px solid #d9d9d9;
            border-collapse: collapse;
            width:90%;
            margin-left:auto;margin-right:auto;
 
            }
        tr {
            border: solid #d9d9d9;
            border-width: 1px 0;
        }
        tr:first-child {
            border-top: none;
        }
        tr:last-child {
            border-bottom: none;
        }
        .btn {
            background: #d9d9d9;
            outline: none !important;
            box-shadow: none !important;
        }
        .btn:focus {
            background: #009900;
         
        }
        </style>
        <title>$($ReportTitle)</title>
 
    </head>
    <body class='app header-fixed bg-light'>
           <table class='table'>
           <nav class='navbar fixed-top navbar-custom'>
           <div class='container-fluid'>
               <div class='col-sm' style='text-align:left'>
                   <div class='row'><div><i class='fas fa-binoculars'></i></div><div class='ml-3'><strong>MCCA</strong></div></div>
               </div>
                
               <div class='col-sm' style='text-align:right'>
                   
               </div>
           </div>
       </nav>
       <div class='app-body p-3'>
       <br/><br/> <br/>
                  <h2 class='card-title'>&nbsp;$($ReportTitle)</h2>
                 <p>&nbspThis report details recommended remediations based on your MCCA report.</p>
        </div></table> "

    <#
     
        OUTPUT GENERATION / Summary
 
    #>

       $Output +=  "<div class=""w3-code notranslate htmlHigh"">"
       [int] $count = 1
    ForEach ($Area in ($Checks | Where-Object {$_.MCCARemediationInfo.RemediationAvailable -eq $True}|  Group-Object Area ))
    {
         $Output += 
          "
          <div class='card m-3'>
          <div class='card-header'>
          $($Area.Name)</div>
          
         <div class='card-body'>
         "
                            
        # Each check
        ForEach ($Check in ($Area.Group | Sort-Object Result -Descending)) 
        {        
            ForEach($o in $Check.Config)
             {                  
                if($($o.RemediationAction))
                 {
                    # div identifier for each remediation script
                    $divid = "div"+ $count.ToString() 
                    $Output += "
                     
                    <h5><B>$($Check.Name)</B></h5>
                    &nbsp;&nbsp;&nbsp;$($Check.MCCARemediationInfo.RemediationText)<br><br>"

                    

                    # We should expand the results by showing a table of Config Data and Items
                     $Output +=  " <table class='codetable'>
                     <tr style=""background-color: #e6e6e6;""><td>
                     <div class=""container-fluid"">
                     <div class=""row"">
                     <div class='col-sm' style='text-align:left; margin-top:auto; margin-bottom:auto;'>PowerShell</div>
                     <div class='col-sm' style='text-align:right; padding-right:0;'>
                     <button type = ""button"" class = ""btn btn-sm active rounded-0"" data-clipboard-action='copy' data-clipboard-target='div#$divid'><i class=""fa fa-clipboard"" aria-hidden=""true""></i>&nbsp; Copy</button>
                     </div>
                     </div>
                     </div>
                     </td></tr>"

                    $Output += "<tr style=""background-color: #f2f2f2;""><td><br><div id=""$divid"">$($o.RemediationAction)</div><br></td></tr>"
                    $Output +=  " </table><br>"
                 }
                     # Object, property, value checks need three columns
             }
             $count = $count + 1
        }           

       $Output +=  "</div></div>"

    }
        $Output +=  "</div>"
    <#
 
        OUTPUT GENERATION / Footer
 
    #>


    $Output += "
            
 
            <footer class='app-footer'>
            <footer class='app-footer'>
                <p><center><i>&nbsp;&nbsp;&nbsp;&nbsp;Disclaimer: Recommendations from MCCA should not be interpreted as a guarantee of compliance.
                It is up to you to evaluate and validate the effectiveness of customer controls per your regulatory environment.<br>
               </i></center> </p>
            </footer>
            </footer>
            <script>
                var clipboard = new Clipboard('.btn');
                clipboard.on('success', function(e) {
                  console.log(e);
                });
                clipboard.on('error', function(e) {
                  console.log(e);
                });
            </script>
        </body>
    </html>"



        # Write to file

        if($null -eq $this.OutputDirectory)
        {
            $OutputDir = $this.DefaultOutputDirectory
        }
        else 
        {
            $OutputDir = $this.OutputDirectory
        }

        #$Tenant = $(($Collection["AcceptedDomains"] | Where-Object {$_.InitialDomain -eq $True}).DomainName -split '\.')[0]
        $ReportFileName = "MCCA-$(Get-Date -Format 'yyyyMMddHHmm')-Remediation.html"

        $OutputFile = "$OutputDir\$ReportFileName"

        $Output | Out-File -FilePath $OutputFile
        $this.Completed = $True
        $this.Result = $OutputFile

    }

}
# SIG # Begin signature block
# MIIhnwYJKoZIhvcNAQcCoIIhkDCCIYwCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC0UWICWB9aylPn
# kOpfBiRjQdqv7pYuujvkw472XxSgTqCCC4QwggUAMIID6KADAgECAhMzAAAEU+We
# zhfpk+4QAAAAAARTMA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBD
# QSAyMDEwMB4XDTIwMTIxNTE5NDMyN1oXDTIxMTIwMjE5NDMyN1owfDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdQ29kZSBTaWdu
# IFRlc3QgKERPIE5PVCBUUlVTVCkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQDIbLqmXHPCGqCpfikwr9Gwu7mmwKaRk2l2c7HiFdxA4N/5QBm3ZfoonyX/
# oaX3WbsvBD3MoCMZJCYGVJeCkW0Iy0ahCtcxjmCmy9T7g0Du1vR29P+TTghXQ4ZP
# fVj+XDxo82IsqpD7uxaa/VujruYpxvYfwRZB11kf0SpaRLae1TvONYQZ/eNifGSx
# zUridwIkDPogu1vzsehp1O+SMhv3foM6Rz95ajbWOJMxgooE+LoAapjHe8jDciok
# 4jPC/5F5HGbf50i6Wj/QLN3VKLQFsSBzBC1RFqUITmcRP4ngQeDvLpvTluC8KFmy
# IlZunmBqGx2ynTmebwVysIa+qV/NAgMBAAGjggF8MIIBeDATBgNVHSUEDDAKBggr
# BgEFBQcDAzAdBgNVHQ4EFgQUrvqOOBCgPTy+cAoXZUhGw1P2yF4wUAYDVR0RBEkw
# R6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNv
# MRYwFAYDVQQFEw0yMzAwNzIrNDYzMDE4MB8GA1UdIwQYMBaAFN3WR4sjFC/YOGhC
# oz5tw/CQ9yzQMFkGA1UdHwRSMFAwTqBMoEqGSGh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRlc3RpbmclMjBQQ0ElMjAyMDEw
# LmNybDBmBggrBgEFBQcBAQRaMFgwVgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cubWlj
# cm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGVzdGluZyUyMFBD
# QSUyMDIwMTAuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggEBACnT
# 9Iwyq9Jk/Ee6QBrLTjw5+p0XjjxX7Oocz1R/iNdfx7iJtSf4VHWcDGXr92BPQLgl
# MOdq6PCrIRstWMg1aBQ4eH9Q6VfiWZq3FyaQNpDG4g/+Z6Zo5A6LgbtEnZB5tboP
# ZsE4o0wDlIXX5pGCsCTIiVMtJqbCZPn5hLG5V7wMlLae9A4xOW+JyBy8vA/FpE+A
# QQoHSJ4LrC22bwpn2+cQRF5SlFRIqZVx+wclji96Nerfosz2ZPLfydHvs8jH65dA
# 2WFAMvN8/KxdX7fp98Bzk+vhCPYc4/CKyPdscD7yJvOxveEAzDiLyyWrnbFU9qP7
# aI/JTxrVA5IGS7wIJKwwggZ8MIIEZKADAgECAgphEYRvAAAAAAADMA0GCSqGSIb3
# DQEBCwUAMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTow
# OAYDVQQDEzFNaWNyb3NvZnQgVGVzdGluZyBSb290IENlcnRpZmljYXRlIEF1dGhv
# cml0eSAyMDEwMB4XDTEwMDcwMTIxMjMwMVoXDTI1MDcwMTIxMzMwMVoweTELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEjMCEGA1UEAxMaTWljcm9z
# b2Z0IFRlc3RpbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQDBvSHVS2YGAJIwORjKy3NCWbHvmyeo4OhVvSmw+SQfOtHow1mJ7ZG2wegz
# Y/ZaZBniLnwMkIAFOL8cproNai/vJ5er3vbvUPOD59fDRTciPxi1wpYRto0Sg1mL
# J1EGVnW5YGoTDtUmPy2WqgXMoYc/vk807wxMb8wE1KHmZ80KJzOf46+bb2h8vLQM
# czSMWoH5h/tUHMVHbOqfV7RZ/c4ZqXd8h0KftXmUvMt2ktuWl6FfBCQ5/qGV4Z+G
# 417ZXFbfQ5CfyRTq0fWgW6vzCATdKK8b4qouE6AK7dKZRCr1mUT7K6RP8bthwh0t
# 9SUnAqh475M59F51ge7S4HYMWyPvAgMBAAGjggHsMIIB6DAQBgkrBgEEAYI3FQEE
# AwIBADAdBgNVHQ4EFgQU3dZHiyMUL9g4aEKjPm3D8JD3LNAwGQYJKwYBBAGCNxQC
# BAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYD
# VR0jBBgwFoAUowEEfjCIM+u5MZzK64V2Z/xltNEwWQYDVR0fBFIwUDBOoEygSoZI
# aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGVz
# Um9vQ2VyQXV0XzIwMTAtMDYtMTcuY3JsMF0GCCsGAQUFBwEBBFEwTzBNBggrBgEF
# BQcwAoZBaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUZXNS
# b29DZXJBdXRfMjAxMC0wNi0xNy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCBjwYJKwYB
# BAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# UEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBn
# AGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqG
# SIb3DQEBCwUAA4ICAQBAYQU+N90ze1LCSGuA92ADFrbJLol+vdlYHGPT9ZLS9loE
# DQjuh7/rmDQ6ZXxQ5MgbKVB5VXsYOZG1QSbzF3+YlWd8TN1y5B21BM3DSPb6r+3b
# rl50kW2t1JqACtiLbZnmhmh5hkdJi8HYUfLQ7xKcP0g1CIJP9CyKil7UJv/HnMXK
# igTGiBaHjfVtVwG5k8roymrEirpBDcOMVB0OZiTXxYIHDbM4v7LItZYIISdPs6+L
# wxwzwdroMdpj42+3dWQBumpRGQAgqJ9i5UiBQtUM+9vLpKIRnujnWfQxbaIuIt2H
# RLFpHUYKGOXRlf148o+71dX3YWap88+ocaxkM8rkavgDNkcWSe9Dpoq8a3tS2P9B
# pxewDV+iSzF0JRo9UOZeciaSQDZvrkQskxJjtdO725L6E5Fu1Ti+lGl6exRCnhPb
# ooxCqHEGLRdiwXkrmLp+huTGAK8zmfEt0d1JFrrDdu5kqoG3OVT2dN4JVFNpOFvC
# U/LNiVDCyCIcG0cSRVtDjyNckMhu1PcPtberjr1mcL8RkTzvonoH4pIvQk1k4IOL
# pdxslOj2oigApZjqCBJA3mIEZHlnwRuglg4Er74nSmL6953C0r1Vwl7T0vXnQO8i
# zb+incAb1r6Y+45N5aVXww+PqHJBRjvhjyBKG+1aDLVM3ixjV9P6OZkOvp4uozGC
# FXEwghVtAgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBDQSAyMDEwAhMzAAAEU+We
# zhfpk+4QAAAAAARTMA0GCWCGSAFlAwQCAQUAoIGwMBkGCSqGSIb3DQEJAzEMBgor
# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3
# DQEJBDEiBCDn43WQ7Wkrbb52qzJk/FRqwBVCJEolnkoqC6Tais5c6DBEBgorBgEE
# AYI3AgEMMTYwNKAUgBIATQBpAGMAcgBvAHMAbwBmAHShHIAaaHR0cHM6Ly93d3cu
# bWljcm9zb2Z0LmNvbSAwDQYJKoZIhvcNAQEBBQAEggEAoAWA+xRFTTzxQ820JH/6
# H5GmW3yiTR4IDm2s3jbC4HLcTMAMN9fGqwIPkB+9/GXNoS4zxuF7ebRW4QCnMb1H
# Z85wSVFgZei5pi9iyDg2jqdGNQsmvqzZQu+WQQFa4HNSgqnnxdQDaxOwzNWZqG3B
# rz8uTwQtNCIneOtlSO//UjR9mCfh6w6UjxBuQ1z+wp0OsE682HGXgT1sbo40HXw1
# ve698WFuqVf3o4euqKhyaPNJ7bOFZU9MGZqdZhwQwyaWddpqqkk2c/oS1LCi+KsJ
# X1eQWaYc8e6czak0SMEpSz6LQMWLqARFrHZuuVAzUpBnpBz1blB2V4+Mx0HbyyEg
# 3qGCEv4wghL6BgorBgEEAYI3AwMBMYIS6jCCEuYGCSqGSIb3DQEHAqCCEtcwghLT
# AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsqhkiG9w0BCRABBKCCAUgEggFEMIIB
# QAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCBrJG9YjOZ7UwJobbLI
# 7mRwluAjHAV1mzj35fsZcTW8yAIGYLD17ri5GBMyMDIxMDYxODEwMDgzNC42OTRa
# MASAAgH0oIHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0
# ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjNCRDQtNEI4MC02OUMzMSUwIwYD
# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOTTCCBPkwggPhoAMC
# AQICEzMAAAE7EhuSI1ICWqUAAAAAATswDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0
# IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjAxMDE1MTcyODIyWhcNMjIwMTEyMTcy
# ODIyWjCB0jELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG
# A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYD
# VQQLEx1UaGFsZXMgVFNTIEVTTjozQkQ0LTRCODAtNjlDMzElMCMGA1UEAxMcTWlj
# cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
# ADCCAQoCggEBAOM21pXQ1uUwGAcBUvPC91UArbFP2chd56rQsPlUSuHhsZjV3UCF
# IW33AqybJe3bpHq8PLkopZafgB+YQPYDkXNyACQvjex5WVl1/+aAJDba2zGmTIWF
# g4TDweE5SsPCncDqc2WReMZw4Gllmbm5fkJ1gdqrdrny2UuuKgvt7BowNvBDotZ+
# 1M5WpB/rxepaAi+WOiH6t7+Qk6uwnuPWQdmQlsGKZB+O3GJ3r0TMptxALPTdPkLw
# ml4jqLCyMW4Zar4ygCub/SRQkoxE3aVGikoE0lZWw1Pke/cEs73bFoD3005NDW5o
# m69wMSVFO/oBX3biNAKN+psiZCUINdAhRDECAwEAAaOCARswggEXMB0GA1UdDgQW
# BBTHz4/N4uhXoIpWZAlBRbq+7+aIkTAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYb
# xTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
# b20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmww
# WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNV
# HRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IB
# AQBBsPG05rk1r1UH+zEtTK/c7pA1RDH1pwFv3mPzlf3lbW1Nh12AMKK/Ing2fr5l
# ps0uPbN/VWBvkAQL76NbFWiZzWtmZBjUKPbJ+wifpX2qe2/M0I3BFdmNdGWT3dct
# hT513SO2km1XbxiK5PAXsOYlmq+mEkGceSuMqCQ9apcefzxe5vyhnpHKbTH4+Yf/
# uB3HhRPTKp1YkZySI1Yp5ic5uqlzVPlUEarmskYYueAPjmdKGKPvYbJGLHmRbIZQ
# mOh9VQxSAxOoASN/TA+xRs51LIKknLiunlAhxLn1/BWhC4+CW7CbKeqtHKV4pEvF
# yp+cm9Lp5lBUF1XuPa7TyyIXMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
# VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
# ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m
# K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm
# gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5
# hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm
# wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB
# wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD
# AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE
# DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
# HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo
# dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D
# ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC
# hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1
# dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw
# gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j
# cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A
# UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL
# BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ
# at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1
# mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv
# SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/
# amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW
# hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua
# 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio
# SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH
# czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw
# 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P
# 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSoYIC1zCCAkAC
# AQEwggEAoYHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0
# ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjNCRDQtNEI4MC02OUMzMSUwIwYD
# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoD
# FQAoM8LvuSnUnUbrez5FdSTlglx95KCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBBQUAAgUA5HZ6FjAiGA8yMDIxMDYxODA5
# NDkxMFoYDzIwMjEwNjE5MDk0OTEwWjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDk
# dnoWAgEAMAoCAQACAh6uAgH/MAcCAQACAhGcMAoCBQDkd8uWAgEAMDYGCisGAQQB
# hFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAw
# DQYJKoZIhvcNAQEFBQADgYEASM858KAXizQYjQfze7msr4CHOZeFp/qo7u9zijK6
# yJmnz/WESO2pjuQ+D6n4E8n+bVEOnsPCfAfjF6bsJHYJh/2L/9uJIeh8iGEGLVGS
# 04l+pFTkWpfM/JXrF5HfO8ukkcy6MiownpPps5E7KnXYpiBuUTVoCTUOi+qR+7Q5
# 10IxggMNMIIDCQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAIT
# MwAAATsSG5IjUgJapQAAAAABOzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcN
# AQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCApkBSr+lnuKJh4q4wn
# pGkwQAgFBf3UZtQWQxDSGeJRlDCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0E
# IBw25zd5xSbYAm3Zn+9CxVW3UWtY7QDGUb0WO2ThxEAcMIGYMIGApH4wfDELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z
# b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAE7EhuSI1ICWqUAAAAAATswIgQg
# R003Q2oQTHsBS6u9heyqjf0mcpS3mu99Q3d+oYwlas8wDQYJKoZIhvcNAQELBQAE
# ggEARwNvHZCoTX5Xpi8PJPjd3Tf3NMw0Qvx6g6uE9y3iyfHiiKEk2ShOAU1PBaoA
# NnI5wAAmCfa8oOZDT8p+uNpgn9a+8AU1vsVotyuaAgh/a9HzdI0vKwFBrgjdrmc2
# qKi17ySdH5qJ6ndjCtpu1BVhPygwAWlVCBsN3wfFP4W59n4noHM3sCOdOa9Rqp5V
# Rxydu5hyYo5+n3vqhlkq59L1bMtM4F3pFHfUuzmQxrJ6DoOAPqcLIOnJHBYqI/cz
# 58BspBDYr5K9osCssK/32xlvZdf5owtut0+wf4sVbNKCQgeFSNdeVw7AUEph/9iJ
# NXze4/cOs0H1618rolgUIFDIig==
# SIG # End signature block