PNG  IHDR  8] PLTE S =tRNS   PNG  IHDR  8] PLTE S =tRNS   REDROOM
PHP 7.4.33
Preview: asynchat.py Size: 11.06 KB
//lib64/python3.9/asynchat.py

# -*- Mode: Python; tab-width: 4 -*-
#       Id: asynchat.py,v 2.26 2000/09/07 22:29:26 rushing Exp
#       Author: Sam Rushing <rushing@nightmare.com>

# ======================================================================
# Copyright 1996 by Sam Rushing
#
#                         All Rights Reserved
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
# granted, provided that the above copyright notice appear in all
# copies and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of Sam
# Rushing not be used in advertising or publicity pertaining to
# distribution of the software without specific, written prior
# permission.
#
# SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
# NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# ======================================================================

r"""A class supporting chat-style (command/response) protocols.

This class adds support for 'chat' style protocols - where one side
sends a 'command', and the other sends a response (examples would be
the common internet protocols - smtp, nntp, ftp, etc..).

The handle_read() method looks at the input stream for the current
'terminator' (usually '\r\n' for single-line responses, '\r\n.\r\n'
for multi-line output), calling self.found_terminator() on its
receipt.

for example:
Say you build an async nntp client using this class.  At the start
of the connection, you'll have self.terminator set to '\r\n', in
order to process the single-line greeting.  Just before issuing a
'LIST' command you'll set it to '\r\n.\r\n'.  The output of the LIST
command will be accumulated (using your own 'collect_incoming_data'
method) up to the terminator, and then control will be returned to
you - by calling your self.found_terminator() method.
"""
import asyncore
from collections import deque


