diff --git a/.gitignore b/.gitignore index b6e4761..7b996eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,129 +1 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ +debugging.py \ No newline at end of file diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index f8b4888..0000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": null -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json index 4a593d5..6b61141 100644 --- a/.vs/VSWorkspaceState.json +++ b/.vs/VSWorkspaceState.json @@ -2,6 +2,5 @@ "ExpandedNodes": [ "" ], - "SelectedNode": "\\C:\\Users\\matht\\Source\\Repos\\python-geofs", "PreviewInSolutionExplorer": false } \ No newline at end of file diff --git a/.vs/pygeofsapi/FileContentIndex/8d9d96dd-307d-4613-904a-9d57fce60e09.vsidx b/.vs/pygeofsapi/FileContentIndex/8d9d96dd-307d-4613-904a-9d57fce60e09.vsidx new file mode 100644 index 0000000..2d9b90d Binary files /dev/null and b/.vs/pygeofsapi/FileContentIndex/8d9d96dd-307d-4613-904a-9d57fce60e09.vsidx differ diff --git a/.vs/python-geofs/FileContentIndex/read.lock b/.vs/pygeofsapi/FileContentIndex/read.lock similarity index 100% rename from .vs/python-geofs/FileContentIndex/read.lock rename to .vs/pygeofsapi/FileContentIndex/read.lock diff --git a/.vs/pygeofsapi/v17/.wsuo b/.vs/pygeofsapi/v17/.wsuo new file mode 100644 index 0000000..eb675bb Binary files /dev/null and b/.vs/pygeofsapi/v17/.wsuo differ diff --git a/.vs/python-geofs/FileContentIndex/a1547f6c-6da7-4b0f-8a34-ad1e7e505243.vsidx b/.vs/python-geofs/FileContentIndex/a1547f6c-6da7-4b0f-8a34-ad1e7e505243.vsidx deleted file mode 100644 index 02884a8..0000000 Binary files a/.vs/python-geofs/FileContentIndex/a1547f6c-6da7-4b0f-8a34-ad1e7e505243.vsidx and /dev/null differ diff --git a/.vs/python-geofs/FileContentIndex/b7ee5e9c-1c0c-4e54-a451-235ed6ab53b7.vsidx b/.vs/python-geofs/FileContentIndex/b7ee5e9c-1c0c-4e54-a451-235ed6ab53b7.vsidx deleted file mode 100644 index 4b0abdc..0000000 Binary files a/.vs/python-geofs/FileContentIndex/b7ee5e9c-1c0c-4e54-a451-235ed6ab53b7.vsidx and /dev/null differ diff --git a/.vs/python-geofs/FileContentIndex/cc441781-7352-41d9-a6b2-090ddf1481f1.vsidx b/.vs/python-geofs/FileContentIndex/cc441781-7352-41d9-a6b2-090ddf1481f1.vsidx deleted file mode 100644 index af78bbf..0000000 Binary files a/.vs/python-geofs/FileContentIndex/cc441781-7352-41d9-a6b2-090ddf1481f1.vsidx and /dev/null differ diff --git a/.vs/python-geofs/FileContentIndex/d2fa6be0-d3a3-474d-b490-8380fbbdd4fc.vsidx b/.vs/python-geofs/FileContentIndex/d2fa6be0-d3a3-474d-b490-8380fbbdd4fc.vsidx deleted file mode 100644 index 4b0abdc..0000000 Binary files a/.vs/python-geofs/FileContentIndex/d2fa6be0-d3a3-474d-b490-8380fbbdd4fc.vsidx and /dev/null differ diff --git a/.vs/python-geofs/v17/.wsuo b/.vs/python-geofs/v17/.wsuo deleted file mode 100644 index a18aaf4..0000000 Binary files a/.vs/python-geofs/v17/.wsuo and /dev/null differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 3f65a89..52de581 100644 Binary files a/.vs/slnx.sqlite and b/.vs/slnx.sqlite differ diff --git a/README.md b/README.md index a0c28bd..d49cba8 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,83 @@ # python-geofs -This package allows the use of an abstraction layer for the geoFS api. +This package is an abstraction layer for the GeoFS API, allowing for Python 3+ integration. -## Quick Setup -1. Install the package with ```pip install python-geofs``` -2. Create a python file and add ```import geofs``` -3. Your good to go. +## Quick Install +1. Install the package via pip with ```pip install python-geofs``` in the terminal. +2. Create a Python (v3.0+) file and add ```import geofs``` +3. Utilize below guide for use instructions. ## Using the package -GeoFS has two different APIs. -One of them is used in game, and the other is for the map. -### Multiplayer API -```from geofs import multiplayerAPI``` - -Before you use the API you first have to give your account ID and session ID. (More on that later) - -```myAPI = multiplayerAPI(sessionID, accountID)``` - -Next, you need to make a handshake with the server. - -```myAPI.handshake()``` - -Finally, you are setup and can use the API freely. -multiplayerAPI currently allows you to send a recieve messages to the GeoFS chat. - -```myAPI.sendMsg(msg)``` Sends a message to GeoFS chat. - -```myAPI.getMessages(msg)``` allows you to pull the most recent messages from the server. -It will only pull messages that occured, since the last time you used this command. - -### Map API -```from geofs import mapAPI``` - -This API is used for pulling user data from the server. - -First initialize the class: - -```myAPI = mapAPI()``` - -Now you can pull users. - -```userData = myAPI.getUsers()``` - +GeoFS has two different backend APIs, one which powers the Map, and presents the basic information of every user (callsign, location, etc), called the MapAPI, and the MultiplayerAPI, which allows you to spawn in as a user, send and receive chat messages, and more (coming soon). + +### MapAPI +You utilize the MapAPI to get basic information on every users. The following is a list of all data presented by the API for usage: +**1.** Location (latitude and longitude) +**2.** Altitude +**3.** Vertical Speed +**4.** Airspeed +**5.** User Info (callsign & GeoFS internal identifier) +**6.** Aircraft Type + +To begin utilizing the MapAPI, you must initialize the ``MapAPI`` class. You may then utilize the ``getUsers()`` function to get a list of users. + +#### ``MapAPI`` Class +The ``MapAPI`` class does not take in any variables. +##### Example +```python +from geofs import MapAPI +api = MapAPI() +``` +With the API Class defined, you can then utilize any of the below functions & variables. + +##### Functions List +``getUsers(foos:bool/NoneType)``: Returns a list of users in the form of a list of ``Player`` classes. Pass in ``False`` to ``foos`` to have no foos, ``True`` to have only foos, and ``None`` to be indescriminate of type. +``returnResponseList(reset:bool)``: Returns a list of the previous responses (if reset is ``True``, then clear the response list). +``disableResponseList()``: Disables the saving of previous responses for use in ``returnResponseList``. Do note that the list is on by default. +``enableResponseList()``: Enables the saving of previosu responses for use in ``returnResponseList``. Do note that the list is on by default. +``getUser(acid:int)``: (Coming in next version), will provide a ``Player`` class for the user who's acid is provided, if found. +##### Variables List +The ``MapAPI`` Class has no externally used variables. + +#### ``Player`` Class +The ``Player`` class is an internally initialized class which provides all information about one specific player. +##### Functions List +``findUser()``: (Coming in next version), will provide a circularly initialized ``Player`` class with updated information on the player. +##### Variables List +``Player.airspeed``: (``int``) Player's airspeed in knots. +``Player.userInfo``: (``dict``) Player's callsign and internal ID (acid). +``Player.coordinates``: (``tuple``) Player's latitude [0] and longitude [1]. +``Player.altitude``: (``int`` or ``float``) Player's altitude in feet (type ``float`` will be a result of conversion from meters, which GeoFS uses internally, to feet, which is offered by this module). +``Player.verticalSpeed``: (``int`` or ``float``) Player's vertical speed in feet (type ``float`` will be a result of conversion from meters, which GeoFS uses internally, to feet, which is offered by this module). +``Player.aircraft``: (``dict``) Player's aircraft type and that aircraft's GeoFS Internal ID. +``Player.grounded``: (``bool``) Coming in next update, tells if a player is grounded or not. + +### MapAPI Example +The below example gets a list of all non-foo users, and prints all of their callsigns followed by their altitudes +#### Code +```python +from geofs import MapAPI + +data = MapAPI().getUsers(foos=False) +for player in data: + print (player.userInfo['callsign']+': '+str(player.altitude)) +``` +#### Output +```BVW-00: 1971.08 +Venom583: 26.37 +davidpietro: 23414.06 +WN-1529: 17493.09 +SomebodyaddtheF35: 526.4 +NICARAGUAN-2[FAN][ACIR][626]: 34000.2 +fiumba: 2005.44 +DXA212: 69.0 +TCHALA[M4AF][FIGHTER][AIRSHOW]: 156.2 +Eagle-7[18][3UM][USAF]: 4582.4 +N999UA: 1155.33 +BJ-120: 4425.64 +626076: 474.72 +SubtoBrianisawesome2927: 8.19 +``` +#### Output ## Getting Session and Account IDs ### Account IDs The account ID identifies the account that you are using to connect to the server. @@ -48,15 +85,5 @@ This is found on the account page on the website: https://www.geo-fs.com/pages/a This is refered to as your "user ID" on the website. -### Session ID -The session ID is stored on your computer in the cookies. -1. Sign into your account and log into the server. -2. Open Chrome Console with ctrl+shift+j -3. Paste this code into the console, and it will return the session ID -``` -const cookies = document.cookie.split(';'); -const sessionIdCookie = cookies.find(cookie => cookie.trim().startsWith('PHPSESSID=')); -const sessionId = sessionIdCookie ? sessionIdCookie.split('=')[1] : null; -console.log(sessionId); -``` -4. If you are having trouble connecting to the server, it may be that your session ID has expired, so be sure to check that. +## MultiplayerAPI +The MultiplayerAPI exists in the code, but is currently being redone. diff --git a/geofs-env/Scripts/Activate.ps1 b/geofs-env/Scripts/Activate.ps1 deleted file mode 100644 index 5d6a0e5..0000000 --- a/geofs-env/Scripts/Activate.ps1 +++ /dev/null @@ -1,472 +0,0 @@ -<# -.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 VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # 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 virtual 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 - } - $env:VIRTUAL_ENV_PROMPT = $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 -# MIIpiQYJKoZIhvcNAQcCoIIpejCCKXYCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk -# dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCDi8wggawMIIEmKADAgECAhAIrUCyYNKc -# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV -# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z -# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg -# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg -# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 -# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr -# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF -# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F -# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh -# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ -# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay -# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI -# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp -# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro -# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB -# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ -# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P -# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk -# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC -# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j -# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED -# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql -# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF -# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h -# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw -# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld -# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw -# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP -# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE -# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn -# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji -# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq -# yK+p/pQd52MbOoZWeE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0G -# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg -# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg -# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1 -# MjM1OTU5WjB8MQswCQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQH -# EwlCZWF2ZXJ0b24xIzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9u -# MSMwIQYDVQQDExpQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZI -# hvcNAQEBBQADggIPADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiS -# YgDFfwhjQy89koM7uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi -# 0GGAZUegEAeRlSXxxhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN1 -# 6yS8skFa3IHyvWdbD9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGu -# ppxcia6a7xCyKoOAGjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu35 -# 2diDY+iCMpk9ZanmSjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0 -# ZFYKeb6BLA66d2GALwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oE -# RzTzEiV6nCO1M3U1HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZ -# I7IWe7JKhHohqKuceQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16x -# ot2KVPdfyPAWd81wtZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapP -# Unwo8ygflJJ74J+BYxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3Z -# Ily+qIqDAgMBAAGjggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiI -# ZfROQjAdBgNVHQ4EFgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQD -# AgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0 -# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu -# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5k -# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZT -# SEEzODQyMDIxQ0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUF -# BwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGH -# MIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYB -# BQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 -# ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB -# /wQCMAAwDQYJKoZIhvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcW -# TiNc2rskrNLrfH1Ns0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+ -# VVzxC88pOEvz68nA82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfL -# IJQsAHBla0i7QRF2de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izW -# OXM95BSkFSKdE45Oq3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86 -# WmjRUqbrnvdyR2ydI5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+ -# W1scCpnA8YTs2d50jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM5 -# 8WEDkbeoriDk3hxU8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMf -# ZOm5cuclMnUHs2uqrRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw -# /TKqVL4Oaz3bkMSsM46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3 -# r7bjyHTxOgqxRCVa18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VH -# xaZg2unjHY3rMYIasDCCGqwCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO -# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29k -# ZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM -# 0NHdMA0GCWCGSAFlAwQCAQUAoIHEMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE -# MBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBn -# AZ6P7YvTwq0fbF62o7E75R0LxsW5OtyYiFESQckLhjBYBgorBgEEAYI3AgEMMUow -# SKBGgEQAQgB1AGkAbAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAwAC4A -# OABfADIAMAAyADIAMQAwADEAMQAuADAAMTANBgkqhkiG9w0BAQEFAASCAgBvrB2R -# d/6IKRT9evXFap+DPx3SGj8fyHcvBdlvQ2lxX3+DQrZTmcmH7qH0SzAgYSjckeK1 -# JjyomHebFxthV+jZDJf2NVL3NSm1KwD6eUVYNYrjPMpJryqMX12JKLZzWWQAbNbk -# BQPqr5dsWQJB+D9DnAj6ahLJ/YdQQ/R9F5lH2XAmqQpON0/9g2qb2wPzUeHDBGgQ -# jBLhiswdvhyLvBSglbx7SfMyRQ8QWzBqSJe4RpxVH/Or5DQ9oarC3BQJfNJH8tuf -# wB3IZNmlNvoIPfZknHnxFhQm9uNbk4VS4jPc7YyBc06qpeTg3zk0ohb03DfB/Qw+ -# njwWEEVXIRM5helnhPcbGHJLLk1NHjy8UmsSCCeqrMs6PASvIGK7y97x4s0b12HP -# GvRaLLK1KSytFK0zWHnqqN/bu1QNzhwxf2SQ1akLVRDgJWMD5AboyBPiYNn32hTD -# lLNoG6KlYBKFtL4eEvHONTPb1uMQFerIj9DgpwJ6OLDyBC6VCOGlrJp0ZQNKAhMy -# vjxOGQpxaL9CiYNXkQlG/PNxF54ex1+2fqjalrNhLRyh9DWe5MmISsYwPjLJAWWN -# axtPHt/v0lUyIoIpJijbrDEO5w0/AEF2EZ26kWxZnIrkD/bo5kVhC3c6EeLvODVY -# 38U153hZPcjJfhZYEFPCHeumsqOxV6aElXjEnaGCFz0wghc5BgorBgEEAYI3AwMB -# MYIXKTCCFyUGCSqGSIb3DQEHAqCCFxYwghcSAgEDMQ8wDQYJYIZIAWUDBAIBBQAw -# dwYLKoZIhvcNAQkQAQSgaARmMGQCAQEGCWCGSAGG/WwHATAxMA0GCWCGSAFlAwQC -# AQUABCCJNX6iKhZvpzctf3+4+Ju6k4+1R6+i/GOszaNWLkM2wgIQSm7Y+oQkne0J -# RSIXmPMifRgPMjAyMjEwMTExNjU1MjlaoIITBzCCBsAwggSooAMCAQICEAxNaXJL -# lPo8Kko9KQeAPVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNV -# BAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0 -# IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBa -# Fw0zMzExMjEyMzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2Vy -# dDEkMCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkq -# hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias -# 0BxVHh42bbySVQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrp -# pijbkGNcvYlT4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAv -# fTuxylONQIMe58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjj -# gMtqedHSEJFGKes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+ -# DF5mjBoKJL6cqtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHd -# wq2lfvgtGx/sK0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8Mefz -# wlLE5hZ7Wn6lJXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0 -# CuYUbWR4u5j9lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCm -# t2Fk+tkgbBhRYLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMH -# msF47caIyLBuMnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMc -# hH7XzuLUOncCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E -# AjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQC -# MAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAd -# BgNVHQ4EFgQUYore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJ -# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5 -# NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYI -# KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZM -# aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNB -# NDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEA -# VaoqGvNG83hXNzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlG -# OQD8adTKmyn7oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7We -# CDAJ+uQt1wmJefkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn -# 6wC6X0qPGjpStOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZ -# iEQU5QpZomvnIj5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLp -# WnR1DT3heYi/HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19q -# tcfg8wXDWd8nYiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4Dg -# I974A6T2RUflzrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpR -# xC+a9l+nJ5e6li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjI -# n7+NuxhcQ/XQKujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX2 -# 5pvcfizM/xdMTQCi2NYBDriL7ubgclWJLCcZYfZ3AYwwggauMIIElqADAgECAhAH -# Nje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUw -# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -# ITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAw -# MDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp -# Q2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2 -# IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -# ggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGh -# RBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISK -# Ihjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdG -# AHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9 -# zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKl -# SNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae -# 5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnz -# yqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/ -# BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7T -# A4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbs -# q11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IB -# XTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3Mpdpov -# dYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P -# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAk -# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC -# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v -# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j -# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEE -# AjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m -# 1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dt -# h/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+K -# LHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd -# 6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ -# 38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+ -# k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3l -# NHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGY -# X/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFm -# ut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADN -# XcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kv -# RBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAY -# WjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl -# cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdp -# Q2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5 -# MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw -# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVz -# dGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBz -# aN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbr -# VsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTR -# EEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJ -# z82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyO -# j4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6R -# AXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k -# 98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJ -# tppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUa -# dmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZB -# dd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVf -# nSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0T -# AQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0j -# BBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsG -# AQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t -# MEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl -# cnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9j -# cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYD -# VR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3Qb -# PbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5 -# +KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+n -# BgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc -# /RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVr -# zyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o -# 4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNl -# cnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBT -# SEEyNTYgVGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFl -# AwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0B -# CQUxDxcNMjIxMDExMTY1NTI5WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBTzhyJN -# hjOCkjWplLy9j5bp/hx8czAvBgkqhkiG9w0BCQQxIgQgyYu+TmGN84kebkxfXnD3 -# cJyRaLRzBepBR07r7/BkPlMwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgx/ThvjIo -# iSCr4iY6vhrE/E/meBwtZNBMgHVXoCO1tvowDQYJKoZIhvcNAQEBBQAEggIAd+QW -# gPb2LX2KRaw6fzUGJN6PPpzRFV3OVkHKYy8/oHAYW9TZ+dgzZMmO7AraUhYwc7Qg -# WjgWgMLR8p95BhbXJvWauBHRFC8SdCtvVrkQ74oZI5Exdoljv/FL/SawklZwLSQh -# 9j+y+DxamK8PZbb9SuRsJkETc/HUxrfm1NPmPx6YXzxnKdVWA9FxNUuy0SHkBFee -# UHf12MM25re7kFKfVLQBtBHmjyOiHc3u5RLI3EHygL3BV85w94yZQSYRkJSWea3z -# OLdZqDqhGqim0hedFHiBwkEg6NfndntQtg5e9OPwInQBf8fRW4zWr2so3ovTgxoZ -# 1nOiPB+YO+OcaB0i2KDWF2rWY/8eydaEx+XDpZuUTG9q8qIt6dAdB7fFlkkL4S9h -# nNy9Sr5OsLUu2ahDElLZWeXvjJl0xpV/bW4QUcWgj1AfhWXif9NcVcba0nz4Ggno -# S/gKqhZW7q6o5cGHMvR2FD1Ucqr03I3K60aInN0UuoqWcHuD/qgoFezLgpPVTRee -# jm3RVn4Ic9KDBQKtMckB5ux6zrn7QNchzvItlDAf0A/PLUaKQlpC9PZg4u687i55 -# 1Z7XKoZoJZfIfneJvF3WyurE7JVBPxA2NoOsVI7cWh/PtzcKv7OTLqEi5hlDa8ko -# aS2jLT+AHbQCW1HzEAVodyqGKItpgePd5x0f0kE= -# SIG # End signature block diff --git a/geofs-env/Scripts/activate b/geofs-env/Scripts/activate deleted file mode 100644 index 517eb26..0000000 --- a/geofs-env/Scripts/activate +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="C:\Users\matht\Source\Repos\python-geofs\geofs-env" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/Scripts:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1="(geofs-env) ${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT="(geofs-env) " - export VIRTUAL_ENV_PROMPT -fi - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null -fi diff --git a/geofs-env/Scripts/activate.bat b/geofs-env/Scripts/activate.bat deleted file mode 100644 index 7a74e68..0000000 --- a/geofs-env/Scripts/activate.bat +++ /dev/null @@ -1,34 +0,0 @@ -@echo off - -rem This file is UTF-8 encoded, so we need to update the current code page while executing it -for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( - set _OLD_CODEPAGE=%%a -) -if defined _OLD_CODEPAGE ( - "%SystemRoot%\System32\chcp.com" 65001 > nul -) - -set VIRTUAL_ENV=C:\Users\matht\Source\Repos\python-geofs\geofs-env - -if not defined PROMPT set PROMPT=$P$G - -if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% -if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% - -set _OLD_VIRTUAL_PROMPT=%PROMPT% -set PROMPT=(geofs-env) %PROMPT% - -if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% -set PYTHONHOME= - -if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% -if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% - -set PATH=%VIRTUAL_ENV%\Scripts;%PATH% -set VIRTUAL_ENV_PROMPT=(geofs-env) - -:END -if defined _OLD_CODEPAGE ( - "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul - set _OLD_CODEPAGE= -) diff --git a/geofs-env/Scripts/deactivate.bat b/geofs-env/Scripts/deactivate.bat deleted file mode 100644 index 62a39a7..0000000 --- a/geofs-env/Scripts/deactivate.bat +++ /dev/null @@ -1,22 +0,0 @@ -@echo off - -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) -set _OLD_VIRTUAL_PROMPT= - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" - set _OLD_VIRTUAL_PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" -) - -set _OLD_VIRTUAL_PATH= - -set VIRTUAL_ENV= -set VIRTUAL_ENV_PROMPT= - -:END diff --git a/geofs-env/Scripts/docutils.exe b/geofs-env/Scripts/docutils.exe deleted file mode 100644 index 0357528..0000000 Binary files a/geofs-env/Scripts/docutils.exe and /dev/null differ diff --git a/geofs-env/Scripts/keyring.exe b/geofs-env/Scripts/keyring.exe deleted file mode 100644 index 1715ace..0000000 Binary files a/geofs-env/Scripts/keyring.exe and /dev/null differ diff --git a/geofs-env/Scripts/markdown-it.exe b/geofs-env/Scripts/markdown-it.exe deleted file mode 100644 index 48d0700..0000000 Binary files a/geofs-env/Scripts/markdown-it.exe and /dev/null differ diff --git a/geofs-env/Scripts/normalizer.exe b/geofs-env/Scripts/normalizer.exe deleted file mode 100644 index 89957e7..0000000 Binary files a/geofs-env/Scripts/normalizer.exe and /dev/null differ diff --git a/geofs-env/Scripts/pip.exe b/geofs-env/Scripts/pip.exe deleted file mode 100644 index 94f4fee..0000000 Binary files a/geofs-env/Scripts/pip.exe and /dev/null differ diff --git a/geofs-env/Scripts/pip3.10.exe b/geofs-env/Scripts/pip3.10.exe deleted file mode 100644 index 94f4fee..0000000 Binary files a/geofs-env/Scripts/pip3.10.exe and /dev/null differ diff --git a/geofs-env/Scripts/pip3.exe b/geofs-env/Scripts/pip3.exe deleted file mode 100644 index 94f4fee..0000000 Binary files a/geofs-env/Scripts/pip3.exe and /dev/null differ diff --git a/geofs-env/Scripts/pkginfo.exe b/geofs-env/Scripts/pkginfo.exe deleted file mode 100644 index ae375d3..0000000 Binary files a/geofs-env/Scripts/pkginfo.exe and /dev/null differ diff --git a/geofs-env/Scripts/pygmentize.exe b/geofs-env/Scripts/pygmentize.exe deleted file mode 100644 index f745c08..0000000 Binary files a/geofs-env/Scripts/pygmentize.exe and /dev/null differ diff --git a/geofs-env/Scripts/python.exe b/geofs-env/Scripts/python.exe deleted file mode 100644 index a23dfcd..0000000 Binary files a/geofs-env/Scripts/python.exe and /dev/null differ diff --git a/geofs-env/Scripts/pythonw.exe b/geofs-env/Scripts/pythonw.exe deleted file mode 100644 index 512209a..0000000 Binary files a/geofs-env/Scripts/pythonw.exe and /dev/null differ diff --git a/geofs-env/Scripts/rst2html.py b/geofs-env/Scripts/rst2html.py deleted file mode 100644 index defe435..0000000 --- a/geofs-env/Scripts/rst2html.py +++ /dev/null @@ -1,23 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2html.py 8927 2022-01-03 23:50:05Z milde $ -# Author: David Goodger -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing HTML. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - - -description = ('Generates (X)HTML documents from standalone reStructuredText ' - 'sources. ' + default_description) - -publish_cmdline(writer_name='html', description=description) diff --git a/geofs-env/Scripts/rst2html4.py b/geofs-env/Scripts/rst2html4.py deleted file mode 100644 index 76dccf9..0000000 --- a/geofs-env/Scripts/rst2html4.py +++ /dev/null @@ -1,26 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2html4.py 8927 2022-01-03 23:50:05Z milde $ -# Author: David Goodger -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing (X)HTML. - -The output conforms to XHTML 1.0 transitional -and almost to HTML 4.01 transitional (except for closing empty tags). -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - - -description = ('Generates (X)HTML documents from standalone reStructuredText ' - 'sources. ' + default_description) - -publish_cmdline(writer_name='html4', description=description) diff --git a/geofs-env/Scripts/rst2html5.py b/geofs-env/Scripts/rst2html5.py deleted file mode 100644 index cf719d4..0000000 --- a/geofs-env/Scripts/rst2html5.py +++ /dev/null @@ -1,33 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe -# :Copyright: © 2015 Günter Milde. -# :License: Released under the terms of the `2-Clause BSD license`_, in short: -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. -# This file is offered as-is, without any warranty. -# -# .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause -# -# Revision: $Revision: 9021 $ -# Date: $Date: 2022-03-04 16:54:22 +0100 (Fr, 04. Mär 2022) $ - -""" -A minimal front end to the Docutils Publisher, producing HTML 5 documents. - -The output is also valid XML. -""" - -try: - import locale # module missing in Jython - locale.setlocale(locale.LC_ALL, '') -except locale.Error: - pass - -from docutils.core import publish_cmdline, default_description - -description = ('Generates HTML5 documents from standalone ' - 'reStructuredText sources.\n' - + default_description) - -publish_cmdline(writer_name='html5', description=description) diff --git a/geofs-env/Scripts/rst2latex.py b/geofs-env/Scripts/rst2latex.py deleted file mode 100644 index 645faea..0000000 --- a/geofs-env/Scripts/rst2latex.py +++ /dev/null @@ -1,26 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2latex.py 8956 2022-01-20 10:11:44Z milde $ -# Author: David Goodger -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing LaTeX. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline - -description = ('Generates LaTeX documents from standalone reStructuredText ' - 'sources. ' - 'Reads from (default is stdin) and writes to ' - ' (default is stdout). See ' - ' for ' - 'the full reference.') - -publish_cmdline(writer_name='latex', description=description) diff --git a/geofs-env/Scripts/rst2man.py b/geofs-env/Scripts/rst2man.py deleted file mode 100644 index 6d347bd..0000000 --- a/geofs-env/Scripts/rst2man.py +++ /dev/null @@ -1,27 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# Author: -# Contact: grubert@users.sf.net -# Copyright: This module has been placed in the public domain. - -""" -man.py -====== - -This module provides a simple command line interface that uses the -man page writer to output from ReStructuredText source. -""" - -import locale -try: - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description -from docutils.writers import manpage - -description = ("Generates plain unix manual documents. " - + default_description) - -publish_cmdline(writer=manpage.Writer(), description=description) diff --git a/geofs-env/Scripts/rst2odt.py b/geofs-env/Scripts/rst2odt.py deleted file mode 100644 index 5c7d3a7..0000000 --- a/geofs-env/Scripts/rst2odt.py +++ /dev/null @@ -1,28 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2odt.py 8994 2022-01-29 16:28:17Z milde $ -# Author: Dave Kuhlman -# Copyright: This module has been placed in the public domain. - -""" -A front end to the Docutils Publisher, producing OpenOffice documents. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline_to_binary, default_description -from docutils.writers.odf_odt import Writer, Reader - - -description = ('Generates OpenDocument/OpenOffice/ODF documents from ' - 'standalone reStructuredText sources. ' + default_description) - - -writer = Writer() -reader = Reader() -output = publish_cmdline_to_binary(reader=reader, writer=writer, - description=description) diff --git a/geofs-env/Scripts/rst2odt_prepstyles.py b/geofs-env/Scripts/rst2odt_prepstyles.py deleted file mode 100644 index 9074448..0000000 --- a/geofs-env/Scripts/rst2odt_prepstyles.py +++ /dev/null @@ -1,65 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2odt_prepstyles.py 8932 2022-01-05 14:59:31Z milde $ -# Author: Dave Kuhlman -# Copyright: This module has been placed in the public domain. - -""" -Fix a word-processor-generated styles.odt for odtwriter use: Drop page size -specifications from styles.xml in STYLE_FILE.odt. -""" - -# Author: Michael Schutte - -from lxml import etree -import sys -import zipfile -from tempfile import mkstemp -import shutil -import os - -NAMESPACES = { - "style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0", - "fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" -} - - -def prepstyle(filename): - - zin = zipfile.ZipFile(filename) - styles = zin.read("styles.xml") - - root = etree.fromstring(styles) - for el in root.xpath("//style:page-layout-properties", - namespaces=NAMESPACES): - for attr in el.attrib: - if attr.startswith("{%s}" % NAMESPACES["fo"]): - del el.attrib[attr] - - tempname = mkstemp() - zout = zipfile.ZipFile(os.fdopen(tempname[0], "w"), "w", - zipfile.ZIP_DEFLATED) - - for item in zin.infolist(): - if item.filename == "styles.xml": - zout.writestr(item, etree.tostring(root)) - else: - zout.writestr(item, zin.read(item.filename)) - - zout.close() - zin.close() - shutil.move(tempname[1], filename) - - -def main(): - args = sys.argv[1:] - if len(args) != 1 or args[0] in ('-h', '--help'): - print(__doc__, file=sys.stderr) - print("Usage: %s STYLE_FILE.odt\n" % sys.argv[0], file=sys.stderr) - sys.exit(1) - filename = args[0] - prepstyle(filename) - - -if __name__ == '__main__': - main() diff --git a/geofs-env/Scripts/rst2pseudoxml.py b/geofs-env/Scripts/rst2pseudoxml.py deleted file mode 100644 index ccf788f..0000000 --- a/geofs-env/Scripts/rst2pseudoxml.py +++ /dev/null @@ -1,23 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2pseudoxml.py 8927 2022-01-03 23:50:05Z milde $ -# Author: David Goodger -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing pseudo-XML. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - - -description = ('Generates pseudo-XML from standalone reStructuredText ' - 'sources (for testing purposes). ' + default_description) - -publish_cmdline(description=description) diff --git a/geofs-env/Scripts/rst2s5.py b/geofs-env/Scripts/rst2s5.py deleted file mode 100644 index 4c7ea37..0000000 --- a/geofs-env/Scripts/rst2s5.py +++ /dev/null @@ -1,24 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2s5.py 8927 2022-01-03 23:50:05Z milde $ -# Author: Chris Liechti -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing HTML slides using -the S5 template system. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - - -description = ('Generates S5 (X)HTML slideshow documents from standalone ' - 'reStructuredText sources. ' + default_description) - -publish_cmdline(writer_name='s5', description=description) diff --git a/geofs-env/Scripts/rst2xetex.py b/geofs-env/Scripts/rst2xetex.py deleted file mode 100644 index a4f28d8..0000000 --- a/geofs-env/Scripts/rst2xetex.py +++ /dev/null @@ -1,27 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2xetex.py 8956 2022-01-20 10:11:44Z milde $ -# Author: Guenter Milde -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing Lua/XeLaTeX code. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline - -description = ('Generates LaTeX documents from standalone reStructuredText ' - 'sources for compilation with the Unicode-aware TeX variants ' - 'XeLaTeX or LuaLaTeX. ' - 'Reads from (default is stdin) and writes to ' - ' (default is stdout). See ' - ' for ' - 'the full reference.') - -publish_cmdline(writer_name='xetex', description=description) diff --git a/geofs-env/Scripts/rst2xml.py b/geofs-env/Scripts/rst2xml.py deleted file mode 100644 index b1f40c5..0000000 --- a/geofs-env/Scripts/rst2xml.py +++ /dev/null @@ -1,23 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rst2xml.py 8927 2022-01-03 23:50:05Z milde $ -# Author: David Goodger -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing Docutils XML. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - - -description = ('Generates Docutils-native XML from standalone ' - 'reStructuredText sources. ' + default_description) - -publish_cmdline(writer_name='xml', description=description) diff --git a/geofs-env/Scripts/rstpep2html.py b/geofs-env/Scripts/rstpep2html.py deleted file mode 100644 index 49bb64d..0000000 --- a/geofs-env/Scripts/rstpep2html.py +++ /dev/null @@ -1,25 +0,0 @@ -#!C:\Users\matht\Source\Repos\python-geofs\geofs-env\Scripts\python.exe - -# $Id: rstpep2html.py 8927 2022-01-03 23:50:05Z milde $ -# Author: David Goodger -# Copyright: This module has been placed in the public domain. - -""" -A minimal front end to the Docutils Publisher, producing HTML from PEP -(Python Enhancement Proposal) documents. -""" - -try: - import locale - locale.setlocale(locale.LC_ALL, '') -except: - pass - -from docutils.core import publish_cmdline, default_description - - -description = ('Generates (X)HTML from reStructuredText-format PEP files. ' - + default_description) - -publish_cmdline(reader_name='pep', writer_name='pep_html', - description=description) diff --git a/geofs-env/Scripts/twine.exe b/geofs-env/Scripts/twine.exe deleted file mode 100644 index 78409a0..0000000 Binary files a/geofs-env/Scripts/twine.exe and /dev/null differ diff --git a/geofs-env/pyvenv.cfg b/geofs-env/pyvenv.cfg deleted file mode 100644 index 9de7902..0000000 --- a/geofs-env/pyvenv.cfg +++ /dev/null @@ -1,3 +0,0 @@ -home = C:\Users\matht\AppData\Local\Programs\Python\Python310 -include-system-site-packages = false -version = 3.10.8 diff --git a/geofs/__init__.py b/geofs/__init__.py index b7a7ab4..5b37552 100644 --- a/geofs/__init__.py +++ b/geofs/__init__.py @@ -1,4 +1,4 @@ from .multiplayerAPI import multiplayerAPI -from .mapAPI import mapAPI +from .mapAPI import MapAPI -__version__ = '0.1.0' \ No newline at end of file +__version__ = '0.1.3' \ No newline at end of file diff --git a/geofs/__pycache__/__init__.cpython-311.pyc b/geofs/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..866f5cd Binary files /dev/null and b/geofs/__pycache__/__init__.cpython-311.pyc differ diff --git a/geofs/__pycache__/exceptions.cpython-311.pyc b/geofs/__pycache__/exceptions.cpython-311.pyc new file mode 100644 index 0000000..cbb276b Binary files /dev/null and b/geofs/__pycache__/exceptions.cpython-311.pyc differ diff --git a/geofs/__pycache__/mapAPI.cpython-311.pyc b/geofs/__pycache__/mapAPI.cpython-311.pyc new file mode 100644 index 0000000..c8868ad Binary files /dev/null and b/geofs/__pycache__/mapAPI.cpython-311.pyc differ diff --git a/geofs/__pycache__/multiplayerAPI.cpython-311.pyc b/geofs/__pycache__/multiplayerAPI.cpython-311.pyc new file mode 100644 index 0000000..006f942 Binary files /dev/null and b/geofs/__pycache__/multiplayerAPI.cpython-311.pyc differ diff --git a/geofs/data/aircraftcodes.json b/geofs/data/aircraftcodes.json new file mode 100644 index 0000000..994e8cf --- /dev/null +++ b/geofs/data/aircraftcodes.json @@ -0,0 +1,428 @@ +{ + "1": { + "name": "Piper Cub" + }, + "2": { + "name": "Cessna 172" + }, + "3": { + "name": "Alphajet PAF" + }, + "4": { + "name": "Boeing 737-700" + }, + "5": { + "name": "Embraer Phenom 100" + }, + "6": { + "name": "de Havilland DHC6 Twin Otter" + }, + "7": { + "name": " F-16 Fighting Falcon" + }, + "8": { + "name": "Pitts Special S1" + }, + "9": { + "name": "Eurocopter EC135" + }, + "10": { + "name": "Airbus A380" + }, + "11": { + "name": "Alisport Silent 2 Electro" + }, + "12": { + "name": "Pilatus PC-7 Mk-I" + }, + "13": { + "name": "de Havilland Canada DHC-2 Beaver" + }, + "14": { + "name": "Colomban MC-15 Cri-cri" + }, + "15": { + "name": "Lockheed P-38 Lightning F-5B" + }, + "16": { + "name": "Douglas DC-3" + }, + "17": { + "name": "McDonnell Douglas MD-11" + }, + "18": { + "name": "Sukhoi Su-35" + }, + "20": { + "name": "Concorde" + }, + "21": { + "name": "Zlin Z-50" + }, + "22": { + "name": "Cessna 152" + }, + "23": { + "name": "Piper PA-28 161 Warrior II" + }, + "26": { + "name": "Antonov An-140" + }, + "40": { + "name": "Evektor Sportstar" + }, + "41": { + "name": "szd-48-3 Jantar" + }, + "50": { + "name": "Paraglider" + }, + "51": { + "name": "Major Tom (hot air balloon)" + }, + "52": { + "name": "Hughes 269a/TH-55 Osage" + }, + "53": { + "name": "Goat Airchair" + }, + "235": { + "name": "Boeing 787-8" + }, + "236": { + "name": "Embraer E190" + }, + "237": { + "name": "Boeing 767-300ER" + }, + "238": { + "name": "Boeing 757-200" + }, + "239": { + "name": "Airbus A350-900" + }, + "240": { + "name": "Boeing 777-300ER" + }, + "242": { + "name": "Airbus A321neo" + }, + "244": { + "name": "Airbus A330-300" + }, + "247": { + "name": "Bombardier Dash 8 Q400" + }, + "252": { + "name": "Boeing 747-8 Freighter" + }, + "1000": { + "name": "Unkown" + }, + "1001": { + "name": "Boeing 73x" + }, + "1002": { + "name": "Boeing 74x" + }, + "1003": { + "name": "Boeing 75x" + }, + "1004": { + "name": "Boeing 76x" + }, + "1005": { + "name": "Boeing 77x" + }, + "1006": { + "name": "Boeing 78x" + }, + "1007": { + "name": "Airbus A31x" + }, + "1008": { + "name": "Airbus A32x" + }, + "1009": { + "name": "Airbus A33x" + }, + "1010": { + "name": "Airbus A34x" + }, + "1011": { + "name": "Airbus A35x" + }, + "1012": { + "name": "Airbus A380" + }, + "1013": { + "name": "ATR42" + }, + "1014": { + "name": "BAE146" + }, + "1015": { + "name": "CRJ 700" + }, + "1016": { + "name": "CRJ 900" + }, + "1017": { + "name": "Embraer 170" + }, + "1018": { + "name": "Embraer 190" + }, + "1019": { + "name": "Piper PA-28" + }, + "1020": { + "name": "Dash 8" + }, + "1021": { + "name": "Cessna Citation" + }, + "1022": { + "name": "Cessna" + }, + "1023": { + "name": "MD11" + }, + "1024": { + "name": "Mirage 2000" + }, + "1025": { + "name": "Helicopter" + }, + "1026": { + "name": "Cirrus SR22" + }, + "1027": { + "name": "Ground Vehicle" + }, + "1069": { + "name": "Cirrus SR22 GTS Turbo" + }, + "2003": { + "name": "Boeing 737-800" + }, + "2004": { + "name": "CRJ-900" + }, + "2153": { + "name": "Airbus A340-600" + }, + "2310": { + "name": "A-10C Thunderbolt II" + }, + "2364": { + "name": "Lockheed SR-71A Blackbird" + }, + "2386": { + "name": "Boeing 787-9 Dreamliner" + }, + "2395": { + "name": "BAe 146-300/Avro RJ100" + }, + "2418": { + "name": "ATR 72-600 (HOP!)" + }, + "2420": { + "name": "ATR 72-600 (Silver)" + }, + "2426": { + "name": "ATR 72-600 (UTair)" + }, + "2461": { + "name": "Cirrus Vision Jet/SF50 G2" + }, + "2556": { + "name": "Northrop Grumman B-2 Spirit" + }, + "2581": { + "name": "F-14B Tomcat " + }, + "2700": { + "name": "Embraer ERJ-195AR (Breeze)" + }, + "2706": { + "name": "Bombardier CRJ 200" + }, + "2726": { + "name": "Scaled 339 \"SpaceShipTwo\"" + }, + "2750": { + "name": "Caproni Stipa" + }, + "2752": { + "name": "Scaled 348 \"WhiteKnightTwo\"" + }, + "2769": { + "name": "Boeing 737 Max 8 (TUI)" + }, + "2772": { + "name": "Boeing 737 Max 8 (SpiceJet)" + }, + "2786": { + "name": "Grumman JF2-5 Duck" + }, + "2788": { + "name": "Antonov An-225 Mriya" + }, + "2806": { + "name": "Sikorsky S-97 Raider" + }, + "2808": { + "name": "Supermarine Spitfire Mk XIV" + }, + "2840": { + "name": "Bell UH-1H Iroquois" + }, + "2843": { + "name": "A220-300 (Air Tanzania)" + }, + "2844": { + "name": "Falcon 9" + }, + "2852": { + "name": "Rozière Balloon" + }, + "2856": { + "name": "Airbus A400M Atlas" + }, + "2857": { + "name": "F-22 Raptor" + }, + "2864": { + "name": "AgustaWestland AW609" + }, + "2865": { + "name": "Airbus a320neo(Air India)" + }, + "2870": { + "name": "Airbus a320neo (Flynas)" + }, + "2871": { + "name": "Airbus a320neo (Iberia)" + }, + "2878": { + "name": "Airbus A319 (Air China)" + }, + "2879": { + "name": "Airbus A319 (Finnair) " + }, + "2892": { + "name": "SAAB 340" + }, + "2899": { + "name": "A220-300 (Swiss)" + }, + "2943": { + "name": "Embraer EMB120 Brasillia " + }, + "2948": { + "name": "(JAaMDG) North American XB-70 Valkyrie" + }, + "2951": { + "name": "Dassault nEUROn " + }, + "2953": { + "name": "ARCHANGEL (limited)" + }, + "2968": { + "name": "Windward Performance Perlan II" + }, + "2973": { + "name": "Airbus A350-1000 XWB" + }, + "2976": { + "name": "Pilatus PC12" + }, + "2988": { + "name": "(TBSG, GeoAD) North American X-15" + }, + "2989": { + "name": "MQ9B Reaper" + }, + "3011": { + "name": "Boeing 737 Max 8 (Norwegian)" + }, + "3036": { + "name": "Embraer E195-E2" + }, + "3049": { + "name": "Lockheed Martin P-791 (LMH-1)" + }, + "3054": { + "name": "Boeing 737-800 [Spice9]" + }, + "3109": { + "name": "Pilatus PC24" + }, + "3140": { + "name": "Airbus A319 (United)" + }, + "3179": { + "name": "Boeing 787-10 Dreamliner (British Airways)" + }, + "3180": { + "name": "Boeing 787-10 Dreamliner (Etihad)" + }, + "3289": { + "name": "HAL-Dornier 228-100" + }, + "3292": { + "name": "Boeing p8I Neptune" + }, + "3307": { + "name": "Bombardier CRJ-700" + }, + "3341": { + "name": "Embraer ERJ-170" + }, + "3460": { + "name": "Grumman E-2C Hawkeye" + }, + "3534": { + "name": "airbus a320-214(Easyjet)" + }, + "3575": { + "name": " Boeing 787-9[Spice9]" + }, + "3591": { + "name": "F-15C Eagle" + }, + "3617": { + "name": "Dassault Mirage 2000-5" + }, + "4017": { + "name": "Embraer ERJ145LR (by Spice 9) &" + }, + "4090": { + "name": "Robinson R-44" + }, + "4140": { + "name": "Boeing 737-200" + }, + "4172": { + "name": "HAL LCA Tejas mk1 (IOC)" + }, + "4197": { + "name": "Robinson R22" + }, + "4251": { + "name": "Chance Vought F4U-1D Corsair" + }, + "4390": { + "name": "Piper PA-28 Floatplane" + }, + "4398": { + "name": "Britten-Norman BN-2 Islander (Loganair)" + }, + "4401": { + "name": "Britten-Norman BN-2 Islander (St. Barth Commuter)" + }, + "4402": { + "name": "Boeing 777 Freighter" + } +} \ No newline at end of file diff --git a/geofs/mapAPI.py b/geofs/mapAPI.py index 6577d95..6ab4ff2 100644 --- a/geofs/mapAPI.py +++ b/geofs/mapAPI.py @@ -1,10 +1,30 @@ import requests import json -class mapAPI: +## EXCEPTIONS ## +class BackendError(Exception): + pass + +## USER CLASSES ## + +class Player: + def __init__ (self,userobj): + #add grounded + self.airspeed = userobj['st']['as'] + self.userInfo = {'id':userobj['acid'],'callsign':userobj['cs']} + self.coordinates = (userobj['co'][0],userobj['co'][1]) + self.altitude = round(userobj['co'][2]*3.28084,2) # meters to feet + self.verticalSpeed = round(userobj['co'][3]*3.28084,2) # meters to feet + try: + self.aircraft = {'type':json.loads(open(r'geofs\data\aircraftcodes.json').read())[str(userobj['ac'])]['name'],'id':userobj['ac']} + except KeyError: + self.aircraft = {'type':"Unknown",'id':userobj['ac']} +## MAIN CLASS ## +class MapAPI: def __init__(self): - pass - def getUsers(self): + self._responseList = [] + self._utilizeResponseList = True + def getUsers(self,foos): try: response = requests.post( "https://mps.geo-fs.com/map", @@ -14,6 +34,64 @@ def getUsers(self): } ) response_body = json.loads(response.text) - return None, response_body["users"] + userList = [] + if foos == False: + for user in response_body['users']: + if user['cs'] == "Foo" or user['cs'] == '': + pass + else: + userList.append(Player(user)) + elif foos == True: + for user in response_body['users']: + if user['cs'] != "Foo": + pass + else: + userList.append(Player(user)) + elif foos == None: + userList.append(Player(user)) + + + else: + raise AttributeError('"Foos" attribute must be boolean or NoneType.') + if self._utilizeResponseList == True: + self._responseList.append(userList) + return userList except: - raise("Unable to connect to GeoFS. Check your connection and restart the application.") \ No newline at end of file + raise BackendError("Unable to connect to GeoFS server, try again later.") + def returnResponseList(self,reset:bool): + if reset == True: + before = self._responseList + self._responseList = [] + return before + return self._responseList + def disableResponseList(self): + self._utilizeResponseList = False + def enableResponseList(self): + self._utilizeResponseList = True + + +''' +st gr -- grounded +st as -- airspeed +ac -- aircraft number [refr aircraftcodes.json] +acid -- user id +cs -- callsign +co 0 latitude +co 1 longitude +co 2 altitude in meters +co 3 vertical speed in meters + +### Session ID +The session ID is stored on your computer in the cookies. +1. Sign into your account and log into the server. +2. Open Chrome Console with ctrl+shift+j +3. Paste this code into the console, and it will return the session ID +``` +const cookies = document.cookie.split(';'); +const sessionIdCookie = cookies.find(cookie => cookie.trim().startsWith('PHPSESSID=')); +const sessionId = sessionIdCookie ? sessionIdCookie.split('=')[1] : null; +console.log(sessionId); +``` +4. If you are having trouble connecting to the server, it may be that your session ID has expired, so be sure to check that. + +''' \ No newline at end of file diff --git a/setup.py b/setup.py index 624d219..e0665cf 100644 --- a/setup.py +++ b/setup.py @@ -10,10 +10,10 @@ setup( name="python-geofs", - version="0.1.2", - description="An abstraction layer for the GeoFS API", - url="https://github.com/iL0g1c/python-geofs", - long_description="Documentation for this script is on github at: https://github.com/iL0g1c/python-geofs", + version="0.1", + description="An abstraction layer for the GeoFS API, forked by slap-py from iL0g1c", + url="https://github.com/slap-py/python-geofs", + long_description="Documentation for this script is on github at: https://github.com/slap-py/python-geofs", author="Osprey", packages=find_packages(), install_requires=[],