SILENT KILLERPanel

Current Path: > > usr > lib64 > > > python3.8


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //usr/lib64///python3.8

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
asyncio Directory - -
collections Directory - -
concurrent Directory - -
config-3.8-x86_64-linux-gnu Directory - -
ctypes Directory - -
curses Directory - -
dbm Directory - -
distutils Directory - -
email Directory - -
encodings Directory - -
ensurepip Directory - -
html Directory - -
http Directory - -
importlib Directory - -
json Directory - -
lib-dynload Directory - -
lib2to3 Directory - -
logging Directory - -
multiprocessing Directory - -
pydoc_data Directory - -
site-packages Directory - -
sqlite3 Directory - -
tkinter Directory - -
turtledemo Directory - -
unittest Directory - -
urllib Directory - -
venv Directory - -
wsgiref Directory - -
xml Directory - -
xmlrpc Directory - -
LICENSE.txt File 13937 bytes June 06 2023 13:32:21.
__future__.py File 5147 bytes June 06 2023 13:32:21.
__phello__.foo.py File 64 bytes June 06 2023 13:32:21.
_bootlocale.py File 1801 bytes June 06 2023 13:32:21.
_collections_abc.py File 26100 bytes June 06 2023 13:32:21.
_compat_pickle.py File 8749 bytes June 06 2023 13:32:21.
_compression.py File 5340 bytes June 06 2023 13:32:21.
_dummy_thread.py File 6027 bytes June 06 2023 13:32:21.
_markupbase.py File 14598 bytes June 06 2023 13:32:21.
_osx_support.py File 21774 bytes June 06 2023 13:32:21.
_py_abc.py File 6189 bytes June 06 2023 13:32:21.
_pydecimal.py File 228666 bytes June 06 2023 13:32:21.
_pyio.py File 93177 bytes June 06 2023 13:32:21.
_sitebuiltins.py File 3115 bytes June 06 2023 13:32:21.
_strptime.py File 25268 bytes June 06 2023 13:32:21.
_sysconfigdata__linux_x86_64-linux-gnu.py File 38510 bytes October 17 2023 18:12:19.
_sysconfigdata_d_linux_x86_64-linux-gnu.py File 38237 bytes October 17 2023 18:03:44.
_threading_local.py File 7220 bytes June 06 2023 13:32:21.
_weakrefset.py File 5735 bytes June 06 2023 13:32:21.
abc.py File 4489 bytes June 06 2023 13:32:21.
aifc.py File 32814 bytes June 06 2023 13:32:21.
antigravity.py File 477 bytes June 06 2023 13:32:21.
argparse.py File 96015 bytes June 06 2023 13:32:21.
ast.py File 19234 bytes June 06 2023 13:32:21.
asynchat.py File 11328 bytes June 06 2023 13:32:21.
asyncore.py File 20094 bytes June 06 2023 13:32:21.
base64.py File 20382 bytes June 06 2023 13:32:21.
bdb.py File 32056 bytes June 06 2023 13:32:21.
binhex.py File 13954 bytes June 06 2023 13:32:21.
bisect.py File 2214 bytes June 06 2023 13:32:21.
bz2.py File 12558 bytes June 06 2023 13:32:21.
cProfile.py File 7010 bytes June 06 2023 13:32:21.
calendar.py File 24832 bytes June 06 2023 13:32:21.
cgi.py File 33934 bytes October 17 2023 18:02:14.
cgitb.py File 12096 bytes June 06 2023 13:32:21.
chunk.py File 5435 bytes June 06 2023 13:32:21.
cmd.py File 14860 bytes June 06 2023 13:32:21.
code.py File 10622 bytes June 06 2023 13:32:21.
codecs.py File 36667 bytes June 06 2023 13:32:21.
codeop.py File 6330 bytes June 06 2023 13:32:21.
colorsys.py File 4064 bytes June 06 2023 13:32:21.
compileall.py File 13678 bytes June 06 2023 13:32:21.
configparser.py File 54374 bytes June 06 2023 13:32:21.
contextlib.py File 24995 bytes June 06 2023 13:32:21.
contextvars.py File 129 bytes June 06 2023 13:32:21.
copy.py File 8661 bytes June 06 2023 13:32:21.
copyreg.py File 7135 bytes June 06 2023 13:32:21.
crypt.py File 3610 bytes June 06 2023 13:32:21.
csv.py File 16144 bytes June 06 2023 13:32:21.
dataclasses.py File 49973 bytes June 06 2023 13:32:21.
datetime.py File 88287 bytes June 06 2023 13:32:21.
decimal.py File 320 bytes June 06 2023 13:32:21.
difflib.py File 84058 bytes June 06 2023 13:32:21.
dis.py File 20570 bytes June 06 2023 13:32:21.
doctest.py File 104543 bytes June 06 2023 13:32:21.
dummy_threading.py File 2815 bytes June 06 2023 13:32:21.
enum.py File 38136 bytes June 06 2023 13:32:21.
filecmp.py File 9830 bytes June 06 2023 13:32:21.
fileinput.py File 14709 bytes June 06 2023 13:32:21.
fnmatch.py File 4079 bytes June 06 2023 13:32:21.
formatter.py File 15143 bytes June 06 2023 13:32:21.
fractions.py File 24329 bytes June 06 2023 13:32:21.
ftplib.py File 35129 bytes June 06 2023 13:32:21.
functools.py File 37406 bytes June 06 2023 13:32:21.
genericpath.py File 4975 bytes June 06 2023 13:32:21.
getopt.py File 7489 bytes June 06 2023 13:32:21.
getpass.py File 5994 bytes June 06 2023 13:32:21.
gettext.py File 27138 bytes June 06 2023 13:32:21.
glob.py File 5697 bytes June 06 2023 13:32:21.
gzip.py File 21413 bytes June 06 2023 13:32:21.
hashlib.py File 8333 bytes October 17 2023 18:02:14.
heapq.py File 22877 bytes June 06 2023 13:32:21.
hmac.py File 7850 bytes October 17 2023 18:02:14.
imaplib.py File 53606 bytes June 06 2023 13:32:21.
imghdr.py File 3808 bytes June 06 2023 13:32:21.
imp.py File 10536 bytes June 06 2023 13:32:21.
inspect.py File 118550 bytes June 06 2023 13:32:21.
io.py File 3541 bytes June 06 2023 13:32:21.
ipaddress.py File 71644 bytes June 06 2023 13:32:21.
keyword.py File 945 bytes June 06 2023 13:32:21.
linecache.py File 5330 bytes June 06 2023 13:32:21.
locale.py File 78191 bytes June 06 2023 13:32:21.
lzma.py File 12983 bytes June 06 2023 13:32:21.
mailbox.py File 78661 bytes June 06 2023 13:32:21.
mailcap.py File 9067 bytes June 06 2023 13:32:21.
mimetypes.py File 21664 bytes June 06 2023 13:32:21.
modulefinder.py File 24430 bytes June 06 2023 13:32:21.
netrc.py File 5566 bytes June 06 2023 13:32:21.
nntplib.py File 43261 bytes June 06 2023 13:32:21.
ntpath.py File 27734 bytes June 06 2023 13:32:21.
nturl2path.py File 2887 bytes June 06 2023 13:32:21.
numbers.py File 10244 bytes June 06 2023 13:32:21.
opcode.py File 5808 bytes June 06 2023 13:32:21.
operator.py File 10711 bytes June 06 2023 13:32:21.
optparse.py File 60369 bytes June 06 2023 13:32:21.
os.py File 38995 bytes June 06 2023 13:32:21.
pathlib.py File 52610 bytes June 06 2023 13:32:21.
pdb.py File 62738 bytes June 06 2023 13:32:21.
pickle.py File 64467 bytes June 06 2023 13:32:21.
pickletools.py File 93486 bytes June 06 2023 13:32:21.
pipes.py File 8916 bytes June 06 2023 13:32:21.
pkgutil.py File 21500 bytes June 06 2023 13:32:21.
platform.py File 40425 bytes June 06 2023 13:32:21.
plistlib.py File 32220 bytes June 06 2023 13:32:21.
poplib.py File 15077 bytes June 06 2023 13:32:21.
posixpath.py File 15627 bytes June 06 2023 13:32:21.
pprint.py File 21484 bytes June 06 2023 13:32:21.
profile.py File 23546 bytes June 06 2023 13:32:21.
pstats.py File 27345 bytes June 06 2023 13:32:21.
pty.py File 4807 bytes June 06 2023 13:32:21.
py_compile.py File 8203 bytes October 17 2023 18:02:14.
pyclbr.py File 15255 bytes June 06 2023 13:32:21.
pydoc.py File 106700 bytes October 17 2023 18:12:57.
queue.py File 11356 bytes June 06 2023 13:32:21.
quopri.py File 7252 bytes June 06 2023 13:32:21.
random.py File 28802 bytes June 06 2023 13:32:21.
re.py File 15861 bytes June 06 2023 13:32:21.
reprlib.py File 5267 bytes June 06 2023 13:32:21.
rlcompleter.py File 7097 bytes June 06 2023 13:32:21.
runpy.py File 12052 bytes June 06 2023 13:32:21.
sched.py File 6442 bytes June 06 2023 13:32:21.
secrets.py File 2038 bytes June 06 2023 13:32:21.
selectors.py File 18561 bytes June 06 2023 13:32:21.
shelve.py File 8527 bytes June 06 2023 13:32:21.
shlex.py File 13325 bytes June 06 2023 13:32:21.
shutil.py File 51761 bytes June 06 2023 13:32:21.
signal.py File 2273 bytes June 06 2023 13:32:21.
site.py File 21838 bytes October 17 2023 18:02:14.
smtpd.py File 34709 bytes June 06 2023 13:32:21.
smtplib.py File 45001 bytes June 06 2023 13:32:21.
sndhdr.py File 7099 bytes June 06 2023 13:32:21.
socket.py File 35243 bytes June 06 2023 13:32:21.
socketserver.py File 27296 bytes June 06 2023 13:32:21.
sre_compile.py File 26695 bytes June 06 2023 13:32:21.
sre_constants.py File 7154 bytes June 06 2023 13:32:21.
sre_parse.py File 40230 bytes June 06 2023 13:32:21.
ssl.py File 50760 bytes June 06 2023 13:32:21.
stat.py File 5485 bytes June 06 2023 13:32:21.
statistics.py File 39690 bytes June 06 2023 13:32:21.
string.py File 10535 bytes June 06 2023 13:32:21.
stringprep.py File 12917 bytes June 06 2023 13:32:21.
struct.py File 257 bytes June 06 2023 13:32:21.
subprocess.py File 78250 bytes June 06 2023 13:32:21.
sunau.py File 18375 bytes June 06 2023 13:32:21.
symbol.py File 2109 bytes October 17 2023 18:04:15.
symtable.py File 8021 bytes June 06 2023 13:32:21.
sysconfig.py File 24896 bytes October 17 2023 18:12:55.
tabnanny.py File 11406 bytes June 06 2023 13:32:21.
tarfile.py File 106473 bytes October 17 2023 18:02:14.
telnetlib.py File 23254 bytes June 06 2023 13:32:21.
tempfile.py File 27537 bytes June 06 2023 13:32:21.
textwrap.py File 19407 bytes June 06 2023 13:32:21.
this.py File 1003 bytes June 06 2023 13:32:21.
threading.py File 50820 bytes June 06 2023 13:32:21.
timeit.py File 13480 bytes June 06 2023 13:32:21.
token.py File 2368 bytes June 06 2023 13:32:21.
tokenize.py File 25841 bytes June 06 2023 13:32:21.
trace.py File 29870 bytes June 06 2023 13:32:21.
traceback.py File 23611 bytes June 06 2023 13:32:21.
tracemalloc.py File 17076 bytes June 06 2023 13:32:21.
tty.py File 879 bytes June 06 2023 13:32:21.
turtle.py File 143716 bytes June 06 2023 13:32:21.
types.py File 9713 bytes June 06 2023 13:32:21.
typing.py File 68962 bytes June 06 2023 13:32:21.
uu.py File 7277 bytes October 17 2023 18:12:57.
uuid.py File 30515 bytes October 17 2023 18:02:14.
warnings.py File 19688 bytes June 06 2023 13:32:21.
wave.py File 18230 bytes June 06 2023 13:32:21.
weakref.py File 21387 bytes June 06 2023 13:32:21.
webbrowser.py File 24083 bytes June 06 2023 13:32:21.
xdrlib.py File 5913 bytes June 06 2023 13:32:21.
zipapp.py File 7535 bytes June 06 2023 13:32:21.
zipfile.py File 87728 bytes June 06 2023 13:32:21.
zipimport.py File 30765 bytes June 06 2023 13:32:21.

