Skip to content

Instantly share code, notes, and snippets.

@dzas
Created January 7, 2018 09:57
Show Gist options
  • Save dzas/6bd7fdec53c45b7d37d280b164e2c1cf to your computer and use it in GitHub Desktop.
Save dzas/6bd7fdec53c45b7d37d280b164e2c1cf to your computer and use it in GitHub Desktop.
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
# MIIanQYJKoZIhvcNAQcCoIIajjCCGooCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQg4OAwsOrM1RZ404Oue4XnT+
# DXugghWCMIIEwzCCA6ugAwIBAgITMwAAAG9lLVhtBxFGKAAAAAAAbzANBgkqhkiG
# 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw
# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTUwMzIwMTczMjAy
# WhcNMTYwNjIwMTczMjAyWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO
# OkMwRjQtMzA4Ni1ERUY4MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
# ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+ZtzcEqza6o
# XtiVTy0DQ0dzO7hC0tBXmt32UzZ31YhFJGrIq9Bm6YvFqg+e8oNGtirJ2DbG9KD/
# EW9m8F4UGbKxZ/jxXpSGqo4lr/g1E/2CL8c4XlPAdhzF03k7sGPrT5OaBfCiF3Hc
# xgyW0wAFLkxtWLN/tCwkcHuWaSxsingJbUmZjjo+ZpWPT394G2B7V8lR9EttUcM0
# t/g6CtYR38M6pR6gONzrrar4Q8SDmo2XNAM0BBrvrVQ2pNQaLP3DbvB45ynxuUTA
# cbQvxBCLDPc2Ynn9B1d96gV8TJ9OMD8nUDhmBrtdqD7FkNvfPHZWrZUgNFNy7WlZ
# bvBUH0DVOQIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFPKmSSl4fFdwUmLP7ay3eyA0
# R9z9MB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw
# SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz
# L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG
# AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv
# c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI
# hvcNAQEFBQADggEBAI2zTLbY7A2Hhhle5ADnl7jVz0wKPL33VdP08KCvVXKcI5e5
# girHFgrFJxNZ0NowK4hCulID5l7JJWgnJ41kp235t5pqqz6sQtAeJCbMVK/2kIFr
# Hq1Dnxt7EFdqMjYxokRoAZhaKxK0iTH2TAyuFTy3JCRdu/98U0yExA3NRnd+Kcqf
# skZigrQ0x/USaVytec0x7ulHjvj8U/PkApBRa876neOFv1mAWRDVZ6NMpvLkoLTY
# wTqhakimiM5w9qmc3vNTkz1wcQD/vut8/P8IYw9LUVmrFRmQdB7/u72qNZs9nvMQ
# FNV69h/W4nXzknQNrRbZEs+hm63SEuoAOyMVDM8wggTsMIID1KADAgECAhMzAAAB
# Cix5rtd5e6asAAEAAAEKMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBMB4XDTE1MDYwNDE3NDI0NVoXDTE2MDkwNDE3NDI0NVowgYMxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx
# HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAJL8bza74QO5KNZG0aJhuqVG+2MWPi75R9LH7O3HmbEm
# UXW92swPBhQRpGwZnsBfTVSJ5E1Q2I3NoWGldxOaHKftDXT3p1Z56Cj3U9KxemPg
# 9ZSXt+zZR/hsPfMliLO8CsUEp458hUh2HGFGqhnEemKLwcI1qvtYb8VjC5NJMIEb
# e99/fE+0R21feByvtveWE1LvudFNOeVz3khOPBSqlw05zItR4VzRO/COZ+owYKlN
# Wp1DvdsjusAP10sQnZxN8FGihKrknKc91qPvChhIqPqxTqWYDku/8BTzAMiwSNZb
# /jjXiREtBbpDAk8iAJYlrX01boRoqyAYOCj+HKIQsaUCAwEAAaOCAWAwggFcMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBSJ/gox6ibN5m3HkZG5lIyiGGE3
# NDBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr
# MDQwNzkzNTAtMTZmYS00YzYwLWI2YmYtOWQyYjFjZDA1OTg0MB8GA1UdIwQYMBaA
# FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j
# cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w
# OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx
# LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQCmqFOR3zsB/mFdBlrrZvAM2PfZ
# hNMAUQ4Q0aTRFyjnjDM4K9hDxgOLdeszkvSp4mf9AtulHU5DRV0bSePgTxbwfo/w
# iBHKgq2k+6apX/WXYMh7xL98m2ntH4LB8c2OeEti9dcNHNdTEtaWUu81vRmOoECT
# oQqlLRacwkZ0COvb9NilSTZUEhFVA7N7FvtH/vto/MBFXOI/Enkzou+Cxd5AGQfu
# FcUKm1kFQanQl56BngNb/ErjGi4FrFBHL4z6edgeIPgF+ylrGBT6cgS3C6eaZOwR
# XU9FSY0pGi370LYJU180lOAWxLnqczXoV+/h6xbDGMcGszvPYYTitkSJlKOGMIIF
# vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm
# iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD
# EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx
# MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD
# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC
# mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw
# aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy
# c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ
# +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP
# Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf
# A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS
# tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB
# MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3
# FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk
# pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp
# L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE
# SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
# cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+
# fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6
# oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW
# 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb
# 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu
# 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ
# NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB
# 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord
# EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t
# s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh
# rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I
# ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0
# AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX
# BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290
# IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx
# MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
# BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn
# 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0
# Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n
# rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR
# JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54
# QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G
# A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG
# A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg
# QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG
# CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg
# Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ
# MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
# Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB
# BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z
# b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB
# BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i
# uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r
# kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct
# xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F
# NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo
# nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0
# NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp
# K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J
# oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0
# eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng
# 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBIUwggSB
# AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh
# BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAABCix5rtd5e6as
# AAEAAAEKMAkGBSsOAwIaBQCggZ4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFLq7
# T4P3QDoL52AUuB09FNltGXiaMD4GCisGAQQBgjcCAQwxMDAuoBaAFABXAGUAYgAg
# AEQAZQBwAGwAbwB5oRSAEmh0dHA6Ly93d3cuaWlzLm5ldDANBgkqhkiG9w0BAQEF
# AASCAQBnd1emYfcWsThpiHOkgKzItYFHJZbLb9Nw7ycKstVD9rNqHGtBoiMdRy4X
# f5EN9xnZb5nYRRlJYzTci3fB98/qOH0leeWWNhTlgpjQz/CIBb6rX4p7Z4Gp23EP
# 33b+nefZYQIOJFSI3PN1FoyjFQmWJtwx7PG1rZj47atvrRaQ54tHsreh8WUjfZ+G
# 0AtSRnAzrAs+0i55eqLTxDKsFwvoOzniNoGxd1woinJh0E66hNe/k5i4IUGw7T3P
# jQEuaJuTlzHiLEwG6m3035cZLpRb3iOFx/T8KLgJpc7qzu8EDea0Dyp/UOXD2FRu
# 3GEoR+iDnHv1xU63N707Wg4MsA9doYICKDCCAiQGCSqGSIb3DQEJBjGCAhUwggIR
# AgEBMIGOMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
# BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQQITMwAAAG9lLVhtBxFGKAAA
# AAAAbzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq
# hkiG9w0BCQUxDxcNMTUwNjE5MTgwNTQ0WjAjBgkqhkiG9w0BCQQxFgQUfH9yF17s
# bydL+97CNIWE/HaD1s4wDQYJKoZIhvcNAQEFBQAEggEABaY38dcwBaPBt9LrYsOf
# 0JHJpvMafXOKEMCbq1uAMbwbmUNJDkBqAPbnHYe2yXmpdGRbTeTvYF7D6IZzomC8
# qMEL1LplkLzJc+Ggs7VlWgRj7elevw4/FLX/UiTladjnAWtEXyBCnypyHdwo0GUC
# 6cRiJiqnWhiHyvGZ0UjW/e8q54eLbKn7aVtwMiuvTcHWXd/AEGXPFVUTBToNyhzZ
# 7aZluLykCWaxX1bAUo6peRdpsGX9jtSGJMhYW9h/MAUrm6PWFnR6XVYen+DepqPh
# ClKEc/7urees7c7c7wDhYSgF5q1ii+9GRxv0eJGN1Ijijh3naiMKhUsxDy3iftul
# LA==
# SIG # End signature block
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment