§
    …ßja  ã                   óÖ  — d Z ddlZddlZddlZddlmZ ddlmZ dZdZ	dZ
dZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZe
eeeeeeeeeeeeeeeiZd„ e                     ¦   «         D ¦   «         ZdZdZdZd	Z d
Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ) ej*        e)¦  «        Z+dZ, G d„ d¦  «        Z-e-Z.	 d/d e/d!e/d"e0d#e1d$e1f
d%„Z2d$e1fd&„Z3d$e1fd'„Z4d$e1fd(„Z5d$e1fd)„Z6	 d0d*e7d+e/d$e1fd,„Z8d1d*e7d-e7d$e1fd.„Z9dS )2a6  
Dirty Worker Binary Protocol

Binary message framing over Unix sockets, inspired by OpenBSD msgctl/msgsnd.
Replaces JSON protocol for efficient binary data transfer.

Header Format (16 bytes):
+--------+--------+--------+--------+--------+--------+--------+--------+
|  Magic (2B)     | Ver(1) | MType  |        Payload Length (4B)        |
+--------+--------+--------+--------+--------+--------+--------+--------+
|                       Request ID (8 bytes)                            |
+--------+--------+--------+--------+--------+--------+--------+--------+

- Magic: 0x47 0x44 ("GD" for Gunicorn Dirty)
- Version: 0x01
- MType: Message type (REQUEST, RESPONSE, ERROR, CHUNK, END)
- Length: Payload size (big-endian uint32, max 64MB)
- Request ID: uint64 (replaces UUID string)

Payload is TLV-encoded (see tlv.py).
é    Né   )ÚDirtyProtocolError)Ú
TLVEncoders   GDé   é   é   é   é   é   é   ÚrequestÚresponseÚerrorÚchunkÚendÚstashÚstatusÚmanagec                 ó   — i | ]\  }}||“Œ	S © r   )Ú.0ÚkÚvs      úJ/var/www/html/venv/lib/python3.11/site-packages/gunicorn/dirty/protocol.pyú
<dictcomp>r   H   s   € Ð>Ð>Ð>™d˜a �Q˜Ð>Ð>Ð>ó    é   é   é   é	   é
   z>2sBBIQi   c                   óÊ  — e Zd ZdZeZeZeZeZ	e
ZeZeZeZeZeZededededefd„¦   «         Zededefd„¦   «         Ze	 d&ded
ededededefd„¦   «         Zededefd„¦   «         Zededefd„¦   «         Z ededefd„¦   «         Z!ededefd„¦   «         Z"ededefd„¦   «         Z#ed'dedededefd„¦   «         Z$e	 d(dedededefd„¦   «         Z%ededefd„¦   «         Z&ede'j(        defd„¦   «         Z)ede'j*        dedd	fd„¦   «         Z+ed e,j,        d!edefd"„¦   «         Z-ed e,j,        defd#„¦   «         Z.ed e,j,        dedd	fd$„¦   «         Z/ededefd%„¦   «         Z0d	S ))ÚBinaryProtocolz-Binary message protocol for dirty worker IPC.Úmsg_typeÚ
request_idÚpayload_lengthÚreturnc                 óR   — t          j        t          t          t          | ||¦  «        S )a,  
        Encode the 16-byte message header.

        Args:
            msg_type: Message type (MSG_TYPE_REQUEST, etc.)
            request_id: Unique request identifier (uint64)
            payload_length: Length of the TLV-encoded payload

        Returns:
            bytes: 16-byte header
        )ÚstructÚpackÚHEADER_FORMATÚMAGICÚVERSION)r$   r%   r&   s      r   Úencode_headerzBinaryProtocol.encode_headerr   s%   € õ Œ{�=­%µ¸(Ø)¨:ñ7ô 7ð 	7r   Údatac                 ó<  — t          | ¦  «        t          k     r)t          dt          | ¦  «        › dt          › �| ¬¦  «        ‚t          j        t
          | dt          …         ¦  «        \  }}}}}|t          k    r$t          d|›dt          ›�| dd…         ¬¦  «        ‚|t          k    r$t          d|› dt          › �| dd…         ¬¦  «        ‚|t          vrt          d	|d