Reading File: //usr/lib64///python3.8/webbrowser.py

#! /usr/bin/python3.8
"""Interfaces for launching and remotely controlling Web browsers."""
# Maintained by Georg Brandl.

import os
import shlex
import shutil
import sys
import subprocess
import threading

__all__ = ["Error", "open", "open_new", "open_new_tab", "get", "register"]

class Error(Exception):
    pass

_lock = threading.RLock()
_browsers = {}                  # Dictionary of available browser controllers
_tryorder = None                # Preference order of available browsers
_os_preferred_browser = None    # The preferred browser

def register(name, klass, instance=None, *, preferred=False):
    """Register a browser connector."""
    with _lock:
        if _tryorder is None:
            register_standard_browsers()
        _browsers[name.lower()] = [klass, instance]

        # Preferred browsers go to the front of the list.
        # Need to match to the default browser returned by xdg-settings, which
        # may be of the form e.g. "firefox.desktop".
        if preferred or (_os_preferred_browser and name in _os_preferred_browser):
            _tryorder.insert(0, name)
        else:
            _tryorder.append(name)

def get(using=None):
    """Return a browser launcher instance appropriate for the environment."""
    if _tryorder is None:
        with _lock:
            if _tryorder is None:
                register_standard_browsers()
    if using is not None:
        alternatives = [using]
    else:
        alternatives = _tryorder
    for browser in alternatives:
        if '%s' in browser:
            # User gave us a command line, split it into name and args
            browser = shlex.split(browser)
            if browser[-1] == '&':
                return BackgroundBrowser(browser[:-1])
            else:
                return GenericBrowser(browser)
        else:
            # User gave us a browser name or path.
            try:
                command = _browsers[browser.lower()]
            except KeyError:
                command = _synthesize(browser)
            if command[1] is not None:
                return command[1]
            elif command[0] is not None:
                return command[0]()
    raise Error("could not locate runnable browser")

