✘✘ GRAYBYTE WORDPRESS FILE MANAGER ✘✘

​🇳​​🇦​​🇲​​🇪♯➤ beluga.o2switch.net ​🇻​♯➤ 4.18.0-553.123.2.lve.el8.x86_64 #1 SMP 🇾​♯➤ 2026

𝗛𝗢𝗠𝗘 𝗜𝗗 ♯➤ 185.154.139.77 ♯➤ 𝗔𝗗𝗠𝗜𝗡 𝗜𝗗 216.73.216.84
𝗢𝗣𝗧𝗜𝗢𝗡𝗦 ♯ CRL ♯➤ 𝗢𝗞 ┃ WGT ♯➤ 𝗢𝗞 ┃ SDO ♯➤ 𝗢𝗙𝗙 ┃ PKEX ♯➤ 𝗢𝗙𝗙
𝗗𝗘𝗔𝗖𝗧𝗜𝗩𝗔𝗧𝗘𝗗 ♯➤ 𝗔𝗟𝗟 𝗪𝗢𝗥𝗞𝗜𝗡𝗚....

𝗛𝗢𝗠𝗘
𝗖𝗨𝗥𝗥𝗘𝗡𝗧 𝗙𝗜𝗟𝗘 : /opt/alt/python312/lib64/python3.12/test//test__xxinterpchannels.py
from collections import namedtuple
import contextlib
import sys
from textwrap import dedent
import threading
import time
import unittest

from test.support import import_helper

from test.test__xxsubinterpreters import (
    interpreters,
    _run_output,
    clean_up_interpreters,
)


channels = import_helper.import_module('_xxinterpchannels')


##################################
# helpers

#@contextmanager
#def run_threaded(id, source, **shared):
#    def run():
#        run_interp(id, source, **shared)
#    t = threading.Thread(target=run)
#    t.start()
#    yield
#    t.join()


def run_interp(id, source, **shared):
    _run_interp(id, source, shared)


def _run_interp(id, source, shared, _mainns={}):
    source = dedent(source)
    main = interpreters.get_main()
    if main == id:
        if interpreters.get_current() != main:
            raise RuntimeError
        # XXX Run a func?
        exec(source, _mainns)
    else:
        interpreters.run_string(id, source, shared)


class Interpreter(namedtuple('Interpreter', 'name id')):

    @classmethod
    def from_raw(cls, raw):
        if isinstance(raw, cls):
            return raw
        elif isinstance(raw, str):
            return cls(raw)
        else:
            raise NotImplementedError

    def __new__(cls, name=None, id=None):
        main = interpreters.get_main()
        if id == main:
            if not name:
                name = 'main'
            elif name != 'main':
                raise ValueError(
                    'name mismatch (expected "main", got "{}")'.format(name))
            id = main
        elif id is not None:
            if not name:
                name = 'interp'
            elif name == 'main':
                raise ValueError('name mismatch (unexpected "main")')
            if not isinstance(id, interpreters.InterpreterID):
                id = interpreters.InterpreterID(id)
        elif not name or name == 'main':
            name = 'main'
            id = main
        else:
            id = interpreters.create()
        self = super().__new__(cls, name, id)
        return self


# XXX expect_channel_closed() is unnecessary once we improve exc propagation.

@contextlib.contextmanager
def expect_channel_closed():
    try:
        yield
    except channels.ChannelClosedError:
        pass
    else:
        assert False, 'channel not closed'


class ChannelAction(namedtuple('ChannelAction', 'action end interp')):

    def __new__(cls, action, end=None, interp=None):
        if not end:
            end = 'both'
        if not interp:
            interp = 'main'
        self = super().__new__(cls, action, end, interp)
        return self

    def __init__(self, *args, **kwargs):
        if self.action == 'use':
            if self.end not in ('same', 'opposite', 'send', 'recv'):
                raise ValueError(self.end)
        elif self.action in ('close', 'force-close'):
            if self.end not in ('both', 'same', 'opposite', 'send', 'recv'):
                raise ValueError(self.end)
        else:
            raise ValueError(self.action)
        if self.interp not in ('main', 'same', 'other', 'extra'):
            raise ValueError(self.interp)

    def resolve_end(self, end):
        if self.end == 'same':
            return end
        elif self.end == 'opposite':
            return 'recv' if end == 'send' else 'send'
        else:
            return self.end

    def resolve_interp(self, interp, other, extra):
        if self.interp == 'same':
            return interp
        elif self.interp == 'other':
            if other is None:
                raise RuntimeError
            return other
        elif self.interp == 'extra':
            if extra is None:
                raise RuntimeError
            return extra
        elif self.interp == 'main':
            if interp.name == 'main':
                return interp
            elif other and other.name == 'main':
                return other
            else:
                raise RuntimeError
        # Per __init__(), there aren't any others.


class ChannelState(namedtuple('ChannelState', 'pending closed')):

    def __new__(cls, pending=0, *, closed=False):
        self = super().__new__(cls, pending, closed)
        return self

    def incr(self):
        return type(self)(self.pending + 1, closed=self.closed)

    def decr(self):
        return type(self)(self.pending - 1, closed=self.closed)

    def close(self, *, force=True):
        if self.closed:
            if not force or self.pending == 0:
                return self
        return type(self)(0 if force else self.pending, closed=True)


def run_action(cid, action, end, state, *, hideclosed=True):
    if state.closed:
        if action == 'use' and end == 'recv' and state.pending:
            expectfail = False
        else:
            expectfail = True
    else:
        expectfail = False

    try:
        result = _run_action(cid, action, end, state)
    except channels.ChannelClosedError:
        if not hideclosed and not expectfail:
            raise
        result = state.close()
    else:
        if expectfail:
            raise ...  # XXX
    return result


def _run_action(cid, action, end, state):
    if action == 'use':
        if end == 'send':
            channels.send(cid, b'spam')
            return state.incr()
        elif end == 'recv':
            if not state.pending:
                try:
                    channels.recv(cid)
                except channels.ChannelEmptyError:
                    return state
                else:
                    raise Exception('expected ChannelEmptyError')
            else:
                channels.recv(cid)
                return state.decr()
        else:
            raise ValueError(end)
    elif action == 'close':
        kwargs = {}
        if end in ('recv', 'send'):
            kwargs[end] = True
        channels.close(cid, **kwargs)
        return state.close()
    elif action == 'force-close':
        kwargs = {
            'force': True,
            }
        if end in ('recv', 'send'):
            kwargs[end] = True
        channels.close(cid, **kwargs)
        return state.close(force=True)
    else:
        raise ValueError(action)


def clean_up_channels():
    for cid in channels.list_all():
        try:
            channels.destroy(cid)
        except channels.ChannelNotFoundError:
            pass  # already destroyed


class TestBase(unittest.TestCase):

    def tearDown(self):
        clean_up_channels()
        clean_up_interpreters()


##################################
# channel tests