›�| dd…         ¬¦  «        ‚|t          k    rt          d|› dt          › d�¦  «        ‚|||fS )zÿ
        Decode the 16-byte message header.

        Args:
            data: 16 bytes of header data

        Returns:
            tuple: (msg_type, request_id, payload_length)

        Raises:
            DirtyProtocolError: If header is invalid
        zHeader too short: ú bytes, expected ©Úraw_dataNzInvalid magic: z, expected é   zUnsupported protocol version: zUnknown message type: 0xÚ02xzMessage too large: z bytes (max: ú))
ÚlenÚHEADER_SIZEr   r)   Úunpackr+   r,   r-   ÚMSG_TYPE_TO_STRÚMAX_MESSAGE_SIZE)r/   ÚmagicÚversionr$   Úlengthr%   s         r   Údecode_headerzBinaryProtocol.decode_header‚   sy  € õ ˆt‰9Œ9•{Ò"Ð"Ý$ØN¥S¨¡Y¤YÐNÐNÅÐNÐNØðñ ô ð õ
 8>´}Ý˜4 ¥ Ô-ñ8
ô 8
Ñ4ˆˆw˜ &¨*ð •EŠ>ˆ>Ý$Ø? %Ð?Ð?µeÐ?Ð?Ø˜c˜r˜cœðñ ô ð ð
 •gÒÐÝ$ØN°ÐNÐNÅWÐNÐNØ˜c˜r˜cœðñ ô ð ð
 �?Ð*Ð*Ý$Ø9¨8Ð9Ð9Ð9Ø˜c˜r˜cœðñ ô ð ð
 Õ$Ò$Ð$Ý$ØN fÐNÐNÕ;KÐNÐNÐNñô ð ð ˜ VÐ+Ð+r   NÚapp_pathÚactionÚargsÚkwargsc                 óÄ   — |||rt          |¦  «        ng |pi dœ}t          j        |¦  «        }t                               t
          | t          |¦  «        ¦  «        }||z   S )al  
        Encode a request message.

        Args:
            request_id: Unique request identifier (uint64)
            app_path: Import path of the dirty app
            action: Action to call on the app
            args: Positional arguments
            kwargs: Keyword arguments

        Returns:
            bytes: Complete message (header + payload)
        )r@   rA   rB   rC   )Úlistr   Úencoder#   r.   ÚMSG_TYPE_REQUESTr7   )r%   r@   rA   rB   rC   Úpayload_dictÚpayloadÚheaders           r   Úencode_requestzBinaryProtocol.encode_request³   so   € ð" !ØØ"&Ð.•D˜‘J”J�J¨BØ�l ð	
ð 
ˆõ Ô# LÑ1Ô1ˆÝ×-Ò-Õ.>À
Ý.1°'©l¬lñ<ô <ˆà˜ÑÐr   c                 ó˜   — d|i}t          j        |¦  «        }t                               t          | t          |¦  «        ¦  «        }||z   S )a  
        Encode a success response message.

        Args:
            request_id: Request identifier this responds to
            result: Result value (must be TLV-serializable)

        Returns:
            bytes: Complete message (header + payload)
        Úresult)r   rF   r#   r.   ÚMSG_TYPE_RESPONSEr7   )r%   rM   rH   rI   rJ   s        r   Úencode_responsezBinaryProtocol.encode_responseÎ   sL   € ð ! &Ð)ˆÝÔ# LÑ1Ô1ˆÝ×-Ò-Õ.?ÀÝ.1°'©l¬lñ<ô <ˆà˜ÑÐr   c                 óh  — ddl m} t          ||¦  «        r|                     ¦   «         }n=t          |t          ¦  «        r|}n%t          |¦  «        j        t          |¦  «        i dœ}d|i}t          j	        |¦  «        }t                               t          | t          |¦  «        ¦  «        }||z   S )a  
        Encode an error response message.

        Args:
            request_id: Request identifier this responds to
            error: DirtyError instance, dict, or Exception

        Returns:
            bytes: Complete message (header + payload)
        r   ©Ú