# Please note: the following definition hides a builtin function.
# It is recommended one does "import webbrowser" and uses webbrowser.open(url)
# instead of "from webbrowser import *".

def open(url, new=0, autoraise=True):
    """Display url using the default browser.

    If possible, open url in a location determined by new.
    - 0: the same browser window (the default).
    - 1: a new browser window.
    - 2: a new browser page ("tab").
    If possible, autoraise raises the window (the default) or not.
    """
    if _tryorder is None:
        with _lock:
            if _tryorder is None:
                register_standard_browsers()
    for name in _tryorder:
        browser = get(name)
        if browser.open(url, new, autoraise):
            return True
    return False

def open_new(url):
    """Open url in a new window of the default browser.

    If not possible, then open url in the only browser window.
    """
    return open(url, 1)

def open_new_tab(url):
    """Open url in a new page ("tab") of the default browser.

    If not possible, then the behavior becomes equivalent to open_new().
    """
    return open(url, 2)


def _synthesize(browser, *, preferred=False):
    """Attempt to synthesize a controller based on existing controllers.

    This is useful to create a controller when a user specifies a path to
    an entry in the BROWSER environment variable -- we can copy a general
    controller to operate using a specific installation of the desired
    browser in this way.

    If we can't create a controller in this way, or if there is no
    executable for the requested browser, return [None, None].

    """
    cmd = browser.split()[0]
    if not shutil.which(cmd):
        return [None, None]
    name = os.path.basename(cmd)
    try:
        command = _browsers[name.lower()]
    except KeyError:
        return [None, None]
    # now attempt to clone to fit the new name:
    controller = command[1]
    if controller and name.lower() == controller.basename:
        import copy
        controller = copy.copy(controller)
        controller.name = browser
        controller.basename = os.path.basename(browser)
        register(browser, None, instance=controller, preferred=preferred)
        return [None, controller]
    return [None, None]