class async_chat(asyncore.dispatcher):
    """This is an abstract class.  You must derive from this class, and add
    the two methods collect_incoming_data() and found_terminator()"""

    # these are overridable defaults

    ac_in_buffer_size = 65536
    ac_out_buffer_size = 65536

    # we don't want to enable the use of encoding by default, because that is a
    # sign of an application bug that we don't want to pass silently

    use_encoding = 0
    encoding = 'latin-1'

    def __init__(self, sock=None, map=None):
        # for string terminator matching
        self.ac_in_buffer = b''

        # we use a list here rather than io.BytesIO for a few reasons...
        # del lst[:] is faster than bio.truncate(0)
        # lst = [] is faster than bio.truncate(0)
        self.incoming = []

        # we toss the use of the "simple producer" and replace it with
        # a pure deque, which the original fifo was a wrapping of
        self.producer_fifo = deque()
        asyncore.dispatcher.__init__(self, sock, map)

    def collect_incoming_data(self, data):
        raise NotImplementedError("must be implemented in subclass")

    def _collect_incoming_data(self, data):
        self.incoming.append(data)

    def _get_data(self):
        d = b''.join(self.incoming)
        del self.incoming[:]
        return d

    def found_terminator(self):
        raise NotImplementedError("must be implemented in subclass")

    def set_terminator(self, term):
        """Set the input delimiter.

        Can be a fixed string of any length, an integer, or None.
        """
        if isinstance(term, str) and self.use_encoding:
            term = bytes(term, self.encoding)
        elif isinstance(term, int) and term < 0:
            raise ValueError('the number of received bytes must be positive')
        self.terminator = term

    def get_terminator(self):
        return self.terminator

    # grab some more data from the socket,
    # throw it to the collector method,
    # check for the terminator,
    # if found, transition to the next state.

    def handle_read(self):

        try:
            data = self.recv(self.ac_in_buffer_size)
        except BlockingIOError:
            return
        except OSError:
            self.handle_error()
            return

        if isinstance(data, str) and self.use_encoding:
            data = bytes(str, self.encoding)
        self.ac_in_buffer = self.ac_in_buffer + data

        # Continue to search for self.terminator in self.ac_in_buffer,
        # while calling self.collect_incoming_data.  The while loop
        # is necessary because we might read several data+terminator
        # combos with a single recv(4096).

        while self.ac_in_buffer:
            lb = len(self.ac_in_buffer)
            terminator = self.get_terminator()
            if not terminator:
                # no terminator, collect it all
                self.collect_incoming_data(self.ac_in_buffer)
                self.ac_in_buffer = b''
            elif isinstance(terminator, int):
                # numeric terminator
                n = terminator
                if lb < n:
                    self.collect_incoming_data(self.ac_in_buffer)
                    self.ac_in_buffer = b''
                    self.terminator = self.terminator - lb
                else:
                    self.collect_incoming_data(self.ac_in_buffer[:n])
                    self.ac_in_buffer = self.ac_in_buffer[n:]
                    self.terminator = 0
                    self.found_terminator()
            else:
                # 3 cases:
                # 1) end of buffer matches terminator exactly:
                #    collect data, transition
                # 2) end of buffer matches some prefix:
                #    collect data to the prefix
                # 3) end of buffer does not match any prefix:
                #    collect data
                terminator_len = len(terminator)
                index = self.ac_in_buffer.find(terminator)
                if index != -1:
                    # we found the terminator
                    if index > 0:
                        # don't bother reporting the empty string
                        # (source of subtle bugs)
                        self.collect_incoming_data(self.ac_in_buffer[:index])
                    self.ac_in_buffer = self.ac_in_buffer[index+terminator_len:]
                    # This does the Right Thing if the terminator
                    # is changed here.
                    self.found_terminator()
                else:
                    # check for a prefix of the terminator
                    index = find_prefix_at_end(self.ac_in_buffer, terminator)
                    if index:
                        if index != lb:
                            # we found a prefix, collect up to the prefix
                            self.collect_incoming_data(self.ac_in_buffer[:-index])
                            self.ac_in_buffer = self.ac_in_buffer[-index:]
                        break
                    else:
                        # no prefix, collect it all
                        self.collect_incoming_data(self.ac_in_buffer)
                        self.ac_in_buffer = b''

    def handle_write(self):
        self.initiate_send()

    def handle_close(self):
        self.close()

    def push(self, data):
        if not isinstance(data, (bytes, bytearray, memoryview)):
            raise TypeError('data argument must be byte-ish (%r)',
                            type(data))
        sabs = self.ac_out_buffer_size
        if len(data) > sabs:
            for i in range(0, len(data), sabs):
                self.producer_fifo.append(data[i:i+sabs])
        else:
            self.producer_fifo.append(data)
        self.initiate_send()

    def push_with_producer(self, producer):
        self.producer_fifo.append(producer)
        self.initiate_send()

    def readable(self):
        "predicate for inclusion in the readable for select()"
        # cannot use the old predicate, it violates the claim of the
        # set_terminator method.

        # return (len(self.ac_in_buffer) <= self.ac_in_buffer_size)
        return 1

    def writable(self):
        "predicate for inclusion in the writable for select()"
        return self.producer_fifo or (not self.connected)

    def close_when_done(self):
        "automatically close this channel once the outgoing queue is empty"
        self.producer_fifo.append(None)

    def initiate_send(self):
        while self.producer_fifo and self.connected:
            first = self.producer_fifo[0]
            # handle empty string/buffer or None entry
            if not first:
                del self.producer_fifo[0]
                if first is None:
                    self.handle_close()
                    return

            # handle classic producer behavior
            obs = self.ac_out_buffer_size
            try:
                data = first[:obs]
            except TypeError:
                data = first.more()
                if data:
                    self.producer_fifo.appendleft(data)
                else:
                    del self.producer_fifo[0]
                continue

            if isinstance(data, str) and self.use_encoding:
                data = bytes(data, self.encoding)

            # send the data
            try:
                num_sent = self.send(data)
            except OSError:
                self.handle_error()
                return

            if num_sent:
                if num_sent < len(data) or obs < len(first):
                    self.producer_fifo[0] = first[num_sent:]
                else:
                    del self.producer_fifo[0]
            # we tried to send some actual data
            return

    def discard_buffers(self):
        # Emergencies only!
        self.ac_in_buffer = b''
        del self.incoming[:]
        self.producer_fifo.clear()


