????

Your IP : 3.138.112.77


Current Path : C:/Program Files/IIS/Microsoft Web Deploy V3/Scripts/
Upload File :
Current File : C:/Program Files/IIS/Microsoft Web Deploy V3/Scripts/BackupScripts.ps1

# Web Deploy: Powershell script to configure automatic backups on the server.
# Copyright (C) Microsoft Corp. 2010
#
# Requirements: IIS 7, Windows Server 2008 (or higher)
#
$BackupSectionName = "system.webServer/wdeploy/backup"
$TurnedOnAttrName = "turnedOn"
$EnabledAttrName = "enabled"
$BackupPathAttrName = "backupPath"
$NumBackupsAttrName = "numberOfBackups"
$ContinueSyncOnBackupFailureAttrName = "continueSyncOnBackupFailure"
$ExcludedProvidersElemName = "excludedProviders"
$BackupSettingsProviderElemName = "backupSettingsProvider"
$CanSetEnabledAttrName = "canSetEnabled"
$CanSetNumberOfBackupsAttrName = "canSetNumberOfBackups"
$CanSetContinueSyncOnFailureAttrName = "canSetContinueSyncOnBackupFailure"
$CanAddExcludedProvidersAttrName = "canAddExcludedProviders"
$DefaultExcludedProviders = @("appHostAuthOverride","appPoolEnable32Bit","appPoolNetFx","appPoolPipeline","createApp","setAcl")

<#
    .SYNOPSIS
        Turns the backup feature on or off.
    .DESCRIPTION
        Turns the backup feature on or off.  Overrides all server and site level backup settings.
    .EXAMPLE
        TurnOn-Backups -On $true
        
        Turns on the backup feature, however in order for backups to be made, they still need to be
        enabled at the server or site level.  Use the Configure-Backups function to accomplish this.
#>
function TurnOn-Backups
{
    param(
        [Parameter(Mandatory=$true)]
        [bool]$On
    )

    . .\Common.ps1
    Initialize

    try
    {
        $serverManager = New-Object Microsoft.Web.Administration.ServerManager
        $appHostConfig = $serverManager.GetApplicationHostConfiguration()
        $configSection = $appHostConfig.GetSection($BackupSectionName)
        $configSection.SetAttributeValue($TurnedOnAttrName, $On)
        
        if($On)
        {
            write-log $Global:Info $Resources.BackupTurningOn
        }
        else
        {
            write-log $Global:Info $Resources.BackupTurningOff
        }
        
        $serverManager.CommitChanges()
    }
    finally
    {
        if($serverManager -ne $null)
        {
            $serverManager.Dispose()
        }
    }
}

<#
    .SYNOPSIS
        Configures backup settings at the server or site level.
    .DESCRIPTION
        Use this function to set server or site level backup settings.  When server 
        level backup settings are set, this function automatically adds default 
        excluded providers.  When site level backup settings are set, they take 
        preference over server level backup settings.
    .EXAMPLE
        Configure-Backups -Enabled $true
        
        Turns on the backup feature at the server level, because a site is not specified.
    .EXAMPLE
        Configure-Backups -SiteName foo -Enabled $true -SetExcludedProviders @("dbmysql","dbfullsql")
        
        Turns on the backup feature for site "foo".  Also sets its excluded providers to "dbmysql" 
        and "dbfullsql" providers.
    .EXAMPLE
        Configure-Backups -SiteName foo -BackupPath "{SitePathParent}\{siteName}_snapshots"
        
        Sets the physical file path for where the backups for site "foo" will be stored.
        The variables "{SitePathParent}" and "{SiteName}" are special because they get
        translated by Web Deploy.  If the physical path of site "foo" were "c:\foo", the
        path in the example would translate to "c:\foo_snapshots"
