| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -38,20 +38,18 @@ repos: | |||
| 38 | 38 | hooks: | |
| 39 | 39 | - id: pyupgrade | |
| 40 | 40 | args: [--py37-plus] | |
| 41 | - - repo: https://github.com/PyCQA/isort | ||
| 42 | - rev: 5.12.0 | ||
| 41 | + - repo: https://github.com/astral-sh/ruff-pre-commit | ||
| 42 | + rev: v0.5.0 | ||
| 43 | 43 | hooks: | |
| 44 | - - id: isort | ||
| 45 | - - repo: https://github.com/psf/black | ||
| 46 | - rev: 22.8.0 | ||
| 47 | - hooks: | ||
| 48 | - - id: black | ||
| 44 | + - id: ruff | ||
| 45 | + args: [--fix, --exit-non-zero-on-fix] | ||
| 46 | + - id: ruff-format | ||
| 49 | 47 | # - repo: https://github.com/codespell-project/codespell | |
| 50 | 48 | # rev: v2.2.1 | |
| 51 | 49 | # hooks: | |
| 52 | 50 | # - id: codespell | |
| 53 | 51 | - repo: https://github.com/PyCQA/flake8 | |
| 54 | - rev: 5.0.4 | ||
| 52 | + rev: 7.1.0 | ||
| 55 | 53 | hooks: | |
| 56 | 54 | - id: flake8 | |
| 57 | 55 | - repo: https://github.com/pre-commit/mirrors-mypy | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,4 +1,5 @@ | |||
| 1 | 1 | """Benchmark for AsyncZeroconf.""" | |
| 2 | + | ||
| 2 | 3 | import asyncio | |
| 3 | 4 | import time | |
| 4 | 5 | ||
@@ -17,7 +18,9 @@ async def _run() -> None: | |||
| 17 | 18 | start = time.perf_counter() | |
| 18 | 19 | await _create_destroy(iterations) | |
| 19 | 20 | duration = time.perf_counter() - start | |
| 20 | - print(f"Creating and destroying {iterations} Zeroconf instances took {duration} seconds") | ||
| 21 | + print( | ||
| 22 | + f"Creating and destroying {iterations} Zeroconf instances took {duration} seconds" | ||
| 23 | + ) | ||
| 21 | 24 | ||
| 22 | 25 | ||
| 23 | 26 | asyncio.run(_run()) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,4 +1,5 @@ | |||
| 1 | 1 | """Benchmark for DNSIncoming.""" | |
| 2 | + | ||
| 2 | 3 | import socket | |
| 3 | 4 | import timeit | |
| 4 | 5 | from typing import List | |
@@ -121,8 +122,8 @@ def generate_packets() -> List[bytes]: | |||
| 121 | 122 | const._TYPE_TXT, | |
| 122 | 123 | const._CLASS_IN | const._CLASS_UNIQUE, | |
| 123 | 124 | const._DNS_OTHER_TTL, | |
| 124 | - b'\x13md=HASS Bridge W9DN\x06pv=1.0\x14id=11:8E:DB:5B:5C:C5\x05c#=12\x04s#=1' | ||
| 125 | - b'\x04ff=0\x04ci=2\x04sf=0\x0bsh=6fLM5A==', | ||
| 125 | + b"\x13md=HASS Bridge W9DN\x06pv=1.0\x14id=11:8E:DB:5B:5C:C5\x05c#=12\x04s#=1" | ||
| 126 | + b"\x04ff=0\x04ci=2\x04sf=0\x0bsh=6fLM5A==", | ||
| 126 | 127 | ), | |
| 127 | 128 | 0, | |
| 128 | 129 | ) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,4 +1,5 @@ | |||
| 1 | 1 | """Benchmark for DNSOutgoing.""" | |
| 2 | + | ||
| 2 | 3 | import socket | |
| 3 | 4 | import timeit | |
| 4 | 5 | ||
@@ -113,8 +114,8 @@ def generate_packets() -> DNSOutgoing: | |||
| 113 | 114 | const._TYPE_TXT, | |
| 114 | 115 | const._CLASS_IN | const._CLASS_UNIQUE, | |
| 115 | 116 | const._DNS_OTHER_TTL, | |
| 116 | - b'\x13md=HASS Bridge W9DN\x06pv=1.0\x14id=11:8E:DB:5B:5C:C5\x05c#=12\x04s#=1' | ||
| 117 | - b'\x04ff=0\x04ci=2\x04sf=0\x0bsh=6fLM5A==', | ||
| 117 | + b"\x13md=HASS Bridge W9DN\x06pv=1.0\x14id=11:8E:DB:5B:5C:C5\x05c#=12\x04s#=1" | ||
| 118 | + b"\x04ff=0\x04ci=2\x04sf=0\x0bsh=6fLM5A==", | ||
| 118 | 119 | ), | |
| 119 | 120 | 0, | |
| 120 | 121 | ) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -47,7 +47,9 @@ def build(setup_kwargs: Any) -> None: | |||
| 47 | 47 | cmdclass=dict(build_ext=BuildExt), | |
| 48 | 48 | ) | |
| 49 | 49 | ) | |
| 50 | - setup_kwargs["exclude_package_data"] = {pkg: ["*.c"] for pkg in setup_kwargs["packages"]} | ||
| 50 | + setup_kwargs["exclude_package_data"] = { | ||
| 51 | + pkg: ["*.c"] for pkg in setup_kwargs["packages"] | ||
| 52 | + } | ||
| 51 | 53 | except Exception: | |
| 52 | 54 | if os.environ.get("REQUIRE_CYTHON"): | |
| 53 | 55 | raise | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -23,23 +23,23 @@ | |||
| 23 | 23 | ||
| 24 | 24 | # Add any Sphinx extension module names here, as strings. They can be extensions | |
| 25 | 25 | # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. | |
| 26 | - extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx'] | ||
| 26 | + extensions = ["sphinx.ext.autodoc", "sphinx.ext.intersphinx"] | ||
| 27 | 27 | ||
| 28 | 28 | # Add any paths that contain templates here, relative to this directory. | |
| 29 | - templates_path = ['_templates'] | ||
| 29 | + templates_path = ["_templates"] | ||
| 30 | 30 | ||
| 31 | 31 | # The suffix of source filenames. | |
| 32 | - source_suffix = '.rst' | ||
| 32 | + source_suffix = ".rst" | ||
| 33 | 33 | ||
| 34 | 34 | # The encoding of source files. | |
| 35 | 35 | # source_encoding = 'utf-8-sig' | |
| 36 | 36 | ||
| 37 | 37 | # The master toctree document. | |
| 38 | - master_doc = 'index' | ||
| 38 | + master_doc = "index" | ||
| 39 | 39 | ||
| 40 | 40 | # General information about the project. | |
| 41 | - project = 'python-zeroconf' | ||
| 42 | - copyright = 'python-zeroconf authors' | ||
| 41 | + project = "python-zeroconf" | ||
| 42 | + copyright = "python-zeroconf authors" | ||
| 43 | 43 | ||
| 44 | 44 | # The version info for the project you're documenting, acts as replacement for | |
| 45 | 45 | # |version| and |release|, also used in various other places throughout the | |
@@ -62,7 +62,7 @@ | |||
| 62 | 62 | ||
| 63 | 63 | # List of patterns, relative to source directory, that match files and | |
| 64 | 64 | # directories to ignore when looking for source files. | |
| 65 | - exclude_patterns = ['_build'] | ||
| 65 | + exclude_patterns = ["_build"] | ||
| 66 | 66 | ||
| 67 | 67 | # The reST default role (used for this markup: `text`) to use for all documents. | |
| 68 | 68 | # default_role = None | |
@@ -79,7 +79,7 @@ | |||
| 79 | 79 | # show_authors = False | |
| 80 | 80 | ||
| 81 | 81 | # The name of the Pygments (syntax highlighting) style to use. | |
| 82 | - pygments_style = 'sphinx' | ||
| 82 | + pygments_style = "sphinx" | ||
| 83 | 83 | ||
| 84 | 84 | # A list of ignored prefixes for module index sorting. | |
| 85 | 85 | # modindex_common_prefix = [] | |
@@ -92,7 +92,7 @@ | |||
| 92 | 92 | ||
| 93 | 93 | # The theme to use for HTML and HTML Help pages. See the documentation for | |
| 94 | 94 | # a list of builtin themes. | |
| 95 | - html_theme = 'default' | ||
| 95 | + html_theme = "default" | ||
| 96 | 96 | ||
| 97 | 97 | # Theme options are theme-specific and customize the look and feel of a theme | |
| 98 | 98 | # further. For a list of options available for each theme, see the | |
@@ -121,7 +121,7 @@ | |||
| 121 | 121 | # Add any paths that contain custom static files (such as style sheets) here, | |
| 122 | 122 | # relative to this directory. They are copied after the builtin static files, | |
| 123 | 123 | # so a file named "default.css" will overwrite the builtin "default.css". | |
| 124 | - html_static_path = ['_static'] | ||
| 124 | + html_static_path = ["_static"] | ||
| 125 | 125 | ||
| 126 | 126 | # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, | |
| 127 | 127 | # using the given strftime format. | |
@@ -133,8 +133,8 @@ | |||
| 133 | 133 | ||
| 134 | 134 | # Custom sidebar templates, maps document names to template names. | |
| 135 | 135 | html_sidebars = { | |
| 136 | - 'index': ('sidebar.html', 'sourcelink.html', 'searchbox.html'), | ||
| 137 | - '**': ('localtoc.html', 'relations.html', 'sourcelink.html', 'searchbox.html'), | ||
| 136 | + "index": ("sidebar.html", "sourcelink.html", "searchbox.html"), | ||
| 137 | + "**": ("localtoc.html", "relations.html", "sourcelink.html", "searchbox.html"), | ||
| 138 | 138 | } | |
| 139 | 139 | ||
| 140 | 140 | # Additional templates that should be rendered to pages, maps page names to | |
@@ -168,7 +168,7 @@ | |||
| 168 | 168 | # html_file_suffix = None | |
| 169 | 169 | ||
| 170 | 170 | # Output file base name for HTML help builder. | |
| 171 | - htmlhelp_basename = 'zeroconfdoc' | ||
| 171 | + htmlhelp_basename = "zeroconfdoc" | ||
| 172 | 172 | ||
| 173 | 173 | ||
| 174 | 174 | # -- Options for LaTeX output -------------------------------------------------- | |
@@ -231,17 +231,17 @@ | |||
| 231 | 231 | ||
| 232 | 232 | ||
| 233 | 233 | # Example configuration for intersphinx: refer to the Python standard library. | |
| 234 | - intersphinx_mapping = {'http://docs.python.org/': None} | ||
| 234 | + intersphinx_mapping = {"http://docs.python.org/": None} | ||
| 235 | 235 | ||
| 236 | 236 | ||
| 237 | 237 | def setup(app): # type: ignore[no-untyped-def] | |
| 238 | - app.connect('autodoc-skip-member', skip_member) | ||
| 238 | + app.connect("autodoc-skip-member", skip_member) | ||
| 239 | 239 | ||
| 240 | 240 | ||
| 241 | 241 | def skip_member(app, what, name, obj, skip, options): # type: ignore[no-untyped-def] | |
| 242 | 242 | return ( | |
| 243 | 243 | skip | |
| 244 | - or getattr(obj, '__doc__', None) is None | ||
| 245 | - or getattr(obj, '__private__', False) is True | ||
| 246 | - or getattr(getattr(obj, '__func__', None), '__private__', False) is True | ||
| 244 | + or getattr(obj, "__doc__", None) is None | ||
| 245 | + or getattr(obj, "__private__", False) is True | ||
| 246 | + or getattr(getattr(obj, "__func__", None), "__private__", False) is True | ||
| 247 | 247 | ) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,6 +1,6 @@ | |||
| 1 | 1 | #!/usr/bin/env python3 | |
| 2 | 2 | ||
| 3 | - """ Scan for apple devices. """ | ||
| 3 | + """Scan for apple devices.""" | ||
| 4 | 4 | ||
| 5 | 5 | import argparse | |
| 6 | 6 | import asyncio | |
@@ -43,15 +43,21 @@ def async_on_service_state_change( | |||
| 43 | 43 | device_name = f"{base_name}.{DEVICE_INFO_SERVICE}" | |
| 44 | 44 | asyncio.ensure_future(_async_show_service_info(zeroconf, service_type, name)) | |
| 45 | 45 | # Also probe for device info | |
| 46 | - asyncio.ensure_future(_async_show_service_info(zeroconf, DEVICE_INFO_SERVICE, device_name)) | ||
| 46 | + asyncio.ensure_future( | ||
| 47 | + _async_show_service_info(zeroconf, DEVICE_INFO_SERVICE, device_name) | ||
| 48 | + ) | ||
| 47 | 49 | ||
| 48 | 50 | ||
| 49 | - async def _async_show_service_info(zeroconf: Zeroconf, service_type: str, name: str) -> None: | ||
| 51 | + async def _async_show_service_info( | ||
| 52 | + zeroconf: Zeroconf, service_type: str, name: str | ||
| 53 | + ) -> None: | ||
| 50 | 54 | info = AsyncServiceInfo(service_type, name) | |
| 51 | 55 | await info.async_request(zeroconf, 3000, question_type=DNSQuestionType.QU) | |
| 52 | 56 | print("Info from zeroconf.get_service_info: %r" % (info)) | |
| 53 | 57 | if info: | |
| 54 | - addresses = ["%s:%d" % (addr, cast(int, info.port)) for addr in info.parsed_addresses()] | ||
| 58 | + addresses = [ | ||
| 59 | + "%s:%d" % (addr, cast(int, info.port)) for addr in info.parsed_addresses() | ||
| 60 | + ] | ||
| 55 | 61 | print(" Name: %s" % name) | |
| 56 | 62 | print(" Addresses: %s" % ", ".join(addresses)) | |
| 57 | 63 | print(" Weight: %d, priority: %d" % (info.weight, info.priority)) | |
@@ -64,7 +70,7 @@ async def _async_show_service_info(zeroconf: Zeroconf, service_type: str, name: | |||
| 64 | 70 | print(" No properties") | |
| 65 | 71 | else: | |
| 66 | 72 | print(" No info") | |
| 67 | - print('\n') | ||
| 73 | + print("\n") | ||
| 68 | 74 | ||
| 69 | 75 | ||
| 70 | 76 | class AsyncAppleScanner: | |
@@ -77,10 +83,17 @@ async def async_run(self) -> None: | |||
| 77 | 83 | self.aiozc = AsyncZeroconf(ip_version=ip_version) | |
| 78 | 84 | await self.aiozc.zeroconf.async_wait_for_start() | |
| 79 | 85 | print("\nBrowsing %s service(s), press Ctrl-C to exit...\n" % ALL_SERVICES) | |
| 80 | - kwargs = {'handlers': [async_on_service_state_change], 'question_type': DNSQuestionType.QU} | ||
| 86 | + kwargs = { | ||
| 87 | + "handlers": [async_on_service_state_change], | ||
| 88 | + "question_type": DNSQuestionType.QU, | ||
| 89 | + } | ||
| 81 | 90 | if self.args.target: | |
| 82 | 91 | kwargs["addr"] = self.args.target | |
| 83 | - self.aiobrowser = AsyncServiceBrowser(self.aiozc.zeroconf, ALL_SERVICES, **kwargs) # type: ignore | ||
| 92 | + self.aiobrowser = AsyncServiceBrowser( | ||
| 93 | + self.aiozc.zeroconf, | ||
| 94 | + ALL_SERVICES, | ||
| 95 | + **kwargs, # type: ignore[arg-type] | ||
| 96 | + ) | ||
| 84 | 97 | while True: | |
| 85 | 98 | await asyncio.sleep(1) | |
| 86 | 99 | ||
@@ -91,19 +104,19 @@ async def async_close(self) -> None: | |||
| 91 | 104 | await self.aiozc.async_close() | |
| 92 | 105 | ||
| 93 | 106 | ||
| 94 | - if __name__ == '__main__': | ||
| 107 | + if __name__ == "__main__": | ||
| 95 | 108 | logging.basicConfig(level=logging.DEBUG) | |
| 96 | 109 | ||
| 97 | 110 | parser = argparse.ArgumentParser() | |
| 98 | - parser.add_argument('--debug', action='store_true') | ||
| 111 | + parser.add_argument("--debug", action="store_true") | ||
| 99 | 112 | version_group = parser.add_mutually_exclusive_group() | |
| 100 | - version_group.add_argument('--target', help='Unicast target') | ||
| 101 | - version_group.add_argument('--v6', action='store_true') | ||
| 102 | - version_group.add_argument('--v6-only', action='store_true') | ||
| 113 | + version_group.add_argument("--target", help="Unicast target") | ||
| 114 | + version_group.add_argument("--v6", action="store_true") | ||
| 115 | + version_group.add_argument("--v6-only", action="store_true") | ||
| 103 | 116 | args = parser.parse_args() | |
| 104 | 117 | ||
| 105 | 118 | if args.debug: | |
| 106 | - logging.getLogger('zeroconf').setLevel(logging.DEBUG) | ||
| 119 | + logging.getLogger("zeroconf").setLevel(logging.DEBUG) | ||
| 107 | 120 | if args.v6: | |
| 108 | 121 | ip_version = IPVersion.All | |
| 109 | 122 | elif args.v6_only: | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,6 +1,6 @@ | |||
| 1 | 1 | #!/usr/bin/env python3 | |
| 2 | 2 | ||
| 3 | - """ Example of browsing for a service. | ||
| 3 | + """Example of browsing for a service. | ||
| 4 | 4 | ||
| 5 | 5 | The default is HTTP and HAP; use --find to search for all available services in the network | |
| 6 | 6 | """ | |
@@ -28,12 +28,17 @@ def async_on_service_state_change( | |||
| 28 | 28 | asyncio.ensure_future(async_display_service_info(zeroconf, service_type, name)) | |
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | - async def async_display_service_info(zeroconf: Zeroconf, service_type: str, name: str) -> None: | ||
| 31 | + async def async_display_service_info( | ||
| 32 | + zeroconf: Zeroconf, service_type: str, name: str | ||
| 33 | + ) -> None: | ||
| 32 | 34 | info = AsyncServiceInfo(service_type, name) | |
| 33 | 35 | await info.async_request(zeroconf, 3000) | |
| 34 | 36 | print("Info from zeroconf.get_service_info: %r" % (info)) | |
| 35 | 37 | if info: | |
| 36 | - addresses = ["%s:%d" % (addr, cast(int, info.port)) for addr in info.parsed_scoped_addresses()] | ||
| 38 | + addresses = [ | ||
| 39 | + "%s:%d" % (addr, cast(int, info.port)) | ||
| 40 | + for addr in info.parsed_scoped_addresses() | ||
| 41 | + ] | ||
| 37 | 42 | print(" Name: %s" % name) | |
| 38 | 43 | print(" Addresses: %s" % ", ".join(addresses)) | |
| 39 | 44 | print(" Weight: %d, priority: %d" % (info.weight, info.priority)) | |
@@ -46,7 +51,7 @@ async def async_display_service_info(zeroconf: Zeroconf, service_type: str, name | |||
| 46 | 51 | print(" No properties") | |
| 47 | 52 | else: | |
| 48 | 53 | print(" No info") | |
| 49 | - print('\n') | ||
| 54 | + print("\n") | ||
| 50 | 55 | ||
| 51 | 56 | ||
| 52 | 57 | class AsyncRunner: | |
@@ -61,7 +66,9 @@ async def async_run(self) -> None: | |||
| 61 | 66 | services = ["_http._tcp.local.", "_hap._tcp.local."] | |
| 62 | 67 | if self.args.find: | |
| 63 | 68 | services = list( | |
| 64 | - await AsyncZeroconfServiceTypes.async_find(aiozc=self.aiozc, ip_version=ip_version) | ||
| 69 | + await AsyncZeroconfServiceTypes.async_find( | ||
| 70 | + aiozc=self.aiozc, ip_version=ip_version | ||
| 71 | + ) | ||
| 65 | 72 | ) | |
| 66 | 73 | ||
| 67 | 74 | print("\nBrowsing %s service(s), press Ctrl-C to exit...\n" % services) | |
@@ -78,19 +85,21 @@ async def async_close(self) -> None: | |||
| 78 | 85 | await self.aiozc.async_close() | |
| 79 | 86 | ||
| 80 | 87 | ||
| 81 | - if __name__ == '__main__': | ||
| 88 | + if __name__ == "__main__": | ||
| 82 | 89 | logging.basicConfig(level=logging.DEBUG) | |
| 83 | 90 | ||
| 84 | 91 | parser = argparse.ArgumentParser() | |
| 85 | - parser.add_argument('--debug', action='store_true') | ||
| 86 | - parser.add_argument('--find', action='store_true', help='Browse all available services') | ||
| 92 | + parser.add_argument("--debug", action="store_true") | ||
| 93 | + parser.add_argument( | ||
| 94 | + "--find", action="store_true", help="Browse all available services" | ||
| 95 | + ) | ||
| 87 | 96 | version_group = parser.add_mutually_exclusive_group() | |
| 88 | - version_group.add_argument('--v6', action='store_true') | ||
| 89 | - version_group.add_argument('--v6-only', action='store_true') | ||
| 97 | + version_group.add_argument("--v6", action="store_true") | ||
| 98 | + version_group.add_argument("--v6-only", action="store_true") | ||
| 90 | 99 | args = parser.parse_args() | |
| 91 | 100 | ||
| 92 | 101 | if args.debug: | |
| 93 | - logging.getLogger('zeroconf').setLevel(logging.DEBUG) | ||
| 102 | + logging.getLogger("zeroconf").setLevel(logging.DEBUG) | ||
| 94 | 103 | if args.v6: | |
| 95 | 104 | ip_version = IPVersion.All | |
| 96 | 105 | elif args.v6_only: | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -33,18 +33,18 @@ async def unregister_services(self, infos: List[AsyncServiceInfo]) -> None: | |||
| 33 | 33 | await self.aiozc.async_close() | |
| 34 | 34 | ||
| 35 | 35 | ||
| 36 | - if __name__ == '__main__': | ||
| 36 | + if __name__ == "__main__": | ||
| 37 | 37 | logging.basicConfig(level=logging.DEBUG) | |
| 38 | 38 | ||
| 39 | 39 | parser = argparse.ArgumentParser() | |
| 40 | - parser.add_argument('--debug', action='store_true') | ||
| 40 | + parser.add_argument("--debug", action="store_true") | ||
| 41 | 41 | version_group = parser.add_mutually_exclusive_group() | |
| 42 | - version_group.add_argument('--v6', action='store_true') | ||
| 43 | - version_group.add_argument('--v6-only', action='store_true') | ||
| 42 | + version_group.add_argument("--v6", action="store_true") | ||
| 43 | + version_group.add_argument("--v6-only", action="store_true") | ||
| 44 | 44 | args = parser.parse_args() | |
| 45 | 45 | ||
| 46 | 46 | if args.debug: | |
| 47 | - logging.getLogger('zeroconf').setLevel(logging.DEBUG) | ||
| 47 | + logging.getLogger("zeroconf").setLevel(logging.DEBUG) | ||
| 48 | 48 | if args.v6: | |
| 49 | 49 | ip_version = IPVersion.All | |
| 50 | 50 | elif args.v6_only: | |
@@ -60,7 +60,7 @@ async def unregister_services(self, infos: List[AsyncServiceInfo]) -> None: | |||
| 60 | 60 | f"Paul's Test Web Site {i}._http._tcp.local.", | |
| 61 | 61 | addresses=[socket.inet_aton("127.0.0.1")], | |
| 62 | 62 | port=80, | |
| 63 | - properties={'path': '/~paulsm/'}, | ||
| 63 | + properties={"path": "/~paulsm/"}, | ||
| 64 | 64 | server=f"zcdemohost-{i}.local.", | |
| 65 | 65 | ) | |
| 66 | 66 | ) | |
| Back | FazBrowse Home | New Git URL |
0 commit comments