399 lines
18 KiB
PowerShell
399 lines
18 KiB
PowerShell
|
<#
|
||
|
.Synopsis
|
||
|
Activate a Python virtual environment for the current PowerShell session.
|
||
|
|
||
|
.Description
|
||
|
Pushes the python executable for a virtual environment to the front of the
|
||
|
$Env:PATH environment variable and sets the prompt to signify that you are
|
||
|
in a Python virtual environment. Makes use of the command line switches as
|
||
|
well as the `pyvenv.cfg` file values present in the virtual environment.
|
||
|
|
||
|
.Parameter VenvDir
|
||
|
Path to the directory that contains the virtual environment to activate. The
|
||
|
default value for this is the parent of the directory that the Activate.ps1
|
||
|
script is located within.
|
||
|
|
||
|
.Parameter Prompt
|
||
|
The prompt prefix to display when this virtual environment is activated. By
|
||
|
default, this prompt is the name of the virtual environment folder (VenvDir)
|
||
|
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
||
|
|
||
|
.Example
|
||
|
Activate.ps1
|
||
|
Activates the Python virtual environment that contains the Activate.ps1 script.
|
||
|
|
||
|
.Example
|
||
|
Activate.ps1 -Verbose
|
||
|
Activates the Python virtual environment that contains the Activate.ps1 script,
|
||
|
and shows extra information about the activation as it executes.
|
||
|
|
||
|
.Example
|
||
|
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
||
|
Activates the Python virtual environment located in the specified location.
|
||
|
|
||
|
.Example
|
||
|
Activate.ps1 -Prompt "MyPython"
|
||
|
Activates the Python virtual environment that contains the Activate.ps1 script,
|
||
|
and prefixes the current prompt with the specified string (surrounded in
|
||
|
parentheses) while the virtual environment is active.
|
||
|
|
||
|
.Notes
|
||
|
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
||
|
execution policy for the user. You can do this by issuing the following PowerShell
|
||
|
command:
|
||
|
|
||
|
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||
|
|
||
|
For more information on Execution Policies:
|
||
|
https://go.microsoft.com/fwlink/?LinkID=135170
|
||
|
|
||
|
#>
|
||
|
Param(
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[String]
|
||
|
$VenvDir,
|
||
|
[Parameter(Mandatory = $false)]
|
||
|
[String]
|
||
|
$Prompt
|
||
|
)
|
||
|
|
||
|
<# Function declarations --------------------------------------------------- #>
|
||
|
|
||
|
<#
|
||
|
.Synopsis
|
||
|
Remove all shell session elements added by the Activate script, including the
|
||
|
addition of the virtual environment's Python executable from the beginning of
|
||
|
the PATH variable.
|
||
|
|
||
|
.Parameter NonDestructive
|
||
|
If present, do not remove this function from the global namespace for the
|
||
|
session.
|
||
|
|
||
|
#>
|
||
|
function global:deactivate ([switch]$NonDestructive) {
|
||
|
# Revert to original values
|
||
|
|
||
|
# The prior prompt:
|
||
|
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
||
|
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
||
|
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
||
|
}
|
||
|
|
||
|
# The prior PYTHONHOME:
|
||
|
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
||
|
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
||
|
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
||
|
}
|
||
|
|
||
|
# The prior PATH:
|
||
|
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
||
|
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
||
|
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
||
|
}
|
||
|
|
||
|
# Just remove the VIRTUAL_ENV altogether:
|
||
|
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
||
|
Remove-Item -Path env:VIRTUAL_ENV
|
||
|
}
|
||
|
|
||
|
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
||
|
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
||
|
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
||
|
}
|
||
|
|
||
|
# Leave deactivate function in the global namespace if requested:
|
||
|
if (-not $NonDestructive) {
|
||
|
Remove-Item -Path function:deactivate
|
||
|
}
|
||
|
}
|
||
|
|
||
|
<#
|
||
|
.Description
|
||
|
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
||
|
given folder, and returns them in a map.
|
||
|
|
||
|
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
||
|
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
||
|
then it is considered a `key = value` line. The left hand string is the key,
|
||
|
the right hand is the value.
|
||
|
|
||
|
If the value starts with a `'` or a `"` then the first and last character is
|
||
|
stripped from the value before being captured.
|
||
|
|
||
|
.Parameter ConfigDir
|
||
|
Path to the directory that contains the `pyvenv.cfg` file.
|
||
|
#>
|
||
|
function Get-PyVenvConfig(
|
||
|
[String]
|
||
|
$ConfigDir
|
||
|
) {
|
||
|
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
||
|
|
||
|
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
||
|
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
||
|
|
||
|
# An empty map will be returned if no config file is found.
|
||
|
$pyvenvConfig = @{ }
|
||
|
|
||
|
if ($pyvenvConfigPath) {
|
||
|
|
||
|
Write-Verbose "File exists, parse `key = value` lines"
|
||
|
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
||
|
|
||
|
$pyvenvConfigContent | ForEach-Object {
|
||
|
$keyval = $PSItem -split "\s*=\s*", 2
|
||
|
if ($keyval[0] -and $keyval[1]) {
|
||
|
$val = $keyval[1]
|
||
|
|
||
|
# Remove extraneous quotations around a string value.
|
||
|
if ("'""".Contains($val.Substring(0, 1))) {
|
||
|
$val = $val.Substring(1, $val.Length - 2)
|
||
|
}
|
||
|
|
||
|
$pyvenvConfig[$keyval[0]] = $val
|
||
|
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $pyvenvConfig
|
||
|
}
|
||
|
|
||
|
|
||
|
<# Begin Activate script --------------------------------------------------- #>
|
||
|
|
||
|
# Determine the containing directory of this script
|
||
|
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||
|
$VenvExecDir = Get-Item -Path $VenvExecPath
|
||
|
|
||
|
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
||
|
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
||
|
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
||
|
|
||
|
# Set values required in priority: CmdLine, ConfigFile, Default
|
||
|
# First, get the location of the virtual environment, it might not be
|
||
|
# VenvExecDir if specified on the command line.
|
||
|
if ($VenvDir) {
|
||
|
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
||
|
}
|
||
|
else {
|
||
|
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
||
|
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
||
|
Write-Verbose "VenvDir=$VenvDir"
|
||
|
}
|
||
|
|
||
|
# Next, read the `pyvenv.cfg` file to determine any required value such
|
||
|
# as `prompt`.
|
||
|
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
||
|
|
||
|
# Next, set the prompt from the command line, or the config file, or
|
||
|
# just use the name of the virtual environment folder.
|
||
|
if ($Prompt) {
|
||
|
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
||
|
}
|
||
|
else {
|
||
|
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
||
|
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
||
|
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
||
|
$Prompt = $pyvenvCfg['prompt'];
|
||
|
}
|
||
|
else {
|
||
|
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
|
||
|
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
||
|
$Prompt = Split-Path -Path $venvDir -Leaf
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Write-Verbose "Prompt = '$Prompt'"
|
||
|
Write-Verbose "VenvDir='$VenvDir'"
|
||
|
|
||
|
# Deactivate any currently active virtual environment, but leave the
|
||
|
# deactivate function in place.
|
||
|
deactivate -nondestructive
|
||
|
|
||
|
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
||
|
# that there is an activated venv.
|
||
|
$env:VIRTUAL_ENV = $VenvDir
|
||
|
|
||
|
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
||
|
|
||
|
Write-Verbose "Setting prompt to '$Prompt'"
|
||
|
|
||
|
# Set the prompt to include the env name
|
||
|
# Make sure _OLD_VIRTUAL_PROMPT is global
|
||
|
function global:_OLD_VIRTUAL_PROMPT { "" }
|
||
|
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
||
|
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
||
|
|
||
|
function global:prompt {
|
||
|
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
||
|
_OLD_VIRTUAL_PROMPT
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# Clear PYTHONHOME
|
||
|
if (Test-Path -Path Env:PYTHONHOME) {
|
||
|
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
||
|
Remove-Item -Path Env:PYTHONHOME
|
||
|
}
|
||
|
|
||
|
# Add the venv to the PATH
|
||
|
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
||
|
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
||
|
|
||
|
# SIG # Begin signature block
|
||
|
# MIIcvgYJKoZIhvcNAQcCoIIcrzCCHKsCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAwnDYwEHaCQq0n
|
||
|
# 8NAvsN7H7BO7/48rXCNwrg891FS5vaCCC38wggUwMIIEGKADAgECAhAECRgbX9W7
|
||
|
# ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
||
|
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
|
||
|
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBa
|
||
|
# Fw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
|
||
|
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD
|
||
|
# ZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3
|
||
|
# DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/l
|
||
|
# qJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fT
|
||
|
# eyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqH
|
||
|
# CN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+
|
||
|
# bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLo
|
||
|
# LFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIB
|
||
|
# yTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK
|
||
|
# BggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
|
||
|
# Y3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGln
|
||
|
# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHow
|
||
|
# eDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl
|
||
|
# ZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp
|
||
|
# Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwA
|
||
|
# AgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAK
|
||
|
# BghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0j
|
||
|
# BBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7s
|
||
|
# DVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGS
|
||
|
# dQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6
|
||
|
# r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo
|
||
|
# +MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qz
|
||
|
# sIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHq
|
||
|
# aGxEMrJmoecYpJpkUe8wggZHMIIFL6ADAgECAhADPtXtoGXRuMkd/PkqbJvYMA0G
|
||
|
# CSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
|
||
|
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0
|
||
|
# IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcNMTgxMjE4MDAwMDAw
|
||
|
# WhcNMjExMjIyMTIwMDAwWjCBgzELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU5ldyBI
|
||
|
# YW1wc2hpcmUxEjAQBgNVBAcTCVdvbGZlYm9ybzEjMCEGA1UEChMaUHl0aG9uIFNv
|
||
|
# ZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMTGlB5dGhvbiBTb2Z0d2FyZSBGb3Vu
|
||
|
# ZGF0aW9uMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqr2kS7J1uW7o
|
||
|
# JRxlsdrETAjKarfoH5TI8PWST6Yb2xPooP7vHT4iaVXyL5Lze1f53Jw67Sp+u524
|
||
|
# fJXf30qHViEWxumy2RWG0nciU2d+mMqzjlaAWSZNF0u4RcvyDJokEV0RUOqI5CG5
|
||
|
# zPI3W9uQ6LiUk3HCYW6kpH177A5T3pw/Po8O8KErJGn1anaqtIICq99ySxrMad/2
|
||
|
# hPMBRf6Ndah7f7HPn1gkSSTAoejyuqF5h+B0qI4+JK5+VLvz659VTbAWJsYakkxZ
|
||
|
# xVWYpFv4KeQSSwoo0DzMvmERsTzNvVBMWhu9OriJNg+QfFmf96zVTu93cZ+r7xMp
|
||
|
# bXyfIOGKhHMaRuZ8ihuWIx3gI9WHDFX6fBKR8+HlhdkaiBEWIsXRoy+EQUyK7zUs
|
||
|
# +FqOo2sRYttbs8MTF9YDKFZwyPjn9Wn+gLGd5NUEVyNvD9QVGBEtN7vx87bduJUB
|
||
|
# 8F4DylEsMtZTfjw/au6AmOnmneK5UcqSJuwRyZaGNk7y3qj06utx+HTTqHgi975U
|
||
|
# pxfyrwAqkovoZEWBVSpvku8PVhkBXcLmNe6MEHlFiaMoiADAeKmX5RFRkN+VrmYG
|
||
|
# Tg4zajxfdHeIY8TvLf48tTfmnQJd98geJQv/01NUy/FxuwqAuTkaez5Nl1LxP0Cp
|
||
|
# THhghzO4FRD4itT2wqTh4jpojw9QZnsCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaA
|
||
|
# FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBT8Kr9+1L6s84KcpM97IgE7
|
||
|
# uI8H8jAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0f
|
||
|
# BHAwbjA1oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
|
||
|
# ZC1jcy1nMS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEy
|
||
|
# LWFzc3VyZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYI
|
||
|
# KwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQB
|
||
|
# MIGEBggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
|
||
|
# ZXJ0LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
|
||
|
# L0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB
|
||
|
# /wQCMAAwDQYJKoZIhvcNAQELBQADggEBAEt1oS21X0axiafPjyY+vlYqjWKuUu/Y
|
||
|
# FuYWIEq6iRRaFabNDhj9RBFQF/aJiE5msrQEOfAD6/6gVSH91lZWBqg6NEeG9T9S
|
||
|
# XbiAPvJ9CEWFsdkXUrjbWhvCnuZ7kqUuU5BAumI1QRbpYgZL3UA+iZXkmjbGh1ln
|
||
|
# 8rUhWIxbBYL4Sg2nqpB44p7CUFYkPj/MbwU2gvBV2pXjj5WaskoZtsACMv5g42BN
|
||
|
# oVLoRAi+ev6s07POt+JtHRIm87lTyuc8wh0swTPUwksKbLU1Zdj9CpqtzXnuVE0w
|
||
|
# 50exJvRSK3Vt4g+0vigpI3qPmDdpkf9+4Mvy0XMNcqrthw20R+PkIlMxghCVMIIQ
|
||
|
# kQIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
|
||
|
# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEy
|
||
|
# IEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADPtXtoGXRuMkd/PkqbJvYMA0G
|
||
|
# CWCGSAFlAwQCAQUAoIGYMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
|
||
|
# AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCwGCisGAQQBgjcCAQwxHjAcoBqAGABQ
|
||
|
# AHkAdABoAG8AbgAgADMALgA5AC4ANTAvBgkqhkiG9w0BCQQxIgQgBrni4mcRv7sM
|
||
|
# JHsxpROjRopOz2wuQVrJnn+lD7X7y+gwDQYJKoZIhvcNAQEBBQAEggIAfa/HLI8D
|
||
|
# GRTQjHbg8SUWGNLXsp08sG0LmtlbsGjTnpfxO4cbVP29YkZ44QaZvGfRczR2MEQc
|
||
|
# BsQ7HwbkKpbGrcADViQGB0THzO6jbr2SPq6weqO0acBthegPH/ZhVzDm1GNxScbZ
|
||
|
# +NRAPq9NDbknSBMKcEOOhqoUcBOfJSYwxV1+aNxS2LJkUqjzWpmBd7PC9YQYDbYb
|
||
|
# e93ClwH8gDujsFg1mksvNz+0jBDIX+hHKXECe8rEx5x26rxHsx1QbofD+L7xrvwh
|
||
|
# 0cv13hfqitPf60Wqa9l+r1v8KpOx/6w4lXA73UY6cWMSg13Wd/vvY/rOATRJB1FL
|
||
|
# /Zl1yRs5qsZJI8igX1WVg1raYX1kpE8gzh8EimOxoN545lxDRzb5LJxZ93zpA8jd
|
||
|
# 5pEj6ggyIct1EEYPAXqJ2IfKGBzdoLAFhXvre/2OgCgRgWkdWLLyq0BTmNeZqXzL
|
||
|
# /d2wF799esEuqAOrvq6Vb1lY8lR3OkYS6vhm1yznsSUH+If3asAVK4jlPNl0Xo6z
|
||
|
# qJA1RUvS8DUtofxOuzJvAGunLgjsdsoQNbLBmJOFx8wqG0R8j5tex+nG0k3z9kRK
|
||
|
# ZbxUbDMGMKFht669aaETctJL7+EMkwXgx5CIrycXUNmsdErVy7hdKQZ/cltL9L2f
|
||
|
# Gg02MnhsLFhmr87wVQ+/sWNLn9IAZ8mLLx6hgg1EMIINQAYKKwYBBAGCNwMDATGC
|
||
|
# DTAwgg0sBgkqhkiG9w0BBwKggg0dMIINGQIBAzEPMA0GCWCGSAFlAwQCAQUAMHcG
|
||
|
# CyqGSIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEF
|
||
|
# AAQg/qSbYAGCU5MoZyHzXgphXixjAtLi3mp3rPftbFQ7uQECEAnu03VwGsvEEBsL
|
||
|
# Mi/0TP0YDzIwMjEwNTAzMTczMzMxWqCCCjcwggT+MIID5qADAgECAhANQkrgvjqI
|
||
|
# /2BAIc4UAPDdMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
||
|
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV
|
||
|
# BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0EwHhcN
|
||
|
# MjEwMTAxMDAwMDAwWhcNMzEwMTA2MDAwMDAwWjBIMQswCQYDVQQGEwJVUzEXMBUG
|
||
|
# A1UEChMORGlnaUNlcnQsIEluYy4xIDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFt
|
||
|
# cCAyMDIxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwuZhhGfFivUN
|
||
|
# CKRFymNrUdc6EUK9CnV1TZS0DFC1JhD+HchvkWsMlucaXEjvROW/m2HNFZFiWrj/
|
||
|
# ZwucY/02aoH6KfjdK3CF3gIY83htvH35x20JPb5qdofpir34hF0edsnkxnZ2OlPR
|
||
|
# 0dNaNo/Go+EvGzq3YdZz7E5tM4p8XUUtS7FQ5kE6N1aG3JMjjfdQJehk5t3Tjy9X
|
||
|
# tYcg6w6OLNUj2vRNeEbjA4MxKUpcDDGKSoyIxfcwWvkUrxVfbENJCf0mI1P2jWPo
|
||
|
# GqtbsR0wwptpgrTb/FZUvB+hh6u+elsKIC9LCcmVp42y+tZji06lchzun3oBc/gZ
|
||
|
# 1v4NSYS9AQIDAQABo4IBuDCCAbQwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
|
||
|
# MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQQYDVR0gBDowODA2BglghkgBhv1s
|
||
|
# BwEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMB8G
|
||
|
# A1UdIwQYMBaAFPS24SAd/imu0uRhpbKiJbLIFzVuMB0GA1UdDgQWBBQ2RIaOpLqw
|
||
|
# Zr68KC0dRDbd42p6vDBxBgNVHR8EajBoMDKgMKAuhixodHRwOi8vY3JsMy5kaWdp
|
||
|
# Y2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDAyoDCgLoYsaHR0cDovL2NybDQu
|
||
|
# ZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwgYUGCCsGAQUFBwEBBHkw
|
||
|
# dzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME8GCCsGAQUF
|
||
|
# BzAChkNodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyQXNz
|
||
|
# dXJlZElEVGltZXN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBIHNy1
|
||
|
# 6ZojvOca5yAOjmdG/UJyUXQKI0ejq5LSJcRwWb4UoOUngaVNFBUZB3nw0QTDhtk7
|
||
|
# vf5EAmZN7WmkD/a4cM9i6PVRSnh5Nnont/PnUp+Tp+1DnnvntN1BIon7h6JGA078
|
||
|
# 9P63ZHdjXyNSaYOC+hpT7ZDMjaEXcw3082U5cEvznNZ6e9oMvD0y0BvL9WH8dQgA
|
||
|
# dryBDvjA4VzPxBFy5xtkSdgimnUVQvUtMjiB2vRgorq0Uvtc4GEkJU+y38kpqHND
|
||
|
# Udq9Y9YfW5v3LhtPEx33Sg1xfpe39D+E68Hjo0mh+s6nv1bPull2YYlffqe0jmd4
|
||
|
# +TaY4cso2luHpoovMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXaNpfCFTANBgkq
|
||
|
# hkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
|
||
|
# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB
|
||
|
# c3N1cmVkIElEIFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEwMTA3MTIwMDAw
|
||
|
# WjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
|
||
|
# ExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3Vy
|
||
|
# ZWQgSUQgVGltZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
||
|
# CgKCAQEAvdAy7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1NaH7ntqD0jbOI
|
||
|
# 5Je/YyGQmL8TvFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vjRkcGGlV+Cyd+
|
||
|
# wKL1oODeIj8O/36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOoCXFr4M8iEA91
|
||
|
# z3FyTgqt30A6XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe/WZuVmEnKYmE
|
||
|
# UeaC50ZQ/ZQqLKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG7z3N1k3vBkL9
|
||
|
# olMqT4UdxB08r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYDVR0OBBYEFPS2
|
||
|
# 4SAd/imu0uRhpbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3z
|
||
|
# bcgPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM
|
||
|
# MAoGCCsGAQUFBwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDov
|
||
|
# L29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5k
|
||
|
# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8E
|
||
|
# ejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
|
||
|
# cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
|
||
|
# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcwOAYKYIZIAYb9
|
||
|
# bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
|
||
|
# MAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGHVmnN793afKpj
|
||
|
# erN4zwY3QITvS4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqumfgnoma/Capg
|
||
|
# 33akOpMP+LLR2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuByx5jWPGTlH0gQ
|
||
|
# GF+JOGFNYkYkh2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraSZ/tTYYmo9WuW
|
||
|
# wPRYaQ18yAGxuSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh5Fhgm7oMLStt
|
||
|
# osR+u8QlK0cCCHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2skuiSpXY9aaO
|
||
|
# UjGCAk0wggJJAgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
|
||
|
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD
|
||
|
# ZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0ECEA1CSuC+Ooj/YEAh
|
||
|
# zhQA8N0wDQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ
|
||
|
# EAEEMBwGCSqGSIb3DQEJBTEPFw0yMTA1MDMxNzMzMzFaMCsGCyqGSIb3DQEJEAIM
|
||
|
# MRwwGjAYMBYEFOHXgqjhkb7va8oWkbWqtJSmJJvzMC8GCSqGSIb3DQEJBDEiBCAQ
|
||
|
# oGsafDstXll3ot5bx/8PLQS720KhIbACU4IesmNHujANBgkqhkiG9w0BAQEFAASC
|
||
|
# AQCICALSl0rnE1Sf/HFyIQUZGwv0NtTNht9v/Qtr3eo7J+9QhOLytlvBnlXai6jV
|
||
|
# qcX/maiZS8yIwwOXh1t0uFYKKO4uomq7UWTD0AuWDLDD0NkHClu756OObY7hH2YF
|
||
|
# 6H4oHbrnPj+tw+0lFuo6FxAQJN/qAWg7hcEUSpnfqEbMuHTFCV65IPcdMPHilnH3
|
||
|
# EvTmeMvUCzqz4mSYuQsr7pnCc+EHuBXzZadWPwzrtMIyrtpFVA2hhhkN97j1t+BW
|
||
|
# D4MZTevHrWOmFLRrFk6x9AcNt29fnSmLUImV2g8C/81fU7CPBYLn/A3GAzcwpWjc
|
||
|
# Evh1My2GZkDQltZ1ceUb/Qfs
|
||
|
# SIG # End signature block
|