#>
function Configure-Backups
{
    param(
        [string] $SiteName = [string]::Empty,
        [System.Nullable``1[[System.Boolean]]] $Enabled,
        [string] $BackupPath,
        [System.Nullable``1[[System.Int32]]] $NumberOfBackups,
        [System.Nullable``1[[System.Boolean]]] $ContinueSyncOnBackupFailure,
        [string[]] $AddExcludedProviders = $null
    )
    
    . .\Common.ps1
    Initialize
    
    # Setup default excluded providers at the server level
    if([string]::IsNullOrEmpty($SiteName))
    {
        if($null -eq $AddExcludedProviders)
        {
            $AddExcludedProviders = @()
        }

        foreach($provider in $DefaultExcludedProviders)
        {
            $AddExcludedProviders += $provider
        }
    }
	
    if($null -ne $AddExcludedProviders)
    {
        $ExcludedProviders = @(RemoveDuplicatesFromList -List $AddExcludedProviders)
    }
    
    $serverManager = $null

    if([string]::IsNullOrEmpty($SiteName))
    {
        write-log $Global:Info $Resources.ServerBackupConfigChanges
    }
    else
    {
        write-log $Global:Info $Resources.SiteBackupConfigChanges $SiteName
    }   
    
    try
    {
        # Cleans up existing Excluded providers
        $ExcludedProviders = VerifyAndDeleteExcludedProviders -SiteName $siteName -ExcludedProviders $ExcludedProviders `
            -SectionName $BackupSectionName
    
        $serverManager = New-Object Microsoft.Web.Administration.ServerManager
        $appHostConfig = $serverManager.GetApplicationHostConfiguration()
        
        if([string]::IsNullOrEmpty($SiteName))
        {
            $configSection = $appHostConfig.GetSection($BackupSectionName)
        }
        else
        {
            $configSection = $appHostConfig.GetSection($BackupSectionName, $SiteName)
        }

        if($Enabled -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingEnabled $Enabled
            $configSection.SetAttributeValue($EnabledAttrName, $Enabled)
        }
        
        if(-not [string]::IsNullOrEmpty($BackupPath))
        {
            write-log $Global:Info $Resources.BackupSettingPath $BackupPath
            write-log $Global:Warning $Resources.BackupSettingPathWarn
            $configSection.SetAttributeValue($BackupPathAttrName, $BackupPath)
        }
        
        if($NumberOfBackups -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingNumber $NumberOfBackups
            $configSection.SetAttributeValue($NumBackupsAttrName, $NumberOfBackups)
        }
        
        if($ContinueSyncOnBackupFailure -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingContinueSync $ContinueSyncOnBackupFailure
            $configSection.SetAttributeValue($ContinueSyncOnBackupFailureAttrName, $ContinueSyncOnBackupFailure)
        }
        
        if($null -ne $ExcludedProviders)
        {
            # Find the ExcludedProviders Element
			$configSection.ChildElements | out-null
            foreach($child in $configSection.ChildElements)
            {
                $excludedProvidersElem = $null
                if($child.Schema -is [Microsoft.Web.Administration.ConfigurationCollectionSchema] -and `
                    $child.Schema.AddElementNames -eq "provider")
                {
                    $excludedProvidersElem = $child
                    break
                }
            }
            
            # Add specified providers to the ExcludedProviders collection
			$providersCollection = $excludedProvidersElem.GetCollection()
            
            # Add each provider to providers collection
            foreach($provider in $ExcludedProviders)
            {
                # Need to explicitly call GetCollection().CreateElement or creation won't work
                $newProvider = $excludedProvidersElem.GetCollection().CreateElement()
                $newProvider.SetAttributeValue("name", $provider)
                $providersCollection.Add($newProvider) | out-null
                
                write-log $Global:Info $Resources.BackupAddingProviders $provider
            }
        }
        
        $serverManager.CommitChanges()
    }
    finally
    {
        if($serverManager -ne $null)
        {
            $serverManager.Dispose()
        }
    }
}

<#
    .SYNOPSIS
        Configures which backup settings a site can manage themselves using the BackupSettingsProvider.
    .DESCRIPTION
        These settings are only set at the server level, and allow a server administrator
        to control which backup settings a site can manage themselves using the BackupSettingsProvider.
    .EXAMPLE
        Configure-BackupSettingsProvider -CanSetEnabled $true -CanAddExcludedProviders $false
        
        Ensures that site administrators can set the "Enabled" setting for backups but cannot
        modify the list of "ExcludedProviders."