DirtyError©Ú
error_typeÚmessageÚdetailsr   )ÚerrorsrR   Ú
isinstanceÚto_dictÚdictÚtypeÚ__name__Ústrr   rF   r#   r.   ÚMSG_TYPE_ERRORr7   )r%   r   rR   Ú
error_dictrH   rI   rJ   s          r   Úencode_errorzBinaryProtocol.encode_errorà   s¿   € ð 	'Ð&Ð&Ð&Ð&Ð&å�e˜ZÑ(Ô(ð 		ØŸš™œˆJˆJÝ˜�tÑ$Ô$ð 	ØˆJˆJõ # 5™kœkÔ2Ý˜u™:œ:Øðð ˆJð   Ð,ˆÝÔ# LÑ1Ô1ˆÝ×-Ò-­n¸jÝ.1°'©l¬lñ<ô <ˆà˜ÑÐr   c                 ó˜   — d|i}t          j        |¦  «        }t                               t          | t          |¦  «        ¦  «        }||z   S )a  
        Encode a chunk message for streaming responses.

        Args:
            request_id: Request identifier this chunk belongs to
            data: Chunk data (must be TLV-serializable)

        Returns:
            bytes: Complete message (header + payload)
        r/   )r   rF   r#   r.   ÚMSG_TYPE_CHUNKr7   )r%   r/   rH   rI   rJ   s        r   Úencode_chunkzBinaryProtocol.encode_chunkÿ   sJ   € ð  �~ˆÝÔ# LÑ1Ô1ˆÝ×-Ò-­n¸jÝ.1°'©l¬lñ<ô <ˆà˜ÑÐr   c                 óH   — t                                t          | d¦  «        }|S )zÅ
        Encode an end-of-stream message.

        Args:
            request_id: Request identifier this ends

        Returns:
            bytes: Complete message (header + empty payload)
        r   )r#   r.   ÚMSG_TYPE_END©r%   rJ   s     r   Ú
encode_endzBinaryProtocol.encode_end  s    € õ  ×-Ò-­l¸JÈÑJÔJˆØˆr   c                 óH   — t                                t          | d¦  «        }|S )z¹
        Encode a status query message.

        Args:
            request_id: Request identifier

        Returns:
            bytes: Complete message (header + empty payload)
        r   )r#   r.   ÚMSG_TYPE_STATUSrf   s     r   Úencode_statuszBinaryProtocol.encode_status   s    € õ  ×-Ò-­o¸zÈ1ÑMÔMˆØˆr   r   ÚopÚcountc                 óš   — ||dœ}t          j        |¦  «        }t                               t          | t          |¦  «        ¦  «        }||z   S )a4  
        Encode a worker management message.

        Args:
            request_id: Request identifier
            op: Management operation (MANAGE_OP_ADD or MANAGE_OP_REMOVE)
            count: Number of workers to add/remove

        Returns:
            bytes: Complete message (header + payload)
        )rk   rl   )r   rF   r#   r.   ÚMSG_TYPE_MANAGEr7   )r%   rk   rl   rH   rI   rJ   s         r   Úencode_managezBinaryProtocol.encode_manage/  sU   € ð Øð
ð 
ˆõ Ô# LÑ1Ô1ˆÝ×-Ò-­o¸zÝ.1°'©l¬lñ<ô <ˆà˜ÑÐr   Útablec                 óÄ   — ||dœ}|�||d<   |�||d<   |�||d<   t          j        |¦  «        }t                               t          | t          |¦  «        ¦  «        }||z   S )a¿  
        Encode a stash operation message.

        Args:
            request_id: Unique request identifier (uint64)
            op: Stash operation code (STASH_OP_*)
            table: Table name
            key: Optional key for put/get/delete operations
            value: Optional value for put operation
            pattern: Optional pattern for keys operation

        Returns:
            bytes: Complete message (header + payload)
        )rk   rp   NÚkeyÚvalueÚpattern)r   rF   r#   r.   ÚMSG_TYPE_STASHr7   )	r%   rk   rp   rr   rs   rt   rH   rI   rJ   s	            r   Úencode_stashzBinaryProtocol.encode_stashE  s„   € ð$ Øð
