Set-StrictMode -Version Latest InModuleScope Pester { Describe "New-PesterState" { Context "TestNameFilter parameter is set" { $p = new-pesterstate -TestNameFilter "filter" it "sets the TestNameFilter property" { $p.TestNameFilter | should be "filter" } } Context "TagFilter parameter is set" { $p = new-pesterstate -TagFilter "tag","tag2" it "sets the TestNameFilter property" { $p.TagFilter | should be ("tag","tag2") } } Context "ExcludeTagFilter parameter is set" { $p = new-pesterstate -ExcludeTagFilter "tag3", "tag" it "sets the ExcludeTagFilter property" { $p.ExcludeTagFilter | should be ("tag3", "tag") } } Context "TagFilter and ExcludeTagFilter parameter are set" { $p = new-pesterstate -TagFilter "tag","tag2" -ExcludeTagFilter "tag3" it "sets the TestNameFilter property" { $p.TagFilter | should be ("tag","tag2") } it "sets the ExcludeTagFilter property" { $p.ExcludeTagFilter | should be ("tag3") } } Context "TestNameFilter and TagFilter parameter is set" { $p = new-pesterstate -TagFilter "tag","tag2" -testnamefilter "filter" it "sets the TestNameFilter property" { $p.TagFilter | should be ("tag","tag2") } it "sets the TestNameFilter property" { $p.TagFilter | should be ("tag","tag2") } } } Describe "Pester state object" { $p = New-PesterState Context "entering describe" { It "enters describe" { $p.EnterDescribe("describe") $p.CurrentDescribe | should be "Describe" } It "can enter describe only once" { { $p.EnterDescribe("describe") } | Should Throw } It "Reports scope correctly" { $p.Scope | should be "describe" } } Context "leaving describe" { It "leaves describe" { $p.LeaveDescribe() $p.CurrentDescribe | should benullOrEmpty } It "Reports scope correctly" { $p.Scope | should benullOrEmpty } } context "Entering It from Describe" { $p.EnterDescribe('Describe') It "Enters It successfully" { { $p.EnterTest("It") } | Should Not Throw } It "Reports scope correctly" { $p.Scope | Should Be 'It' } It "Cannot enter It after already entered" { { $p.EnterTest("It") } | Should Throw } It "Cannot enter Context from inside It" { { $p.EnterContext("Context") } | Should Throw } } context "Leaving It from Describe" { It "Leaves It to Describe" { { $p.LeaveTest() } | Should Not Throw } It "Reports scope correctly" { $p.Scope | Should Be 'Describe' } $p.LeaveDescribe() } Context "entering Context" { it "Cannot enter Context before Describe" { { $p.EnterContext("context") } | should throw } it "enters context from describe" { $p.EnterDescribe("Describe") $p.EnterContext("Context") $p.CurrentContext | should be "Context" } It "can enter context only once" { { $p.EnterContext("Context") } | Should Throw } It "Reports scope correctly" { $p.Scope | should be "Context" } } Context "leaving context" { it "cannot leave describe before leaving context" { { $p.LeaveDescribe() } | should throw } it "leaves context" { $p.LeaveContext() $p.CurrentContext | should BeNullOrEmpty } It "Returns from context to describe" { $p.Scope | should be "Describe" } $p.LeaveDescribe() } context "Entering It from Context" { $p.EnterDescribe('Describe') $p.EnterContext('Context') It "Enters It successfully" { { $p.EnterTest("It") } | Should Not Throw } It "Reports scope correctly" { $p.Scope | Should Be 'It' } It "Cannot enter It after already entered" { { $p.EnterTest("It") } | Should Throw } } context "Leaving It from Context" { It "Leaves It to Context" { { $p.LeaveTest() } | Should Not Throw } It "Reports scope correctly" { $p.Scope | Should Be 'Context' } $p.LeaveContext() $p.LeaveDescribe() } context "adding test result" { $p.EnterDescribe('Describe') it "adds passed test" { $p.AddTestResult("result","Passed", 100) $result = $p.TestResult[-1] $result.Name | should be "result" $result.passed | should be $true $result.Result | Should be "Passed" $result.time.ticks | should be 100 } it "adds failed test" { try { throw 'message' } catch { $e = $_ } $p.AddTestResult("result","Failed", 100, "fail", "stack","suite name",@{param='eters'},$e) $result = $p.TestResult[-1] $result.Name | should be "result" $result.passed | should be $false $result.Result | Should be "Failed" $result.time.ticks | should be 100 $result.FailureMessage | should be "fail" $result.StackTrace | should be "stack" $result.ParameterizedSuiteName | should be "suite name" $result.Parameters['param'] | should be 'eters' $result.ErrorRecord.Exception.Message | should be 'message' } it "adds skipped test" { $p.AddTestResult("result","Skipped", 100) $result = $p.TestResult[-1] $result.Name | should be "result" $result.passed | should be $true $result.Result | Should be "Skipped" $result.time.ticks | should be 100 } it "adds Pending test" { $p.AddTestResult("result","Pending", 100) $result = $p.TestResult[-1] $result.Name | should be "result" $result.passed | should be $true $result.Result | Should be "Pending" $result.time.ticks | should be 100 } it "can add test result before entering describe" { if ($p.CurrentContext) { $p.LeaveContext()} if ($p.CurrentDescribe) { $p.LeaveDescribe() } { $p.addTestResult(1,"Passed",1) } | should not throw } $p.LeaveContext() $p.LeaveDescribe() } Context "Path and TestNameFilter parameter is set" { $strict = New-PesterState -Strict It "Keeps Passed state" { $strict.AddTestResult("test","Passed") $result = $strict.TestResult[-1] $result.passed | should be $true $result.Result | Should be "Passed" } It "Keeps Failed state" { $strict.AddTestResult("test","Failed") $result = $strict.TestResult[-1] $result.passed | should be $false $result.Result | Should be "Failed" } It "Changes Pending state to Failed" { $strict.AddTestResult("test","Pending") $result = $strict.TestResult[-1] $result.passed | should be $false $result.Result | Should be "Failed" } It "Changes Skipped state to Failed" { $strict.AddTestResult("test","Skipped") $result = $strict.TestResult[-1] $result.passed | should be $false $result.Result | Should be "Failed" } } } Describe ConvertTo-FailureLines { $testPath = Join-Path $TestDrive test.ps1 $escapedTestPath = [regex]::Escape($testPath) It 'produces correct message lines.' { try { throw 'message' } catch { $e = $_ } $r = $e | ConvertTo-FailureLines $r.Message[0] | Should be 'RuntimeException: message' $r.Message.Count | Should be 1 } It 'failed should produces correct message lines.' { try { 'One' | Should be 'Two' } catch { $e = $_ } $r = $e | ConvertTo-FailureLines $r.Message[0] | Should be 'String lengths are both 3. Strings differ at index 0.' $r.Message[1] | Should be 'Expected: {Two}' $r.Message[2] | Should be 'But was: {One}' $r.Message[3] | Should be '-----------^' $r.Message[4] | Should match "'One' | Should be 'Two'" $r.Message.Count | Should be 5 } Context 'should fails in file' { Set-Content -Path $testPath -Value @' $script:IgnoreErrorPreference = 'SilentlyContinue' 'One' | Should be 'Two' '@ try { & $testPath } catch { $e = $_ } $r = $e | ConvertTo-FailureLines It 'produces correct message lines.' { $r.Message[0] | Should be 'String lengths are both 3. Strings differ at index 0.' $r.Message[1] | Should be 'Expected: {Two}' $r.Message[2] | Should be 'But was: {One}' $r.Message[3] | Should be '-----------^' $r.Message[4] | Should be "2: 'One' | Should be 'Two'" $r.Message.Count | Should be 5 } if ( $e | Get-Member -Name ScriptStackTrace ) { It 'produces correct trace lines.' { $r.Trace[0] | Should be "at , $testPath`: line 2" $r.Trace[1] -match 'at , .*\\Functions\\PesterState.Tests.ps1: line [0-9]*$' | Should be $true $r.Trace.Count | Should be 2 } } else { It 'produces correct trace lines.' { $r.Trace[0] | Should be "at line: 2 in $testPath" $r.Trace.Count | Should be 1 } } } Context 'exception thrown in nested functions in file' { Set-Content -Path $testPath -Value @' function f1 { throw 'f1 message' } function f2 { f1 } f2 '@ try { & $testPath } catch { $e = $_ } $r = $e | ConvertTo-FailureLines It 'produces correct message lines.' { $r.Message[0] | Should be 'RuntimeException: f1 message' } if ( $e | Get-Member -Name ScriptStackTrace ) { It 'produces correct trace lines.' { $r.Trace[0] | Should be "at f1, $testPath`: line 2" $r.Trace[1] | Should be "at f2, $testPath`: line 5" $r.Trace[2] | Should be "at , $testPath`: line 7" $r.Trace[3] -match 'at , .*\\Functions\\PesterState.Tests.ps1: line [0-9]*$' | Should be $true $r.Trace.Count | Should be 4 } } else { It 'produces correct trace lines.' { $r.Trace[0] | Should be "at line: 2 in $testPath" $r.Trace.Count | Should be 1 } } } Context 'nested exceptions thrown in file' { Set-Content -Path $testPath -Value @' try { throw New-Object System.ArgumentException( 'inner message', 'param_name' ) } catch { throw New-Object System.FormatException( 'outer message', $_.Exception ) } '@ try { & $testPath } catch { $e = $_ } $r = $e | ConvertTo-FailureLines It 'produces correct message lines.' { $r.Message[0] | Should be 'ArgumentException: inner message' $r.Message[1] | Should be 'Parameter name: param_name' $r.Message[2] | Should be 'FormatException: outer message' } if ( $e | Get-Member -Name ScriptStackTrace ) { It 'produces correct trace line.' { $r.Trace[0] | Should be "at , $testPath`: line 10" $r.Trace[1] -match 'at , .*\\Functions\\PesterState.Tests.ps1: line [0-9]*$' $r.Trace.Count | Should be 2 } } else { It 'produces correct trace line.' { $r.Trace[0] | Should be "at line: 10 in $testPath" $r.Trace.Count | Should be 1 } } } } } # SIG # Begin signature block # MIInjAYJKoZIhvcNAQcCoIInfTCCJ3kCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCzVis637nmKLfu # tBlmMuPbVllEbkewuwHWaKM6oNYSS6CCC8MwggXaMIIEwqADAgECAhMzAAABP8rF # KBkLiTVYAAAAAAE/MA0GCSqGSIb3DQEBCwUAMIGOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU # aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMjAeFw0yNTExMTMxOTU5NDJaFw0y # NjExMTAxOTU5NDJaMIGEMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS4wLAYDVQQDEyVNaWNyb3NvZnQgV2luZG93cyAzcmQgcGFydHkgQ29tcG9u # ZW50MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA2Zy0BnZmL5lF9IDS # IFBJ81NqCWCPLo2bRGJObUnrlezQw+FWEDU9+poMEyRjgbgafifNKY4TJ3e9Od4p # q56xMXBcGYVIe546gz4p68MQG4iXqqSBB4kk5jwk5U7igTCfZIga6PFElV6Wm7kv # Bdw14NVgdJZZDdmIc9TdaWbxrxAda9IMjZNQYfJZ/WVinf0mPnYM2hQwj4Gl4DGC # 0/KO6U+ayXHAtcS9qj2UJYB7rCyteNydGWHaMa5B8fzOpSNS3ioJfYcBwSjfcBRD # pemnEb5BcIF10FVuNA4foeMz5emIZaGGl8XxVC9K79Xwkc571Sv899qEdYP8ZFW9 # yVXY8l1ptvk4nD52nq9ld4HjWA+FHmhbhKggbjEVymQee7fOgEWKE3Uc73YnTMGf # TXzDwH9jYip5fwls08LWs0HCINu/iA/OG/vm1jrJdK5wcBgX2B0fZPdwgLTEgs0R # rSIyv9WucI0S6XffXJuUH+lziAX7RmCPhy5kZR1R3LB0GnBlAgMBAAGjggG3MIIB # szATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUt3RSDxhJIhKufhwaOyWL # 3nMDoeUwVAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5k # IE9wZXJhdGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwODA5KzUwNjIzOTAfBgNV # HSMEGDAWgBRhcaeHr/9p1SF2T1KTKAC+eRKrhDB0BgNVHR8EbTBrMGmgZ6BlhmNo # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBX # aW5kb3dzJTIwVGhpcmQlMjBQYXJ0eSUyMENvbXBvbmVudCUyMENBJTIwMjAxMi5j # cmwwgYEGCCsGAQUFBwEBBHUwczBxBggrBgEFBQcwAoZlaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBXaW5kb3dzJTIwVGhp # cmQlMjBQYXJ0eSUyMENvbXBvbmVudCUyMENBJTIwMjAxMi5jcnQwDAYDVR0TAQH/ # BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAk+iGdVNjQ2VMiNXhflILGybQmTUMM+qd # BZ3KErdJ9wkVTN/fMukvmp9y1iF8Sz1NUqDNqiKLofcL0XukOu5W3zAofFlAs2tR # vf0ArWKgRP5gjpqXeo3xWRM/1LBYTDhwDmylfh36AnfErB+aHyoIr9an+2KqeIqj # 5VvFPgwJ1n6ZTXZMhjvYnIol/P+vwVroo2XKwbOL1/c79xRj7X8Lqw+7sVoIA9/P # ytqdSDV1ClBjltkRpdgwvbSDPzycfvN8V5pPFfkrqrcIHjaL2pe76nqRsEIPqiVQ # SmqiaJV6iprCSDGJYC4/4EMLIDZ4uf+m0XHW3Qzlr7RLlMdsJKny7jCCBeEwggPJ # oAMCAQICCmELqsEAAAAAAAkwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290 # IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEyMDQxODIzNDgzOFoXDTI3 # MDQxODIzNTgzOFowgY4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xODA2BgNVBAMTL01pY3Jvc29mdCBXaW5kb3dzIFRoaXJkIFBhcnR5IENvbXBv # bmVudCBDQSAyMDEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo5ww # hAmnYy7PCkfw6iT5ozAgD15XMSaBmjEHslDUzmcJCGUKWqVLrtXtEC7npZm1n2gv # mItYAqwgtCnEcb0oHKX9PJtk5MXr32ElvPDuaL/Rp8t+KgKBTmRcDFOGeVcZN2G3 # mPkMoE4iWZv5Gy1nPCc8VpBm4/1/ZX0Phr01R+iKzPTajulqTqunVeyiiR7VM0VT # y/med73NLPkFuH90AR3o+xjhQ9EN6arcN2+9/rgP7R1NAUZOCqz8gujsVoMTjjoB # 7RRkdOpksmYQtmhtyHAAfVBILj1D7uAklcbNjsf9uOSVz91++5VeoQHNQ7EH16Qw # 7puGGipuwQtZonRviwIDAQABo4IBQzCCAT8wEAYJKwYBBAGCNxUBBAMCAQAwHQYD # VR0OBBYEFGFxp4ev/2nVIXZPUpMoAL55EquEMBkGCSsGAQQBgjcUAgQMHgoAUwB1 # AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaA # FNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8y # MDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAt # MDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQBaimfazNX9DSZBd78KRni0s94S # aSt3I8JlLwFf0gP0YbpQnS6MOXLzbD5qsR52bey384LczLvFaXAoc2YXP1Tr7gEW # SMRG2RuAroE6jQ95bWiwnuotPznTyjh+vV58CG4Z3MbC9DgzaGHiUkeD4QABVtK6 # y4eCBTEKQYtO539fX+1f0zktReuiE7/9HsKYQXFhFl/ICnAlfFlpMSTkcecKuwQX # 959yHsnSuxq+PQL+CQyyQ7RZGplTk5YhX+DWtyYBQpU2rCf9vvSFd2g9GL30vpiI # IhGGUhbzRewDlxBwh6NwQ3E828mGAxcM9XNbxn3hXGTt18VI1+0y4tGq08+n9ldO # Yfl362fyiLPeANoDj9CKNDc+HdhiuNKx8+Evi3I7gZZ8b/zsZnZyYBsk8qCJbVtt # AC7vKN2GhwXCtLnlvmTCKvJKFVyY4sQnhf9S42J+D7ICC9dmxwqy0z0gBBRQMlmD # Cn2b7Vo4EgFSui9eIHKOSvH953ECjDvhB77Jc/TdR9i077SkszC5iT52yrkAmFZ+ # q+qKuKXQOKtpdxMLFC/pqkEf97q9Ois0iu4Kq2PmY/eIJI4gDSs7nePCSVKsnx8O # OTtd1G5QauZ9UjqqfDMVKQ0mXgFYp06pPXqEb3Q/YJ/kMk82AK9tcdM+pkZlX4F0 # 8f7BcdpMoEFagt3xHzGCGx8wghsbAgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU # aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMgITMwAAAT/KxSgZC4k1WAAAAAAB # PzANBglghkgBZQMEAgEFAKCCARgwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEICJ0 # ahyqOOH6HkHqKc9bIQcBQ1JSo332MaJLpfaOedpCMFAGCisGAQQBgjcKAxwxQgxA # OTFDMzhGM0I0QjVCMjQzNUQxOUY2NEVGNzI4QzdCMDVGM0YwRTMwOEUwREVBNzg2 # ODAyODQ4Mzg0NzlDRDRDNDBaBgorBgEEAYI3AgEMMUwwSqAkgCIATQBpAGMAcgBv # AHMAbwBmAHQAIABXAGkAbgBkAG8AdwBzoSKAIGh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS93aW5kb3dzMA0GCSqGSIb3DQEBAQUABIIBgMpScZh99z5e4uYrgImXF081 # PIPQvL37J79XKIf5OkFUNVI/6MTOvCj9/Ju7/36HtHC6qiQXWrjUOyI4KKl3TQqI # dPEzCAMIlexCzmERbyeZeK33hTF/3LLFvqEyWHunYLw5aWdhH17LoA+Yz95ICCs9 # fBw6iTDCjX+r8lmfarnIxKw186/CuyaQu6NuzLteXbgKZYKjKR5mud/twINYcz5K # ZR4URvui3SLtYHKSgLTgkMPk71hNSxpO7+G0b9HmCNf5ThCyUoijQVER0BCASg3S # KOOtkNWDWFwXCG4xcApy9FmlhNVA3oqlRe3YoZy1w/5NbtTl1PukAK+UzwnRqyQ5 # ltPhiyOZzu7RBjhe4aAxf8V3pl3T+KplLucd9qR4C4KHwCUTqiDGx01FBV20yvRR # 5A0uyAtN1c1CXhzeTGyRTESzU55pxWe7gYsHCbtlK0PlUfRVEsudVVJ5DMjbNCL/ # d8n22laSwOi/x1i9x1VWfV/ETRCZRcaEfoPyttdJ7KGCF60wghepBgorBgEEAYI3 # AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheCAgEDMQ8wDQYJYIZIAWUDBAIB # BQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAx # MA0GCWCGSAFlAwQCAQUABCCtdSKUzSasrYsvPOKwBCVAlxdtZpAgOH5rKIL4iE5n # WQIGajVo+hmSGBMyMDI2MDcxMTA0MDMyNC4yMDdaMASAAgH0oIHZpIHWMIHTMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGll # bGQgVFNTIEVTTjo0QzFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgECAhMzAAACGCXZkgXi5+Xk # AAEAAAIYMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMB4XDTI1MDgxNDE4NDgyNVoXDTI2MTExMzE4NDgyNVowgdMxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJ # cmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1Mg # RVNOOjRDMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt # cCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsdzo6uuQ # JqAfxLnvEBfIvj6knK+p6bnMXEFZ/QjPOFywlcjDfzI8Dg1nzDlxm7/pqbvjWhyv # azKmFyO6qbPwClfRnI57h5OCixgpOOCGJJQIZSTiMgui3B8DPiFtJPcfzRt3Fsnx # jLXwBIjGgnjGfmQl7zejA1WoYL/qBmQhw/FDFTWebxfo4m0RCCOxf2qwj31aOjc2 # aYUePtLMXHsXKPFH0tp5SKIF/9tJxRSg0NYEvQqVilje8aQkPd3qzAux2Mc5HMSK # 4NMTtVVCYAWDUZ4p+6iDI9t5BNCBIsf5ooFNUWtxCqnpFYiLYkHfFfxhVUBZ8LGG # xYsA36snD65s2Hf4t86k0e8WelH/usfhYqOM3z2yaI8rg08631IkwqUzyQoEPqMs # HgBem1xpmOGSIUnVvTsAv+lmECL2RqrcOZlZax8K0aiij8h6UkWBN2IA/ikackTS # GVRBQmWWZuLFWV/T4xuNzscC0X7xo4fetgpsqaEA0jY/QevkTvLv4OlNN9eOL8LN # h7Vm0R65P7oabOQDqtUFAwCgjgPJ0iV/jQCaMAcO3SYpG5wSAYiJkk4XLjNSlNxU # 2Idjs1sORhl7s7LC6hOb7bVAHVwON74GxfFNiEIA6BfudANjpQJ0nUc/ppEXpT4p # gDBHsYtV8OyKSjKsIxOdFR7fIJIjDc8DvUkCAwEAAaOCAUkwggFFMB0GA1UdDgQW # BBQkLqHEXDobY7dHuoQCBa4sX7aL0TAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJl # pxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx # MCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3Rh # bXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEA # nkjRhjwPgdoIpvt4YioT/j0LWuBxF3ARBKXDENggraKvC0oRPwbjAmsXnPEmtuo5 # MD8uJ9Xw9eYrxqqkK4DF9snZMrHMfooxCa++1irLz8YoozC4tci+a4N37Sbke1pt # 1xs9qZtvkPgZGWn5BcwVfmAwSZLHi2CuZ06Y0/X+t6fNBnrbMVovNaDX4WPdyI9G # EzxfIggDsck2Ipo4VXL/Arcz7p2F7bEZGRuyxjgMC+woCkDJaH/yk/wcZpAsixe4 # POdN0DW6Zb35O3Dg3+a6prANMc3WIdvfKDl75P0aqcQbQAR7b0f4gH4NMkUct0Wm # 4GN5KhsE1YK7V/wAqDKmK4jx3zLz3a8Hsxa9HB3GyitlmC5sDhOl4QTGN5kRi6oC # oV4hK+kIFgnkWjHhSRNomz36QnbCSG/BHLEm2GRU9u3/I4zUd9E1AC97IJEGfwb+ # 0NWb3QEcrkypdGdWwl0LEObhrQR9B1V7+edcyNmsX0p2BX0rFpd1PkXJSbxf8IcE # iw/bkNgagZE+VlDtxXeruLdo5k3lGOv7rPYuOEaoZYxDvZtpHP9P36wmW4INjR6N # Inn2UM+krP/xeLnRbDBkm9RslnoDhVraliKDH62BxhcgL9tiRgOHlcI0wqvVWLdv # 8yW8rxkawOlhCRqT3EKECW8ktUAPwNbBULkT+oWcvBcwggdxMIIFWaADAgECAhMz # AAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9v # dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0z # MDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjAN # BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP9 # 7pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMM # tY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gm # U3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130 # /o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP # 3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7 # vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+A # utuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz # 1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6 # EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/Zc # UlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZy # acaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJ # KwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVd # AF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8G # CCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3Mv # UmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQC # BAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYD # VR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZF # aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9v # Q2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcw # AoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJB # dXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cB # MSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7 # bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/ # SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2 # EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2Fz # Lixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0 # /fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9 # swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJ # Xk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+ # pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW # 4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N # 7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEwggEBoYHZpIHWMIHTMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGll # bGQgVFNTIEVTTjo0QzFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAnWtGrXWiuNE8QrKfm4Ct # Gr57z+mggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkq # hkiG9w0BAQsFAAIFAO38PkUwIhgPMjAyNjA3MTEwNDAwMDVaGA8yMDI2MDcxMjA0 # MDAwNVowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7fw+RQIBADAHAgEAAgIEsTAH # AgEAAgISYjAKAgUA7f2PxQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZ # CgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBZ # n8QIRh4zw5J5vmKuIHD39a4pFEGCX41IHhIJmuCQE0FmbKR/yRhPSFsMCzkTh/mF # HbwDP1QgEmL238n9bi2rKIM1C7i/N/pUp3vIhrSwphsG7/G9liVpcuNBrdDMLmC/ # 8kHkcr5YEoUxy/NgAxpJ7DHGaw5vYbzAGUSiJyiAICLYDzKcprrGuOdfbNQZXzhZ # NDqB27XvVfPvNjn+0q9ymYj6C7cWCFnEdoYEYYKtbBIfYaHHlzwzaKvNJa4q7Pga # c+vM/HLCWQhl+OX6fF1oshwJPjLw5EWj3gJZTddYePyYVG4V7wik29i7uCqVu5mF # KrezQXYQ5ujX+Uq8di9UMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgUENBIDIwMTACEzMAAAIYJdmSBeLn5eQAAQAAAhgwDQYJYIZIAWUDBAIBBQCg # ggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg # SItAwAci27pj36dl0qm1oNOmA4lvGPNG2IDq16kpS00wgfoGCyqGSIb3DQEJEAIv # MYHqMIHnMIHkMIG9BCCZE9yJuOTItIwWaES6lzGKK1XcSoz1ynRzaOVzx9eFajCB # mDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk # BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACGCXZkgXi # 5+XkAAEAAAIYMCIEIJktZFk11cPk0fjj7mqa+6+A6KFS4CjNf7mfWCjRCR84MA0G # CSqGSIb3DQEBCwUABIICAHvIqR5FjVWlfyAlC7rIjEiHCbi5UeTz8VUTaSGR/Shr # mTWLCfD+Tv3OG4cG1r4Z+tign4s1TA09Q5kDXFU93Qmk/iK/iHkRJ/eYONPIpdK0 # aC9V4wp/PKR1YMb+VdUFlfRGzZ7vUntIgICkKNcgZzMmnFIidnJcBtthREuily3a # K3DG8ck2vdHPzZJMU/jqZEbbL8EpBEDLNxkutpZUVdngNBoC7EJEk43XZPngdxCY # hmUiSsdNiMktP6rzabjuvpx9Y0rSmPi2HY56fJ74KA0scL0LPgbbYobVTvkHpgK/ # lPfWWgxuzL4tbC1Ccqk+0JvcFkfeljjWs1Wl0Fst9JjsHGIQtcssMmTqGsO1Fe0l # PtIAAEvVEg8PWAYLwLmfSZ1WiTEmsGUrWPa3hHymvvJAFvTPYBXoptsnTX+KGG+N # O9+udkYYk/7QYSycQXaYKK1jVlXZpqujNM3JV5rk6X1dUe8TEZ71+3Kh3wyxiBAf # xm+ummAY8XQEgIyyf+vJVQEmzdr9t7XkM6WQtsLKzzs04EdQ3mJUGDKeyX3kfUNU # jIND4c/6Ji8aB9xXzd3a4L0IilRYWftwlyaQa62+4OPRP6sKwIqkIHuHIxUXvndo # 7cgu/QFibN1SZjhjwQz57EEh76KqAzasIWjUP6LYPweTJFhacMsYiIfV53p0zUtr # SIG # End signature block