# General parent classes

class BaseBrowser(object):
    """Parent class for all browsers. Do not use directly."""

    args = ['%s']

    def __init__(self, name=""):
        self.name = name
        self.basename = name

    def open(self, url, new=0, autoraise=True):
        raise NotImplementedError

    def open_new(self, url):
        return self.open(url, 1)

    def open_new_tab(self, url):
        return self.open(url, 2)


class GenericBrowser(BaseBrowser):
    """Class for all browsers started with a command
       and without remote functionality."""

    def __init__(self, name):
        if isinstance(name, str):
            self.name = name
            self.args = ["%s"]
        else:
            # name should be a list with arguments
            self.name = name[0]
            self.args = name[1:]
        self.basename = os.path.basename(self.name)

    def open(self, url, new=0, autoraise=True):
        sys.audit("webbrowser.open", url)
        cmdline = [self.name] + [arg.replace("%s", url)
                                 for arg in self.args]
        try:
            if sys.platform[:3] == 'win':
                p = subprocess.Popen(cmdline)
            else:
                p = subprocess.Popen(cmdline, close_fds=True)
            return not p.wait()
        except OSError:
            return False


class BackgroundBrowser(GenericBrowser):
    """Class for all browsers which are to be started in the
       background."""

    def open(self, url, new=0, autoraise=True):
        cmdline = [self.name] + [arg.replace("%s", url)
                                 for arg in self.args]
        sys.audit("webbrowser.open", url)
        try:
            if sys.platform[:3] == 'win':
                p = subprocess.Popen(cmdline)
            else:
                p = subprocess.Popen(cmdline, close_fds=True,
                                     start_new_session=True)
            return (p.poll() is None)
        except OSError:
            return False