ð 
ˆð ˆ?Ø"%ˆL˜ÑØÐØ$)ˆL˜Ñ!ØÐØ&-ˆL˜Ñ#åÔ# LÑ1Ô1ˆÝ×-Ò-­n¸jÝ.1°'©l¬lñ<ô <ˆà˜ÑÐr   c                 óÜ  — t                                | ¦  «        \  }}}t          | ¦  «        t          |z   k     r4t	          dt          |z   › dt          | ¦  «        › �| dd…         ¬¦  «        ‚|dk    ri }ne| t          t          |z   …         }	 t          j        |¦  «        }n8# t          $ r ‚ t          $ r!}t	          d|› �|dd…         ¬¦  «        ‚d}~ww xY wt          |         }|||fS )a˜  
        Decode a complete message (header + payload).

        Args:
            data: Complete message bytes

        Returns:
            tuple: (msg_type_str, request_id, payload_dict)
                   msg_type_str is the string name (e.g., "request")
                   payload_dict is the decoded TLV payload as a dict

        Raises:
            DirtyProtocolError: If message is malformed
        zIncomplete message: expected z bytes, got Né2   r2   r   úFailed to decode TLV payload: )	r#   r?   r7   r8   r   r   Údecode_fullÚ	Exceptionr:   )r/   r$   r%   r>   rH   Úpayload_dataÚeÚmsg_type_strs           r   Údecode_messagezBinaryProtocol.decode_messagef  s7  € õ  (6×'CÒ'CÀDÑ'IÔ'IÑ$ˆ�*˜fåˆt‰9Œ9•{ VÑ+Ò+Ð+Ý$ð#µ¸fÑ0Dð #ð #Ý˜4‘y”yð#ð #à˜c˜r˜cœðñ ô ð ð �QŠ;ˆ;àˆLˆLà¥­K¸&Ñ,@Ð @ÔAˆLðÝ)Ô5°lÑCÔC��øÝ%ð ð ð ØÝð ð ð Ý(Ø8°QÐ8Ð8Ø)¨#¨2¨#Ô.ðñ ô ð øøøøðøøøõ ' xÔ0ˆà˜Z¨Ð5Ð5s   ÂB$ Â$CÂ8CÃCÚreaderc              ƒ   ó  K  — 	 |                       t          ¦  «        ƒ d{V —†}nc# t          j        $ rQ}t	          |j        ¦  «        dk    r‚ t          dt	          |j        ¦  «        › dt          › �|j        ¬¦  «        ‚d}~ww xY wt                               |¦  «        \  }}}|dk    r°	 |                       |¦  «        ƒ d{V —†}nE# t          j        $ r3}t          dt	          |j        ¦  «        › d|› �|j        ¬¦  «        ‚d}~ww xY w	 t          j
        |¦  «        }n:# t          $ r ‚ t          $ r!}t          d|› �|dd…         ¬¦  «        ‚d}~ww xY wi }t          |         }||d	œ}	|	                     |¦  «         |	S )
ap  
        Read a complete binary message from async stream.

        Args:
            reader: asyncio StreamReader

        Returns:
            dict: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If read fails or message is malformed
            asyncio.IncompleteReadError: If connection closed mid-read
        Nr   zIncomplete header: got r1   r2   zIncomplete payload: got ry   rx   ©r[   Úid)Úreadexactlyr8   ÚasyncioÚIncompleteReadErrorr7   Úpartialr   r#   r?   r   rz   r{   r:   Úupdate)