class ChannelIDTests(TestBase):

    def test_default_kwargs(self):
        cid = channels._channel_id(10, force=True)

        self.assertEqual(int(cid), 10)
        self.assertEqual(cid.end, 'both')

    def test_with_kwargs(self):
        cid = channels._channel_id(10, send=True, force=True)
        self.assertEqual(cid.end, 'send')

        cid = channels._channel_id(10, send=True, recv=False, force=True)
        self.assertEqual(cid.end, 'send')

        cid = channels._channel_id(10, recv=True, force=True)
        self.assertEqual(cid.end, 'recv')

        cid = channels._channel_id(10, recv=True, send=False, force=True)
        self.assertEqual(cid.end, 'recv')

        cid = channels._channel_id(10, send=True, recv=True, force=True)
        self.assertEqual(cid.end, 'both')

    def test_coerce_id(self):
        class Int(str):
            def __index__(self):
                return 10

        cid = channels._channel_id(Int(), force=True)
        self.assertEqual(int(cid), 10)

    def test_bad_id(self):
        self.assertRaises(TypeError, channels._channel_id, object())
        self.assertRaises(TypeError, channels._channel_id, 10.0)
        self.assertRaises(TypeError, channels._channel_id, '10')
        self.assertRaises(TypeError, channels._channel_id, b'10')
        self.assertRaises(ValueError, channels._channel_id, -1)
        self.assertRaises(OverflowError, channels._channel_id, 2**64)

    def test_bad_kwargs(self):
        with self.assertRaises(ValueError):
            channels._channel_id(10, send=False, recv=False)

    def test_does_not_exist(self):
        cid = channels.create()
        with self.assertRaises(channels.ChannelNotFoundError):
            channels._channel_id(int(cid) + 1)  # unforced

    def test_str(self):
        cid = channels._channel_id(10, force=True)
        self.assertEqual(str(cid), '10')

    def test_repr(self):
        cid = channels._channel_id(10, force=True)
        self.assertEqual(repr(cid), 'ChannelID(10)')

        cid = channels._channel_id(10, send=True, force=True)
        self.assertEqual(repr(cid), 'ChannelID(10, send=True)')

        cid = channels._channel_id(10, recv=True, force=True)
        self.assertEqual(repr(cid), 'ChannelID(10, recv=True)')

        cid = channels._channel_id(10, send=True, recv=True, force=True)
        self.assertEqual(repr(cid), 'ChannelID(10)')

    def test_equality(self):
        cid1 = channels.create()
        cid2 = channels._channel_id(int(cid1))
        cid3 = channels.create()

        self.assertTrue(cid1 == cid1)
        self.assertTrue(cid1 == cid2)
        self.assertTrue(cid1 == int(cid1))
        self.assertTrue(int(cid1) == cid1)
        self.assertTrue(cid1 == float(int(cid1)))
        self.assertTrue(float(int(cid1)) == cid1)
        self.assertFalse(cid1 == float(int(cid1)) + 0.1)
        self.assertFalse(cid1 == str(int(cid1)))
        self.assertFalse(cid1 == 2**1000)
        self.assertFalse(cid1 == float('inf'))
        self.assertFalse(cid1 == 'spam')
        self.assertFalse(cid1 == cid3)

        self.assertFalse(cid1 != cid1)
        self.assertFalse(cid1 != cid2)
        self.assertTrue(cid1 != cid3)

    def test_shareable(self):
        chan = channels.create()

        obj = channels.create()
        channels.send(chan, obj)
        got = channels.recv(chan)

        self.assertEqual(got, obj)
        self.assertIs(type(got), type(obj))
        # XXX Check the following in the channel tests?
        #self.assertIsNot(got, obj)