#>
function Configure-BackupSettingsProvider
{
	param(
		[System.Nullable``1[[System.Boolean]]] $CanSetEnabled,
		[System.Nullable``1[[System.Boolean]]] $CanSetNumBackups,
		[System.Nullable``1[[System.Boolean]]] $CanSetContinueSyncOnBackupFailure,
		[System.Nullable``1[[System.Boolean]]] $CanAddExcludedProviders
	)
    
    . .\Common.ps1
    Initialize
    $serverManager = $null

    try
    {
        $serverManager = New-Object Microsoft.Web.Administration.ServerManager
        $appHostConfig = $serverManager.GetApplicationHostConfiguration()
        $configSection = $appHostConfig.GetSection($BackupSectionName)
        $backupProviderElem = GetBackupSettingsProviderElem -ConfigSection $configSection
        
        if($CanSetEnabled -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingCanSetEnabled $CanSetEnabled
            $backupProviderElem.SetAttributeValue($CanSetEnabledAttrName, $CanSetEnabled)
        }
        
        if($CanSetNumBackups -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingCanSetNumBackups $CanSetNumBackups
            $backupProviderElem.SetAttributeValue($CanSetNumberOfBackupsAttrName, $CanSetNumBackups)
        }
        
        if($CanSetContinueSyncOnBackupFailure -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingCanSetContinueSync $CanSetContinueSyncOnBackupFailure
            $backupProviderElem.SetAttributeValue($CanSetContinueSyncOnFailureAttrName, $CanSetContinueSyncOnBackupFailure)
        }
        
        if($CanAddExcludedProviders -ne $null)
        {
            write-log $Global:Info $Resources.BackupSettingCanSetExcludedProviders $CanAddExcludedProviders
            $backupProviderElem.SetAttributeValue($CanAddExcludedProvidersAttrName, $CanAddExcludedProviders)
        }
        
        $serverManager.CommitChanges()
    }
    finally
    {
        if($serverManager -ne $null)
        {
            $serverManager.Dispose()
        }
    }
}

<#
    .SYNOPSIS
        Resets backup settings at either the server or site level.
    .DESCRIPTION
        Resets backup settings at either the server or site level.
    .EXAMPLE
        Reset-BackupSettings
        
        Resets all backup settings at the server level.
    .EXAMPLE
        Reset-BackupSettings -SiteName foo
        
        Resets all backup settings for site "foo"
#>
function Reset-BackupSettings
{
	param(
		[string] $SiteName
	)
    
    . .\Common.ps1
    Initialize
    $serverManager = $null
    
    try
    {
        $serverManager = New-Object Microsoft.Web.Administration.ServerManager
        $appHostConfig = $serverManager.GetApplicationHostConfiguration()
        if([string]::IsNullOrEmpty($SiteName))
        {
            write-log $Global:Info $Resources.BackupResetServerConfig
            $configSection = $appHostConfig.GetSection($BackupSectionName)
        }
        else
        {
            write-log $Global:Info $Resources.BackupResetSiteConfig $SiteName
            $configSection = $appHostConfig.GetSection($BackupSectionName, $SiteName)
        }

        $configSection.Delete()
        $serverManager.CommitChanges()
    }
    finally
    {
        if($serverManager -ne $null)
        {
            $serverManager.Dispose()
        }    
    }
}

<#
    .SYNOPSIS
        Returns the current server or site level backup settings
    .DESCRIPTION
        Returns the current server or site level backup settings as an object.
    .EXAMPLE
        Get-BackupSettings
        
        Returns the global backup settings
    .Example
        $settings = Get-BackupSettings -SiteName "foo"
        $settings | get-member          # Lists all properties of $settings
        write-host $settings.Enabled    # Outputs whether backups are enabled for site "foo"
