remoterf 0.0.7.35__tar.gz → 0.0.7.37__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of remoterf might be problematic. Click here for more details.

Files changed (40) hide show
  1. {remoterf-0.0.7.35/src/remoteRF.egg-info → remoterf-0.0.7.37}/PKG-INFO +2 -2
  2. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/setup.py +2 -2
  3. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/app.py +81 -12
  4. remoterf-0.0.7.37/src/remoteRF/core/certs/server.crt +19 -0
  5. remoterf-0.0.7.37/src/remoteRF/core/certs/server.key +28 -0
  6. {remoterf-0.0.7.35 → remoterf-0.0.7.37/src/remoteRF.egg-info}/PKG-INFO +2 -2
  7. remoterf-0.0.7.35/src/remoteRF/core/certs/server.crt +0 -19
  8. remoterf-0.0.7.35/src/remoteRF/core/certs/server.key +0 -28
  9. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/LICENSE +0 -0
  10. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/MANIFEST.in +0 -0
  11. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/README.md +0 -0
  12. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/setup.cfg +0 -0
  13. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/__init__.py +0 -0
  14. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/__init__.py +0 -0
  15. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/grpc/__init__.py +0 -0
  16. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/grpc/grpc_pb2.py +0 -0
  17. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/grpc/grpc_pb2_grpc.py +0 -0
  18. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/utils/__init__.py +0 -0
  19. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/utils/ansi_codes.py +0 -0
  20. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/utils/api_token.py +0 -0
  21. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/utils/list_string.py +0 -0
  22. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/common/utils/process_arg.py +0 -0
  23. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/__init__.py +0 -0
  24. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/acc_login.py +0 -0
  25. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/certs/__init__.py +0 -0
  26. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/certs/ca.crt +0 -0
  27. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/certs/ca.key +0 -0
  28. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/certs/cert.pem +0 -0
  29. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/certs/key.pem +0 -0
  30. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/grpc_acc.py +0 -0
  31. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/grpc_client.py +0 -0
  32. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/core/version.py +0 -0
  33. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/drivers/__init__.py +0 -0
  34. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/drivers/adalm_pluto/__init__.py +0 -0
  35. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF/drivers/adalm_pluto/pluto_remote.py +0 -0
  36. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF.egg-info/SOURCES.txt +0 -0
  37. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF.egg-info/dependency_links.txt +0 -0
  38. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF.egg-info/entry_points.txt +0 -0
  39. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF.egg-info/requires.txt +0 -0
  40. {remoterf-0.0.7.35 → remoterf-0.0.7.37}/src/remoteRF.egg-info/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoterf
3
- Version: 0.0.7.35
4
- Summary: A python API to remotely access signal centric hardware. Client-side only!
3
+ Version: 0.0.7.37
4
+ Summary: A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.
5
5
  Author: Ethan Ge
6
6
  Author-email: ethoGalaxy@gmail.com
7
7
  Classifier: Programming Language :: Python :: 3
@@ -6,10 +6,10 @@ with open("README.md", "r", encoding="utf-8") as fh:
6
6
 