class UnixBrowser(BaseBrowser):
    """Parent class for all Unix browsers with remote functionality."""

    raise_opts = None
    background = False
    redirect_stdout = True
    # In remote_args, %s will be replaced with the requested URL.  %action will
    # be replaced depending on the value of 'new' passed to open.
    # remote_action is used for new=0 (open).  If newwin is not None, it is
    # used for new=1 (open_new).  If newtab is not None, it is used for
    # new=3 (open_new_tab).  After both substitutions are made, any empty
    # strings in the transformed remote_args list will be removed.
    remote_args = ['%action', '%s']
    remote_action = None
    remote_action_newwin = None
    remote_action_newtab = None

    def _invoke(self, args, remote, autoraise, url=None):
        raise_opt = []
        if remote and self.raise_opts:
            # use autoraise argument only for remote invocation
            autoraise = int(autoraise)
            opt = self.raise_opts[autoraise]
            if opt: raise_opt = [opt]

        cmdline = [self.name] + raise_opt + args

        if remote or self.background:
            inout = subprocess.DEVNULL
        else:
            # for TTY browsers, we need stdin/out
            inout = None
        p = subprocess.Popen(cmdline, close_fds=True, stdin=inout,
                             stdout=(self.redirect_stdout and inout or None),
                             stderr=inout, start_new_session=True)
        if remote:
            # wait at most five seconds. If the subprocess is not finished, the
            # remote invocation has (hopefully) started a new instance.
            try:
                rc = p.wait(5)
                # if remote call failed, open() will try direct invocation
                return not rc
            except subprocess.TimeoutExpired:
                return True
        elif self.background:
            if p.poll() is None:
                return True
            else:
                return False
        else:
            return not p.wait()

    def open(self, url, new=0, autoraise=True):
        sys.audit("webbrowser.open", url)
        if new == 0:
            action = self.remote_action
        elif new == 1:
            action = self.remote_action_newwin
        elif new == 2:
            if self.remote_action_newtab is None:
                action = self.remote_action_newwin
            else:
                action = self.remote_action_newtab
        else:
            raise Error("Bad 'new' parameter to open(); " +
                        "expected 0, 1, or 2, got %s" % new)

        args = [arg.replace("%s", url).replace("%action", action)
                for arg in self.remote_args]
        args = [arg for arg in args if arg]
        success = self._invoke(args, True, autoraise, url)
        if not success:
            # remote invocation failed, try straight way
            args = [arg.replace("%s", url) for arg in self.args]
            return self._invoke(args, False, False)
        else:
            return True


class Mozilla(UnixBrowser):
    """Launcher class for Mozilla browsers."""

    remote_args = ['%action', '%s']
    remote_action = ""
    remote_action_newwin = "-new-window"
    remote_action_newtab = "-new-tab"
    background = True