class ChannelTests(TestBase):

    def test_create_cid(self):
        cid = channels.create()
        self.assertIsInstance(cid, channels.ChannelID)

    def test_sequential_ids(self):
        before = channels.list_all()
        id1 = channels.create()
        id2 = channels.create()
        id3 = channels.create()
        after = channels.list_all()

        self.assertEqual(id2, int(id1) + 1)
        self.assertEqual(id3, int(id2) + 1)
        self.assertEqual(set(after) - set(before), {id1, id2, id3})

    def test_ids_global(self):
        id1 = interpreters.create()
        out = _run_output(id1, dedent("""
            import _xxinterpchannels as _channels
            cid = _channels.create()
            print(cid)
            """))
        cid1 = int(out.strip())

        id2 = interpreters.create()
        out = _run_output(id2, dedent("""
            import _xxinterpchannels as _channels
            cid = _channels.create()
            print(cid)
            """))
        cid2 = int(out.strip())

        self.assertEqual(cid2, int(cid1) + 1)

    def test_channel_list_interpreters_none(self):
        """Test listing interpreters for a channel with no associations."""
        # Test for channel with no associated interpreters.
        cid = channels.create()
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(send_interps, [])
        self.assertEqual(recv_interps, [])

    def test_channel_list_interpreters_basic(self):
        """Test basic listing channel interpreters."""
        interp0 = interpreters.get_main()
        cid = channels.create()
        channels.send(cid, "send")
        # Test for a channel that has one end associated to an interpreter.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(send_interps, [interp0])
        self.assertEqual(recv_interps, [])

        interp1 = interpreters.create()
        _run_output(interp1, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            """))
        # Test for channel that has both ends associated to an interpreter.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(send_interps, [interp0])
        self.assertEqual(recv_interps, [interp1])

    def test_channel_list_interpreters_multiple(self):
        """Test listing interpreters for a channel with many associations."""
        interp0 = interpreters.get_main()
        interp1 = interpreters.create()
        interp2 = interpreters.create()
        interp3 = interpreters.create()
        cid = channels.create()

        channels.send(cid, "send")
        _run_output(interp1, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.send({cid}, "send")
            """))
        _run_output(interp2, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            """))
        _run_output(interp3, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            """))
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(set(send_interps), {interp0, interp1})
        self.assertEqual(set(recv_interps), {interp2, interp3})

    def test_channel_list_interpreters_destroyed(self):
        """Test listing channel interpreters with a destroyed interpreter."""
        interp0 = interpreters.get_main()
        interp1 = interpreters.create()
        cid = channels.create()
        channels.send(cid, "send")
        _run_output(interp1, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            """))
        # Should be one interpreter associated with each end.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(send_interps, [interp0])
        self.assertEqual(recv_interps, [interp1])

        interpreters.destroy(interp1)
        # Destroyed interpreter should not be listed.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(send_interps, [interp0])
        self.assertEqual(recv_interps, [])

    def test_channel_list_interpreters_released(self):
        """Test listing channel interpreters with a released channel."""
        # Set up one channel with main interpreter on the send end and two
        # subinterpreters on the receive end.
        interp0 = interpreters.get_main()
        interp1 = interpreters.create()
        interp2 = interpreters.create()
        cid = channels.create()
        channels.send(cid, "data")
        _run_output(interp1, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            """))
        channels.send(cid, "data")
        _run_output(interp2, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            """))
        # Check the setup.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(len(send_interps), 1)
        self.assertEqual(len(recv_interps), 2)

        # Release the main interpreter from the send end.
        channels.release(cid, send=True)
        # Send end should have no associated interpreters.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(len(send_interps), 0)
        self.assertEqual(len(recv_interps), 2)

        # Release one of the subinterpreters from the receive end.
        _run_output(interp2, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.release({cid})
            """))
        # Receive end should have the released interpreter removed.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(len(send_interps), 0)
        self.assertEqual(recv_interps, [interp1])

    def test_channel_list_interpreters_closed(self):
        """Test listing channel interpreters with a closed channel."""
        interp0 = interpreters.get_main()
        interp1 = interpreters.create()
        cid = channels.create()
        # Put something in the channel so that it's not empty.
        channels.send(cid, "send")

        # Check initial state.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(len(send_interps), 1)
        self.assertEqual(len(recv_interps), 0)

        # Force close the channel.
        channels.close(cid, force=True)
        # Both ends should raise an error.
        with self.assertRaises(channels.ChannelClosedError):
            channels.list_interpreters(cid, send=True)
        with self.assertRaises(channels.ChannelClosedError):
            channels.list_interpreters(cid, send=False)

    def test_channel_list_interpreters_closed_send_end(self):
        """Test listing channel interpreters with a channel's send end closed."""
        interp0 = interpreters.get_main()
        interp1 = interpreters.create()
        cid = channels.create()
        # Put something in the channel so that it's not empty.
        channels.send(cid, "send")

        # Check initial state.
        send_interps = channels.list_interpreters(cid, send=True)
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(len(send_interps), 1)
        self.assertEqual(len(recv_interps), 0)

        # Close the send end of the channel.
        channels.close(cid, send=True)
        # Send end should raise an error.
        with self.assertRaises(channels.ChannelClosedError):
            channels.list_interpreters(cid, send=True)
        # Receive end should not be closed (since channel is not empty).
        recv_interps = channels.list_interpreters(cid, send=False)
        self.assertEqual(len(recv_interps), 0)

        # Close the receive end of the channel from a subinterpreter.
        _run_output(interp1, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.close({cid}, force=True)
            """))
        return
        # Both ends should raise an error.
        with self.assertRaises(channels.ChannelClosedError):
            channels.list_interpreters(cid, send=True)
        with self.assertRaises(channels.ChannelClosedError):
            channels.list_interpreters(cid, send=False)

    ####################

    def test_send_recv_main(self):
        cid = channels.create()
        orig = b'spam'
        channels.send(cid, orig)
        obj = channels.recv(cid)

        self.assertEqual(obj, orig)
        self.assertIsNot(obj, orig)

    def test_send_recv_same_interpreter(self):
        id1 = interpreters.create()
        out = _run_output(id1, dedent("""
            import _xxinterpchannels as _channels
            cid = _channels.create()
            orig = b'spam'
            _channels.send(cid, orig)
            obj = _channels.recv(cid)
            assert obj is not orig
            assert obj == orig
            """))

    def test_send_recv_different_interpreters(self):
        cid = channels.create()
        id1 = interpreters.create()
        out = _run_output(id1, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.send({cid}, b'spam')
            """))
        obj = channels.recv(cid)

        self.assertEqual(obj, b'spam')

    def test_send_recv_different_threads(self):
        cid = channels.create()

        def f():
            while True:
                try:
                    obj = channels.recv(cid)
                    break
                except channels.ChannelEmptyError:
                    time.sleep(0.1)
            channels.send(cid, obj)
        t = threading.Thread(target=f)
        t.start()

        channels.send(cid, b'spam')
        t.join()
        obj = channels.recv(cid)

        self.assertEqual(obj, b'spam')

    def test_send_recv_different_interpreters_and_threads(self):
        cid = channels.create()
        id1 = interpreters.create()
        out = None

        def f():
            nonlocal out
            out = _run_output(id1, dedent(f"""
                import time
                import _xxinterpchannels as _channels
                while True:
                    try:
                        obj = _channels.recv({cid})
                        break
                    except _channels.ChannelEmptyError:
                        time.sleep(0.1)
                assert(obj == b'spam')
                _channels.send({cid}, b'eggs')
                """))
        t = threading.Thread(target=f)
        t.start()

        channels.send(cid, b'spam')
        t.join()
        obj = channels.recv(cid)

        self.assertEqual(obj, b'eggs')

    def test_send_not_found(self):
        with self.assertRaises(channels.ChannelNotFoundError):
            channels.send(10, b'spam')

    def test_recv_not_found(self):
        with self.assertRaises(channels.ChannelNotFoundError):
            channels.recv(10)

    def test_recv_empty(self):
        cid = channels.create()
        with self.assertRaises(channels.ChannelEmptyError):
            channels.recv(cid)

    def test_recv_default(self):
        default = object()
        cid = channels.create()
        obj1 = channels.recv(cid, default)
        channels.send(cid, None)
        channels.send(cid, 1)
        channels.send(cid, b'spam')
        channels.send(cid, b'eggs')
        obj2 = channels.recv(cid, default)
        obj3 = channels.recv(cid, default)
        obj4 = channels.recv(cid)
        obj5 = channels.recv(cid, default)
        obj6 = channels.recv(cid, default)

        self.assertIs(obj1, default)
        self.assertIs(obj2, None)
        self.assertEqual(obj3, 1)
        self.assertEqual(obj4, b'spam')
        self.assertEqual(obj5, b'eggs')
        self.assertIs(obj6, default)

    def test_recv_sending_interp_destroyed(self):
        with self.subTest('closed'):
            cid1 = channels.create()
            interp = interpreters.create()
            interpreters.run_string(interp, dedent(f"""
                import _xxinterpchannels as _channels
                _channels.send({cid1}, b'spam')
                """))
            interpreters.destroy(interp)

            with self.assertRaisesRegex(RuntimeError,
                                        f'channel {cid1} is closed'):
                channels.recv(cid1)
            del cid1
        with self.subTest('still open'):
            cid2 = channels.create()
            interp = interpreters.create()
            interpreters.run_string(interp, dedent(f"""
                import _xxinterpchannels as _channels
                _channels.send({cid2}, b'spam')
                """))
            channels.send(cid2, b'eggs')
            interpreters.destroy(interp)

            channels.recv(cid2)
            with self.assertRaisesRegex(RuntimeError,
                                        f'channel {cid2} is empty'):
                channels.recv(cid2)
            del cid2

    def test_allowed_types(self):
        cid = channels.create()
        objects = [
            None,
            'spam',
            b'spam',
            42,
        ]
        for obj in objects:
            with self.subTest(obj):
                channels.send(cid, obj)
                got = channels.recv(cid)

                self.assertEqual(got, obj)
                self.assertIs(type(got), type(obj))
                # XXX Check the following?
                #self.assertIsNot(got, obj)
                # XXX What about between interpreters?

    def test_run_string_arg_unresolved(self):
        cid = channels.create()
        interp = interpreters.create()

        out = _run_output(interp, dedent("""
            import _xxinterpchannels as _channels
            print(cid.end)
            _channels.send(cid, b'spam')
            """),
            dict(cid=cid.send))
        obj = channels.recv(cid)

        self.assertEqual(obj, b'spam')
        self.assertEqual(out.strip(), 'send')

    # XXX For now there is no high-level channel into which the
    # sent channel ID can be converted...
    # Note: this test caused crashes on some buildbots (bpo-33615).
    @unittest.skip('disabled until high-level channels exist')
    def test_run_string_arg_resolved(self):
        cid = channels.create()
        cid = channels._channel_id(cid, _resolve=True)
        interp = interpreters.create()

        out = _run_output(interp, dedent("""
            import _xxinterpchannels as _channels
            print(chan.id.end)
            _channels.send(chan.id, b'spam')
            """),
            dict(chan=cid.send))
        obj = channels.recv(cid)

        self.assertEqual(obj, b'spam')
        self.assertEqual(out.strip(), 'send')

    # close

    def test_close_single_user(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.close(cid)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_close_multiple_users(self):
        cid = channels.create()
        id1 = interpreters.create()
        id2 = interpreters.create()
        interpreters.run_string(id1, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.send({cid}, b'spam')
            """))
        interpreters.run_string(id2, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.recv({cid})
            """))
        channels.close(cid)
        with self.assertRaises(interpreters.RunFailedError) as cm:
            interpreters.run_string(id1, dedent(f"""
                _channels.send({cid}, b'spam')
                """))
        self.assertIn('ChannelClosedError', str(cm.exception))
        with self.assertRaises(interpreters.RunFailedError) as cm:
            interpreters.run_string(id2, dedent(f"""
                _channels.send({cid}, b'spam')
                """))
        self.assertIn('ChannelClosedError', str(cm.exception))

    def test_close_multiple_times(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.close(cid)

        with self.assertRaises(channels.ChannelClosedError):
            channels.close(cid)

    def test_close_empty(self):
        tests = [
            (False, False),
            (True, False),
            (False, True),
            (True, True),
            ]
        for send, recv in tests:
            with self.subTest((send, recv)):
                cid = channels.create()
                channels.send(cid, b'spam')
                channels.recv(cid)
                channels.close(cid, send=send, recv=recv)

                with self.assertRaises(channels.ChannelClosedError):
                    channels.send(cid, b'eggs')
                with self.assertRaises(channels.ChannelClosedError):
                    channels.recv(cid)

    def test_close_defaults_with_unused_items(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')

        with self.assertRaises(channels.ChannelNotEmptyError):
            channels.close(cid)
        channels.recv(cid)
        channels.send(cid, b'eggs')

    def test_close_recv_with_unused_items_unforced(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')

        with self.assertRaises(channels.ChannelNotEmptyError):
            channels.close(cid, recv=True)
        channels.recv(cid)
        channels.send(cid, b'eggs')
        channels.recv(cid)
        channels.recv(cid)
        channels.close(cid, recv=True)

    def test_close_send_with_unused_items_unforced(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')
        channels.close(cid, send=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        channels.recv(cid)
        channels.recv(cid)
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_close_both_with_unused_items_unforced(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')

        with self.assertRaises(channels.ChannelNotEmptyError):
            channels.close(cid, recv=True, send=True)
        channels.recv(cid)
        channels.send(cid, b'eggs')
        channels.recv(cid)
        channels.recv(cid)
        channels.close(cid, recv=True)

    def test_close_recv_with_unused_items_forced(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')
        channels.close(cid, recv=True, force=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_close_send_with_unused_items_forced(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')
        channels.close(cid, send=True, force=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_close_both_with_unused_items_forced(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')
        channels.close(cid, send=True, recv=True, force=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_close_never_used(self):
        cid = channels.create()
        channels.close(cid)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'spam')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_close_by_unassociated_interp(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        interp = interpreters.create()
        interpreters.run_string(interp, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.close({cid}, force=True)
            """))
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)
        with self.assertRaises(channels.ChannelClosedError):
            channels.close(cid)

    def test_close_used_multiple_times_by_single_user(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'spam')
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.close(cid, force=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_channel_list_interpreters_invalid_channel(self):
        cid = channels.create()
        # Test for invalid channel ID.
        with self.assertRaises(channels.ChannelNotFoundError):
            channels.list_interpreters(1000, send=True)

        channels.close(cid)
        # Test for a channel that has been closed.
        with self.assertRaises(channels.ChannelClosedError):
            channels.list_interpreters(cid, send=True)

    def test_channel_list_interpreters_invalid_args(self):
        # Tests for invalid arguments passed to the API.
        cid = channels.create()
        with self.assertRaises(TypeError):
            channels.list_interpreters(cid)


class ChannelReleaseTests(TestBase):

    # XXX Add more test coverage a la the tests for close().

    """
    - main / interp / other
    - run in: current thread / new thread / other thread / different threads
    - end / opposite
    - force / no force
    - used / not used  (associated / not associated)
    - empty / emptied / never emptied / partly emptied
    - closed / not closed
    - released / not released
    - creator (interp) / other
    - associated interpreter not running
    - associated interpreter destroyed
    """

    """
    use
    pre-release
    release
    after
    check
    """

    """
    release in:         main, interp1
    creator:            same, other (incl. interp2)

    use:                None,send,recv,send/recv in None,same,other(incl. interp2),same+other(incl. interp2),all
    pre-release:        None,send,recv,both in None,same,other(incl. interp2),same+other(incl. interp2),all
    pre-release forced: None,send,recv,both in None,same,other(incl. interp2),same+other(incl. interp2),all

    release:            same
    release forced:     same

    use after:          None,send,recv,send/recv in None,same,other(incl. interp2),same+other(incl. interp2),all
    release after:      None,send,recv,send/recv in None,same,other(incl. interp2),same+other(incl. interp2),all
    check released:     send/recv for same/other(incl. interp2)
    check closed:       send/recv for same/other(incl. interp2)
    """

    def test_single_user(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.release(cid, send=True, recv=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_multiple_users(self):
        cid = channels.create()
        id1 = interpreters.create()
        id2 = interpreters.create()
        interpreters.run_string(id1, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.send({cid}, b'spam')
            """))
        out = _run_output(id2, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.recv({cid})
            _channels.release({cid})
            print(repr(obj))
            """))
        interpreters.run_string(id1, dedent(f"""
            _channels.release({cid})
            """))

        self.assertEqual(out.strip(), "b'spam'")

    def test_no_kwargs(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.release(cid)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_multiple_times(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.release(cid, send=True, recv=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.release(cid, send=True, recv=True)

    def test_with_unused_items(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'ham')
        channels.release(cid, send=True, recv=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_never_used(self):
        cid = channels.create()
        channels.release(cid)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'spam')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_by_unassociated_interp(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        interp = interpreters.create()
        interpreters.run_string(interp, dedent(f"""
            import _xxinterpchannels as _channels
            _channels.release({cid})
            """))
        obj = channels.recv(cid)
        channels.release(cid)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        self.assertEqual(obj, b'spam')

    def test_close_if_unassociated(self):
        # XXX Something's not right with this test...
        cid = channels.create()
        interp = interpreters.create()
        interpreters.run_string(interp, dedent(f"""
            import _xxinterpchannels as _channels
            obj = _channels.send({cid}, b'spam')
            _channels.release({cid})
            """))

        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)

    def test_partially(self):
        # XXX Is partial close too weird/confusing?
        cid = channels.create()
        channels.send(cid, None)
        channels.recv(cid)
        channels.send(cid, b'spam')
        channels.release(cid, send=True)
        obj = channels.recv(cid)

        self.assertEqual(obj, b'spam')

    def test_used_multiple_times_by_single_user(self):
        cid = channels.create()
        channels.send(cid, b'spam')
        channels.send(cid, b'spam')
        channels.send(cid, b'spam')
        channels.recv(cid)
        channels.release(cid, send=True, recv=True)

        with self.assertRaises(channels.ChannelClosedError):
            channels.send(cid, b'eggs')
        with self.assertRaises(channels.ChannelClosedError):
            channels.recv(cid)


class ChannelCloseFixture(namedtuple('ChannelCloseFixture',
                                     'end interp other extra creator')):

    # Set this to True to avoid creating interpreters, e.g. when
    # scanning through test permutations without running them.
    QUICK = False

    def __new__(cls, end, interp, other, extra, creator):
        assert end in ('send', 'recv')
        if cls.QUICK:
            known = {}
        else:
            interp = Interpreter.from_raw(interp)
            other = Interpreter.from_raw(other)
            extra = Interpreter.from_raw(extra)
            known = {
                interp.name: interp,
                other.name: other,
                extra.name: extra,
                }
        if not creator:
            creator = 'same'
        self = super().__new__(cls, end, interp, other, extra, creator)
        self._prepped = set()
        self._state = ChannelState()
        self._known = known
        return self

    @property
    def state(self):
        return self._state

    @property
    def cid(self):
        try:
            return self._cid
        except AttributeError:
            creator = self._get_interpreter(self.creator)
            self._cid = self._new_channel(creator)
            return self._cid

    def get_interpreter(self, interp):
        interp = self._get_interpreter(interp)
        self._prep_interpreter(interp)
        return interp

    def expect_closed_error(self, end=None):
        if end is None:
            end = self.end
        if end == 'recv' and self.state.closed == 'send':
            return False
        return bool(self.state.closed)

    def prep_interpreter(self, interp):
        self._prep_interpreter(interp)

    def record_action(self, action, result):
        self._state = result

    def clean_up(self):
        clean_up_interpreters()
        clean_up_channels()

    # internal methods

    def _new_channel(self, creator):
        if creator.name == 'main':
            return channels.create()
        else:
            ch = channels.create()
            run_interp(creator.id, f"""
                import _xxsubinterpreters
                cid = _xxsubchannels.create()
                # We purposefully send back an int to avoid tying the
                # channel to the other interpreter.
                _xxsubchannels.send({ch}, int(cid))
                del _xxsubinterpreters
                """)
            self._cid = channels.recv(ch)
        return self._cid

    def _get_interpreter(self, interp):
        if interp in ('same', 'interp'):
            return self.interp
        elif interp == 'other':
            return self.other
        elif interp == 'extra':
            return self.extra
        else:
            name = interp
            try:
                interp = self._known[name]
            except KeyError:
                interp = self._known[name] = Interpreter(name)
            return interp

    def _prep_interpreter(self, interp):
        if interp.id in self._prepped:
            return
        self._prepped.add(interp.id)
        if interp.name == 'main':
            return
        run_interp(interp.id, f"""
            import _xxinterpchannels as channels
            import test.test__xxinterpchannels as helpers
            ChannelState = helpers.ChannelState
            try:
                cid
            except NameError:
                cid = channels._channel_id({self.cid})
            """)


@unittest.skip('these tests take several hours to run')
class ExhaustiveChannelTests(TestBase):

    """
    - main / interp / other
    - run in: current thread / new thread / other thread / different threads
    - end / opposite
    - force / no force
    - used / not used  (associated / not associated)
    - empty / emptied / never emptied / partly emptied
    - closed / not closed
    - released / not released
    - creator (interp) / other
    - associated interpreter not running
    - associated interpreter destroyed

    - close after unbound
    """

    """
    use
    pre-close
    close
    after
    check
    """

    """
    close in:         main, interp1
    creator:          same, other, extra

    use:              None,send,recv,send/recv in None,same,other,same+other,all
    pre-close:        None,send,recv in None,same,other,same+other,all
    pre-close forced: None,send,recv in None,same,other,same+other,all

    close:            same
    close forced:     same

    use after:        None,send,recv,send/recv in None,same,other,extra,same+other,all
    close after:      None,send,recv,send/recv in None,same,other,extra,same+other,all
    check closed:     send/recv for same/other(incl. interp2)
    """

    def iter_action_sets(self):
        # - used / not used  (associated / not associated)
        # - empty / emptied / never emptied / partly emptied
        # - closed / not closed
        # - released / not released

        # never used
        yield []

        # only pre-closed (and possible used after)
        for closeactions in self._iter_close_action_sets('same', 'other'):
            yield closeactions
            for postactions in self._iter_post_close_action_sets():
                yield closeactions + postactions
        for closeactions in self._iter_close_action_sets('other', 'extra'):
            yield closeactions
            for postactions in self._iter_post_close_action_sets():
                yield closeactions + postactions

        # used
        for useactions in self._iter_use_action_sets('same', 'other'):
            yield useactions
            for closeactions in self._iter_close_action_sets('same', 'other'):
                actions = useactions + closeactions
                yield actions
                for postactions in self._iter_post_close_action_sets():
                    yield actions + postactions
            for closeactions in self._iter_close_action_sets('other', 'extra'):
                actions = useactions + closeactions
                yield actions
                for postactions in self._iter_post_close_action_sets():
                    yield actions + postactions
        for useactions in self._iter_use_action_sets('other', 'extra'):
            yield useactions
            for closeactions in self._iter_close_action_sets('same', 'other'):
                actions = useactions + closeactions
                yield actions
                for postactions in self._iter_post_close_action_sets():
                    yield actions + postactions
            for closeactions in self._iter_close_action_sets('other', 'extra'):
                actions = useactions + closeactions
                yield actions
                for postactions in self._iter_post_close_action_sets():
                    yield actions + postactions

    def _iter_use_action_sets(self, interp1, interp2):
        interps = (interp1, interp2)

        # only recv end used
        yield [
            ChannelAction('use', 'recv', interp1),
            ]
        yield [
            ChannelAction('use', 'recv', interp2),
            ]
        yield [
            ChannelAction('use', 'recv', interp1),
            ChannelAction('use', 'recv', interp2),
            ]

        # never emptied
        yield [
            ChannelAction('use', 'send', interp1),
            ]
        yield [
            ChannelAction('use', 'send', interp2),
            ]
        yield [
            ChannelAction('use', 'send', interp1),
            ChannelAction('use', 'send', interp2),
            ]

        # partially emptied
        for interp1 in interps:
            for interp2 in interps:
                for interp3 in interps:
                    yield [
                        ChannelAction('use', 'send', interp1),
                        ChannelAction('use', 'send', interp2),
                        ChannelAction('use', 'recv', interp3),
                        ]

        # fully emptied
        for interp1 in interps:
            for interp2 in interps:
                for interp3 in interps:
                    for interp4 in interps:
                        yield [
                            ChannelAction('use', 'send', interp1),
                            ChannelAction('use', 'send', interp2),
                            ChannelAction('use', 'recv', interp3),
                            ChannelAction('use', 'recv', interp4),
                            ]

    def _iter_close_action_sets(self, interp1, interp2):
        ends = ('recv', 'send')
        interps = (interp1, interp2)
        for force in (True, False):
            op = 'force-close' if force else 'close'
            for interp in interps:
                for end in ends:
                    yield [
                        ChannelAction(op, end, interp),
                        ]
        for recvop in ('close', 'force-close'):
            for sendop in ('close', 'force-close'):
                for recv in interps:
                    for send in interps:
                        yield [
                            ChannelAction(recvop, 'recv', recv),
                            ChannelAction(sendop, 'send', send),
                            ]

    def _iter_post_close_action_sets(self):
        for interp in ('same', 'extra', 'other'):
            yield [
                ChannelAction('use', 'recv', interp),
                ]
            yield [
                ChannelAction('use', 'send', interp),
                ]

    def run_actions(self, fix, actions):
        for action in actions:
            self.run_action(fix, action)

    def run_action(self, fix, action, *, hideclosed=True):
        end = action.resolve_end(fix.end)
        interp = action.resolve_interp(fix.interp, fix.other, fix.extra)
        fix.prep_interpreter(interp)
        if interp.name == 'main':
            result = run_action(
                fix.cid,
                action.action,
                end,
                fix.state,
                hideclosed=hideclosed,
                )
            fix.record_action(action, result)
        else:
            _cid = channels.create()
            run_interp(interp.id, f"""
                result = helpers.run_action(
                    {fix.cid},
                    {repr(action.action)},
                    {repr(end)},
                    {repr(fix.state)},
                    hideclosed={hideclosed},
                    )
                channels.send({_cid}, result.pending.to_bytes(1, 'little'))
                channels.send({_cid}, b'X' if result.closed else b'')
                """)
            result = ChannelState(
                pending=int.from_bytes(channels.recv(_cid), 'little'),
                closed=bool(channels.recv(_cid)),
                )
            fix.record_action(action, result)

    def iter_fixtures(self):
        # XXX threads?
        interpreters = [
            ('main', 'interp', 'extra'),
            ('interp', 'main', 'extra'),
            ('interp1', 'interp2', 'extra'),
            ('interp1', 'interp2', 'main'),
        ]
        for interp, other, extra in interpreters:
            for creator in ('same', 'other', 'creator'):
                for end in ('send', 'recv'):
                    yield ChannelCloseFixture(end, interp, other, extra, creator)

    def _close(self, fix, *, force):
        op = 'force-close' if force else 'close'
        close = ChannelAction(op, fix.end, 'same')
        if not fix.expect_closed_error():
            self.run_action(fix, close, hideclosed=False)
        else:
            with self.assertRaises(channels.ChannelClosedError):
                self.run_action(fix, close, hideclosed=False)

    def _assert_closed_in_interp(self, fix, interp=None):
        if interp is None or interp.name == 'main':
            with self.assertRaises(channels.ChannelClosedError):
                channels.recv(fix.cid)
            with self.assertRaises(channels.ChannelClosedError):
                channels.send(fix.cid, b'spam')
            with self.assertRaises(channels.ChannelClosedError):
                channels.close(fix.cid)
            with self.assertRaises(channels.ChannelClosedError):
                channels.close(fix.cid, force=True)
        else:
            run_interp(interp.id, """
                with helpers.expect_channel_closed():
                    channels.recv(cid)
                """)
            run_interp(interp.id, """
                with helpers.expect_channel_closed():
                    channels.send(cid, b'spam')
                """)
            run_interp(interp.id, """
                with helpers.expect_channel_closed():
                    channels.close(cid)
                """)
            run_interp(interp.id, """
                with helpers.expect_channel_closed():
                    channels.close(cid, force=True)
                """)

    def _assert_closed(self, fix):
        self.assertTrue(fix.state.closed)

        for _ in range(fix.state.pending):
            channels.recv(fix.cid)
        self._assert_closed_in_interp(fix)

        for interp in ('same', 'other'):
            interp = fix.get_interpreter(interp)
            if interp.name == 'main':
                continue
            self._assert_closed_in_interp(fix, interp)

        interp = fix.get_interpreter('fresh')
        self._assert_closed_in_interp(fix, interp)

    def _iter_close_tests(self, verbose=False):
        i = 0
        for actions in self.iter_action_sets():
            print()
            for fix in self.iter_fixtures():
                i += 1
                if i > 1000:
                    return
                if verbose:
                    if (i - 1) % 6 == 0:
                        print()
                    print(i, fix, '({} actions)'.format(len(actions)))
                else:
                    if (i - 1) % 6 == 0:
                        print(' ', end='')
                    print('.', end=''); sys.stdout.flush()
                yield i, fix, actions
            if verbose:
                print('---')
        print()

    # This is useful for scanning through the possible tests.
    def _skim_close_tests(self):
        ChannelCloseFixture.QUICK = True
        for i, fix, actions in self._iter_close_tests():
            pass

    def test_close(self):
        for i, fix, actions in self._iter_close_tests():
            with self.subTest('{} {}  {}'.format(i, fix, actions)):
                fix.prep_interpreter(fix.interp)
                self.run_actions(fix, actions)

                self._close(fix, force=False)

                self._assert_closed(fix)
            # XXX Things slow down if we have too many interpreters.
            fix.clean_up()

    def test_force_close(self):
        for i, fix, actions in self._iter_close_tests():
            with self.subTest('{} {}  {}'.format(i, fix, actions)):
                fix.prep_interpreter(fix.interp)
                self.run_actions(fix, actions)

                self._close(fix, force=True)

                self._assert_closed(fix)
            # XXX Things slow down if we have too many interpreters.
            fix.clean_up()


if __name__ == '__main__':
    unittest.main()


Current_dir [ 𝗡𝗢𝗧 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]


[ Back ]
𝗡𝗔𝗠𝗘
𝗦𝗜𝗭𝗘
𝗟𝗔𝗦𝗧 𝗧𝗢𝗨𝗖𝗛
𝗨𝗦𝗘𝗥
𝗦𝗧𝗔𝗧𝗨𝗦
𝗙𝗨𝗡𝗖𝗧𝗜𝗢𝗡𝗦
..
--
21 Aug 2026 4.01 AM
root / linksafe
0755
__pycache__
--
21 Aug 2026 4.01 AM
root / linksafe
0755
audiodata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
certdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
cjkencodings
--
21 Aug 2026 4.01 AM
root / linksafe
0755
configdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
crashers
--
21 Aug 2026 4.01 AM
root / linksafe
0755
data
--
21 Aug 2026 4.01 AM
root / linksafe
0755
decimaltestdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
dtracedata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
encoded_modules
--
21 Aug 2026 4.01 AM
root / linksafe
0755
imghdrdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
leakers
--
21 Aug 2026 4.01 AM
root / linksafe
0755
libregrtest
--
21 Aug 2026 4.01 AM
root / linksafe
0755
regrtestdata
--
17 Aug 2026 3.13 PM
root / linksafe
0755
sndhdrdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
subprocessdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
support
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_ast
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_asyncio
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_capi
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_cext
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_concurrent_futures
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_cppext
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_ctypes
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_dataclasses
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_doctest
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_email
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_future_stmt
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_gdb
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_import
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_importlib
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_inspect
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_json
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_lib2to3
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_module
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_multiprocessing_fork
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_multiprocessing_forkserver
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_multiprocessing_spawn
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_peg_generator
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_pydoc
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_sqlite3
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_tkinter
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_tomllib
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_tools
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_ttk
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_unittest
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_warnings
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_zipfile
--
21 Aug 2026 4.01 AM
root / linksafe
0755
test_zoneinfo
--
21 Aug 2026 4.01 AM
root / linksafe
0755
tokenizedata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
tracedmodules
--
21 Aug 2026 4.01 AM
root / linksafe
0755
translationdata
--
17 Aug 2026 3.13 PM
root / linksafe
0755
typinganndata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
wheeldata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
xmltestdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
ziptestdata
--
21 Aug 2026 4.01 AM
root / linksafe
0755
Sine-1000Hz-300ms.aif
60.25 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
__init__.py
0.046 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
__main__.py
0.065 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
_test_atexit.py
3.614 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
_test_eintr.py
17.72 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
_test_embed_set_config.py
8.64 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
_test_embed_structseq.py
1.988 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
_test_multiprocessing.py
216.264 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
_test_venv_multiprocessing.py
0.777 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
archiver_tests.py
6.104 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
audiotest.au
27.484 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
audiotests.py
12.134 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
audit-tests.py
13.758 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
autotest.py
0.209 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
bisect_cmd.py
5.355 KB
17 Aug 2026 3.08 PM
root / linksafe
0755
clinic.test.c
139.104 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
cmath_testcases.txt
141.197 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
curses_tests.py
1.227 KB
17 Aug 2026 3.08 PM
root / linksafe
0755
datetimetester.py
265.734 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
dis_module.py
0.074 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
empty.vbs
0.068 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
exception_hierarchy.txt
2.331 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
floating_points.txt
15.92 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
fork_wait.py
2.294 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
formatfloat_testcases.txt
7.451 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
ieee754.txt
3.15 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
levenshtein_examples.json
406.437 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
list_tests.py
16.899 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
lock_tests.py
35.642 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
mailcap.txt
1.24 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
mapping_tests.py
21.869 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
math_testcases.txt
23.186 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
memory_watchdog.py
0.694 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
mime.types
47.372 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
mock_socket.py
3.687 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
mp_fork_bomb.py
0.438 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
mp_preload.py
0.343 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
multibytecodec_support.py
14.187 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
pickletester.py
172.369 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
profilee.py
2.97 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
pstats.pck
65.046 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
pyclbr_input.py
1.63 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
pythoninfo.py
28.477 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
randv2_32.pck
7.341 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
randv2_64.pck
7.192 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
randv3.pck
7.816 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
re_tests.py
25.943 KB
17 Aug 2026 3.08 PM
root / linksafe
0755
recursion.tar
0.504 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
regrtest.py
1.282 KB
17 Aug 2026 3.08 PM
root / linksafe
0755
relimport.py
0.026 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
reperf.py
0.525 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
seq_tests.py
14.958 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
signalinterproctester.py
3.122 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
ssl_servers.py
7.12 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
ssltests.py
1.026 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
string_tests.py
71.244 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test___all__.py
5.042 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test__locale.py
12.521 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test__opcode.py
4.141 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test__osx_support.py
13.534 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test__xxinterpchannels.py
52.186 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test__xxsubinterpreters.py
27.497 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_abc.py
23.814 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_abstract_numbers.py
5.813 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_aifc.py
17.838 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_argparse.py
218.49 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_array.py
55.438 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_asdl_parser.py
4.442 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_asyncgen.py
53.944 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_atexit.py
3.2 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_audioop.py
28.317 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_audit.py
9.217 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_augassign.py
7.684 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_base64.py
35.055 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_baseexception.py
7.773 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bdb.py
44.168 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bigaddrspace.py
2.83 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bigmem.py
45.008 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_binascii.py
20.095 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_binop.py
14.14 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bisect.py
16.625 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bool.py
14.247 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_buffer.py
171.878 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bufio.py
2.558 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_builtin.py
96.658 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bytes.py
82.015 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_bz2.py
43.288 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_c_locale_coercion.py
20.992 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_calendar.py
51.782 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_call.py
35.212 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cgi.py
22.271 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cgitb.py
2.62 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_charmapcodec.py
1.771 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_class.py
22.016 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_clinic.py
85.406 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cmath.py
22.47 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cmd.py
6.491 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cmd_line.py
39.512 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cmd_line_script.py
34.928 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_code.py
25.695 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_code_module.py
12.728 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codeccallbacks.py
49.229 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecencodings_cn.py
3.857 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecencodings_hk.py
0.685 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecencodings_iso2022.py
3.654 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecencodings_jp.py
4.792 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecencodings_kr.py
2.957 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecencodings_tw.py
0.665 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecmaps_cn.py
0.729 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecmaps_hk.py
0.377 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecmaps_jp.py
1.703 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecmaps_kr.py
1.16 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecmaps_tw.py
0.688 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codecs.py
137.42 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_codeop.py
8.676 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_collections.py
93.466 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_colorsys.py
4.268 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_compare.py
17.459 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_compile.py
81.241 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_compileall.py
48.528 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_compiler_assemble.py
2.458 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_compiler_codegen.py
1.725 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_complex.py
35.211 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_configparser.py
86.702 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_contains.py
3.352 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_context.py
31.099 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_contextlib.py
43.077 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_contextlib_async.py
23.988 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_copy.py
26.522 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_copyreg.py
4.363 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_coroutines.py
67.469 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_cprofile.py
9.442 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_crashers.py
1.169 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_crypt.py
4.191 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_csv.py
63.761 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_curses.py
50.14 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_datetime.py
2.671 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dbm.py
6.828 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dbm_dumb.py
11.076 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dbm_gnu.py
7.643 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dbm_ndbm.py
5.907 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_decimal.py
217.939 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_decorators.py
14.626 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_defaultdict.py
6.102 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_deque.py
33.163 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_descr.py
196.202 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_descrtut.py
10.982 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_devpoll.py
4.442 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dict.py
51.329 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dict_version.py
6.096 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dictcomps.py
6.548 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dictviews.py
14.821 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_difflib.py
21.475 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_difflib_expect.html
100.904 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
test_dis.py
83.447 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_docxmlrpc.py
9.099 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dtrace.py
7.979 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dynamic.py
5.995 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_dynamicclassattribute.py
9.565 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_eintr.py
0.612 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_embed.py
69.878 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ensurepip.py
11.494 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_enum.py
188.151 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_enumerate.py
9.137 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_eof.py
7.94 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_epoll.py
9.404 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_errno.py
1.044 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_except_star.py
39.702 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_exception_group.py
34.026 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_exception_hierarchy.py
7.54 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_exception_variations.py
13.738 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_exceptions.py
83.625 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_extcall.py
14.689 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_faulthandler.py
30.311 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fcntl.py
7.762 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_file.py
11.782 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_file_eintr.py
10.735 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_filecmp.py
11.979 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fileinput.py
37.858 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fileio.py
19.976 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fileutils.py
0.929 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_finalization.py
14.657 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_float.py
64.649 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_flufl.py
2.807 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fnmatch.py
10.683 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fork1.py
3.305 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_format.py
28.442 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fractions.py
65.65 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_frame.py
14.044 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_frozen.py
2.198 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_fstring.py
64.739 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ftplib.py
43.549 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_funcattrs.py
15.711 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_functools.py
114.021 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_gc.py
47.711 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_generator_stop.py
0.921 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_generators.py
66.484 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_genericalias.py
17.775 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_genericclass.py
9.439 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_genericpath.py
23.254 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_genexps.py
7.305 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_getopt.py
6.938 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_getpass.py
6.37 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_getpath.py
44.361 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_gettext.py
41.958 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_glob.py
18.21 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_global.py
1.196 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_grammar.py
66.311 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_graphlib.py
8.313 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_grp.py
3.67 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_gzip.py
41.479 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_hash.py
12.113 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_hashlib.py
46.708 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_heapq.py
16.422 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_hmac.py
26.063 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_html.py
4.234 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_htmlparser.py
46.474 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_http_cookiejar.py
81.548 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_http_cookies.py
25.245 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_httplib.py
102.987 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_httpservers.py
57.947 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_idle.py
0.812 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_imaplib.py
42.111 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_imghdr.py
4.813 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_index.py
8.371 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_int.py
33.975 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_int_literal.py
6.888 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_interpreters.py
32.11 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_io.py
183.891 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ioctl.py
3.24 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ipaddress.py
126.692 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_isinstance.py
12.949 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_iter.py
38.229 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_iterlen.py
7.096 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_itertools.py
113.531 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_keyword.py
2.002 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_keywordonlyarg.py
6.893 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_kqueue.py
9.364 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_largefile.py
11.054 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_launcher.py
28.752 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_linecache.py
12.56 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_list.py
9.599 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_listcomps.py
24.017 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_lltrace.py
3.706 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_locale.py
24.691 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_logging.py
251.698 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_long.py
63.403 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_longexp.py
0.228 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_lzma.py
93.004 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_mailbox.py
93.909 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_mailcap.py
11.476 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_marshal.py
23.148 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_math.py
108.303 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_math_property.py
1.153 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_memoryio.py
32.651 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_memoryview.py
22.229 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_metaclass.py
6.193 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_mimetypes.py
15.741 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_minidom.py
69.564 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_mmap.py
38.563 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_modulefinder.py
12.21 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_monitoring.py
55.757 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_msilib.py
5.516 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_multibytecodec.py
15.793 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_multiprocessing_main_handling.py
11.482 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_named_expressions.py
29.622 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_netrc.py
11.857 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_nis.py
1.255 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_nntplib.py
62.697 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ntpath.py
64.113 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_numeric_tower.py
7.996 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_opcache.py
10.893 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_opcodes.py
3.62 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_openpty.py
0.586 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_operator.py
26.716 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_optparse.py
61.393 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ordered_dict.py
39.957 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_os.py
181.055 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ossaudiodev.py
7.271 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_osx_env.py
1.307 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pathlib.py
138.013 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_patma.py
86.602 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pdb.py
92.917 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_peepholer.py
40.604 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pep646_syntax.py
7.795 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_perf_profiler.py
11.411 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_perfmaps.py
0.669 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pickle.py
21.243 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_picklebuffer.py
4.989 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pickletools.py
16.78 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pipes.py
6.787 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pkg.py
9.594 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pkgutil.py
26.221 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_platform.py
21.531 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_plistlib.py
42.615 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_poll.py
7.394 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_popen.py
2.363 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_poplib.py
18.016 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_positional_only_arg.py
18.444 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_posix.py
96.253 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_posixpath.py
44.923 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pow.py
6.385 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pprint.py
50.586 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_print.py
8.053 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_profile.py
8.692 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_property.py
19.325 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pstats.py
4.312 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pty.py
16.18 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pulldom.py
12.332 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pwd.py
4.324 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_py_compile.py
11.933 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pyclbr.py
10.246 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_pyexpat.py
42.823 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_queue.py
20.614 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_quopri.py
7.868 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_raise.py
13.442 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_random.py
57.006 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_range.py
26.53 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_re.py
144.786 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_readline.py
15.721 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_regrtest.py
92.506 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_repl.py
6.344 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_reprlib.py
29.071 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_resource.py
7.115 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_richcmp.py
11.945 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_rlcompleter.py
7.398 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_robotparser.py
11.017 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_runpy.py
33.989 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sax.py
54.633 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sched.py
7.378 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_scope.py
21.941 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_script_helper.py
5.82 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_secrets.py
4.278 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_select.py
3.422 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_selectors.py
19.638 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_set.py
71.309 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_setcomps.py
5.244 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_shelve.py
6.419 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_shlex.py
13.392 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_shutil.py
140.348 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_signal.py
52.581 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_site.py
29.771 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_slice.py
9.46 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_smtplib.py
60.02 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_smtpnet.py
3.027 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sndhdr.py
1.506 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_socket.py
261.133 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_socketserver.py
17.395 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sort.py
13.591 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_source_encoding.py
12.653 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_spwd.py
2.835 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ssl.py
216.517 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_stable_abi_ctypes.py
24.748 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_startfile.py
1.695 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_stat.py
8.922 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_statistics.py
120.024 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_strftime.py
7.404 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_string.py
21.858 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_string_literals.py
14.101 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_stringprep.py
3.04 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_strptime.py
41.948 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_strtod.py
20.056 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_struct.py
39.18 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_structseq.py
7.722 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_subclassinit.py
8.043 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_subprocess.py
161.374 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sunau.py
6.093 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sundry.py
1.022 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_super.py
14.787 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_support.py
27.052 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_symtable.py
17.559 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_syntax.py
73.954 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sys.py
67.373 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sys_setprofile.py
14.534 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sys_settrace.py
84.558 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_sysconfig.py
26.078 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_syslog.py
4.704 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tabnanny.py
13.899 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tarfile.py
190.533 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tcl.py
30.301 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_telnetlib.py
12.848 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tempfile.py
75.505 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_termios.py
10.96 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_textwrap.py
41.886 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_thread.py
8.866 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_threadedtempfile.py
1.929 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_threading.py
74.212 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_threading_local.py
7.011 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_threadsignals.py
9.871 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_time.py
44.651 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_timeit.py
15.195 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_timeout.py
10.74 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tix.py
1.049 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tokenize.py
118.005 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_trace.py
21.521 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_traceback.py
144.404 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tracemalloc.py
40.971 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ttk_textonly.py
16.693 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tty.py
3.63 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_tuple.py
19.801 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_turtle.py
14.038 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_type_aliases.py
12.743 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_type_annotations.py
6.233 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_type_cache.py
6.596 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_type_comments.py
10.501 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_type_params.py
38.866 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_typechecks.py
2.554 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_types.py
82.379 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_typing.py
343.332 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_ucn.py
9.712 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unary.py
1.524 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unicode.py
125.435 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unicode_file.py
5.719 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unicode_file_functions.py
6.908 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unicode_identifiers.py
0.974 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unicodedata.py
18.564 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_univnewlines.py
3.854 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unpack.py
3.507 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unpack_ex.py
9.977 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_unparse.py
27.962 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urllib.py
73.042 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urllib2.py
80.817 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urllib2_localnet.py
25.64 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urllib2net.py
13.958 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urllib_response.py
2.04 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urllibnet.py
9.407 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_urlparse.py
81.411 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_userdict.py
7.563 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_userlist.py
1.969 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_userstring.py
2.519 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_utf8_mode.py
10.312 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_utf8source.py
1.081 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_uu.py
9.195 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_uuid.py
44.279 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_venv.py
37.424 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_wait3.py
1.739 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_wait4.py
1.14 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_wave.py
7.641 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_weakref.py
74.318 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_weakset.py
16.304 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_webbrowser.py
13.363 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_winapi.py
2.627 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_winconsoleio.py
7.6 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_winreg.py
22.479 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_winsound.py
5.172 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_with.py
27.778 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_wmi.py
3.311 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_wsgiref.py
31.005 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xdrlib.py
2.253 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xml_dom_minicompat.py
4.182 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xml_dom_xmlbuilder.py
3.098 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xml_etree.py
170.074 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xml_etree_c.py
9.337 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xmlrpc.py
58.079 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xmlrpc_net.py
0.932 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xxlimited.py
2.462 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_xxtestfuzz.py
0.674 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_yield_from.py
50.227 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_zipapp.py
16.702 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_zipfile64.py
5.784 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_zipimport.py
31.879 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_zipimport_support.py
10.567 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
test_zlib.py
41.657 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
testcodec.py
1.021 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
testtar.tar
425 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
testtar.tar.xz
0.168 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
tf_inherit_check.py
0.697 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
time_hashlib.py
2.874 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
win_console_handler.py
1.383 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
xmltests.py
0.487 KB
17 Aug 2026 3.08 PM
root / linksafe
0644
zip_cp437_header.zip
0.264 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
zipdir.zip
0.365 KB
12 Aug 2026 1.57 PM
root / linksafe
0644
zipdir_backslash.zip
0.188 KB
12 Aug 2026 1.57 PM
root / linksafe
0644

✘✘ GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME ✘✘
Static GIF Static GIF