7
7
  setup(
8
8
  name="remoterf",
9
- version="0.0.7.35",
9
+ version="0.0.7.37",
10
10
  author="Ethan Ge",
11
11
  author_email="ethoGalaxy@gmail.com",
12
- description="A python API to remotely access signal centric hardware. Client-side only!",
12
+ description="A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.",
13
13
  long_description=long_description, # Set the README content here
14
14
  long_description_content_type="text/markdown", # Specify that it's Markdown
15
15
  packages=find_packages(where="src"), # Automatically finds subpackages like core, deviceA, deviceB
@@ -13,7 +13,7 @@ account = RemoteRFAccount()
13
13
  session = PromptSession()
14
14
 
15
15
  def welcome():
16
- printf("Welcome to RemoteRF Reservation System. (all times are in Pacific Time)", (Sty.BOLD, Sty.BLUE))
16
+ printf(f"Welcome to the RemoteRF Platform", (Sty.BOLD, Sty.BLUE), f"\nCurrent version: {print_my_version()} \nAll times are in Pacific Time (Los Angeles)", (Sty.GRAY))
17
17
  try:
18
18
  inpu = session.prompt(stylize("Please ", Sty.DEFAULT, "login", Sty.GREEN, " or ", Sty.DEFAULT, "register", Sty.RED, " to continue. (", Sty.DEFAULT, 'l', Sty.GREEN, "/", Sty.DEFAULT, 'r', Sty.RED, "): ", Sty.DEFAULT))
19
19
  if inpu == 'r':
@@ -49,21 +49,21 @@ def welcome():
49
49
  exit()
50
50
 
51
51
  def title():
52
- printf(f"RemoteRF Reservation System", Sty.BOLD)
52
+ printf(f"Welcome to the RemoteRF Platform", (Sty.BOLD, Sty.BLUE), f"\nCurrent version: {print_my_version()} \nAll times are in Pacific Time (Los Angeles)", (Sty.GRAY))
53
53
  # printf(f"Logged in as: ", Sty.DEFAULT, f'{account.username}', Sty.MAGENTA)
54
- printf(f"Input ", Sty.DEFAULT, "'help' ", Sty.BRIGHT_GREEN, "for avaliable commands.", Sty.DEFAULT)
54
+ printf(f"Input ", Sty.DEFAULT, "'help' ", Sty.BRIGHT_GREEN, "for a list of avaliable commands.", Sty.DEFAULT)
55
55
 
56
56
  def commands():
57
57
  printf("Commands:", Sty.BOLD)
58
- printf("'clear' ", Sty.MAGENTA, "- clear terminal", Sty.DEFAULT)
59
- printf("'getdev' ", Sty.MAGENTA, "- view devices", Sty.DEFAULT)
60
- printf("'help' or 'h'", Sty.MAGENTA, "- show this help message", Sty.DEFAULT)
61
- printf("'perms' ", Sty.MAGENTA, "- view permissions", Sty.DEFAULT)
62
- printf("'exit' or 'quit'", Sty.MAGENTA, "- exit", Sty.DEFAULT)
63
- printf("'getres' ", Sty.MAGENTA, "- view all reservations", Sty.DEFAULT)
64
- printf("'myres' ", Sty.MAGENTA, "- view my reservations", Sty.DEFAULT)
65
- printf("'cancelres' ", Sty.MAGENTA, "- cancel a reservation", Sty.DEFAULT)
66
- printf("'resdev' ", Sty.MAGENTA, "- reserve a device", Sty.DEFAULT)
58
+ printf("'clear' ", Sty.MAGENTA, " : Clear terminal", Sty.DEFAULT)
59
+ printf("'getdev' ", Sty.MAGENTA, " : View devices", Sty.DEFAULT)
60
+ printf("'help' or 'h' ", Sty.MAGENTA, " : Show this help message", Sty.DEFAULT)
61
+ printf("'perms' ", Sty.MAGENTA, " : View permissions", Sty.DEFAULT)
62
+ printf("'exit' or 'quit' ", Sty.MAGENTA, ": Exit", Sty.DEFAULT)
63
+ printf("'getres' ", Sty.MAGENTA, " : View all reservations", Sty.DEFAULT)
64
+ printf("'myres' ", Sty.MAGENTA, " : View my reservations", Sty.DEFAULT)
65
+ printf("'cancelres' ", Sty.MAGENTA, " : Cancel a reservation", Sty.DEFAULT)
66
+ printf("'resdev' ", Sty.MAGENTA, " : Reserve a device", Sty.DEFAULT)
67
67
  # printf("'resdev -n' ", Sty.MAGENTA, "- naive reserve device", Sty.DEFAULT)
68
68
  # printf("'resdev s' ", Sty.MAGENTA, "- Reserve a Device (by single date)", Sty.DEFAULT)
69
69
  # check if user is admin
@@ -73,6 +73,75 @@ def clear():
73
73
  os.system('cls' if os.name == 'nt' else 'clear')
74
74
  title()
75
75
 
76
+ # def print_my_version():
77
+ # import sys
78
+ # try:
79
+ # import importlib.metadata as md # Py3.8+
80
+ # top = __name__.split('.')[0]
81
+ # # Try mapping package → distribution (Py3.10+); fall back to same name.
82
+ # for dist in getattr(md, "packages_distributions", lambda: {})().get(top, []):
83
+ # return md.version(dist)
84
+ # return md.version(top)
85
+ # except Exception:
86
+ # # Last resort: __version__ attribute if you define it.
87
+ # return getattr(sys.modules.get(__name__.split('.')[0]), "__version__", "unknown")
88
+
89
+ def print_my_version(timeout=3.0):
90
+ """
91
+ Return this package's installed version, tagged as (LATEST) or (OUTDATED → X).
92
+ Uses only the Python stdlib.
93
+ """
94
+ import sys, json, urllib.request, re
95
+ try:
96
+ import importlib.metadata as md # Py 3.8+
97
+ top = __name__.split('.')[0]
98
+ dists = getattr(md, "packages_distributions", lambda: {})().get(top, []) or [top]
99
+
100
+ # Simple PEP440-ish comparator using only stdlib
101
+ def _canon(v):
102
+ parts = re.split(r'[.\-+]', v)
103
+ out = []
104
+ for p in parts:
105
+ if p.isdigit():
106
+ out.append((0, int(p)))
107
+ continue
108
+ t = p.lower().replace("alpha", "a").replace("beta", "b").replace("pre", "rc")
109
+ m = re.match(r'([a-z]+)(\d*)', t)
110
+ if m:
111
+ rank = {'dev': -1, 'a': 0, 'b': 1, 'rc': 2, 'post': 4}.get(m.group(1), 3)
112
+ out.append((1, rank, int(m.group(2) or 0)))
113
+ else:
114
+ out.append((2, t))
115
+ return tuple(out)
116
+
117
+ def _cmp(v1, v2):
118
+ a, b = _canon(v1), _canon(v2)
119
+ return (a > b) - (a < b)
120
+
121
+ for dist in dists:
122
+ try:
123
+ installed = md.version(dist)
124
+ except Exception:
125
+ continue
126
+
127
+ latest = None
128
+ try:
129
+ with urllib.request.urlopen(f"https://pypi.org/pypi/{dist}/json", timeout=timeout) as r:
130
+ latest = (json.load(r)["info"]["version"] or "").strip() or None
131
+ except Exception:
132
+ pass
133
+
134
+ if not latest:
135
+ return installed # offline or project not on PyPI
136
+
137
+ return installed + (" (LATEST)" if _cmp(installed, latest) >= 0
138
+ else f" (OUTDATED \u2192 {latest})")
139
+
140
+ # Fallback: use __version__ if importlib metadata couldn't resolve
141
+ return getattr(sys.modules.get(top), "__version__", "unknown")
142
+ except Exception:
143
+ return "unknown"
144
+
76
145
  def reservations():
77
146
  data = account.get_reservations()
78
147
  if 'ace' in data.results:
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDJjCCAg6gAwIBAgIUEutLmDonaXbPUYklSjQw9IoSI/wwDQYJKoZIhvcNAQEL
3
+ BQAwGTEXMBUGA1UEAwwOMTY0LjY3LjE5NS4yMDcwIBcNMjUwOTI5MjAyNjI2WhgP
4
+ MjEyNTA5MDUyMDI2MjZaMBkxFzAVBgNVBAMMDjE2NC42Ny4xOTUuMjA3MIIBIjAN
5
+ BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzTdU+Of3lKJlNVzPvB5FVF/o3TBT
6
+ DC+xi9O1cjAfm6IDBfBTyP8oD1kTyevNP+N14p6zn7Xxd1Dd6M0m4h+381+fwHQx
7
+ hKzPXaH1Xefy7OuKmMuyZH7i5GZtnOXMa+2sMuekEQhwqn9U2NIwL1jr2/z3sd3b
8
+ W52bdDfstU29htpTEgLZ3cS0zknElg7R5Qhd6ZX9L1/O8DP2XaOcM3UG4YcXXwuh
9
+ EV7fGy28JIwKHyUXHWNLOSINOKfsXdBTUJa1WEzid2pTDKjd1oKAMta3LP38MTK4
10
+ xkGQ7mQnBGhh4cbHSWNKqglGc/ZWBVlLC6jZJw6Q+RZpnHBZbpVN0kbXGQIDAQAB
11
+ o2QwYjAdBgNVHQ4EFgQUe1g9n2C1VBHUdIutCWzU/WNqUnswHwYDVR0jBBgwFoAU
12
+ e1g9n2C1VBHUdIutCWzU/WNqUnswDwYDVR0TAQH/BAUwAwEB/zAPBgNVHREECDAG
13
+ hwSkQ8PPMA0GCSqGSIb3DQEBCwUAA4IBAQBetHfCe999KPuT5rnL8+P+DKhCHYm1
14
+ vX6rmIhtYUj/m50xvf+TCJv/799fXfpX/G2fe1Gm40uPGjwNHYaUuJHaTDtqR7vs
15
+ R9F7+tOlJ+03u2Ue8e8jIzPbXt/ThpCbUPDsXbAImqgYEF6b2xR6abf5zn9jiBiM
16
+ jCawdjsB2mcgKp/5BlTeajQj6rM7Gyvl6YpQ5v03f2xDTIyqV9sAVChyv63jPU6j
17
+ iH9FFEFoBx7i3Vszx95lExid/bL/OTZoaQkpXHjSsqSwfL0BG3ZJEfjVsbfKolZN
18
+ HNIbcnf/t/B+XmLFFBy/wpVPuALnAOxMmYatrB/qMzq/UDIvA4DHgaSl
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDNN1T45/eUomU1
3
+ XM+8HkVUX+jdMFMML7GL07VyMB+bogMF8FPI/ygPWRPJ680/43XinrOftfF3UN3o
4
+ zSbiH7fzX5/AdDGErM9dofVd5/Ls64qYy7JkfuLkZm2c5cxr7awy56QRCHCqf1TY
5
+ 0jAvWOvb/Pex3dtbnZt0N+y1Tb2G2lMSAtndxLTOScSWDtHlCF3plf0vX87wM/Zd
6
+ o5wzdQbhhxdfC6ERXt8bLbwkjAofJRcdY0s5Ig04p+xd0FNQlrVYTOJ3alMMqN3W
7
+ goAy1rcs/fwxMrjGQZDuZCcEaGHhxsdJY0qqCUZz9lYFWUsLqNknDpD5FmmccFlu
8
+ lU3SRtcZAgMBAAECggEADBKewZvn8UsSeC6zG+aN/pY73VNb92IQ6GB2krapDV9d
9
+ HSrTywXTxf9gDid8pi8L/t6GQ7WQ9IuB2pHDIVdrW3p7K/fJ9/uwoVoHVNRx8qUy
10
+ vKVzI71hPL2X4jyUp57OXBpLiSL9edJO3AiVhBuPmJwLuF+MaZnejNpDZzEhHr87
11
+ RhD50umMNSXSL16pPuWihV73700UkoGbi4UChmbVPza0EJnS9trIqTeoKsQmAhC6
12
+ idmzfJGaTLl6BoQYJSxi8OR+zeGYN91OMtGOM10W0kZSV0p92/SOoaKN9LH7wgK1
13
+ HEabo5eyGpsDMAhBCDQ7XrcqZywpF88Ttp09GbzrjwKBgQD5f3TMEp3k0ADvf1DX
14
+ ln+f+MhVeDu3yfN4F/lPJciWHp24uu4feF++z78FKvlplDhXko6e85tSJKk86N8/
15
+ 6/kgkc9Ndljw6YxelhItPStHjQZXVMXOEQJr5x6patV+oeF5O+nnmYUcydw96PeA
16
+ rGiuJj1+y2QEppTi3aU0uK0TowKBgQDSkHJfeKjppLX4O/gApNw+Y3D5u6ezcjM1
17
+ yiB81UcBtN8gNMWoEFTphAQnD5ieNFvChmY6x0NpSVPstcWj7NSNOHfTU9ctptg8
18
+ LkuJtfDgcfoPUuRKqFZx30EAr/zDce3tvhR/98KyffjomYOdycUPWgVaIdcpXp+A
19
+ 8eIS3C42EwKBgAlkTd48uSra1Z4uWbmz1ZwM/mWRQBY8COk1ZdIf5vwXrPI+PyZ6
20
+ HoiNQ3CLXJYn2TMatjmvi+I8tQ4w6e57EIa0VmxhDxoKgJky5v5C9jUcTufMriGC
21
+ rGepbJMODXlV2Kn6omRwd/1Mb/j4oxB57PrZP6ldOKegKayckVJ5vTInAoGAUeP7
22
+ l0XF65gzbSdlfFqhjWH/PiDNR+zSHclOeT45L2C4pj3f4Uz4uRiuxMI8CMs0JKNA
23
+ fvugLAJosVbAVtB0mbesYnPo68hHsKAQoK4x0BiDuBH011RAymiZTzsigqB8eEnE
24
+ j0A8aE61z0Bk/6jJCv9ntXYTx/MU9YEc+1jGYCECgYB9Y32sH3xV2LdMKlhFtjux
25
+ WAyyAN+C7Ly8jzwpHQMxpSxHZ16tO/V+0mMIqZHRz1X+DKqO4h6t1j3Bn0u9Tm/i
26
+ vXNDEfy9RF/9U16s0ByK6QzwTodevNg7SEP6YzagR6DlCzIwj0Xbs9m9BHT7Ypia
27
+ J2qGfS7rsnmSP31AtQhikA==
28
+ -----END PRIVATE KEY-----
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoterf
3
- Version: 0.0.7.35
4
- Summary: A python API to remotely access signal centric hardware. Client-side only!
3
+ Version: 0.0.7.37
4
+ Summary: A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.
5
5
  Author: Ethan Ge
6
6
  Author-email: ethoGalaxy@gmail.com
7
7
  Classifier: Programming Language :: Python :: 3
@@ -1,19 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDJDCCAgygAwIBAgIUTLqudWuu46JkqxA1UOVcHkhZz0swDQYJKoZIhvcNAQEL
3
- BQAwGTEXMBUGA1UEAwwOMTY0LjY3LjE5NS4yMDcwHhcNMjQxMDI1MjAzNTAzWhcN
4
- MjUxMDI1MjAzNTAzWjAZMRcwFQYDVQQDDA4xNjQuNjcuMTk1LjIwNzCCASIwDQYJ
5
- KoZIhvcNAQEBBQADggEPADCCAQoCggEBALCAm+cnf98MpcPLB9n6NEYoDU7ye/74
6
- iEenNiFV440qKQ2y0fV9qZ5+AeaUpFbrZPyClOBQhJxg1SrZnhQkBJD2GOiX0vxh
7
- LqugFCCgfoCJEyX/oJXogGcNPlcrkN5ATFfD7n/9MIvdcpSisF34/jQvqjZXzkd2
8
- 1KpqHH+bwxCUCoe2YENIVpEs3gbojaPsgbsJECHy3CsG9pS7/FNPGnoI6UdXrXSl
9
- RIQToERlyk0UgKsGWwj+FGdJavOlU/um7Q1C/oxNeCaZPGSQzJOrCiPt/HGimCAn
10
- 2BMOro2X9KfKnT4cUMIZzeSvjdTx6IgrpjSN+XdzeFpcoUZRMpxtdPECAwEAAaNk
11
- MGIwHQYDVR0OBBYEFIVpaHQqtgoiCyJQpsUZqAXEvTuUMB8GA1UdIwQYMBaAFIVp
12
- aHQqtgoiCyJQpsUZqAXEvTuUMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0RBAgwBocE
13
- pEPDzzANBgkqhkiG9w0BAQsFAAOCAQEAEUiXzwMbEry2ptVu/Q9FV8hmhbpgveve
14
- Hh5PniP3UQfxlRZnZ4UEN14FHIV7d9o9FUedGmnC95hnURHd5YlLE3JTNTN5lyqp
15
- zWySGS1oGsTog6ctl7Psey6Detgxj5B8lA+z3Tp7Ud2sANejFhoYNrzkFrbyLLnW
16
- 1BjPJlMZBBW2+yVd8zQPXAfAQwdqeuBns9XSDuY5MvRaJd8yfXjP1SksBBaanqCN
17
- 9Fj/LXtjZrTu1FqZ7I0rUp/obR+avoeu/qHx6TkZ741SDhJ1wGJzW/+21yDdQe7P
18
- kf4iOINrN3FaQv35oo2fgINgWoZYRrEsKkRbEZvUX2/yAg2le1WkKA==
19
- -----END CERTIFICATE-----
@@ -1,28 +0,0 @@
1
- -----BEGIN PRIVATE KEY-----
2
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwgJvnJ3/fDKXD
3
- ywfZ+jRGKA1O8nv++IhHpzYhVeONKikNstH1famefgHmlKRW62T8gpTgUIScYNUq
4
- 2Z4UJASQ9hjol9L8YS6roBQgoH6AiRMl/6CV6IBnDT5XK5DeQExXw+5//TCL3XKU
5
- orBd+P40L6o2V85HdtSqahx/m8MQlAqHtmBDSFaRLN4G6I2j7IG7CRAh8twrBvaU
6
- u/xTTxp6COlHV610pUSEE6BEZcpNFICrBlsI/hRnSWrzpVP7pu0NQv6MTXgmmTxk
7
- kMyTqwoj7fxxopggJ9gTDq6Nl/Snyp0+HFDCGc3kr43U8eiIK6Y0jfl3c3haXKFG
8
- UTKcbXTxAgMBAAECggEAHlas9am7eBqTb7k5a0VvsNN3nideGvCbdD2Qt2AtEfm6
9
- PsmK/3iPLFgaeYj5SpuBq0nCz1/nu32Fhq0LWAjs5AH5PBnEwW7u9783Vnhf5jYp
10
- nXF4J+xkDdKf8Znid+Fzfe6G02cw7gmthVEFodGH2G6NAnRLV8tcOMKujVy3xeRz
11
- XVqL9ttbllCboYQQ5yZH9+wahAV0YT5FogttvKhd3jiPRAZ5sITxq+ibnLx3upqc
12
- Tzz4VSCymuoX5Aq010bjvrA9yWcFeP4lHru4ArTZS9zsZ9BgCoT2MxBv9qmg/fwv
13
- /SZ+/WvHWj0dhSonh5TWv2be0JWWMZu6cWKoFAs68QKBgQDc9dmZZagY+y93frCj
14
- 38MjVfFUtUbauXW2Q83EiMjOPU3UAH7igE564OPAM5YRTtbzT7qohwokHS6FrXgB
15
- NEdes6qQfaCvaqnG75ylpRKKL1abWSBjb28jNYvSJdvM7z38+XjLNRXeoiDFju5g
16
- 4nU7Yru4aXRlwvTCmLh6VSD9JQKBgQDMfe8zJHQHpMG/edcYE0858F/IsXZAVM4c
17
- vnEwRGAEOvLRLbf2FkyC8UmQ0JxaXRCxyeSl5JRuMjpImmfvOEdI9OZvVolbuIM3
18
- QrY7SL//CqcNuQWm6OvGy3+QrrFHEVsEdMKEB7bbDo0+Eyl87U+8sXge7wkTp7OW
19
- 10uOm3F83QKBgHF5zROLcoXJ0jnDFYJDc1rdU0AWjNndbwd40N8DBGVudF7RFljK
20
- XgObJTvbAlHHNHrmUk0kdN/RIMhEKyIrMBABozHrYq9Tzvc8rS0glmHjJ85GOmz2
21
- mJPzdugoyzX3E9WsZQ2vKJkamEv9OI0HH/+smA2AEugD9GFPv0YMHBIFAoGAOxws
22
- CJyA7bSyTKbrhgoO3LCe/2RMyku5SJXEIi+hkZd4mP6eLoRDmZYlrbafe39rU/kI
23
- Huvz++aI8nOvl3atJGmmMojRK7IqO88M3hYpaY+qukzBVX3+qXgpZ6kXlXNu29rk
24
- X0XblXafXVIsq+/tHJ4wGsD93rCbOP8C2DYWmAECgYEAn5KaWkAJCH1GGurJD/jU
25
- w/M1eU4tMRecI/9E2J38PuANfcQ972Jl252ZK/1aR/rysFlrdkZSzDfEuiQFphhu
26
- BmOqFELKbsst+ijc/jTR8KQLHqr4nFk0PCE8HwrLc2LBN45kr3LdqwmehobU80+s
27
- nvDLTTO6AjP462kETu05Nrk=
28
- -----END PRIVATE KEY-----
File without changes
File without changes
File without changes
File without changes