class Netscape(UnixBrowser):
    """Launcher class for Netscape browser."""

    raise_opts = ["-noraise", "-raise"]
    remote_args = ['-remote', 'openURL(%s%action)']
    remote_action = ""
    remote_action_newwin = ",new-window"
    remote_action_newtab = ",new-tab"
    background = True


class Galeon(UnixBrowser):
    """Launcher class for Galeon/Epiphany browsers."""

    raise_opts = ["-noraise", ""]
    remote_args = ['%action', '%s']
    remote_action = "-n"
    remote_action_newwin = "-w"
    background = True


class Chrome(UnixBrowser):
    "Launcher class for Google Chrome browser."

    remote_args = ['%action', '%s']
    remote_action = ""
    remote_action_newwin = "--new-window"
    remote_action_newtab = ""
    background = True

Chromium = Chrome


class Opera(UnixBrowser):
    "Launcher class for Opera browser."

    remote_args = ['%action', '%s']
    remote_action = ""
    remote_action_newwin = "--new-window"
    remote_action_newtab = ""
    background = True


class Elinks(UnixBrowser):
    "Launcher class for Elinks browsers."

    remote_args = ['-remote', 'openURL(%s%action)']
    remote_action = ""
    remote_action_newwin = ",new-window"
    remote_action_newtab = ",new-tab"
    background = False

    # elinks doesn't like its stdout to be redirected -
    # it uses redirected stdout as a signal to do -dump
    redirect_stdout = False


class Konqueror(BaseBrowser):
    """Controller for the KDE File Manager (kfm, or Konqueror).

    See the output of ``kfmclient --commands``
    for more information on the Konqueror remote-control interface.
    """

    def open(self, url, new=0, autoraise=True):
        sys.audit("webbrowser.open", url)
        # XXX Currently I know no way to prevent KFM from opening a new win.
        if new == 2:
            action = "newTab"
        else:
            action = "openURL"

        devnull = subprocess.DEVNULL

        try:
            p = subprocess.Popen(["kfmclient", action, url],
                                 close_fds=True, stdin=devnull,
                                 stdout=devnull, stderr=devnull)
        except OSError:
            # fall through to next variant
            pass
        else:
            p.wait()
            # kfmclient's return code unfortunately has no meaning as it seems
            return True

        try:
            p = subprocess.Popen(["konqueror", "--silent", url],
                                 close_fds=True, stdin=devnull,
                                 stdout=devnull, stderr=devnull,
                                 start_new_session=True)
        except OSError:
            # fall through to next variant
            pass
        else:
            if p.poll() is None:
                # Should be running now.
                return True

        try:
            p = subprocess.Popen(["kfm", "-d", url],
                                 close_fds=True, stdin=devnull,
                                 stdout=devnull, stderr=devnull,
                                 start_new_session=True)
        except OSError:
            return False
        else:
            return (p.poll() is None)


class Grail(BaseBrowser):
    # There should be a way to maintain a connection to Grail, but the
    # Grail remote control protocol doesn't really allow that at this
    # point.  It probably never will!
    def _find_grail_rc(self):
        import glob
        import pwd
        import socket
        import tempfile
        tempdir = os.path.join(tempfile.gettempdir(),
                               ".grail-unix")
        user = pwd.getpwuid(os.getuid())[0]
        filename = os.path.join(glob.escape(tempdir), glob.escape(user) + "-*")
        maybes = glob.glob(filename)
        if not maybes:
            return None
        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        for fn in maybes:
            # need to PING each one until we find one that's live
            try:
                s.connect(fn)
            except OSError:
                # no good; attempt to clean it out, but don't fail:
                try:
                    os.unlink(fn)
                except OSError:
                    pass
            else:
                return s

    def _remote(self, action):
        s = self._find_grail_rc()
        if not s:
            return 0
        s.send(action)
        s.close()
        return 1

    def open(self, url, new=0, autoraise=True):
        sys.audit("webbrowser.open", url)
        if new:
            ok = self._remote("LOADNEW " + url)
        else:
            ok = self._remote("LOAD " + url)
        return ok


#
# Platform support for Unix
#

# These are the right tests because all these Unix browsers require either
# a console terminal or an X display to run.