r€   rJ   r}   r$   r%   r>   r|   rH   r~   rM   s
             r   Úread_message_asyncz!BinaryProtocol.read_message_async—  s  è è € ð 
	Ø!×-Ò-­kÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ˆFˆFøÝÔ*ð 	ð 	ð 	Ý�1”9‰~Œ~ Ò"Ð"àÝ$ð*­#¨a¬i©.¬.ð *ð *Ý'ð*ð *àœðñ ô ð øøøøð		øøøõ (6×'CÒ'CÀFÑ'KÔ'KÑ$ˆ�*˜fð �AŠ:ˆ:ðØ%+×%7Ò%7¸Ñ%?Ô%?Ð?Ð?Ð?Ð?Ð?Ð?��øÝÔ.ð ð ð Ý(ð)­s°1´9©~¬~ð )ð )Ø &ð)ð )àœYðñ ô ð øøøøðøøøðÝ)Ô5°lÑCÔC��øÝ%ð ð ð ØÝð ð ð Ý(Ø8°QÐ8Ð8Ø)¨#¨2¨#Ô.ðñ ô ð øøøøðøøøð ˆLõ ' xÔ0ˆØ&¨jÐ9Ð9ˆØ�Š�lÑ#Ô#Ð#àˆsE   „ % ¥B´AB Â BÂ-C	 Ã	DÃ.DÄDÄD$ Ä$EÄ8EÅEÚwriterrU   c              ƒ   óœ   K  — t                                |¦  «        }|                      |¦  «         |                      ¦   «         ƒ d{V —† dS )a[  
        Write a message to async stream.

        Accepts dict format for backwards compatibility.

        Args:
            writer: asyncio StreamWriter
            message: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If encoding fails
            ConnectionError: If write fails
        N)r#   Ú_encode_from_dictÚwriteÚdrain)rŠ   rU   r/   s      r   Úwrite_message_asyncz"BinaryProtocol.write_message_asyncÓ  sS   è è € õ  ×/Ò/°Ñ8Ô8ˆØ�Š�TÑÔÐØ�lŠl‰nŒnÐÐÐÐÐÐÐÐÐr   ÚsockÚnc                 ó:  — d}t          |¦  «        |k     r…|                      |t          |¦  «        z
  ¦  «        }|sFt          |¦  «        dk    rt          d¦  «        ‚t          dt          |¦  «        › d|› �|¬¦  «        ‚||z  }t          |¦  «        |k     °…|S )a  
        Receive exactly n bytes from a socket.

        Args:
            sock: Socket to read from
            n: Number of bytes to read

        Returns:
            bytes: Received data

        Raises:
            DirtyProtocolError: If read fails or connection closed
        r   r   zConnection closedzConnection closed after r1   r2   )r7   Úrecvr   )r�   r‘   r/   r   s       r   Ú_recv_exactlyzBinaryProtocol._recv_exactlyë  s¯   € ð ˆÝ�$‰iŒi˜!ŠmˆmØ—I’I˜a¥# d¡)¤)™mÑ,Ô,ˆEØð Ý�t‘9”9 ’>�>Ý,Ð-@ÑAÔAÐAÝ(ØN­s°4©y¬yÐNÐNÈ1ÐNÐNØ!ðñ ô ð ð �E‰MˆDõ �$‰iŒi˜!Šmˆmð ˆr   c                 ó²  — t                                | t          ¦  «        }t                                |¦  «        \  }}}|dk    rit                                | |¦  «        }	 t	          j        |¦  «        }n:# t          $ r ‚ t          $ r!}t          d|› �|dd…         ¬¦  «        ‚d}~ww xY wi }t          |         }||dœ}	|	 	                    |¦  «         |	S )a   
        Read a complete message from socket (sync).

        Args:
            sock: Socket to read from

        Returns:
            dict: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If read fails or message is malformed
        r   ry   Nrx   r2   r‚   )
r#   r”   r8   r?   r   rz   r   r{   r:   rˆ   )
r�   rJ   r$   r%   r>   r|   rH   r}   r~   rM   s
             r   Úread_messagezBinaryProtocol.read_message  s  € õ  ×-Ò-¨dµKÑ@Ô@ˆÝ'5×'CÒ'CÀFÑ'KÔ'KÑ$ˆ�*˜fð �AŠ:ˆ:Ý)×7Ò7¸¸fÑEÔEˆLðÝ)Ô5°lÑCÔC��øÝ%ð ð ð ØÝð ð ð Ý(Ø8°QÐ8Ð8Ø)¨#¨2¨#Ô.ðñ ô ð øøøøðøøøð ˆLõ ' xÔ0ˆØ&¨jÐ9Ð9ˆØ�Š�lÑ#Ô#Ð#àˆs   Á!A6 Á6B+Â
