library/xPSDesiredStateConfiguration/9.2.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psm1
$modulePath = Split-Path -Path $PSScriptRoot -Parent # Import the shared modules Import-Module -Name (Join-Path -Path $modulePath ` -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') # Import Localization Strings $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' New-Variable -Name DscWebServiceDefaultAppPoolName -Value 'PSWS' -Option ReadOnly -Force -Scope Script <# .SYNOPSIS Validate supplied configuration to setup the PSWS Endpoint Function checks for the existence of PSWS Schema files, IIS config Also validate presence of IIS on the target machine #> function Initialize-Endpoint { [CmdletBinding()] param ( [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $appPool, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $site, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $path, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $cfgfile, [Parameter()] [System.Int32] $port, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $app, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $applicationPoolIdentityType, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $svc, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $mof, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $dispatch, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $asax, [Parameter()] [ValidateNotNullOrEmpty()] [System.String[]] $dependentBinaries, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $language, [Parameter()] [ValidateNotNullOrEmpty()] [System.String[]] $dependentMUIFiles, [Parameter()] [System.String[]] $psFiles, [Parameter()] [System.Boolean] $removeSiteFiles = $false, [Parameter()] [System.String] $certificateThumbPrint, [Parameter()] [System.Boolean] $enable32BitAppOnWin64 ) if ($certificateThumbPrint -ne 'AllowUnencryptedTraffic') { Write-Verbose -Message 'Verify that the certificate with the provided thumbprint exists in CERT:\LocalMachine\MY\' $certificate = Get-ChildItem -Path CERT:\LocalMachine\MY\ | Where-Object -FilterScript { $_.Thumbprint -eq $certificateThumbPrint } if (!$Certificate) { throw "ERROR: Certificate with thumbprint $certificateThumbPrint does not exist in CERT:\LocalMachine\MY\" } } Test-IISInstall # First remove the site so that the binding count on the application pool is reduced Update-Site -siteName $site -siteAction Remove Remove-AppPool -appPool $appPool # Check for existing binding, there should be no binding with the same port $allWebBindingsOnPort = Get-WebBinding | Where-Object -FilterScript { $_.BindingInformation -eq "*:$($port):" } if ($allWebBindingsOnPort.Count -gt 0) { throw "ERROR: Port $port is already used, please review existing sites and change the port to be used." } if ($removeSiteFiles) { if (Test-Path -Path $path) { Remove-Item -Path $path -Recurse -Force } } Copy-PSWSConfigurationToIISEndpointFolder -path $path ` -cfgfile $cfgfile ` -svc $svc ` -mof $mof ` -dispatch $dispatch ` -asax $asax ` -dependentBinaries $dependentBinaries ` -language $language ` -dependentMUIFiles $dependentMUIFiles ` -psFiles $psFiles New-IISWebSite -site $site ` -path $path ` -port $port ` -app $app ` -apppool $appPool ` -applicationPoolIdentityType $applicationPoolIdentityType ` -certificateThumbPrint $certificateThumbPrint ` -enable32BitAppOnWin64 $enable32BitAppOnWin64 } <# .SYNOPSIS Validate if IIS and all required dependencies are installed on the target machine #> function Test-IISInstall { [CmdletBinding()] param () Write-Verbose -Message 'Checking IIS requirements' $iisVersion = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\InetStp -ErrorAction silentlycontinue).MajorVersion if ($iisVersion -lt 7) { throw "ERROR: IIS Version detected is $iisVersion , must be running higher than 7.0" } $wsRegKey = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\Services\W3SVC -ErrorAction silentlycontinue).ImagePath if ($null -eq $wsRegKey) { throw 'ERROR: Cannot retrive W3SVC key. IIS Web Services may not be installed' } if ((Get-Service w3svc).Status -ne 'running') { throw 'ERROR: service W3SVC is not running' } } <# .SYNOPSIS Verify if a given IIS Site exists #> function Test-ForIISSite { [CmdletBinding()] [OutputType([System.Boolean])] param ( [Parameter()] [System.String] $siteName ) if (Get-Website -Name $siteName) { return $true } return $false } <# .SYNOPSIS Perform an action (such as stop, start, delete) for a given IIS Site #> function Update-Site { param ( [Parameter(ParameterSetName = 'SiteName', Mandatory = $true, Position = 0)] [ValidateNotNullOrEmpty()] [System.String] $siteName, [Parameter(ParameterSetName = 'Site', Mandatory = $true, Position = 0)] [System.Object] $site, [Parameter(ParameterSetName = 'SiteName', Mandatory = $true, Position = 1)] [Parameter(ParameterSetName = 'Site', Mandatory = $true, Position = 1)] [System.String] [ValidateSet('Start', 'Stop', 'Remove')] $siteAction ) if ('SiteName' -eq $PSCmdlet.ParameterSetName) { $site = Get-Website -Name $siteName } if ($site) { switch ($siteAction) { 'Start' { Write-Verbose -Message "Starting IIS Website [$($site.name)]" Start-Website -Name $site.name } 'Stop' { if ('Started' -eq $site.state) { Write-Verbose -Message "Stopping WebSite $($site.name)" $website = Stop-Website -Name $site.name -Passthru if ('Started' -eq $website.state) { throw "Unable to stop WebSite $($site.name)" } <# There may be running requests, wait a little I had an issue where the files were still in use when I tried to delete them #> Write-Verbose -Message 'Waiting for IIS to stop website' Start-Sleep -Milliseconds 1000 } else { Write-Verbose -Message "IIS Website [$($site.name)] already stopped" } } 'Remove' { Update-Site -site $site -siteAction Stop Write-Verbose -Message "Removing IIS Website [$($site.name)]" Remove-Website -Name $site.name } } } else { Write-Verbose -Message "IIS Website [$siteName] not found" } } <# .SYNOPSIS Returns the list of bound sites and applications for a given IIS Application pool .PARAMETER appPool The application pool name #> function Get-AppPoolBinding { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $AppPool ) if (Test-Path -Path "IIS:\AppPools\$AppPool") { $sites = Get-WebConfigurationProperty ` -Filter "/system.applicationHost/sites/site/application[@applicationPool=`'$AppPool`'and @path='/']/parent::*" ` -PSPath 'machine/webroot/apphost' ` -Name name $apps = Get-WebConfigurationProperty ` -Filter "/system.applicationHost/sites/site/application[@applicationPool=`'$AppPool`'and @path!='/']" ` -PSPath 'machine/webroot/apphost' ` -Name path $sites, $apps | ForEach-Object { $_.Value } } } <# .SYNOPSIS Delete the given IIS Application Pool. This is required to cleanup any existing conflicting apppools before setting up the endpoint. #> function Remove-AppPool { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $AppPool ) if ($DscWebServiceDefaultAppPoolName -eq $AppPool) { # Without this tests we may get a breaking error here, despite SilentlyContinue if (Test-Path -Path "IIS:\AppPools\$AppPool") { $bindingCount = (Get-AppPoolBinding -AppPool $AppPool | Measure-Object).Count if (0 -ge $bindingCount) { Remove-WebAppPool -Name $AppPool -ErrorAction SilentlyContinue } else { Write-Verbose -Message "Application pool [$AppPool] can't be deleted because it's still bound to a site or application" } } } else { Write-Verbose -Message "ApplicationPool can't be deleted because the name is different from built-in name [$DscWebServiceDefaultAppPoolName]." } } <# .SYNOPSIS Generate an IIS Site Id while setting up the endpoint. The Site Id will be the max available in IIS config + 1. #> function New-SiteID { [CmdletBinding()] param () return ((Get-Website | Foreach-Object -Process { $_.Id } | Measure-Object -Maximum).Maximum + 1) } <# .SYNOPSIS Copies the supplied PSWS config files to the IIS endpoint in inetpub #> function Copy-PSWSConfigurationToIISEndpointFolder { [CmdletBinding()] param ( [Parameter()] [System.String] $path, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $cfgfile, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $svc, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $mof, [Parameter()] [System.String] $dispatch, [Parameter()] [ValidateScript({Test-Path -Path $_})] [System.String] $asax, [Parameter()] [System.String[]] $dependentBinaries, [Parameter()] [System.String] $language, [Parameter()] [System.String[]] $dependentMUIFiles, [Parameter()] [System.String[]] $psFiles ) if (!(Test-Path -Path $path)) { $null = New-Item -ItemType container -Path $path } foreach ($dependentBinary in $dependentBinaries) { if (!(Test-Path -Path $dependentBinary)) { throw "ERROR: $dependentBinary does not exist" } } Write-Verbose -Message 'Create the bin folder for deploying custom dependent binaries required by the endpoint' $binFolderPath = Join-Path -Path $path -ChildPath 'bin' $null = New-Item -Path $binFolderPath -ItemType 'directory' -Force Copy-Item -Path $dependentBinaries -Destination $binFolderPath -Force foreach ($psFile in $psFiles) { if (!(Test-Path -Path $psFile)) { throw "ERROR: $psFile does not exist" } Copy-Item -Path $psFile -Destination $path -Force } Copy-Item -Path $cfgfile (Join-Path -Path $path -ChildPath 'web.config') -Force Copy-Item -Path $svc -Destination $path -Force Copy-Item -Path $mof -Destination $path -Force if ($dispatch) { Copy-Item -Path $dispatch -Destination $path -Force } if ($asax) { Copy-Item -Path $asax -Destination $path -Force } } <# .SYNOPSIS Setup IIS Apppool, Site and Application #> function New-IISWebSite { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $site, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $path, [Parameter(Mandatory = $true)] [System.Int32] $port, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $app, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $appPool, [Parameter()] [System.String] $applicationPoolIdentityType, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $certificateThumbPrint, [Parameter()] [System.Boolean] $enable32BitAppOnWin64 ) $siteID = New-SiteID if (Test-Path IIS:\AppPools\$appPool) { Write-Verbose -Message "Application Pool [$appPool] already exists" } else { Write-Verbose -Message "Adding App Pool [$appPool]" $null = New-WebAppPool -Name $appPool Write-Verbose -Message 'Set App Pool Properties' $appPoolIdentity = 4 if ($applicationPoolIdentityType) { # LocalSystem = 0, LocalService = 1, NetworkService = 2, SpecificUser = 3, ApplicationPoolIdentity = 4 switch ($applicationPoolIdentityType) { 'LocalSystem' { $appPoolIdentity = 0 } 'LocalService' { $appPoolIdentity = 1 } 'NetworkService' { $appPoolIdentity = 2 } 'ApplicationPoolIdentity' { $appPoolIdentity = 4 } default { throw "Invalid value [$applicationPoolIdentityType] for parameter -applicationPoolIdentityType" } } } $appPoolItem = Get-Item -Path IIS:\AppPools\$appPool $appPoolItem.managedRuntimeVersion = 'v4.0' $appPoolItem.enable32BitAppOnWin64 = $enable32BitAppOnWin64 $appPoolItem.processModel.identityType = $appPoolIdentity $appPoolItem | Set-Item } Write-Verbose -Message 'Add and Set Site Properties' if ($certificateThumbPrint -eq 'AllowUnencryptedTraffic') { $null = New-WebSite -Name $site -Id $siteID -Port $port -IPAddress "*" -PhysicalPath $path -ApplicationPool $appPool } else { $null = New-WebSite -Name $site -Id $siteID -Port $port -IPAddress "*" -PhysicalPath $path -ApplicationPool $appPool -Ssl # Remove existing binding for $port Remove-Item IIS:\SSLBindings\0.0.0.0!$port -ErrorAction Ignore # Create a new binding using the supplied certificate $null = Get-Item CERT:\LocalMachine\MY\$certificateThumbPrint | New-Item IIS:\SSLBindings\0.0.0.0!$port } Update-Site -siteName $site -siteAction Start } <# .SYNOPSIS Enable & Clear PSWS Operational/Analytic/Debug ETW Channels. #> function Enable-PSWSETW { # Disable Analytic Log $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Analytic /e:false /q # Disable Debug Log $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Debug /e:false /q # Clear Operational Log $null = & $script:wevtutil cl Microsoft-Windows-ManagementOdataService/Operational # Enable/Clear Analytic Log $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Analytic /e:true /q # Enable/Clear Debug Log $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Debug /e:true /q } <# .SYNOPSIS Create PowerShell WebServices IIS Endpoint .DESCRIPTION Creates a PSWS IIS Endpoint by consuming PSWS Schema and related dependent files .EXAMPLE New PSWS Endpoint [@ http://Server:39689/PSWS_Win32Process] by consuming PSWS Schema Files and any dependent scripts/binaries: New-PSWSEndpoint -site Win32Process -path $env:SystemDrive\inetpub\PSWS_Win32Process -cfgfile Win32Process.config -port 39689 -app Win32Process -svc PSWS.svc -mof Win32Process.mof -dispatch Win32Process.xml -dependentBinaries ConfigureProcess.ps1, Rbac.dll -psFiles Win32Process.psm1 #> function New-PSWSEndpoint { [CmdletBinding()] param ( # Unique Name of the IIS Site [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $site = 'PSWS', # Physical path for the IIS Endpoint on the machine (under inetpub) [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $path = "$env:SystemDrive\inetpub\PSWS", # Web.config file [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $cfgfile = 'web.config', # Port # for the IIS Endpoint [Parameter()] [System.Int32] $port = 8080, # IIS Application Name for the Site [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $app = 'PSWS', # IIS Application Name for the Site [Parameter()] [System.String] $appPool, # IIS App Pool Identity Type - must be one of LocalService, LocalSystem, NetworkService, ApplicationPoolIdentity [Parameter()] [ValidateSet('LocalService', 'LocalSystem', 'NetworkService', 'ApplicationPoolIdentity')] [System.String] $applicationPoolIdentityType, # WCF Service SVC file [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $svc = 'PSWS.svc', # PSWS Specific MOF Schema File [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $mof, # PSWS Specific Dispatch Mapping File [Optional] [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $dispatch, # Global.asax file [Optional] [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $asax, # Any dependent binaries that need to be deployed to the IIS endpoint, in the bin folder [Parameter()] [ValidateNotNullOrEmpty()] [System.String[]] $dependentBinaries, # MUI Language [Optional] [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $language, # Any dependent binaries that need to be deployed to the IIS endpoint, in the bin\mui folder [Optional] [Parameter()] [ValidateNotNullOrEmpty()] [System.String[]] $dependentMUIFiles, # Any dependent PowerShell Scipts/Modules that need to be deployed to the IIS endpoint application root [Parameter()] [System.String[]] $psFiles, # True to remove all files for the site at first, false otherwise [Parameter()] [System.Boolean] $removeSiteFiles = $false, # Enable and Clear PSWS ETW [Parameter()] [System.Management.Automation.SwitchParameter] $EnablePSWSETW, # Thumbprint of the Certificate in CERT:\LocalMachine\MY\ for Pull Server [Parameter()] [System.String] $certificateThumbPrint = 'AllowUnencryptedTraffic', # When this property is set to true, Pull Server will run on a 32 bit process on a 64 bit machine [Parameter()] [System.Boolean] $Enable32BitAppOnWin64 = $false ) if (-not $appPool) { $appPool = $DscWebServiceDefaultAppPoolName } $script:wevtutil = "$env:windir\system32\Wevtutil.exe" $svcName = Split-Path $svc -Leaf $protocol = 'https:' if ($certificateThumbPrint -eq 'AllowUnencryptedTraffic') { $protocol = 'http:' } # Get Machine Name $cimInstance = Get-CimInstance -ClassName Win32_ComputerSystem -Verbose:$false Write-Verbose -Message "Setting up endpoint at - $protocol//$($cimInstance.Name):$port/$svcName" Initialize-Endpoint ` -appPool $appPool ` -site $site ` -path $path ` -cfgfile $cfgfile ` -port $port ` -app $app ` -applicationPoolIdentityType $applicationPoolIdentityType ` -svc $svc ` -mof $mof ` -dispatch $dispatch ` -asax $asax ` -dependentBinaries $dependentBinaries ` -language $language ` -dependentMUIFiles $dependentMUIFiles ` -psFiles $psFiles ` -removeSiteFiles $removeSiteFiles ` -certificateThumbPrint $certificateThumbPrint ` -enable32BitAppOnWin64 $Enable32BitAppOnWin64 if ($EnablePSWSETW) { Enable-PSWSETW } } <# .SYNOPSIS Removes a DSC WebServices IIS Endpoint .DESCRIPTION Removes a PSWS IIS Endpoint .EXAMPLE Remove the endpoint with the specified name: Remove-PSWSEndpoint -siteName PSDSCPullServer #> function Remove-PSWSEndpoint { [CmdletBinding()] param ( # Unique Name of the IIS Site [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $siteName ) # Get the site to remove $site = Get-Website -Name $siteName if ($site) { # And the pool it is using $pool = $site.applicationPool # Get the path so we can delete the files $filePath = $site.PhysicalPath # Remove the actual site. Update-Site -site $site -siteAction Remove # Remove the files for the site if (Test-Path -Path $filePath) { Get-ChildItem -Path $filePath -Recurse | Remove-Item -Recurse -Force Remove-Item -Path $filePath -Force } Remove-AppPool -appPool $pool } else { Write-Verbose -Message "Website with name [$siteName] does not exist" } } <# .SYNOPSIS Set the option into the web.config for an endpoint .DESCRIPTION Set the options into the web.config for an endpoint allowing customization. #> function Set-AppSettingsInWebconfig { [CmdletBinding()] param ( # Physical path for the IIS Endpoint on the machine (possibly under inetpub) [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $Path, # Key to add/update [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $Key, # Value [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $Value ) $webconfig = Join-Path -Path $Path -ChildPath 'web.config' [System.Boolean] $Found = $false if (Test-Path -Path $webconfig) { $xml = [System.Xml.XmlDocument] (Get-Content -Path $webconfig) $root = $xml.get_DocumentElement() foreach ($item in $root.appSettings.add) { if ($item.key -eq $Key) { $item.value = $Value; $Found = $true; } } if (-not $Found) { $newElement = $xml.CreateElement('add') $nameAtt1 = $xml.CreateAttribute('key') $nameAtt1.psbase.value = $Key; $null = $newElement.SetAttributeNode($nameAtt1) $nameAtt2 = $xml.CreateAttribute('value') $nameAtt2.psbase.value = $Value; $null = $newElement.SetAttributeNode($nameAtt2) $null = $xml.configuration['appSettings'].AppendChild($newElement) } } $xml.Save($webconfig) } <# .SYNOPSIS Set the binding redirect setting in the web.config to redirect 10.0.0.0 version of microsoft.isam.esent.interop to 6.3.0.0. .DESCRIPTION This function creates the following section in the web.config: <runtime> <assemblyBinding xmlns='urn:schemas-microsoft-com:asm.v1'> <dependentAssembly> <assemblyIdentity name='microsoft.isam.esent.interop' publicKeyToken='31bf3856ad364e35' /> <bindingRedirect oldVersion='10.0.0.0' newVersion='6.3.0.0' /> </dependentAssembly> </assemblyBinding> </runtime> #> function Set-BindingRedirectSettingInWebConfig { [CmdletBinding()] param ( # Physical path for the IIS Endpoint on the machine (possibly under inetpub) [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $path, # old version of the assembly [Parameter()] [System.String] $oldVersion = '10.0.0.0', # new version to redirect to [Parameter()] [System.String] $newVersion = '6.3.0.0' ) $webconfig = Join-Path $path 'web.config' if (Test-Path -Path $webconfig) { $xml = [System.Xml.XmlDocument] (Get-Content -Path $webconfig) if (-not($xml.get_DocumentElement().runtime)) { # Create the <runtime> section $runtimeSetting = $xml.CreateElement('runtime') # Create the <assemblyBinding> section $assemblyBindingSetting = $xml.CreateElement('assemblyBinding') $xmlnsAttribute = $xml.CreateAttribute('xmlns') $xmlnsAttribute.Value = 'urn:schemas-microsoft-com:asm.v1' $assemblyBindingSetting.Attributes.Append($xmlnsAttribute) # The <assemblyBinding> section goes inside <runtime> $null = $runtimeSetting.AppendChild($assemblyBindingSetting) # Create the <dependentAssembly> section $dependentAssemblySetting = $xml.CreateElement('dependentAssembly') # The <dependentAssembly> section goes inside <assemblyBinding> $null = $assemblyBindingSetting.AppendChild($dependentAssemblySetting) # Create the <assemblyIdentity> section $assemblyIdentitySetting = $xml.CreateElement('assemblyIdentity') $nameAttribute = $xml.CreateAttribute('name') $nameAttribute.Value = 'microsoft.isam.esent.interop' $publicKeyTokenAttribute = $xml.CreateAttribute('publicKeyToken') $publicKeyTokenAttribute.Value = '31bf3856ad364e35' $null = $assemblyIdentitySetting.Attributes.Append($nameAttribute) $null = $assemblyIdentitySetting.Attributes.Append($publicKeyTokenAttribute) # <assemblyIdentity> section goes inside <dependentAssembly> $dependentAssemblySetting.AppendChild($assemblyIdentitySetting) # Create the <bindingRedirect> section $bindingRedirectSetting = $xml.CreateElement('bindingRedirect') $oldVersionAttribute = $xml.CreateAttribute('oldVersion') $newVersionAttribute = $xml.CreateAttribute('newVersion') $oldVersionAttribute.Value = $oldVersion $newVersionAttribute.Value = $newVersion $null = $bindingRedirectSetting.Attributes.Append($oldVersionAttribute) $null = $bindingRedirectSetting.Attributes.Append($newVersionAttribute) # The <bindingRedirect> section goes inside <dependentAssembly> section $dependentAssemblySetting.AppendChild($bindingRedirectSetting) # The <runtime> section goes inside <Configuration> section $xml.configuration.AppendChild($runtimeSetting) $xml.Save($webconfig) } } } # SIG # Begin signature block # MIIjYAYJKoZIhvcNAQcCoIIjUTCCI00CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBOcQYq6HvXspzG # L9RSvnmwDQeecWYqS8s3wX+Qlqhcy6CCHVkwggUaMIIEAqADAgECAhADBbuGIbCh # Y1+/3q4SBOdtMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV # BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcN # MjAwNTEyMDAwMDAwWhcNMjMwNjA4MTIwMDAwWjBXMQswCQYDVQQGEwJVUzERMA8G # A1UECBMIVmlyZ2luaWExDzANBgNVBAcTBlZpZW5uYTERMA8GA1UEChMIZGJhdG9v # bHMxETAPBgNVBAMTCGRiYXRvb2xzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB # CgKCAQEAvL9je6vjv74IAbaY5rXqHxaNeNJO9yV0ObDg+kC844Io2vrHKGD8U5hU # iJp6rY32RVprnAFrA4jFVa6P+sho7F5iSVAO6A+QZTHQCn7oquOefGATo43NAadz # W2OWRro3QprMPZah0QFYpej9WaQL9w/08lVaugIw7CWPsa0S/YjHPGKQ+bYgI/kr # EUrk+asD7lvNwckR6pGieWAyf0fNmSoevQBTV6Cd8QiUfj+/qWvLW3UoEX9ucOGX # 2D8vSJxL7JyEVWTHg447hr6q9PzGq+91CO/c9DWFvNMjf+1c5a71fEZ54h1mNom/ # XoWZYoKeWhKnVdv1xVT1eEimibPEfQIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAU # WsS5eyoKo6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFPDAoPu2A4BDTvsJ193ferHL # 454iMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8E # cDBuMDWgM6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVk # LWNzLWcxLmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTIt # YXNzdXJlZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggr # BgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEw # gYQGCCsGAQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl # cnQuY29tME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v # RGlnaUNlcnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/ # BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAj835cJUMH9Y2pBKspjznNJwcYmOxeBcH # Ji+yK0y4bm+j44OGWH4gu/QJM+WjZajvkydJKoJZH5zrHI3ykM8w8HGbYS1WZfN4 # oMwi51jKPGZPw9neGS2PXrBcKjzb7rlQ6x74Iex+gyf8z1ZuRDitLJY09FEOh0BM # LaLh+UvJ66ghmfIyjP/g3iZZvqwgBhn+01fObqrAJ+SagxJ/21xNQJchtUOWIlxR # kuUn9KkuDYrMO70a2ekHODcAbcuHAGI8wzw4saK1iPPhVTlFijHS+7VfIt/d/18p # MLHHArLQQqe1Z0mTfuL4M4xCUKpebkH8rI3Fva62/6osaXLD0ymERzCCBTAwggQY # oAMCAQICEAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X # DTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTAT # BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEx # MC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBD # QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsx # SRnP0PtFmbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawO # eSg6funRZ9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJ # RdQtoaPpiCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEc # z+ryCuRXu0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whk # PlKWwfIPEvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8l # k9ECAwEAAaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQD # AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF # BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw # Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu # Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20v # RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5k # aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARI # MEYwOAYKYIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdp # Y2VydC5jb20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg # +S32ZXUOWDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG # 9w0BAQsFAAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/E # r4v97yrfIFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3 # nEZOXP+QsRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpo # aK+bp1wgXNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW # 6Fkd6fp0ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ # 92JuoVP6EpQYhS6SkepobEQysmah5xikmmRR7zCCBY0wggR1oAMCAQICEA6bGI75 # 0C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIG # A1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAw # MFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln # aUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuE # DcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNw # wrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs0 # 6wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e # 5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtV # gkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85 # tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+S # kjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1Yxw # LEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzl # DlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFr # b7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATow # ggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiu # HA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQE # AwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp # Z2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2 # hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 # Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/ # Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNK # ei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHr # lnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4 # oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5A # Y8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNN # n3O3AamfV6peKOK5lDCCBq4wggSWoAMCAQICEAc2N7ckVHzYR6z9KGYqXlswDQYJ # KoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQg # VHJ1c3RlZCBSb290IEc0MB4XDTIyMDMyMzAwMDAwMFoXDTM3MDMyMjIzNTk1OVow # YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD # EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu # ZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMaGNQZJs8E9cklR # VcclA8TykTepl1Gh1tKD0Z5Mom2gsMyD+Vr2EaFEFUJfpIjzaPp985yJC3+dH54P # Mx9QEwsmc5Zt+FeoAn39Q7SE2hHxc7Gz7iuAhIoiGN/r2j3EF3+rGSs+QtxnjupR # PfDWVtTnKC3r07G1decfBmWNlCnT2exp39mQh0YAe9tEQYncfGpXevA3eZ9drMvo # hGS0UvJ2R/dhgxndX7RUCyFobjchu0CsX7LeSn3O9TkSZ+8OpWNs5KbFHc02DVzV # 5huowWR0QKfAcsW6Th+xtVhNef7Xj3OTrCw54qVI1vCwMROpVymWJy71h6aPTnYV # VSZwmCZ/oBpHIEPjQ2OAe3VuJyWQmDo4EbP29p7mO1vsgd4iFNmCKseSv6De4z6i # c/rnH1pslPJSlRErWHRAKKtzQ87fSqEcazjFKfPKqpZzQmiftkaznTqj1QPgv/Ci # PMpC3BhIfxQ0z9JMq++bPf4OuGQq+nUoJEHtQr8FnGZJUlD0UfM2SU2LINIsVzV5 # K6jzRWC8I41Y99xh3pP+OcD5sjClTNfpmEpYPtMDiP6zj9NeS3YSUZPJjAw7W4oi # qMEmCPkUEBIDfV8ju2TjY+Cm4T72wnSyPx4JduyrXUZ14mCjWAkBKAAOhFTuzuld # yF4wEr1GnrXTdrnSDmuZDNIztM2xAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAG # AQH/AgEAMB0GA1UdDgQWBBS6FtltTYUvcyl2mi91jGogj57IbzAfBgNVHSMEGDAW # gBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAww # CgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8v # b2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRp # Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDow # OKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRS # b290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkq # hkiG9w0BAQsFAAOCAgEAfVmOwJO2b5ipRCIBfmbW2CFC4bAYLhBNE88wU86/GPvH # UF3iSyn7cIoNqilp/GnBzx0H6T5gyNgL5Vxb122H+oQgJTQxZ822EpZvxFBMYh0M # CIKoFr2pVs8Vc40BIiXOlWk/R3f7cnQU1/+rT4osequFzUNf7WC2qk+RZp4snuCK # rOX9jLxkJodskr2dfNBwCnzvqLx1T7pa96kQsl3p/yhUifDVinF2ZdrM8HKjI/rA # J4JErpknG6skHibBt94q6/aesXmZgaNWhqsKRcnfxI2g55j7+6adcq/Ex8HBanHZ # xhOACcS2n82HhyS7T6NJuXdmkfFynOlLAlKnN36TU6w7HQhJD5TNOXrd/yVjmScs # PT9rp/Fmw0HNT7ZAmyEhQNC3EyTN3B14OuSereU0cZLXJmvkOHOrpgFPvT87eK1M # rfvElXvtCl8zOYdBeHo46Zzh3SP9HSjTx/no8Zhf+yvYfvJGnXUsHicsJttvFXse # GYs2uJPU5vIXmVnKcPA3v5gA3yAWTyf7YGcWoWa63VXAOimGsJigK+2VQbc61RWY # MbRiCQ8KvYHZE/6/pNHzV9m8BPqC3jLfBInwAM1dwvnQI38AC+R2AibZ8GV2QqYp # hwlHK+Z/GqSFD/yYlvZVVCsfgPrA8g4r5db7qS9EFUrnEw4d2zc4GqEr9u3WfPww # ggbAMIIEqKADAgECAhAMTWlyS5T6PCpKPSkHgD1aMA0GCSqGSIb3DQEBCwUAMGMx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy # RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg # Q0EwHhcNMjIwOTIxMDAwMDAwWhcNMzMxMTIxMjM1OTU5WjBGMQswCQYDVQQGEwJV # UzERMA8GA1UEChMIRGlnaUNlcnQxJDAiBgNVBAMTG0RpZ2lDZXJ0IFRpbWVzdGFt # cCAyMDIyIC0gMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM/spSY6 # xqnya7uNwQ2a26HoFIV0MxomrNAcVR4eNm28klUMYfSdCXc9FZYIL2tkpP0GgxbX # kZI4HDEClvtysZc6Va8z7GGK6aYo25BjXL2JU+A6LYyHQq4mpOS7eHi5ehbhVsbA # umRTuyoW51BIu4hpDIjG8b7gL307scpTjUCDHufLckkoHkyAHoVW54Xt8mG8qjoH # ffarbuVm3eJc9S/tjdRNlYRo44DLannR0hCRRinrPibytIzNTLlmyLuqUDgN5YyU # XRlav/V7QG5vFqianJVHhoV5PgxeZowaCiS+nKrSnLb3T254xCg/oxwPUAY3ugjZ # Naa1Htp4WB056PhMkRCWfk3h3cKtpX74LRsf7CtGGKMZ9jn39cFPcS6JAxGiS7uY # v/pP5Hs27wZE5FX/NurlfDHn88JSxOYWe1p+pSVz28BqmSEtY+VZ9U0vkB8nt9Kr # FOU4ZodRCGv7U0M50GT6Vs/g9ArmFG1keLuY/ZTDcyHzL8IuINeBrNPxB9Thvdld # S24xlCmL5kGkZZTAWOXlLimQprdhZPrZIGwYUWC6poEPCSVT8b876asHDmoHOWIZ # ydaFfxPZjXnPYsXs4Xu5zGcTB5rBeO3GiMiwbjJ5xwtZg43G7vUsfHuOy2SJ8bHE # uOdTXl9V0n0ZKVkDTvpd6kVzHIR+187i1Dp3AgMBAAGjggGLMIIBhzAOBgNVHQ8B # Af8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAg # BgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZ # bU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFGKK3tBh/I8xFO2XC809KpQU31Kc # MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp # Q2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAG # CCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy # dC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQw # DQYJKoZIhvcNAQELBQADggIBAFWqKhrzRvN4Vzcw/HXjT9aFI/H8+ZU5myXm93KK # mMN31GT8Ffs2wklRLHiIY1UJRjkA/GnUypsp+6M/wMkAmxMdsJiJ3HjyzXyFzVOd # r2LiYWajFCpFh0qYQitQ/Bu1nggwCfrkLdcJiXn5CeaIzn0buGqim8FTYAnoo7id # 160fHLjsmEHw9g6A++T/350Qp+sAul9Kjxo6UrTqvwlJFTU2WZoPVNKyG39+Xgmt # dlSKdG3K0gVnK3br/5iyJpU4GYhEFOUKWaJr5yI+RCHSPxzAm+18SLLYkgyRTzxm # lK9dAlPrnuKe5NMfhgFknADC6Vp0dQ094XmIvxwBl8kZI4DXNlpflhaxYwzGRkA7 # zl011Fk+Q5oYrsPJy8P7mxNfarXH4PMFw1nfJ2Ir3kHJU7n/NBBn9iYymHv+XEKU # gZSCnawKi8ZLFUrTmJBFYDOA4CPe+AOk9kVH5c64A0JH6EE2cXet/aLol3ROLtoe # HYxayB6a1cLwxiKoT5u92ByaUcQvmvZfpyeXupYuhVfAYOd4Vn9q78KVmksRAsiC # nMkaBXy6cbVOepls9Oie1FqYyJ+/jbsYXEP10Cro4mLueATbvdH7WwqocH7wl4R4 # 4wgDXUcsY6glOJcB0j862uXl9uab3H4szP8XTE0AotjWAQ64i+7m4HJViSwnGWH2 # dwGMMYIFXTCCBVkCAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGln # aUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQAwW7hiGwoWNf # v96uEgTnbTANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgACh # AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM # BgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCDysspqx/E/eCIa5n1nmNyh5bjn # iCz1kgOkfipBOI1wsDANBgkqhkiG9w0BAQEFAASCAQBaBunTH4Hsf9YLow84wL3Z # IuKs+Pw36riMYvl5UAL/GnR8E9F2wgPxXyAYAUcUwsQiSXgs47ZmeL4WJWtRoMdm # h/Rt0d1g7Cn7MDzb2YdvRoP+BmkovtKsbxmzHyDSBIhgrj6boVx4qHTg4K3dI/Gu # IpPLtP8Hy44HcjluMv0k1IJnv32dnGHVLi9XgVboRdmCkCKGDIjC43NRTern5lqX # XdNch6j4WwI0haxe2TK2kdMGBghErtJDKVPZ8yXrU5+VDEVI6ysEN2TCEHeDaj33 # WGIAEqp04X+N1DcMrNP3lQ3oboaQTnO3ILEPT9OF80sD1W/lD2DqZ1mdU9JSOeH/ # oYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMx # FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVz # dGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQDE1pckuU+jwq # Sj0pB4A9WjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0B # BwEwHAYJKoZIhvcNAQkFMQ8XDTIyMTAwNzA2MTIyMVowLwYJKoZIhvcNAQkEMSIE # IPPNqwaOj8rjFYZz/xpPgFd/jvYpxMjgAce53uxz/XrzMA0GCSqGSIb3DQEBAQUA # BIICADurmYfSaOrcauc462VeaLqv/bsDNsV80gbuli4XE5llTzkKkQPzC1tC37ln # MJ8gl6M/wUk7dtrXh9ZwDHk0oEQYTPVX6SCcE+72mNrDO0D+GzqVaJZh3Ef9eSuJ # mtNu4jUQj2qMLcnGtd7tmHYlInJA4phm/S+ZMEawdr1cPipGMYmDvNX+HT7InaT3 # 3/FbWLs4bLR4r40lx7ELjW2qcsx8lJElfBl03MQNHYU7mkeoIvdufa39V6t2kQWJ # XOlEBQbbZLbiUyEk9iHx1ixc+aY+t+k2OE0GTgKSlSgWFyJbhv5C1Jwze7wAdOZu # Y48iUgy+RLMX+69reUJIVL9hchOYVsrAcwzMgOZm7XB5erQdtABDL5PvW8IS0eiq # +AMdhVpPMMtzoDshR8YKZMweJ7m+W7LFz2MuO74JsybR8Xtko/2bB9jF7qlJ/5h2 # flTvz1bewEcJ1Xu+H2iLE60j19vaaJHIbN0gqKWs5vgElmyICyDokY9AWocBsljv # d5Nf9OZdC3ciuZ/aPrZELvtlKCudPXxhJ87+94MaF7u4xK2CU5mUwr8WIReR1ZSb # oqjN0bcJY1GUHoBNdTgTC96HuHRnsjkH0ZCFVIZh0ffS5dG2PVKsMBtXvL400Jlh # xuFXjXZCOtHj3YZJs2Wl8/w4PPEUGLHe5hPGkfNWe2MlkvHt # SIG # End signature block |