Remediation/RemediationAction.ps1
using module "..\CAMP.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>CAMP</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'> $($ReportTitle)</h2> <p> This report details recommended remediations based on your CAMP report.</p> </div></table> " <# OUTPUT GENERATION / Summary #> $Output += "<div class=""w3-code notranslate htmlHigh"">" [int] $count = 1 ForEach ($Area in ($Checks | Where-Object {$_.CAMPRemediationInfo.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> $($Check.CAMPRemediationInfo.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> 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> Disclaimer: Recommendations from CAMP 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 = "CAMP-$(Get-Date -Format 'yyyyMMddHHmm')-Remediation.html" $OutputFile = "$OutputDir\$ReportFileName" $Output | Out-File -FilePath $OutputFile $this.Completed = $True $this.Result = $OutputFile } } # SIG # Begin signature block # MIIlyQYJKoZIhvcNAQcCoIIlujCCJbYCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBBWhHmM7rdk4a9 # 6fvYxiT7yo1jeF55qypKabHhYlO00qCCC5YwggT7MIID46ADAgECAhMzAAAE4qOH # mdFtQCqWAAEAAATiMA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBD # QSAyMDEwMB4XDTIxMDkwMjE5MjYyN1oXDTIyMDkwMTE5MjYyN1owfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdQ29kZSBTaWdu # IFRlc3QgKERPIE5PVCBUUlVTVCkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQC08O5FqM6i91zE1YIK4epCwArU+0xTEScHJ0Vfy32sK+Xf3dM/vHm1iLfc # 7hhDNwVxfHvaHgjNYC2Qr2cff4F40aShGrc6xyIdmcSiygICYGQrF7FWKQ4thEdX # HuAMiuVYZQ9Jo+vxOXRJTSa3zsFFrbkCOgun7Vu9UeFxOQT1ByNomsxky0gCRu+P # YdaqnbOyxNsnCDaGUUHp+D1EpBv4Cdrgy9o359Z4nFUyUm4MVMjpG6jC2n8dPonw # hAcbjIvyJzA1v88jVCMfDrHt0AkIHN69J4wahtOrJeERgXjklilV0hMRwkVkfpnJ # 18aw7NqWsDi4ekmBd2EL6d+HljzNAgMBAAGjggF3MIIBczATBgNVHSUEDDAKBggr # BgEFBQcDAzAdBgNVHQ4EFgQUCekP9tRzR3NLSbCNG+oPPWd/nuYwRQYDVR0RBD4w # PKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UEBRMN # MjMwMDcyKzQ2NzYwNTAfBgNVHSMEGDAWgBS/ZaKrb3WjTkWWVwXPOYf0wBUcHDBc # BgNVHR8EVTBTMFGgT6BNhktodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NybC9NaWNyb3NvZnQlMjBUZXN0aW5nJTIwUENBJTIwMjAxMCgxKS5jcmwwaQYI # KwYBBQUHAQEEXTBbMFkGCCsGAQUFBzAChk1odHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRlc3RpbmclMjBQQ0ElMjAyMDEw # KDEpLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCTxe9mJYSi # GUIIw4imC+gePdQLAeeMTTa8Uwa406/66Su7fVZTGNFMpLwofA1WfxvAX4+5+U+J # aFJod4KyAdUngWtPlyPmkR0kXQ6mTxvqMFEih/s0mRyW6dHMHrCezmY//89C5zau # E3LBcI4gqAQ2ZabPxj2+j6+Er8StKv07PigCuM4M16DIQUAY6kNgnate4WoiiQSu # mXhMiwtUh6jgSnTpOqpNfXk+YJxNoqHH8qqyW7FcQ88jyoxM4LYdAQVN3eYD7eJn # xfW2nWIbDRaZpBkv9N1t8yObWcyC/YrRLuq3QLqpll20Y1eFsm+gypEoiERqpPUT # 3p7K5897ABKoMIIGkzCCBHugAwIBAgITMwAAAC01ekaIyQdx2AAAAAAALTANBgkq # hkiG9w0BAQsFADCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjE6MDgGA1UEAxMxTWljcm9zb2Z0IFRlc3RpbmcgUm9vdCBDZXJ0aWZpY2F0ZSBB # dXRob3JpdHkgMjAxMDAeFw0yMDEyMTAyMDQzMjBaFw0zNTA2MTcyMTA0MTFaMHkx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1p # Y3Jvc29mdCBUZXN0aW5nIFBDQSAyMDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A # MIIBCgKCAQEAvzxggau+7P/XF2PypkLRE2KcsBfOukYaeyIuVXOaVLnG1NHKmP53 # Rw2OnfBezPhU7/LPKtRi8ak0CgTXxQWG8hD1TdOWCGaF2wJ9GNzieiOnmildrnkY # zwxj8Br/gampQz+pC7lR8bNIOvxELl8RxVY6/8oOzYgIwf3H1fU+7+pOG3KLI71F # N54fcMGnybggc+3zbD2LIQXPdxL+odwH6Q1beAlsMlUQR9A3yMf3+nP+RjTkVhao # N2RT1jX7w4C2jraGkaEQ1sFK9uN61BEKst4unhCX4IGuEl2IAV3MpMQoUpxg8Arm # iK9L6VeK7KMPNx4p9l0h09faXQ7JTtuNbQIDAQABo4IB+jCCAfYwDgYDVR0PAQH/ # BAQDAgGGMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFOqfXzO2 # 0F+erestpsECu0A4y+e1MB0GA1UdDgQWBBS/ZaKrb3WjTkWWVwXPOYf0wBUcHDBU # BgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcU # AgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUowEE # fjCIM+u5MZzK64V2Z/xltNEwWQYDVR0fBFIwUDBOoEygSoZIaHR0cDovL2NybC5t # aWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGVzUm9vQ2VyQXV0XzIw # MTAtMDYtMTcuY3JsMIGNBggrBgEFBQcBAQSBgDB+ME0GCCsGAQUFBzAChkFodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rlc1Jvb0NlckF1dF8y # MDEwLTA2LTE3LmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9z # b2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBCwUAA4ICAQAntNCFsp7MD6QqU3PVbdrX # MQDI9v9jyPYBEbUYktrctPmvJuj8Snm9wWewiAN5Zc81NQVYjuKDBpb1un4SWVCb # 4PDVPZ0J87tGzYe9dOJ30EYGeiIaaStkLLmLOYAM6oInIqIwVyIk2SE/q2lGt8Ov # wcZevNmPkVYjk6nyJi5EdvS6ciPRmW9bRWRT4pWU8bZIQL938LE4lHOQAixrAQiW # es5Szp2U85E0nLdaDr5w/I28J/Z1+4zW1Nao1prVCOqrosnoNUfVf1kvswfW3FY2 # l1PiAYp8sGyO57GaztXdBoEOBcDLedfcPra9+NLdEF36NkE0g+9dbokFY7KxhUJ8 # WpMiCmN4yj9LKFLvQbctGMJJY9EwHFifm2pgaiaafKF1Gyz+NruJzEEgpysMo/f9 # AVBQ/qCdPQQGEWp3QDIaef4ts9QTx+RmDKCBDMTFLgFmmhbtUY0JWjLkKn7soz/L # IcDUle/p5TiFD4VhfZnAcvYQHXfuslnyp+yuhWzASnAQNnOIO6fc1JFIwkDkcM+k # /TspfAajzHooSAwXkrOWrjRDV6wI0YzMVHrEyQ0hZ5NnIXbL3lrTkOPjf3NBu1na # SNEaySduStDbFVjV3TXoENEnZiugJKYSwmhzoYHM1ngipN5rNdqJiK5ukp6E8LDz # i3l5/7XctJQY3+ZgHDJosjGCGYkwghmFAgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5n # IFBDQSAyMDEwAhMzAAAE4qOHmdFtQCqWAAEAAATiMA0GCWCGSAFlAwQCAQUAoIGu # MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor # BgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCa0JTSfcEvwu2OMQ4T4q6a/EB1SxKB # R7AP2tggOGMBeDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBm # AHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIB # AAGvLFzRVh1DjjbIv8y04nsb36kP9In1hsyfChcQq0m6XhXixB5lLgq3dRiYAodP # XYuC/44JGbsrbi/Q6OBPeGBHHLa3eV54r7xKAjckJ/HCsO4Li+92WcpK0LimcW1Z # 6SnaF27Te4O48QxBTndm9plLuqyEm2Rlt3/hknUAcJ3biV5EoWmkgQfqqs8e7Lfg # QbsOd/WIBFpH4Y0dVVonEM1JJ+mZHHxxiUh+7Hw/tBBP/CotZ/RqKWbZOQcvZ+uY # uNq3rV51AT15AEG2I8EaGChXL7SmzUnRYP+gndsbxKiXrSh4hg+OEqyaCGHaFMsa # 74tS+QPu3X/bqXi79orZQ9OhghcYMIIXFAYKKwYBBAGCNwMDATGCFwQwghcABgkq # hkiG9w0BBwKgghbxMIIW7QIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBWAYLKoZIhvcN # AQkQAQSgggFHBIIBQzCCAT8CAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEF # AAQg+u5nRfyW0KoVTupJNIifa7yELB3czynpa3JyTpmuUtgCBmKGYDujARgSMjAy # MjA2MTAwNDExMzcuMTZaMASAAgH0oIHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBP # cGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjE3OUUt # NEJCMC04MjQ2MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl # oIIRaDCCBxQwggT8oAMCAQICEzMAAAGKPjiN0g4C+ugAAQAAAYowDQYJKoZIhvcN # AQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG # A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjExMDI4MTky # NzQyWhcNMjMwMTI2MTkyNzQyWjCB0jELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh # c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD # b3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9u # cyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoxNzlFLTRCQjAtODI0 # NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBALf/rrehgwMgGb3oAYWoFndBqKk/JRRz # HqaFjTizzxBKC7smuF95/iteBb5WcBZisKmqegfuhJCE0o5HnE0gekEQOJIr3Scn # ZS7yq4PLnbQbuuyyso0KsEcw0E0YRAsaVN9LXQRPwHsj/eZO6p3YSLvzqU+EBshi # VIjA5ZmQIgz2ORSZIrVIBr8DAR8KICc/BVRARZ1YgFEUyeJAQ4lOqaW7+DyPe/r0 # IabKQyvvN4GsmokQt4DUxst4jonuj7JdN3L2CIhXACUT+DtEZHhZb/0kKKJs9ybb # DHfaKEv1ztL0jfYdg1SjjTI2hToJzeUZOYgqsJp+qrJnvoWqEf06wgUtM1417Fk4 # JJY1Abbde1AW1vES/vSzcN3IzyfBGEYJTDVwmCzOhswg1xLxPU//7AL/pNXPOLZq # ImQ2QagYK/0ry/oFbDs9xKA2UNuqk2tWxJ/56cTJl3LaGUnvEkQ6oCtCVFoYyl4J # 8mjgAxAfhbXyIvo3XFCW6T7QC+JFr1UkSoqVb/DBLmES3sVxAxAYvleLXygKWYRO # IGtKfkAomsBywWTaI91EDczOUFZhmotzJ0BW2ZIam1A8qaPb2lhHlXjt+SX3S1o8 # EYLzF91SmS+e3e45kY4lZZbl42RS8fq4SS+yWFabTj7RdTALTGJaejroJzqRvuFu # DBh6o+2GHz9FAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUI9pD2P1sGdSXrqdJR4Q+ # MZBpJAMwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgw # VjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUF # BwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgx # KS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG # 9w0BAQsFAAOCAgEAxfTBErD1w3kbXxaNX+e+Yj3xfQEVm3rrjXzOfNyH08X82X9n # b/5ntwzYvynDTRJ0dUym2bRuy7INHMv6SiBEDiRtn2GlsCCCmMLsgySNkOJFYuZs # 21f9Aufr0ELEHAr37DPCuV9n34nyYu7anhtK+fAo4MHu8QWL4Lj5o1DccE1rxI2S # D36Y1VKGjwpeqqrNHhVG+23C4c0xBGAZwI/DBDYYj+SCXeD6eZRah07aXnOu2BZh # rjv7iAP04zwX3LTOZFCPrs38of8iHbQzbZCM/nv8Zl0hYYkBEdLgY0aG0GVenPtE # zbb0TS2slOLuxHpHezmg180EdEblhmkosLTel3Pz6DT9K3sxujr3MqMNajKFJFBE # O6qg9EKvEBcCtAygnWUibcgSjAaY1GApzVGW2L001puA1yuUWIH9t21QSVuF6OcO # PdBx6OE41jas9ez6j8jAk5zPB3AKk5z3jBNHT2L23cMwzIG7psnWyWqv9OhSJpCe # yl7PY8ag4hNj03mJ2o/Np+kP/z6mx7scSZsEDuH83ToFagBJBtVw5qaVSlv6ycQT # dyMcla+kD/XIWNjGFWtG2wAiNnb1PkdkCZROQI6DCsuvFiNaZhU9ySga62nKcuh1 # Ixq7Vfv9VOdm66xJQpVcuRW/PlGVmS6fNnLgs7STDEqlvpD+c8lQUryzPuAwggdx # MIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGI # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylN # aWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5 # MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciEL # eaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa # 4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxR # MTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEByd # Uv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi9 # 47SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJi # ss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+ # /NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY # 7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtco # dgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH # 29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94 # q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcV # AQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0G # A1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQB # gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgw # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB # /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f # BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv # ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w # TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 # cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIB # AJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRs # fNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6 # Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveV # tihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKB # GUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoy # GtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQE # cb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFU # a2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+ # k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0 # +CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cir # Ooo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIC1zCCAkACAQEwggEA # oYHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0w # KwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAk # BgNVBAsTHVRoYWxlcyBUU1MgRVNOOjE3OUUtNEJCMC04MjQ2MSUwIwYDVQQDExxN # aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQCA8PNj # rxtTBQQdp/+MHlaqc1fEoaCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwMA0GCSqGSIb3DQEBBQUAAgUA5k014jAiGA8yMDIyMDYxMDExMTU0NloY # DzIwMjIwNjExMTExNTQ2WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDmTTXiAgEA # MAoCAQACAgpUAgH/MAcCAQACAhFIMAoCBQDmTodiAgEAMDYGCisGAQQBhFkKBAIx # KDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZI # hvcNAQEFBQADgYEAG140uQ5lj9m6dVZUCb9MQNhBKkjWKm1SCCABKE7eC8LFWZzj # tNEDNZCWIgcPXqGv/MoSKWnOfo8wVNsPdJj6Pi9o4scsGgfr1WoCk3aOT8FdiGDf # FytA7g/Gvk4Lcn3OALV/gsUWUGE0ZuyQfY6QK+AXyUdNdLu7DWnu7/2/mOwxggQN # MIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAYo+ # OI3SDgL66AABAAABijANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0G # CyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCAfxPMwodmVY/t26ahRHuk6nN+J # pVEvrZ/zHICn9t+03jCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIPS94Kt1 # 30q+fvO/fzD4MbWQhQaE7RHkOH6AkjlNVCm9MIGYMIGApH4wfDELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp # bWUtU3RhbXAgUENBIDIwMTACEzMAAAGKPjiN0g4C+ugAAQAAAYowIgQgBlJcJ3UV # iw/IRJPV0bG//WIfXq1bZV3E5Vd9qWBiwtkwDQYJKoZIhvcNAQELBQAEggIAFg/x # udGew0mtap4hkp9QG5T8wjRZ9Lb7LUbqRdDeXg/TDpKxh1GaISJD1bzLC7jk9m44 # w0RZxIT17sYFF1CZkA8MdyiNurUatf+yqxCdXkxDHacoP9EIuvkFMkBOK8rvTt/4 # 3dQdNvk2HiX482nh/2CW8rL+Sr4wkzqXbN+wbyfUm/KLNv8jdHwN3DZY7tlh+1Zb # tvM4oELyZiRmarWdr19v6Y9AiVraH2vhgw+bXgfYIDiR12ZH3yLsZEsnyOUC6kc9 # qFDCxbI6jnb7dWYtvbVFAm8LbhFE13SSL6jIAck4QW7mNgnGE7GlaT+AaMTArES6 # lWwaif5d6U4CgE0rov1H54+vr/YLNoTBswJpKN6GfOBIZ2nuVOAVUzSvzSiC4lNv # +U+xn8PWmfucWrXObPRW9SxMs3VQz5IcUv+TJXeA/m3mzT1sRResH7WqaKvm1HSR # CIX/JhumUXRK4iRV+jDTK+QQHB61Ms9IvimVcyvdJ+zFORTVe6w7jRw7kTTn0b4y # LJ0XlMqyVn6OXdyJbETkFT6JiBBNIvWr09cqN3uUbFbX9yY9SVeoQos1nlI928fI # 06xdwtQy8/kNxXI+LXuwS1ZcAjONi//SAv8Ry4Rx1Nw+MgC26o4D9zQ5iQGvskgK # qSXtG3xBptwQwgXpa28ts8uJXH1oz83mu9E1pCw= # SIG # End signature block |