B&Â&B+c                 ód   — t                                |¦  «        }|                      |¦  «         dS )a  
        Write a message to socket (sync).

        Args:
            sock: Socket to write to
            message: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If encoding fails
            OSError: If write fails
        N)r#   rŒ   Úsendall)r�   rU   r/   s      r   Úwrite_messagezBinaryProtocol.write_message/  s/   € õ ×/Ò/°Ñ8Ô8ˆØ�Š�TÑÔÐÐÐr   c           
      ó°  — |                       d¦  «        }|                       dd¦  «        }t          |t          ¦  «        rt          |¦  «        dz  }t                                |¦  «        }|€t          d|› �¦  «        ‚|t          k    rlt                               ||                       dd¦  «        |                       d	d¦  «        |                       d
¦  «        |                       d¦  «        ¦  «        S |t          k    r.t           
                    ||                       d¦  «        ¦  «        S |t          k    r/t                               ||                       di ¦  «        ¦  «        S |t          k    r.t                               ||                       d¦  «        ¦  «        S |t          k    rt                               |¦  «        S |t"          k    rt                               ||                       d¦  «        |                       dd¦  «        |                       d¦  «        |                       d¦  «        |                       d¦  «        ¦  «        S |t&          k    rt                               |¦  «        S |t*          k    rCt                               ||                       d¦  «        |                       dd¦  «        ¦  «        S t          d|› �¦  «        ‚)a  
        Encode a message dict to binary format.

        Supports the old dict-based API for backwards compatibility.

        Args:
            message: Message dict with 'type', 'id', and payload fields

        Returns:
            bytes: Complete encoded message
        r[   rƒ   r   l   ÿÿÿÿ NzUnknown message type: r@   Ú rA   rB   rC   rM   r   r/   rk   rp   rr   rs   rt   rl   r   zUnhandled message type: )ÚgetrX   r]   ÚhashÚMSG_TYPE_FROM_STRr   rG   r#   rK   rN   rO   r^   r`   rb   rc   re   rg   ru   rv   ri   rj   rn   ro   )rU   r~   r%   r$   s       r   rŒ   z BinaryProtocol._encode_from_dict?  s¢  € ð —{’{ 6Ñ*Ô*ˆØ—[’[  qÑ)Ô)ˆ