class simple_producer:

    def __init__(self, data, buffer_size=512):
        self.data = data
        self.buffer_size = buffer_size

    def more(self):
        if len(self.data) > self.buffer_size:
            result = self.data[:self.buffer_size]
            self.data = self.data[self.buffer_size:]
            return result
        else:
            result = self.data
            self.data = b''
            return result


# Given 'haystack', see if any prefix of 'needle' is at its end.  This
# assumes an exact match has already been checked.  Return the number of
# characters matched.
# for example:
# f_p_a_e("qwerty\r", "\r\n") => 1
# f_p_a_e("qwertydkjf", "\r\n") => 0
# f_p_a_e("qwerty\r\n", "\r\n") => <undefined>

# this could maybe be made faster with a computed regex?
# [answer: no; circa Python-2.0, Jan 2001]
# new python:   28961/s
# old python:   18307/s
# re:        12820/s
# regex:     14035/s

def find_prefix_at_end(haystack, needle):
    l = len(needle) - 1
    while l and not haystack.endswith(needle[:l]):
        l -= 1
    return l

Directory Contents

Dirs: 30 × Files: 173

Name Size Perms Modified Actions
asyncio DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
ctypes DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
curses DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
dbm DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
distutils DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
email DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
encodings DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
ensurepip DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
html DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
http DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
importlib DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
json DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
lib2to3 DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
logging DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-04 10:02:47
Edit Download
sqlite3 DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
unittest DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
urllib DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
venv DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
wsgiref DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
xml DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
xmlrpc DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
zoneinfo DIR
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
- drwxr-xr-x 2026-06-03 15:11:46
Edit Download
4.80 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
31.84 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
500 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download
95.82 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
54.94 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
11.06 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
19.63 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
19.39 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
30.65 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.44 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
2.29 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
12.16 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
24.25 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
33.14 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
11.81 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.31 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.51 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
10.37 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
35.81 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
6.18 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
3.97 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
19.63 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
53.30 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
24.05 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
129 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download
8.45 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.10 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
6.20 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
3.73 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
15.77 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
48.42 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
87.09 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
320 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download
81.35 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
20.09 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
102.12 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
38.52 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
9.79 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.44 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.86 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.79 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
23.75 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
34.66 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
37.97 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.12 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.31 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.85 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
26.63 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.69 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
9.35 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
21.26 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.88 KB lrw-r--r-- 2026-04-27 17:28:55
Edit Download
22.34 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.85 KB lrw-r--r-- 2026-04-27 17:28:55
Edit Download
54.13 KB lrw-r--r-- 2026-04-27 17:28:55
Edit Download
3.72 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
10.29 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
115.46 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
3.46 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
79.03 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
1.02 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
13.61 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.33 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
76.44 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
12.92 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
76.95 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
8.90 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
21.06 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
23.83 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.44 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
40.06 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
25.84 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
2.82 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
10.10 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.53 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
10.50 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
58.95 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
38.15 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
49.94 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
61.75 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
63.40 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
91.29 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
8.71 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
23.71 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
39.65 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
27.59 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.96 KB lrw-r--r-- 2026-04-27 17:28:55
Edit Download
15.77 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
22.00 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
22.34 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
28.64 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
4.69 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.90 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
107.03 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
8.01 KB lrw-r--r-- 2026-04-27 17:28:55
Edit Download
11.23 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.10 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
30.75 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
15.49 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.14 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.47 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
12.78 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
6.29 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
1.99 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
19.08 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
8.33 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
13.18 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
51.79 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
2.38 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
21.57 KB lrw-r--r-- 2026-04-27 17:28:55
Edit Download
34.00 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
44.34 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
6.93 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
36.05 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
26.66 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
27.32 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.01 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
39.82 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
51.39 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.36 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
37.17 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
10.32 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
12.61 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
257 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download
81.61 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
17.73 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
2.23 KB lrw-r--r-- 2026-04-27 17:30:38
Edit Download
7.72 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
24.96 KB lrw-r--r-- 2026-04-27 17:39:59
Edit Download
11.14 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
110.29 KB lrwxr-xr-x 2026-04-27 17:28:55
Edit Download
22.71 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
27.31 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
18.95 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
1003 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download
52.91 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
13.16 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
2.31 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
25.28 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
28.52 KB lrwxr-xr-x 2025-10-31 18:40:52
Edit Download
24.08 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
17.62 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
879 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download
9.56 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
75.24 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.11 KB lrw-r--r-- 2026-04-27 17:40:00
Edit Download
26.68 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
19.23 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
17.58 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
21.05 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
24.01 KB lrwxr-xr-x 2026-04-27 17:28:55
Edit Download
5.77 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
7.36 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
86.82 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
30.04 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
3.31 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
1.76 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
2.61 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
28.69 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
8.54 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.21 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
14.28 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
21.26 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
223.31 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
91.13 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
6.04 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
3.04 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
24.68 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
40.27 KB lrw-r--r-- 2026-04-27 17:39:15
Edit Download
7.05 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.78 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
5.03 KB lrw-r--r-- 2025-10-31 18:40:52
Edit Download
64 B lrw-r--r-- 2025-10-31 18:40:52
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).
 !"#$%&'(()*+,-./00123456789 t\ wIDATx ]ys  47Y ƒ -  "  Rv  < f{Ɛ $k l L > L  ~h^ 1  [  r G t& h  l F z3O Y ! p A(_g̷ E8 )S 8 c  Kb"z ~ 5 J xAL WU <  *  5 m;W a pB h ~P J 2 3 6 ҙ .Ƹ P i  4g F R L P ΪK/D  M v (a3 k J Œ4N5* SH ` SdJ z  O J Xՠ V>u ߱ BE&L b2 ?2` tX+  c CB A$ i b C ĀMB E : /  # Dx &l =q Ty  0 \p I ( L Ǎ { e 4k ;`u^ヲ eP!( d {  )T A 8 O;Ě n >;s6 !  :Nx `[S D HU ~ q›J F} a g*D 49 / pn k h (t 8NxƐF _!r չ7 ZR R׷ q/5") Ӎ NY 0 x sZ!   o  fu  ,  K"$ ? pg  㕣=  1» {h " fh7    y  } € +7  $ y " X —ą - G P u 4 m >J 5 L =V ' ^@I p ?MS xЌ XV P ! h "C NS9B8̢ ]!K  e   zA , ӏkbY  !< XQ ٿyS| *" f { w  4@[S <  # 0 ! js [m  =,~ o "ݎ DHf Wo $ g ! Vԅ t mB /y Wf V4񺍸 c+@x?  B ~u " xUN e 0 BĂ) ~J pz! 7y6]l Ԥ@ P a< O /DHC `≻  N m"$  0ObB }{ x AO FCG D R ^ "B  { WDH  UR l@ T #  +"d T ; 0 i  D}. 7 ` ' ] w rE &S i ƕiTD EL P _ u h $ Ա FG wVD G L R Zf ' .!] J /ZR oGЍs Mr Ĥ ʬ 3 Q [3 cL ` ^ p + ( F;# B 5 '  2Y f [  ϶R0e }  E 7 6M aۮ H <& n % L] E}Up x紉, Uw' Q  Ǯշo k ވۙ 0N94 VX5 xEDE l D #֤ } C o )W :  ^ s 9  bRf iX5u ཱི 4 :[  T 1. | [E 2ؽ Iy\ : o x K G 5 ylP ' uK E ftb/i[3 .g _  [3M n G, #NwQ5~  ؚ) | n =Ц"x qg gB ` 듘 ~ x w ? ? R~  _ u. &VQ K˻   H C ( TN˄+ `C dA nB׭ D 3"Z G ê ^k H_ /- ~ " R_  .8 Z_ 6@ o  xg  uP ? 3լ @7AM!  E7^ - =V L  x  g-D0  CtmW 7  O  G _ WD0 g C  w1 r d w : a | \  *" f nֳ ^ H# f L ` Z ۽hV  }S F r0Ù Bć5r] @! NL iQ]{s^=4 d  WD  "  "   M; t" 8 5 e dL| "-*st" ) SWD ?R[S e ooF  20.D ? bo =) A i o d ģ ZҰaO @E =) i D a &ܟa CϞ y6 ,<%{^x%{f8? `iw^ ?/ M * IEND B`