def register_X_browsers():

    # use xdg-open if around
    if shutil.which("xdg-open"):
        register("xdg-open", None, BackgroundBrowser("xdg-open"))

    # The default GNOME3 browser
    if "GNOME_DESKTOP_SESSION_ID" in os.environ and shutil.which("gvfs-open"):
        register("gvfs-open", None, BackgroundBrowser("gvfs-open"))

    # The default GNOME browser
    if "GNOME_DESKTOP_SESSION_ID" in os.environ and shutil.which("gnome-open"):
        register("gnome-open", None, BackgroundBrowser("gnome-open"))

    # The default KDE browser
    if "KDE_FULL_SESSION" in os.environ and shutil.which("kfmclient"):
        register("kfmclient", Konqueror, Konqueror("kfmclient"))

    if shutil.which("x-www-browser"):
        register("x-www-browser", None, BackgroundBrowser("x-www-browser"))

    # The Mozilla browsers
    for browser in ("firefox", "iceweasel", "iceape", "seamonkey"):
        if shutil.which(browser):
            register(browser, None, Mozilla(browser))

    # The Netscape and old Mozilla browsers
    for browser in ("mozilla-firefox",
                    "mozilla-firebird", "firebird",
                    "mozilla", "netscape"):
        if shutil.which(browser):
            register(browser, None, Netscape(browser))

    # Konqueror/kfm, the KDE browser.
    if shutil.which("kfm"):
        register("kfm", Konqueror, Konqueror("kfm"))
    elif shutil.which("konqueror"):
        register("konqueror", Konqueror, Konqueror("konqueror"))

    # Gnome's Galeon and Epiphany
    for browser in ("galeon", "epiphany"):
        if shutil.which(browser):
            register(browser, None, Galeon(browser))

    # Skipstone, another Gtk/Mozilla based browser
    if shutil.which("skipstone"):
        register("skipstone", None, BackgroundBrowser("skipstone"))

    # Google Chrome/Chromium browsers
    for browser in ("google-chrome", "chrome", "chromium", "chromium-browser"):
        if shutil.which(browser):
            register(browser, None, Chrome(browser))

    # Opera, quite popular
    if shutil.which("opera"):
        register("opera", None, Opera("opera"))

    # Next, Mosaic -- old but still in use.
    if shutil.which("mosaic"):
        register("mosaic", None, BackgroundBrowser("mosaic"))

    # Grail, the Python browser. Does anybody still use it?
    if shutil.which("grail"):
        register("grail", Grail, None)

def register_standard_browsers():
    global _tryorder
    _tryorder = []

    if sys.platform == 'darwin':
        register("MacOSX", None, MacOSXOSAScript('default'))
        register("chrome", None, MacOSXOSAScript('chrome'))
        register("firefox", None, MacOSXOSAScript('firefox'))
        register("safari", None, MacOSXOSAScript('safari'))
        # OS X can use below Unix support (but we prefer using the OS X
        # specific stuff)

    if sys.platform[:3] == "win":
        # First try to use the default Windows browser
        register("windows-default", WindowsDefault)

        # Detect some common Windows browsers, fallback to IE
        iexplore = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"),
                                "Internet Explorer\\IEXPLORE.EXE")
        for browser in ("firefox", "firebird", "seamonkey", "mozilla",
                        "netscape", "opera", iexplore):
            if shutil.which(browser):
                register(browser, None, BackgroundBrowser(browser))
    else:
        # Prefer X browsers if present
        if os.environ.get("DISPLAY") or os.environ.get("WAYLAND_DISPLAY"):
            try:
                cmd = "xdg-settings get default-web-browser".split()
                raw_result = subprocess.check_output(cmd, stderr=subprocess.DEVNULL)
                result = raw_result.decode().strip()
            except (FileNotFoundError, subprocess.CalledProcessError, PermissionError, NotADirectoryError) :
                pass
            else:
                global _os_preferred_browser
                _os_preferred_browser = result

            register_X_browsers()

        # Also try console browsers
        if os.environ.get("TERM"):
            if shutil.which("www-browser"):
                register("www-browser", None, GenericBrowser("www-browser"))
            # The Links/elinks browsers <http://artax.karlin.mff.cuni.cz/~mikulas/links/>
            if shutil.which("links"):
                register("links", None, GenericBrowser("links"))
            if shutil.which("elinks"):
                register("elinks", None, Elinks("elinks"))
            # The Lynx browser <http://lynx.isc.org/>, <http://lynx.browser.org/>
            if shutil.which("lynx"):
                register("lynx", None, GenericBrowser("lynx"))
            # The w3m browser <http://w3m.sourceforge.net/>
            if shutil.which("w3m"):
                register("w3m", None, GenericBrowser("w3m"))

    # OK, now that we know what the default preference orders for each
    # platform are, allow user to override them with the BROWSER variable.
    if "BROWSER" in os.environ:
        userchoices = os.environ["BROWSER"].split(os.pathsep)
        userchoices.reverse()

        # Treat choices in same way as if passed into get() but do register
        # and prepend to _tryorder
        for cmdline in userchoices:
            if cmdline != '':
                cmd = _synthesize(cmdline, preferred=True)
                if cmd[1] is None:
                    register(cmdline, None, GenericBrowser(cmdline), preferred=True)

    # what to do if _tryorder is now empty?