#>
function Get-BackupSettings
{
	param(
		[string] $SiteName
	)
    
    . .\Common.ps1
    Initialize
    $serverManager = $null
    
    $properties = @{
        SiteName = $SiteName
        Enabled = ""
        BackupPath = ""
        NumberOfBackups = ""
        ContinueSyncOnFailure = ""
        CanSetEnabled = ""
        CanSetNumberOfBackups = ""
        CanSetContinueSyncOnFailure = ""
        CanAddExcludedProviders = ""
        
        ExcludedProviders = @()
    }
    
    $settings = new-object PSObject -Property $properties
    
    try
    {
        $serverManager = New-Object Microsoft.Web.Administration.ServerManager
        $appHostConfig = $serverManager.GetApplicationHostConfiguration()
        if([string]::IsNullOrEmpty($SiteName))
        {
            $configSection = $appHostConfig.GetSection($BackupSectionName)
        }
        else
        {
            $configSection = $appHostConfig.GetSection($BackupSectionName, $SiteName)
        }

        $settings.Enabled = $configSection.GetAttributeValue($EnabledAttrName)
        $settings.BackupPath = $configSection.GetAttributeValue($BackupPathAttrName)
        $settings.NumberOfBackups = $configSection.GetAttributeValue($NumBackupsAttrName)
        $settings.ContinueSyncOnFailure = $configSection.GetAttributeValue($ContinueSyncOnBackupFailureAttrName)

        $providersCollection = @(GetExcludedProvidersColletion $configSection)
        foreach($provider in $providersCollection)
        {
            $settings.ExcludedProviders += $provider.GetAttributeValue("name")
        }
        
        $providerElem = GetBackupSettingsProviderElem -ConfigSection $configSection
        $settings.CanSetEnabled = $providerElem.GetAttributeValue($CanSetEnabledAttrName)
        $settings.CanSetNumberOfBackups = $providerElem.GetAttributeValue($CanSetNumberOfBackupsAttrName)
        $settings.CanSetContinueSyncOnFailure = $providerElem.GetAttributeValue($CanSetContinueSyncOnFailureAttrName)
        $settings.CanAddExcludedProviders = $providerElem.GetAttributeValue($CanAddExcludedProvidersAttrName)
        
        return $settings
    }
    finally
    {
        if($serverManager -ne $null)
        {
            $serverManager.Dispose()
        }    
    }
}
# SIG # Begin signature block
# MIInvwYJKoZIhvcNAQcCoIInsDCCJ6wCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDWr+FHadl15mag
# OexsD8gtmapwnprl0A5WxAPauhYYiKCCDXYwggX0MIID3KADAgECAhMzAAADrzBA
# DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
# hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
# 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
# xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
# go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
# tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
# mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
# 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
# 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
# XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
# TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
# e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
# OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
# PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
# ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
# HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
# CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCGZ8wghmbAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGQQjmyoOeVHq3HIx0WkjLDp
# WAtb+G6h1Kw0mBNK798VMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAcgWSfUQDXAwJUagT/2WgUT69amw5zHal3FviKxkP2Kj1zAjoJZkaR9aL
# 9VQxYMZUKy7DaXDYT7YwgXYIVwGkVGHEhFKZ+rQDs06pqrTN+qs8c6CWYlHbCNC1
# j4JHtJiMMz/I2mWbBc+1tmO7SpSBR9HrkUYdgx+AuMqyrAlldWP2Xsjojx4nyHyA
# TeiaTYGURCUHaxKLG/kOUkoPRv9rSWGtxPxGW3lid/e8dYFGVPhJgiwYCXPhcQE/
# kEqtlFGtyjS8LStsNHbNJ/NNTDUijPX3VVQho19NzAG6o4Gi9iM5VCKSfxZopEFz
# Kng2Otx6Xqy9yYQe+t6f1K8coKQud6GCFykwghclBgorBgEEAYI3AwMBMYIXFTCC
# FxEGCSqGSIb3DQEHAqCCFwIwghb+AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsq
# hkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCDLnkxPzgN5WV543anmrYzhCNDs0dAH184PajAygi241AIGZdYHe7H8
# GBMyMDI0MDIyODIxMTAzOC4yMjFaMASAAgH0oIHYpIHVMIHSMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNO
# OjE3OUUtNEJCMC04MjQ2MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
# ZXJ2aWNloIIReDCCBycwggUPoAMCAQICEzMAAAHg1PwfExUffl0AAQAAAeAwDQYJ
# KoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjMx
# MDEyMTkwNzE5WhcNMjUwMTEwMTkwNzE5WjCB0jELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3Bl
# cmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoxNzlFLTRC
# QjAtODI0NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKyHnPOhxbvRATnGjb/6fuBh
# h3ZLzotAxAgdLaZ/zkRFUdeSKzyNt3tqorMK7GDvcXdKs+qIMUbvenlH+w53ssPa
# 6rYP760ZuFrABrfserf0kFayNXVzwT7jarJOEjnFMBp+yi+uwQ2TnJuxczceG5FD
# HrII6sF6F879lP6ydY0BBZkZ9t39e/svNRieA5gUnv/YcM/bIMY/QYmd9F0B+ebF
# Yi+PH4AkXahNkFgK85OIaRrDGvhnxOa/5zGL7Oiii7+J9/QHkdJGlfnRfbQ3QXM/
# 5/umBOKG4JoFY1niZ5RVH5PT0+uCjwcqhTbnvUtfK+N+yB2b9rEZvp2Tv4ZwYzEd
# 9A9VsYMuZiCSbaFMk77LwVbklpnw4aHWJXJkEYmJvxRbcThE8FQyOoVkSuKc5OWZ
# 2+WM/j50oblA0tCU53AauvUOZRoQBh89nHK+m5pOXKXdYMJ+ceuLYF8h5y/cXLQM
# OmqLJz5l7MLqGwU0zHV+MEO8L1Fo2zEEQ4iL4BX8YknKXonHGQacSCaLZot2kyJV
# RsFSxn0PlPvHVp0YdsCMzdeiw9jAZ7K9s1WxsZGEBrK/obipX6uxjEpyUA9mbVPl
# jlb3R4MWI0E2xI/NM6F4Ac8Ceax3YWLT+aWCZeqiIMLxyyWZg+i1KY8ZEzMeNTKC
# EI5wF1wxqr6T1/MQo+8tAgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUcF4XP26dV+8S
# usoA1XXQ2TDSmdIwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYD
# VR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# cmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwG
# CCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIw
# MjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD
# CDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAMATzg6R/A0ldO7M
# qGxD1VJji5yVA1hHb0Hc0Yjtv7WkxQ8iwfflulX5Us64tD3+3NT1JkphWzaAWf2w
# KdAw35RxtQG1iON3HEZ0X23nde4Kg/Wfbx5rEHkZ9bzKnR/2N5A16+w/1pbwJzdf
# RcnJT3cLyawr/kYjMWd63OP0Glq70ua4WUE/Po5pU7rQRbWEoQozY24hAqOcwuRc
# m6Cb0JBeTOCeRBntEKgjKep4pRaQt7b9vusT97WeJcfaVosmmPtsZsawgnpIjbBa
# 55tHfuk0vDkZtbIXjU4mr5dns9dnanBdBS2PY3N3hIfCPEOszquwHLkfkFZ/9bxw
# 8/eRJldtoukHo16afE/AqP/smmGJh5ZR0pmgW6QcX+61rdi5kDJTzCFaoMyYzUS0
# SEbyrDZ/p2KOuKAYNngljiOlllct0uJVz2agfczGjjsKi2AS1WaXvOhgZNmGw42S
# FB1qaloa8Kaux9Q2HHLE8gee/5rgOnx9zSbfVUc7IcRNodq6R7v+Rz+P6XKtOgyC
# qW/+rhPmp/n7Fq2BGTRkcy//hmS32p6qyglr2K4OoJDJXxFs6lwc8D86qlUeGjUy
# o7hVy5VvyA+y0mGnEAuA85tsOcUPlzwWF5sv+B5fz35OW3X4Spk5SiNulnLFRPM5
# XCsSHqvcbC8R3qwj2w1evPhZxDuNMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJ
# mQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNh
# dGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1
# WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
# Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjK
# NVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhg
# fWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJp
# rx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/d
# vI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka9
# 7aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKR
# Hh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9itu
# qBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyO
# ArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItb
# oKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6
# bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6t
# AgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQW
# BBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacb
# UzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA
# QwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2
# VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
# bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEw
# LTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt
# MjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/q
# XBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6
# U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVt
# I1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis
# 9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTp
# kbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0
# sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138e
# W0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJ
# sWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7
# Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0
# dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQ
# tB1VM1izoXBm8qGCAtQwggI9AgEBMIIBAKGB2KSB1TCB0jELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh
# bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjox
# NzlFLTRCQjAtODI0NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
# dmljZaIjCgEBMAcGBSsOAwIaAxUAbfPR1fBX6HxYfyPx8zYzJU5fIQyggYMwgYCk
# fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
# Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIF
# AOmJvw4wIhgPMjAyNDAyMjgyMjE3NTBaGA8yMDI0MDIyOTIyMTc1MFowdDA6Bgor
# BgEEAYRZCgQBMSwwKjAKAgUA6Ym/DgIBADAHAgEAAgIFODAHAgEAAgIRUDAKAgUA
# 6YsQjgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAID
# B6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAErMic/nNPp5tSOJsfCe
# cCou9ByTN3G55pr1uxb+X3idhClgYGc3ljiCPGpHiDsoGXrc4dK+WWhXosUk2fv4
# 6uOPrhy11gttQCsn+i9NRKfttUNZl3FIUO2oKEwmp78mrjzCAwD8dlydsjn4dHDC
# v8eIDkmbT8xHYmeUT9tHQQbPMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt
# U3RhbXAgUENBIDIwMTACEzMAAAHg1PwfExUffl0AAQAAAeAwDQYJYIZIAWUDBAIB
# BQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx
# IgQglNgK47c71WKJOG5g2y+AApAEcyqHADjhpZ4/dB+p4sEwgfoGCyqGSIb3DQEJ
# EAIvMYHqMIHnMIHkMIG9BCDj7lK/8jnlbTjPvc77DCCSb4TZApY9nJm5whsK/2kK
# wTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB4NT8
# HxMVH35dAAEAAAHgMCIEIG01xKO9hBFTAtjUO/ZHX2/vm3tWdTGjY5wDebXC55bI
# MA0GCSqGSIb3DQEBCwUABIICAJoPjC43AcUU9lN9+c549gXuhqz1C9aqKQVB8mux
# cW5LCtrWVm27c88KBVypkN7OUgF2u3yaEElY7KiJXtyNORQT/1FVQsaXFY/MQQ/5
# 7FgsChpzNqEFgPJ4gJ4ok8cIvY4tBOvDerylx8eDvWG/bgOhI5QAtYVQtCA1thfa
# 0Cp5EXnNteBM7vnQOHKqynPf+q9mRbSMu5JWXqf/z3/gNkVog02BO1rcd9+ajDo7
# fB3j6/aEQBmwiK9j3bNOQHDysqXrS7wNGaheO18w5E3Q+juM+TKHYmdae9eRUvGf
# lq9f83UC720KX74V4ErZJgSexKqs3SZFlgehxfWJI5mpYppPZlshVXmBpkF29o6x
# NmDPXtj2Jt4x5r8yCi0FWZErwyTnpgI/8lxqBfq1nCbtlB/+Xud+3yql94kuXuKv
# XH5cfgPw5rCFqnEAobmoSsAX+9eadG4VJc4QngMt9narUPpILvDN9GbcK5qtH5lq
# xAzjNhsWTo/AEmvP3CyKMvDueQcEZiixUZasdCC2IvRJ4aps28HIZiyml8WIDGCJ
# MwKS9tEEROWSRw7S3q3JYP/cKm8X+9gU0q1Bos3mI/zVQdB1z6IbuZddY3W+0Rda
# X8I+gm2nJ26XH3QsFjWFORoziGbhx4HzZWmfW2yNl8pHux2J5/d9S33drPg17sVf
# hxIi
# SIG # End signature block