õ �j¥#Ñ&Ô&ð 	?å˜jÑ)Ô)Ð,>Ñ>ˆJå$×(Ò(¨Ñ6Ô6ˆØÐÝ$Ð%L¸lÐ%LÐ%LÑMÔMÐMàÕ'Ò'Ð'Ý!×0Ò0ØØ—’˜J¨Ñ+Ô+Ø—’˜H bÑ)Ô)Ø—’˜FÑ#Ô#Ø—’˜HÑ%Ô%ñô ð ð Õ*Ò*Ð*Ý!×1Ò1ØØ—’˜HÑ%Ô%ñô ð ð �Ò'Ð'Ý!×.Ò.ØØ—’˜G RÑ(Ô(ñô ð ð �Ò'Ð'Ý!×.Ò.ØØ—’˜FÑ#Ô#ñô ð ð �Ò%Ð%Ý!×,Ò,¨ZÑ8Ô8Ð8Ø�Ò'Ð'Ý!×.Ò.ØØ—’˜DÑ!Ô!Ø—’˜G RÑ(Ô(Ø—’˜EÑ"Ô"Ø—’˜GÑ$Ô$Ø—’˜IÑ&Ô&ñô ð ð �Ò(Ð(Ý!×/Ò/°
Ñ;Ô;Ð;Ø�Ò(Ð(Ý!×/Ò/ØØ—’˜DÑ!Ô!Ø—’˜G QÑ'Ô'ñô ð õ %Ð%JÀÐ%JÐ%JÑKÔKÐKr   ©NN©r   ©NNN)1r\   Ú
__module__Ú__qualname__Ú__doc__r8   r;   ÚMSG_TYPE_REQUEST_STRrG   ÚMSG_TYPE_RESPONSE_STRrN   ÚMSG_TYPE_ERROR_STRr^   ÚMSG_TYPE_CHUNK_STRrb   ÚMSG_TYPE_END_STRre   ÚMSG_TYPE_STASH_STRru   ÚMSG_TYPE_STATUS_STRri   ÚMSG_TYPE_MANAGE_STRrn   ÚstaticmethodÚintÚbytesr.   Útupler?   r]   rZ   rK   rO   r`   rc   rg   rj   ro   rv   r   r…   ÚStreamReaderr‰   ÚStreamWriterr�   Úsocketr”   r–   r™   rŒ   r   r   r   r#   r#   b   sô  € € € € € Ø7Ð7ð €KØ'Ðà+ÐØ-ÐØ'€NØ'€NØ#€LØ'€NØ)€OØ)€Oàð7 ð 7°ð 7Àcð 7Èeð 7ð 7ð 7ñ „\ð7ð ð.,˜Eð ., eð .,ð .,ð .,ñ „\ð.,ð` à:>ð ð   3ð  °#ð  ¸sð  Ø"ð Ø37ð ØCHð ð  ð  ñ „\ð ð4 ð  Cð  °Eð  ð  ð  ñ „\ð ð" ð  ð  °ð  ð  ð  ñ „\ð ð< ð  ð  ¨uð  ð  ð  ñ „\ð ð" ð˜sð  uð ð ð ñ „\ðð ð #ð ¨%ð ð ð ñ „\ðð ð ð   #ð  ¨3ð  °sð  À5ð  ð  ð  ñ „\ð ð* à37ð ð   ð  ¨#ð  °cð  Ø<Að ð  ð  ñ „\ð ð@ ð*6˜Uð *6 uð *6ð *6ð *6ñ „\ð*6ð` ð9¨Ô)=ð 9À$ð 9ð 9ð 9ñ „\ð9ðv ð¨'Ô*>ð Ø+/ðØ48ðð ð ñ „\ðð. ð˜FœMð ¨cð °eð ð ð ñ „\ðð6 ð%˜6œ=ð %¨Tð %ð %ð %ñ „\ð%ðN ð˜FœMð °Dð ¸Tð ð ð ñ „\ðð ðCL 4ð CL¨Eð CLð CLð CLñ „\ðCLð CLð CLr   r#   r@   rA   rB   rC   r'   c                 óN   — t           j        | |||rt          |¦  «        ng |pi dœS )aU  
    Build a request message dict.

    Args:
        request_id: Unique request identifier (int or str)
        app_path: Import path of the dirty app (e.g., 'myapp.ml:MLApp')
        action: Action to call on the app
        args: Positional arguments
        kwargs: Keyword arguments

    Returns:
        dict: Request message dict
    )r[   rƒ   r@   rA   rB   rC   )ÚDirtyProtocolrG   rE   )r%   r@   rA   rB   rC   s        r   Úmake_requestr¶   �  s;   € õ  Ô.ØØØØ"Ð*•�T‘
”
�
¨Ø�,˜Bðð ð r   c                 ó"   — t           j        | |dœS )zÂ
    Build a success response message dict.

    Args:
        request_id: Request identifier this responds to
        result: Result value

    Returns:
        dict: Response message dict
    )r[   rƒ   rM   )rµ   rN   )r%   rM   s     r   Úmake_responser¸   ¨  s   € õ Ô/ØØðð ð r   c                 óò   — ddl m} t          ||¦  «        r|                     ¦   «         }n=t          |t          ¦  «        r|}n%t          |¦  «        j        t          |¦  «        i dœ}t          j	        | |dœS )zå
    Build an error response message dict.

    Args:
        request_id: Request identifier this responds to
        error: DirtyError instance or dict with error info

    Returns:
        dict: Error response message dict
    r   rQ   rS   )r[   rƒ   r   )