#
# Platform support for Windows
#

if sys.platform[:3] == "win":
    class WindowsDefault(BaseBrowser):
        def open(self, url, new=0, autoraise=True):
            sys.audit("webbrowser.open", url)
            try:
                os.startfile(url)
            except OSError:
                # [Error 22] No application is associated with the specified
                # file for this operation: '<URL>'
                return False
            else:
                return True

#
# Platform support for MacOS
#

if sys.platform == 'darwin':
    # Adapted from patch submitted to SourceForge by Steven J. Burr
    class MacOSX(BaseBrowser):
        """Launcher class for Aqua browsers on Mac OS X

        Optionally specify a browser name on instantiation.  Note that this
        will not work for Aqua browsers if the user has moved the application
        package after installation.

        If no browser is specified, the default browser, as specified in the
        Internet System Preferences panel, will be used.
        """
        def __init__(self, name):
            self.name = name

        def open(self, url, new=0, autoraise=True):
            sys.audit("webbrowser.open", url)
            assert "'" not in url
            # hack for local urls
            if not ':' in url:
                url = 'file:'+url

            # new must be 0 or 1
            new = int(bool(new))
            if self.name == "default":
                # User called open, open_new or get without a browser parameter
                script = 'open location "%s"' % url.replace('"', '%22') # opens in default browser
            else:
                # User called get and chose a browser
                if self.name == "OmniWeb":
                    toWindow = ""
                else:
                    # Include toWindow parameter of OpenURL command for browsers
                    # that support it.  0 == new window; -1 == existing
                    toWindow = "toWindow %d" % (new - 1)
                cmd = 'OpenURL "%s"' % url.replace('"', '%22')
                script = '''tell application "%s"
                                activate
                                %s %s
                            end tell''' % (self.name, cmd, toWindow)
            # Open pipe to AppleScript through osascript command
            osapipe = os.popen("osascript", "w")
            if osapipe is None:
                return False
            # Write script to osascript's stdin
            osapipe.write(script)
            rc = osapipe.close()
            return not rc

    class MacOSXOSAScript(BaseBrowser):
        def __init__(self, name):
            self._name = name

        def open(self, url, new=0, autoraise=True):
            if self._name == 'default':
                script = 'open location "%s"' % url.replace('"', '%22') # opens in default browser
            else:
                script = '''
                   tell application "%s"
                       activate
                       open location "%s"
                   end
                   '''%(self._name, url.replace('"', '%22'))

            osapipe = os.popen("osascript", "w")
            if osapipe is None:
                return False

            osapipe.write(script)
            rc = osapipe.close()
            return not rc


def main():
    import getopt
    usage = """Usage: %s [-n | -t] url
    -n: open new window
    -t: open new tab""" % sys.argv[0]
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'ntd')
    except getopt.error as msg:
        print(msg, file=sys.stderr)
        print(usage, file=sys.stderr)
        sys.exit(1)
    new_win = 0
    for o, a in opts:
        if o == '-n': new_win = 1
        elif o == '-t': new_win = 2
    if len(args) != 1:
        print(usage, file=sys.stderr)
        sys.exit(1)

    url = args[0]
    open(url, new_win)

    print("\a")

if __name__ == "__main__":
    main()

SILENT KILLER Tool