Framework/Abstracts/FileOutputBase.ps1
Set-StrictMode -Version Latest class FileOutputBase: ListenerBase { static [string] $ETCFolderPath = "Etc"; static [string] $CSVFilePath = $null; [string] $FilePath = ""; [string] $FolderPath = ""; #[string] $BasePath = ""; hidden [string[]] $BasePaths = @(); FileOutputBase() { [Helpers]::AbstractClass($this, [FileOutputBase]); } hidden [void] AddBasePath([string] $path) { if(-not [string]::IsNullOrWhiteSpace($path)) { $path = $global:ExecutionContext.InvokeCommand.ExpandString($path); if(Test-Path -Path $path) { $this.BasePaths += $path; } } } [void] SetRunIdentifier([AzSKRootEventArgument] $arguments) { ([ListenerBase]$this).SetRunIdentifier($arguments); $this.AddBasePath([ConfigurationManager]::GetAzSKSettings().OutputFolderPath); $this.AddBasePath([ConfigurationManager]::GetAzSKConfigData().OutputFolderPath); $this.AddBasePath([Constants]::AzSKLogFolderPath); } hidden [string] CalculateFolderPath([OrganizationContext] $context, [string] $subFolderPath, [int] $pathIndex) { $outputPath = ""; if($context -and (-not [string]::IsNullOrWhiteSpace($context.OrganizationName))) { $isDefaultPath = $false; if($pathIndex -lt $this.BasePaths.Count) { $basePath = $this.BasePaths.Item($pathIndex); } else { $isDefaultPath = $true; $basePath = [Constants]::AzSKLogFolderPath; } $outputPath = Join-Path $basePath ($([Constants]::AzSKModuleName)+"Logs") ; $sanitizedPath = [Helpers]::SanitizeFolderName($context.OrganizationName); if ([string]::IsNullOrEmpty($sanitizedPath)) { $sanitizedPath = $context.OrganizationName; } $runPath = $this.RunIdentifier; $commandMetadata = $this.GetCommandMetadata(); #if this is a batch scan, we have to add results to the batch scan folder $batchScanSanitizedPath = $null if($commandMetaData.PSObject.Properties.Name.Contains("BatchScan")){ $batchScanSanitizedPath = [Helpers]::SanitizeFolderName($commandMetadata.BatchScan) } if($commandMetadata) { $runPath += "_" + $commandMetadata.ShortName; } if ([string]::IsNullOrEmpty($sanitizedPath)) { $outputPath = Join-Path $outputPath -ChildPath "Default" |Join-Path -ChildPath $runPath ; } else { if(![string]::IsNullOrEmpty($batchScansanitizedPath)) { $outputPath = Join-Path $outputPath -ChildPath ([Constants]::ParentFolder + $sanitizedPath) | Join-Path -ChildPath "BatchScan" | Join-Path -ChildPath $batchScanSanitizedPath |Join-Path -ChildPath $runPath ; } else { if ($this.invocationContext.BoundParameters["ServiceIds"]) { $runPath += "_SVCIdBased"; } if ($this.invocationContext.BoundParameters["UsePartialCommit"]) { $runPath += "_UPC"; } if ($this.invocationContext.BoundParameters["UseBaselineControls"]) { $runPath += "_UBC"; } if ($this.invocationContext.BoundParameters["ResourceTypeName"]) { $runPath += "_" + $this.invocationContext.BoundParameters["ResourceTypeName"]; } if ($this.invocationContext.BoundParameters["FilterTags"]) { $runPath += "_FT_"+ $this.invocationContext.BoundParameters["FilterTags"]; } #if ($this.invocationContext.BoundParameters["MaxObj"]) { # $runPath += "_" +"MO"+ $this.invocationContext.BoundParameters["MaxObj"]; #}FilterTags $outputPath = Join-Path $outputPath -ChildPath ([Constants]::ParentFolder + $sanitizedPath) |Join-Path -ChildPath $runPath ; } } if (-not [string]::IsNullOrEmpty($subFolderPath)) { $sanitizedPath = [Helpers]::SanitizeFolderName($subFolderPath); if (-not [string]::IsNullOrEmpty($sanitizedPath)) { $outputPath = Join-Path $outputPath $sanitizedPath ; } } if(-not (Test-Path $outputPath)) { try { New-Item -Path $outputPath -ItemType Directory -ErrorAction Stop | Out-Null } catch { $outputPath = ""; if(-not $isDefaultPath) { $outputPath = $this.CalculateFolderPath($context, $subFolderPath, $pathIndex + 1); } } } } return $outputPath; } [string] CalculateFolderPath([OrganizationContext] $context, [string] $subFolderPath) { return $this.CalculateFolderPath($context, $subFolderPath, 0); } [string] CalculateFolderPath([OrganizationContext] $context) { return $this.CalculateFolderPath($context, ""); } [void] SetFolderPath([OrganizationContext] $context) { $this.SetFolderPath($context, ""); } [void] SetFolderPath([OrganizationContext] $context, [string] $subFolderPath) { $this.FolderPath = $this.CalculateFolderPath($context, $subFolderPath); } [string] CalculateFilePath([OrganizationContext] $context, [string] $fileName) { return $this.CalculateFilePath($context, "", $fileName); } [string] CalculateFilePath([OrganizationContext] $context, [string] $subFolderPath, [string] $fileName) { $outputPath = ""; $this.SetFolderPath($context, $subFolderPath); if ([string]::IsNullOrEmpty($this.FolderPath)) { return $outputPath; } $outputPath = $this.FolderPath; if ([string]::IsNullOrEmpty($fileName)) { $outputPath = Join-Path $outputPath ($(Get-Date -format "yyyyMMdd_HHmmss") + ".LOG"); } else { $outputPath = Join-Path $outputPath $fileName; } return $outputPath; } [void] SetFilePath([OrganizationContext] $context, [string] $fileName) { $this.SetFilePath($context, "", $fileName); } [void] SetFilePath([OrganizationContext] $context, [string] $subFolderPath, [string] $fileName) { $this.FilePath = $this.CalculateFilePath($context, $subFolderPath, $fileName); } } # SIG # Begin signature block # MIIjhwYJKoZIhvcNAQcCoIIjeDCCI3QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCDB2v0qKYd87Up # njf6dwNISbTMB8FQ6lstdDEedoOrkqCCDYEwggX/MIID56ADAgECAhMzAAAB32vw # LpKnSrTQAAAAAAHfMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAxMjE1MjEzMTQ1WhcNMjExMjAyMjEzMTQ1WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC2uxlZEACjqfHkuFyoCwfL25ofI9DZWKt4wEj3JBQ48GPt1UsDv834CcoUUPMn # s/6CtPoaQ4Thy/kbOOg/zJAnrJeiMQqRe2Lsdb/NSI2gXXX9lad1/yPUDOXo4GNw # PjXq1JZi+HZV91bUr6ZjzePj1g+bepsqd/HC1XScj0fT3aAxLRykJSzExEBmU9eS # yuOwUuq+CriudQtWGMdJU650v/KmzfM46Y6lo/MCnnpvz3zEL7PMdUdwqj/nYhGG # 3UVILxX7tAdMbz7LN+6WOIpT1A41rwaoOVnv+8Ua94HwhjZmu1S73yeV7RZZNxoh # EegJi9YYssXa7UZUUkCCA+KnAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUOPbML8IdkNGtCfMmVPtvI6VZ8+Mw # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDYzMDA5MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAnnqH # tDyYUFaVAkvAK0eqq6nhoL95SZQu3RnpZ7tdQ89QR3++7A+4hrr7V4xxmkB5BObS # 0YK+MALE02atjwWgPdpYQ68WdLGroJZHkbZdgERG+7tETFl3aKF4KpoSaGOskZXp # TPnCaMo2PXoAMVMGpsQEQswimZq3IQ3nRQfBlJ0PoMMcN/+Pks8ZTL1BoPYsJpok # t6cql59q6CypZYIwgyJ892HpttybHKg1ZtQLUlSXccRMlugPgEcNZJagPEgPYni4 # b11snjRAgf0dyQ0zI9aLXqTxWUU5pCIFiPT0b2wsxzRqCtyGqpkGM8P9GazO8eao # mVItCYBcJSByBx/pS0cSYwBBHAZxJODUqxSXoSGDvmTfqUJXntnWkL4okok1FiCD # Z4jpyXOQunb6egIXvkgQ7jb2uO26Ow0m8RwleDvhOMrnHsupiOPbozKroSa6paFt # VSh89abUSooR8QdZciemmoFhcWkEwFg4spzvYNP4nIs193261WyTaRMZoceGun7G # CT2Rl653uUj+F+g94c63AhzSq4khdL4HlFIP2ePv29smfUnHtGq6yYFDLnT0q/Y+ # Di3jwloF8EWkkHRtSuXlFUbTmwr/lDDgbpZiKhLS7CBTDj32I0L5i532+uHczw82 # oZDmYmYmIUSMbZOgS65h797rj5JJ6OkeEUJoAVwwggd6MIIFYqADAgECAgphDpDS # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVXDCCFVgCAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAd9r8C6Sp0q00AAAAAAB3zAN # BglghkgBZQMEAgEFAKCBsDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgPNTc0e9J # nAJ+VW9q4u+ErTg/MG0X4JHyB5RnGti+6oswRAYKKwYBBAGCNwIBDDE2MDSgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRyAGmh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20g # MA0GCSqGSIb3DQEBAQUABIIBAEFaB7b71gvg8ONXuAwd3bGdy0+ntJVQQBcBjc6c # +XZ4IZeJFg7vmc+YzZN3EvSxNsq7lSefGSatrPyleSeDovyhlFM4sG4uX3nZiiaR # g87qu3sY3L/VwdnhCWqP/xrfd7bZg7hWNcRMPEqe/0YRZeSv/0I7Q6eqvt/1lKe5 # kDdFEZkkC+ZmffCdBw04R7Qd38LVeBmQ5yHhXQZK1zTkN6P8a6a0pzRhpvy+OMff # kNsiVglL2IQ+aR0HBI5GdxrNDK8FXq90Izr+4H+uUrQ/Aur58oB14NxOzpBOLskg # a0Hm7y6kgwBT3rVgPhJAPqXd2IX8O1SdohL+SJ1ggmGiyjKhghLkMIIS4AYKKwYB # BAGCNwMDATGCEtAwghLMBgkqhkiG9w0BBwKgghK9MIISuQIBAzEPMA0GCWCGSAFl # AwQCAQUAMIIBUAYLKoZIhvcNAQkQAQSgggE/BIIBOzCCATcCAQEGCisGAQQBhFkK # AwEwMTANBglghkgBZQMEAgEFAAQgfEw/BHXcKpIzB7hvPwxLEzw8UtV/JhJyL9Jp # 3fhUz4sCBmEem32oghgSMjAyMTA5MTAwNjM4MzQuMDFaMASAAgH0oIHQpIHNMIHK # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxN # aWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNT # IEVTTjo0OUJDLUUzN0EtMjMzQzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgU2VydmljZaCCDjwwggTxMIID2aADAgECAhMzAAABSYAISrsJoDMLAAAAAAFJ # MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4X # DTIwMTExMjE4MjU1N1oXDTIyMDIxMTE4MjU1N1owgcoxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh # IE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjQ5QkMtRTM3QS0y # MzNDMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjAN # BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArxP7iQ+F2HbaejkqGT5KJRvadwln # MC5XtV5EDJbhHozcyEDHljLHfGW7o3X4yX1hv3N0jpmQcFAFhH1UnZQmjGsrfIEB # 5ChYpKA/22NUOMu0X3Wu7AicPAl3+cHy6s7BjLypIbQRRjoajf2KkJuY+wdHPaqt # dvIuNJa67KTpt9VXpflAKpVbdS+yW+TBijFphGqEKYLyxkKvTTwQzHYFY5tV8BRV # XKXgUVlp91W9FAlgOrakbhSy2jrIXmAgP48Os8N/lMCE5tyZp0FTCK/RwC4LymNr # ku5Z0iohGikY29aAdb9FNLPFj85IG1abMq6PlJpdr+1a3moM0M8L0fnVrQIDAQAB # o4IBGzCCARcwHQYDVR0OBBYEFFZ3mvGj77i0vDU11k/JqXPqbySBMB8GA1UdIwQY # MBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6 # Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1RpbVN0YVBD # QV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljVGltU3RhUENBXzIw # MTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwgw # DQYJKoZIhvcNAQELBQADggEBABDeeAs+IOzgSqnPIsKi8zXUI9jgk8Sph/o69wMq # fgGP9asOHe+wP+Fgj/IPD3U6GIguO1FwuhXdnqSdOzpXp+dH/PKxQM+PR+QVe15c # D44shNWVNLyyh4gnAdpom2pbou1tHbYOFuGyKou1JUJIQSxEUuZ5/sx2EIP6xUFE # L7yayqcdjTNDBYL9oZIuAdyZA1HxcKB8WGwACUdVLV2h/tDxtQVuci9Qy7OOdauw # /0bBxpr8dTOvkSkq96glInG30BGvL2j/pyidE/w2ub0qqUiqHHw/HcDN1J59LaaA # vpSpqkDA25ZYIRrOzVYabPvcRvebO23gjK9wLlGRvxOkUGkwggZxMIIEWaADAgEC # AgphCYEqAAAAAAACMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0 # aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0xMDA3MDEyMTM2NTVaFw0yNTA3MDEy # MTQ2NTVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk # BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIIBIjANBgkqhkiG # 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqR0NvHcRijog7PwTl/X6f2mUa3RUENWlCgCC # hfvtfGhLLF/Fw+Vhwna3PmYrW/AVUycEMR9BGxqVHc4JE458YTBZsTBED/FgiIRU # QwzXTbg4CLNC3ZOs1nMwVyaCo0UN0Or1R4HNvyRgMlhgRvJYR4YyhB50YWeRX4FU # sc+TTJLBxKZd0WETbijGGvmGgLvfYfxGwScdJGcSchohiq9LZIlQYrFd/XcfPfBX # day9ikJNQFHRD5wGPmd/9WbAA5ZEfu/QS/1u5ZrKsajyeioKMfDaTgaRtogINeh4 # HLDpmc085y9Euqf03GS9pAHBIAmTeM38vMDJRF1eFpwBBU8iTQIDAQABo4IB5jCC # AeIwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNVjOlyKMZDzQ3t8RhvFM2ha # hW1VMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYG # A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3Js # L3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcB # AQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kv # Y2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MIGgBgNVHSABAf8EgZUw # gZIwgY8GCSsGAQQBgjcuAzCBgTA9BggrBgEFBQcCARYxaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL1BLSS9kb2NzL0NQUy9kZWZhdWx0Lmh0bTBABggrBgEFBQcCAjA0 # HjIgHQBMAGUAZwBhAGwAXwBQAG8AbABpAGMAeQBfAFMAdABhAHQAZQBtAGUAbgB0 # AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAB+aIUQ3ixuCYP4FxAz2do6Ehb7Prpsz1 # Mb7PBeKp/vpXbRkws8LFZslq3/Xn8Hi9x6ieJeP5vO1rVFcIK1GCRBL7uVOMzPRg # Eop2zEBAQZvcXBf/XPleFzWYJFZLdO9CEMivv3/Gf/I3fVo/HPKZeUqRUgCvOA8X # 9S95gWXZqbVr5MfO9sp6AG9LMEQkIjzP7QOllo9ZKby2/QThcJ8ySif9Va8v/rbl # jjO7Yl+a21dA6fHOmWaQjP9qYn/dxUoLkSbiOewZSnFjnXshbcOco6I8+n99lmqQ # eKZt0uGc+R38ONiU9MalCpaGpL2eGq4EQoO4tYCbIjggtSXlZOz39L9+Y1klD3ou # OVd2onGqBooPiRa6YacRy5rYDkeagMXQzafQ732D8OE7cQnfXXSYIghh2rBQHm+9 # 8eEA3+cxB6STOvdlR3jo+KhIq/fecn5ha293qYHLpwmsObvsxsvYgrRyzR30uIUB # HoD7G4kqVDmyW9rIDVWZeodzOwjmmC3qjeAzLhIp9cAvVCch98isTtoouLGp25ay # p0Kiyc8ZQU3ghvkqmqMRZjDTu3QyS99je/WZii8bxyGvWbWu3EQ8l1Bx16HSxVXj # ad5XwdHeMMD9zOZN+w2/XU/pnR4ZOC+8z1gFLu8NoFA12u8JJxzVs341Hgi62jbb # 01+P3nSISRKhggLOMIICNwIBATCB+KGB0KSBzTCByjELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046NDlCQy1FMzdBLTIz # M0MxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAH # BgUrDgMCGgMVAD/lsa7nLvRkiJsAHQ+dgURrqah3oIGDMIGApH4wfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDk5XGdMCIYDzIw # MjEwOTEwMTM1NDM3WhgPMjAyMTA5MTExMzU0MzdaMHcwPQYKKwYBBAGEWQoEATEv # MC0wCgIFAOTlcZ0CAQAwCgIBAAICFOoCAf8wBwIBAAICEcIwCgIFAOTmwx0CAQAw # NgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgC # AQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQCQETUecOtFpZ0rCnelnDFaInFMDS7X # pRdKJX4xVYZfrkbIacbCFmdwY8oG0t+lGyjDiPQqw73LCaURsgG3CNtfVyAIYeXQ # qPq3cneCiqBFHDV+d4UtfIE7OVpQhUJYi+VtbnerN3rEWhoDSr2mn9WL8YwrbWz1 # zmg8i2fZ6d7qlDGCAw0wggMJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAABSYAISrsJoDMLAAAAAAFJMA0GCWCGSAFlAwQCAQUAoIIBSjAa # BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIPRXcvF7 # r/Fbgl9s2jfUfQ5V0CnqBP/b0r6SpzHhB6A0MIH6BgsqhkiG9w0BCRACLzGB6jCB # 5zCB5DCBvQQgKJX6/Fh9eO/M3YZ4EHUqnOw0C9LGcdDlxvWtH7noobIwgZgwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAUmACEq7CaAzCwAA # AAABSTAiBCDtBwqB+Xhv9kPVQn3gmxS1px8OT14OXdSxboNuXT1SdDANBgkqhkiG # 9w0BAQsFAASCAQAX/2iogZ5PFjjsLG2KjyNDcYz/GmRAQdgBoBc7ylr7ZwgE/BQe # 7SEmJ50JOCWV2Ew1D5oODSD+lI2ri/52+1I7OJGaEQTiRPCUYYQ0XxoozEVoWrzj # gG99B3FHDYU9M4MmH19mQ9+z7jao/gC2wcxgLTEcP7NGmiqQK58VFuN+vJnBXmfT # MzrhVswg2NRPsMgM/U2ZdUwSaLzmsB1IQ/d0BwgMyLF2VxI+a+YrooaJOH+3jPBV # Chi7pFQmMIQ1yBYFq+iFzlLuhhrN5ZmT/DMtqpbLumWF+1nfoRb9YBM++rNhTXvj # 52FJ64fDKJlQtTNBqt/x07IzrvfOnrgEh+mX # SIG # End signature block |