rW   rR   rX   rY   rZ   r[   r\   r]   rµ   r^   )r%   r   rR   r_   s       r   Úmake_error_responserº   º  s“   € ð #Ð"Ð"Ð"Ð"Ð"Ý�%˜Ñ$Ô$ð 	
Ø—]’]‘_”_ˆ
ˆ
Ý	�E�4Ñ	 Ô	 ð 
Øˆ
ˆ
õ ˜u™+œ+Ô.Ý˜5‘z”zØð
ð 
ˆ
õ Ô,ØØðð ð r   c                 ó"   — t           j        | |dœS )zÍ
    Build a chunk message dict for streaming responses.

    Args:
        request_id: Request identifier this chunk belongs to
        data: Chunk data

    Returns:
        dict: Chunk message dict
    )r[   rƒ   r/   )rµ   rb   )r%   r/   s     r   Úmake_chunk_messager¼   Ø  s   € õ Ô,ØØðð ð r   c                 ó    — t           j        | dœS )z—
    Build an end-of-stream message dict.

    Args:
        request_id: Request identifier this ends

    Returns:
        dict: End message dict
    r‚   )rµ   re   )r%   s    r   Úmake_end_messager¾   ê  s   € õ Ô*Øðð ð r   rk   rp   c                 óR   — t           j        | ||dœ}|�||d<   |�||d<   |�||d<   |S )a‰  
    Build a stash operation message dict.

    Args:
        request_id: Unique request identifier (int or str)
        op: Stash operation code (STASH_OP_*)
        table: Table name
        key: Optional key for put/get/delete operations
        value: Optional value for put operation
        pattern: Optional pattern for keys operation

    Returns:
        dict: Stash message dict
    )r[   rƒ   rk   rp   Nrr   rs   rt   )rµ   ru   )r%   rk   rp   rr   rs   rt   Úmsgs          r   Úmake_stash_messagerÁ   ú  sR   € õ" Ô,ØØØð	ð €Cð €ØˆˆE‰
ØÐØˆˆG‰ØÐØ ˆˆI‰Ø€Jr   rl   c                 ó$   — t           j        | ||dœS )a  
    Build a worker management message dict.

    Args:
        request_id: Unique request identifier (int or str)
        op: Management operation (MANAGE_OP_ADD or MANAGE_OP_REMOVE)
        count: Number of workers to add/remove

    Returns:
        dict: Manage message dict
    )r[   rƒ   rk   rl   )rµ   rn   )r%   rk   rl   s      r   Úmake_manage_messagerÃ     s"   € õ Ô-ØØØð	ð ð r   rŸ   r¡   r    ):r¤   r…   r³   r)   rW   r   Útlvr   r,   r-   rG   rN   r^   rb   re   ru   ri   rn   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r:   Úitemsrž   ÚSTASH_OP_PUTÚSTASH_OP_GETÚSTASH_OP_DELETEÚSTASH_OP_KEYSÚSTASH_OP_CLEARÚSTASH_OP_INFOÚSTASH_OP_ENSUREÚSTASH_OP_DELETE_TABLEÚSTASH_OP_TABLESÚSTASH_OP_EXISTSÚMANAGE_OP_ADDÚMANAGE_OP_REMOVEr+   Úcalcsizer8   r;   r#   rµ   r]   r°   rZ   r¶   r¸   rº   r¼   r¾   r®   rÁ   rÃ   r   r   r   ú<module>rÓ      sÓ  ðð
ð ð, €€€Ø €€€Ø €€€à &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð ð 	€Ø
€ð Ð ØÐ Ø€Ø€Ø€Ø€Ø€Ø€ð !Ð Ø"Ð ØÐ ØÐ ØÐ ØÐ ØÐ ØÐ ð Ð*ØÐ,ØÐ&ØÐ&ØÐ"ØÐ&ØÐ(ØÐ(ð	€ð ?Ð> o×&;Ò&;Ñ&=Ô&=Ð>Ñ>Ô>Ð ð €Ø€Ø€Ø€Ø€Ø€Ø€ØÐ Ø€Ø€ð €ØÐ ð €ØˆfŒo˜mÑ,Ô,€ð $Ð ðaLð aLð aLð aLð aLñ aLô aLð aLðR €ð
 59ðð  sð °Cð ØðØ-1ðØ=Aðð ð ð ð2¨ð ð ð ð ð$¨dð ð ð ð ð<¨Dð ð ð ð ð$ Dð ð ð ð ð" 6:ðð  sð °3ð Ø>Bðð ð ð ð>ð ¨ð °Cð Àð ð ð ð ð ð r   