Ë
    oj‚—  ã                   ó^  — d Z ddlmZmZ ddlmZ ddlmZ ddlmZm	Z
mZ ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ  eej8                  «       G d„ d«      «       Z eej<                  «       G d„ d«      «       ZdZ  eejB                  «       G d„ dejD                  «      «       Z# G d„ dejH                  «      Z% G d„ dejL                  «      Z' eejB                  «       G d„ dejP                  «      «       Z) ejT                  e'e)«        G d„ dejL                  «      Z+ eej8                  «       G d„ dejP                  «      «       Z, ejT                  e+e,«        G d„ dejL                  «      Z- eejB                  «       G d„ d ejL                  «      «       Z. ee.ej<                  ej^                  «        G d!„ d"ejP                  «      Z0 ejT                  e.e0«        eejb                  ejd                  «       G d#„ d$«      «       Z3 G d%„ d&e3«      Z4g d'¢Z5y())a  
A module that needs a better name.

Implements new cred things for words.

How does this thing work?

  - Network connection on some port expecting to speak some protocol

  - Protocol-specific authentication, resulting in some kind of credentials object

  - twisted.cred.portal login using those credentials for the interface
    IUser and with something implementing IChatClient as the mind

  - successful login results in an IUser avatar the protocol can call
    methods on, and state added to the realm such that the mind will have
    methods called on it as is necessary

  - protocol specific actions lead to calls onto the avatar; remote events
    lead to calls onto the mind

  - protocol specific hangup, realm is notified, user is removed from active
    play, the end.
é    )ÚctimeÚtime)Úimplementer)Ú	copyright)ÚcredentialsÚerrorÚportal)ÚdeferÚprotocol)ÚfailureÚlogÚreflect)ÚregisterAdapter)Úpb)ÚewordsÚiwords)Úircc                   óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Z	d	„ Z
d
„ Zy)ÚGroupc                 ó4   — || _         i | _        dddœ| _        y )NÚ )ÚtopicÚtopic_author)ÚnameÚusersÚmeta©Úselfr   s     ú7/usr/lib/python3/dist-packages/twisted/words/service.pyÚ__init__zGroup.__init__.   s   € ØˆŒ	ØˆŒ
àØñ
ˆ�	ó    c                 ó@   — t        j                  t        ||«      «      S ©N)r   ÚFailureÚ	Exception)r   ÚerrÚps      r   Ú_ebUserCallzGroup._ebUserCall6   s   € Ü�‰œy¨¨CÓ0Ó1Ð1r!   c                 ó|   — |D ]7  \  }}|rŒ	|j                   \  }}| j                  ||j                  «       «       Œ9 y r#   )ÚvalueÚremoveÚgetErrorMessage)r   ÚresultsÚsuccessÚresultÚuserr&   s         r   Ú_cbUserCallzGroup._cbUserCall9   s<   € Ø&ò 	9‰OˆG�VÚØ"ŸL™L‘	��cØ—‘˜D #×"5Ñ"5Ó"7Õ8ñ	9r!   c                 ó>  — t         j                  j                  |«      sJ dj                  |«      «       ‚|j                  | j
                  vr¼g }|| j
                  |j                  <   | j
                  j                  «       D ]V  }||usŒt        j                  |j                  | |«      }|j                  | j                  |¬«       |j                  |«       ŒX t        j                  |«      j                  | j                  «       t        j                   d «      S )Nz{!r} is not a chat client©r'   )r   ÚIChatClientÚ
providedByÚformatr   r   Úvaluesr
   ÚmaybeDeferredÚ
userJoinedÚ
addErrbackr(   ÚappendÚDeferredListÚaddCallbackr1   Úsucceed)r   r0   Ú	additionsr'   Úds        r   Úaddz	Group.add?   sì   € Ü×!Ñ!×,Ñ,¨TÔ2ð 	
Ð4O×4VÑ4VØó5
ó 	
Ð2ð �9‰9˜DŸJ™JÑ&ØˆIØ$(ˆD�J‰J�t—y‘yÑ!Ø—Z‘Z×&Ñ&Ó(ò (�Ø˜D’=Ü×+Ñ+¨A¯L©L¸$ÀÓE�AØ—L‘L ×!1Ñ!1°Q�LÔ7Ø×$Ñ$ QÕ'ð	(ô
 ×Ñ˜yÓ)×5Ñ5°d×6FÑ6FÔGÜ�}‰}˜TÓ"Ð"r!   Nc                 óÂ  — 	 | j                   |j                  = g }| j                   j                  «       D ]W  }||usŒt        j                  |j
                  | ||«      }|j                  | j                  |¬«       |j                  |«       ŒY t        j                  |«      j                  | j                  «       t        j                  d «      S # t        $ r Y Œ w xY w©Nr3   )r   r   r7   r
   r8   ÚuserLeftr:   r(   r;   r<   r=   r1   ÚKeyErrorr>   )r   r0   ÚreasonÚremovalsr'   r@   s         r   r+   zGroup.removeN   sÂ   € ð	GØ—
‘
˜4Ÿ9™9Ð%ð ˆHØ—Z‘Z×&Ñ&Ó(ò '�Ø˜D’=Ü×+Ñ+¨A¯J©J¸¸dÀFÓK�AØ—L‘L ×!1Ñ!1°Q�LÔ7Ø—O‘O AÕ&ð	'ô
 ×Ñ˜xÓ(×4Ñ4°T×5EÑ5EÔFÜ�}‰}˜TÓ"Ð"øô ò 	Ùð	ús   ‚C Ã	CÃCc                 óR   — t        j                  t        | j                  «      «      S r#   )r
   r>   Úlenr   ©r   s    r   Úsizez
Group.size]   s   € Ü�}‰}œS §¡›_Ó-Ð-r!   c                 ó€  — || u sJ ‚g }| j                   j                  «       D ]W  }||usŒt        j                  |j                  || |«      }|j                  | j                  |¬«       |j                  |«       ŒY t        j                  |«      j                  | j                  «       t        j                  d «      S rC   )r   r7   r
   r8   Úreceiver:   r(   r;   r<   r=   r1   r>   )r   ÚsenderÚ	recipientÚmessageÚreceivesr'   r@   s          r   rM   zGroup.receive`   s¤   € Ø˜DÑ Ð Ð ØˆØ—‘×"Ñ"Ó$ò 	#ˆAØ˜ŠÜ×'Ñ'¨¯	©	°6¸4ÀÓI�Ø—‘˜T×-Ñ-°�Ô3Ø—‘ Õ"ð		#ô
 	×Ñ˜8Ó$×0Ñ0°×1AÑ1AÔBÜ�}‰}˜TÓ"Ð"r!   c                 óv  — || _         g }| j                  j                  «       D ]Q  }t        j                  |j
                  | |«      }|j                  | j                  |¬«       |j                  |«       ŒS t        j                  |«      j                  | j                  «       t        j                  d «      S rC   )r   r   r7   r
   r8   ÚgroupMetaUpdater:   r(   r;   r<   r=   r1   r>   )r   r   Úsetsr'   r@   s        r   ÚsetMetadatazGroup.setMetadatak   s•   € ØˆŒ	ØˆØ—‘×"Ñ"Ó$ò 	ˆAÜ×#Ñ# A×$5Ñ$5°t¸TÓBˆAØ�L‰L˜×)Ñ)¨QˆLÔ/Ø�K‰K˜�Nð	ô 	×Ñ˜4Ó ×,Ñ,¨T×-=Ñ-=Ô>Ü�}‰}˜TÓ"Ð"r!   c                 óH   — t        | j                  j                  «       «      S r#   )Úiterr   r7   rJ   s    r   Ú	iteruserszGroup.iterusersu   s   € ä�D—J‘J×%Ñ%Ó'Ó(Ð(r!   r#   )Ú__name__Ú
__module__Ú__qualname__r    r(   r1   rA   r+   rK   rM   rU   rX   © r!   r   r   r   ,   s/   „ ò
ò2ò9ò#ó#ò.ò	#ò#ó)r!   r   c                   ó@   — e Zd ZdZdZd„ Zd„ Zd„ Zd	d„Zd„ Z	d„ Z
d„ Zy)
ÚUserNc                 ó>   — || _         g | _        t        «       | _        y r#   )r   Úgroupsr   ÚlastMessager   s     r   r    zUser.__init__   s   € ØˆŒ	ØˆŒÜ›6ˆÕr!   c                 ó>   — || _         || _        t        «       | _        y r#   )ÚrealmÚmindr   ÚsignOn)r   rc   rd   s      r   ÚloggedInzUser.loggedIn„   s   € ØˆŒ
ØˆŒ	Ü“fˆ�r!   c                 óf   ‡ ‡— ˆˆ fd„}‰j                  ‰ j                  «      j                  |«      S )Nc                 ó>   •— ‰j                   j                  ‰«       | S r#   )r`   r;   ©r/   Úgroupr   s    €€r   ÚcbJoinzUser.join.<locals>.cbJoinŠ   ó   ø€ Ø�K‰K×Ñ˜uÔ%ØˆMr!   )rA   rd   r=   )r   rj   rk   s   `` r   Újoinz	User.join‰   s(   ù€ õ	ð �y‰y˜Ÿ™Ó#×/Ñ/°Ó7Ð7r!   c                 óh   ‡ ‡— ˆˆ fd„}‰j                  ‰ j                  |«      j                  |«      S )Nc                 ó>   •— ‰j                   j                  ‰«       | S r#   )r`   r+   ri   s    €€r   ÚcbLeavezUser.leave.<locals>.cbLeave‘   rl   r!   )r+   rd   r=   )r   rj   rF   rp   s   ``  r   Úleavez
User.leave�   s*   ù€ õ	ð �|‰|˜DŸI™I vÓ.×:Ñ:¸7ÓCÐCr!   c                 óZ   — t        «       | _        |j                  | j                  ||«      S r#   )r   ra   rM   rd   )r   rO   rP   s      r   Úsendz	User.send—   s%   € Ü›6ˆÔØ× Ñ  §¡¨I°wÓ?Ð?r!   c                 ó,   — t        | j                  «      S r#   )rW   r`   rJ   s    r   Ú
itergroupszUser.itergroups›   s   € Ü�D—K‘KÓ Ð r!   c                 óN   — | j                   d d  D ]  }| j                  |«       Œ y r#   )r`   rq   )r   Úgs     r   ÚlogoutzUser.logoutž   s$   € Ø—‘™Q�ò 	ˆAØ�J‰J�q�Mñ	r!   r#   )rY   rZ   r[   rc   rd   r    rf   rm   rq   rs   ru   rx   r\   r!   r   r^   r^   z   s1   „ à€EØ€Dò"ò
ò
8óDò@ò!ór!   r^   zNickServ!NickServ@servicesc                   ó¨  — e Zd ZdZdZdZdZdZdZd„ Z	d„ Z
d„ Zd„ Zd-d„Zd	„ Zd
„ ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zej0                  dfej2                  dfej4                  dfej6                  dfgZej:                  dfej<                  dfgZd„ Z d„ Z!d„ Z"d„ Z#d-d„Z$d-d„Z%d„ Z&d„ Z'd„ Z(d„ Z)d „ Z*d!„ Z+d"„ Z,d#„ Z-d$„ Z.d%„ Z/d&„ Z0d'„ Z1d(„ Z2d)„ Z3d*„ Z4d+„ Z5d,„ Z6y).ÚIRCUserzM
    Protocol instance representing an IRC user connected to the server.
    Núutf-8c                 ó’   — | j                   | _        | j                  j                  | _        | j                  j                  | _        y r#   )Úirc_NICKSERV_PRIVMSGÚirc_PRIVMSGÚfactoryrc   r   ÚhostnamerJ   s    r   ÚconnectionMadezIRCUser.connectionMade¼   s0   € Ø×4Ñ4ˆÔØ—\‘\×'Ñ'ˆŒ
ØŸ
™
Ÿ™ˆ�r!   c                 óL   — | j                   �| j                  «        d | _        y y r#   )rx   Úavatar©r   rF   s     r   ÚconnectionLostzIRCUser.connectionLostÁ   s!   € Ø�;‰;Ð"Ø�K‰KŒMØˆD�Kð #r!   c                 ó^  — d|vr| j                   |d<   d|vr(| j                  j                  | j                  «      |d<   | ||d   gt	        |«      z   }g }|D ]4  }t        |t        «      r|j                  d«      }|j                  |«       Œ6 t        j                  j                  |i |¤Ž y )NÚprefixÚtor{   )r€   r   ÚencodeÚencodingÚlistÚ
isinstanceÚbytesÚdecoder;   r   ÚIRCÚsendMessage)r   ÚcommandÚparameter_listÚkwÚarglistÚarglistUnicodeÚargs          r   r�   zIRCUser.sendMessageÇ   s§   € Ø˜2ÑØŸ=™=ˆBˆx‰LØ�r‰>Ø—y‘y×'Ñ'¨¯©Ó6ˆBˆt‰Hà˜ " T¡(Ð+¬d°>Ó.BÑBˆØˆØò 	'ˆCÜ˜#œuÔ%Ø—j‘j Ó)�Ø×!Ñ! #Õ&ð	'ô 	�‰×Ñ˜^Ð2¨rÓ2r!   c                 óŽ   — | j                  |j                  › d|j                  › d| j                  › �d|j                  z   «       y )Nú!ú@ú#)rm   r   r€   ©r   rj   r0   s      r   r9   zIRCUser.userJoinedÖ   s6   € Ø�	‰	�T—Y‘Y�K˜q §¡ ¨1¨T¯]©]¨OÐ<¸cÀEÇJÁJÑ>NÕOr!   c                 ó˜   — | j                  |j                  › d|j                  › d| j                  › �d|j                  z   |xs d«       y )Nr˜   r™   rš   Úleaving)Úpartr   r€   ©r   rj   r0   rF   s       r   rD   zIRCUser.userLeftÙ   sB   € Ø�	‰	Ø�y‰yˆk˜˜4Ÿ9™9˜+ Q t§}¡} oÐ6Ø�%—*‘*ÑØÒ �yõ	
r!   c                 ó:  — t         j                  j                  |«      rd|j                  z   }n|j                  }|j	                  dd«      }|j                  «       D ];  }| j                  |j                  › d|j                  › d| j                  › �||«       Œ= y )Nrš   Útextz<an unrepresentable message>r˜   r™   )r   ÚIGroupr5   r   ÚgetÚ
splitlinesÚprivmsgr€   )r   rN   rO   rP   ÚrecipientNamer¡   ÚLs          r   rM   zIRCUser.receiveà   s†   € ô �=‰=×#Ñ# IÔ.Ø )§.¡.Ñ0‰Mà%ŸN™NˆMà�{‰{˜6Ð#AÓBˆØ—‘Ó"ò 	ˆAØ�L‰LØ—;‘;�-˜q §¡ ¨Q¨t¯}©}¨oÐ>ØØõñ	r!   c           
      ó¶   — d|v rU|d   }|j                  dd«      }| j                  | j                  d|j                  z   ||› d|› d| j                  › �«       y y )Nr   r   r   rš   r˜   r™   )r£   r   r   r€   )r   rj   r   r   Úauthors        r   rS   zIRCUser.groupMetaUpdateñ   sa   € Ø�d‰?Ø˜‘MˆEØ—X‘X˜n¨bÓ1ˆFØ�J‰JØ—	‘	Ø�e—j‘jÑ ØØ�(˜!˜F˜8 1 T§]¡] OÐ4õ	ð r!   c                 ó   — |d   | _         y)zÃ
        Password message -- Register a password.

        Parameters: <password>

        [REQUIRED]

        Note that IRC requires the client send this *before* NICK
        and USER.
        éÿÿÿÿN)Úpassword©r   r‡   Úparamss      r   Úirc_PASSzIRCUser.irc_PASS   s   € ð ˜r™
ˆ�r!   c                 ó   — |d   }	 t        |t        «      r|j                  | j                  «      }|| _
        || _        | j                  D ].  \  }}| j                  ||| j                  j                  z  «       Œ0 | j                   €| j                  t        |d«       y| j                   }d| _        | j#                  ||«       y# t        $ r= | j                  t        t        |«      d«       | j                  j                  «        Y yw xY w)zh
        Nick message -- Set your nickname.

        Parameters: <nickname>

        [REQUIRED]
        r   z;Your nickname cannot be decoded. Please use ASCII or UTF-8.Nz	Password?)rŒ   r�   rŽ   rŠ   ÚUnicodeDecodeErrorr¥   ÚNICKSERVÚreprÚ	transportÚloseConnectionÚnicknamer   Ú_motdMessagesr�   r   Ú_serverInfor¬   ÚlogInAs)r   r‡   r®   r¶   Úcoder¡   r¬   s          r   Úirc_NICKzIRCUser.irc_NICK  sñ   € ð ˜!‘9ˆð
	Ü˜(¤EÔ*Ø#Ÿ?™?¨4¯=©=Ó9�ð !ˆŒØˆŒ	à×,Ñ,ò 	D‰JˆD�$Ø×Ñ˜T 4¨$¯,©,×*BÑ*BÑ#BÕCð	Dð �=‰=Ð Ø�L‰Lœ 8¨[Õ9à—}‘}ˆHØ ˆDŒMØ�L‰L˜ 8Õ,øô) "ò 	Ø�L‰LÜÜ�X“ØMôð
 �N‰N×)Ñ)Ô+Ùð	ús   ‡+C ÃADÄDc                 ó   — |d   | _         y)zk
        User message -- Set your realname.

        Parameters: <user> <mode> <unused> <realname>
        r«   N)Úrealnamer­   s      r   Úirc_USERzIRCUser.irc_USER/  s   € ð ˜r™
ˆ�r!   c                 ó  — |d   }|d   }| j                   €| j                  j                  «        y|j                  «       dk7  r"| j	                  t
        | j                   d«       y| j                   }d| _         | j                  ||«       y)ú^
        Send a (private) message.

        Parameters: <msgtarget> <text to be sent>
        r   r«   NÚnickservz1Denied.  Please send me (NickServ) your password.)r¶   r´   rµ   Úlowerr¥   r²   r¹   )r   r‡   r®   Útargetr¬   r¶   s         r   r}   zIRCUser.irc_NICKSERV_PRIVMSG:  sw   € ð ˜‘ˆØ˜"‘:ˆà�=‰=Ð à�N‰N×)Ñ)Õ+Ø�\‰\‹^˜zÒ)Ø�L‰LÜØ—‘ØCõð —}‘}ˆHØ ˆDŒMØ�L‰L˜ 8Õ,r!   c                 óè   — | j                   j                  j                  t        j                  ||«      | t
        j                  «      }|j                  | j                  | j                  |f¬«       y )N)ÚerrbackArgs)
r   r	   Úloginr   ÚUsernamePasswordr   ÚIUserÚaddCallbacksÚ_cbLoginÚ_ebLogin)r   r¶   r¬   r@   s       r   r¹   zIRCUser.logInAsQ  sR   € Ø�L‰L×Ñ×%Ñ%Ü×(Ñ(¨°8Ó<¸dÄFÇLÁLó
ˆð 	
�‰�t—}‘} d§m¡mÀ(ÀˆÕMr!   z:connected to Twisted IRCzA:Your host is %(serviceName)s, running version %(serviceVersion)sz,:This server was created on %(creationDate)sz&%(serviceName)s %(serviceVersion)s w nz(:- %(serviceName)s Message of the Day - z:End of /MOTD command.c                 óâ   — |\  }}}|t         j                  u s
J d|›�«       ‚| `|| _        || _        | j
                  D ].  \  }}| j                  ||| j                  j                  z  «       Œ0 y )NzRealm is buggy, got )	r   rÈ   r~   rƒ   rx   Ú_welcomeMessagesr�   r   r¸   )r   r/   Úifacerƒ   rx   rº   r¡   s          r   rÊ   zIRCUser._cbLoginn  s}   € Ø"(Ñˆ�˜ØœŸ™Ñ$ÐFÐ(<¸U¸IÐ&FÓFÐ$ð ÐàˆŒØˆŒØ×/Ñ/ò 	D‰JˆD�$Ø×Ñ˜T 4¨$¯,©,×*BÑ*BÑ#BÕCñ	Dr!   c                 ó–  — |j                  t        j                  «      r| j                  t        |d«       nx|j                  t
        j                  «      r| j                  t        |d«       nAt        j                  d«       t        j                  |«       | j                  t        |d«       | j                  j                  «        y )Nz*Already logged in.  No pod people allowed!zLogin failed.  Goodbye.zUnhandled error during login:z"Server error during login.  Sorry.)Úcheckr   ÚAlreadyLoggedInr¥   r²   ÚecredÚUnauthorizedLoginr   Úmsgr&   r´   rµ   )r   r&   r¶   s      r   rË   zIRCUser._ebLoginz  s†   € Ø�9‰9”V×+Ñ+Ô,Ø�L‰LÜ˜(Ð$Põð �Y‰Y”u×.Ñ.Ô/Ø�L‰Lœ 8Ð-FÕGä�G‰GÐ3Ô4Ü�G‰G�CŒLØ�L‰Lœ 8Ð-QÔRØ�‰×%Ñ%Õ'r!   c                 óV   — | j                   �| j                  d| j                  «       yy)zK
        Ping message

        Parameters: <server1> [ <server2> ]
        NÚPONG)rc   r�   r€   r­   s      r   Úirc_PINGzIRCUser.irc_PING‰  s'   € ð �:‰:Ð!Ø×Ñ˜V T§]¡]Õ3ð "r!   c                 ó8   — | j                   j                  «        y)z>
        Quit

        Parameters: [ <Quit Message> ]
        N)r´   rµ   r­   s      r   Úirc_QUITzIRCUser.irc_QUIT’  s   € ð 	�‰×%Ñ%Õ'r!   c                 óž   — |r!| j                  t        j                  d«       y | j                  | j                  d|j                  z   d«       y )Nú:Unknown MODE flag.rš   ú+)r�   r   ÚERR_UNKNOWNMODEÚchannelModer   )r   rj   ÚmodesÚargss       r   Ú_channelModezIRCUser._channelModeš  s;   € ÙØ×ÑœS×0Ñ0Ð2GÕHà×Ñ˜TŸY™Y¨¨e¯j©jÑ(8¸#Õ>r!   c                 óè   — |r!| j                  t        j                  d«       y || j                  u r!| j                  t        j                  d«       y | j                  t        j
                  d«       y )NrÛ   rÜ   z(:You can't look at someone else's modes.)r�   r   rÝ   rƒ   ÚRPL_UMODEISÚERR_USERSDONTMATCH)r   r0   rß   s      r   Ú	_userModezIRCUser._userMode   sV   € ÙØ×ÑœS×0Ñ0Ð2GÕHØ�T—[‘[Ñ Ø×ÑœSŸ_™_¨cÕ2à×ÑÜ×&Ñ&Ð(Rõr!   c           	      ó$  ‡ ‡— 	 ‰d   }t        |t        «      r|j                  ‰ j                  «      }|j                  d«      rOˆˆ fd„}‰ j                  j                  |dd «      }|j                  ‰ j                  |t        ‰dd «      ¬«       yˆ fd„}‰ j                  j                  |«      }|j                  ‰ j                  |t        ‰dd «      ¬«       y# t        $ r' ‰ j                  t        j                  ‰d   d«       Y yw xY w)	z€
        User mode message

        Parameters: <nickname>
        *( ( "+" / "-" ) *( "i" / "w" / "o" / "O" / "r" ) )

        r   z2:No such nickname (could not decode your unicode!)Nrš   c                 óŒ   •— | j                  t        j                  «       ‰j                  t        j
                  ‰d   d«       y )Nr   ú:That channel doesn't exist.©Útrapr   ÚNoSuchGroupr�   r   ÚERR_NOSUCHCHANNEL©r&   r®   r   s    €€r   ÚebGroupz!IRCUser.irc_MODE.<locals>.ebGroupÀ  s5   ø€ Ø—‘œ×+Ñ+Ô,Ø× Ñ Ü×)Ñ)¨6°!©9Ð6Tõr!   é   )ÚcallbackArgsc                 óF   •— ‰j                  t        j                  d«       y )Nz:No such nickname.©r�   r   ÚERR_NOSUCHNICK)r&   r   s    €r   ÚebUserz IRCUser.irc_MODE.<locals>.ebUserÊ  s   ø€ Ø× Ñ ¤×!3Ñ!3Ð5IÕJr!   )rŒ   r�   rŽ   rŠ   r±   r�   r   ró   Ú
startswithrc   ÚlookupGrouprÉ   rá   ÚtupleÚ
lookupUserrå   )r   r‡   r®   ÚchannelOrUserrî   r@   rô   s   ` `    r   Úirc_MODEzIRCUser.irc_MODEª  sú   ù€ ð
	Ø" 1™IˆMÜ˜-¬Ô/Ø -× 4Ñ 4°T·]±]Ó C�ð ×#Ñ# CÔ(õð —
‘
×&Ñ& }°Q°RÐ'8Ó9ˆAØ�N‰N˜4×,Ñ,¨gÄEÈ&ÐQRÐQSÈ*ÓDUˆNÕVôKð —
‘
×%Ñ% mÓ4ˆAØ�N‰N˜4Ÿ>™>¨6ÄÀfÈQÈRÀjÓ@QˆNÕRøô1 "ò 	Ø×ÑÜ×"Ñ"Ø�q‘	ØDôñ
 ð	ús   „0C Ã-DÄDc                  ó   — y)zl
        Userhost message

        Parameters: <nickname> *( SPACE <nickname> )

        [Optional]
        Nr\   r­   s      r   Úirc_USERHOSTzIRCUser.irc_USERHOSTÐ  s   € ð 	r!   c                 óÎ  ‡ ‡‡— 	 |d   Št        ‰t        «      r‰j                  ‰ j                  «      Š|d   Š‰j                  d«      r‰ j                  j                  ‰dd «      }n+‰ j                  j                  ‰«      j                  d„ «      }ˆˆ fd„}ˆ ˆfd	„}|j                  ||«       y# t        $ r' ‰ j                  t        j                  |d   d«       Y yw xY w)
rÀ   r   z6:No such nick/channel (could not decode your unicode!)Nr«   rš   rï   c                 ó   — | j                   S r#   )rd   )r0   s    r   ú<lambda>z%IRCUser.irc_PRIVMSG.<locals>.<lambda>ñ  s
   € ˜TŸY™Y€ r!   c                 óF   •— | �‰j                   j                  | d‰i«      S y )Nr¡   )rƒ   rs   )ÚtargÚmessageTextr   s    €€r   ÚcbTargetz%IRCUser.irc_PRIVMSG.<locals>.cbTargetô  s*   ø€ ØÐØ—{‘{×'Ñ'¨¨v°{Ð.CÓDÐDð  r!   c                 óH   •— ‰j                  t        j                  ‰d«       y )Nz:No such nick/channel.rò   )r&   r   Ú
targetNames    €€r   ÚebTargetz%IRCUser.irc_PRIVMSG.<locals>.ebTargetø  s   ø€ Ø×ÑœS×/Ñ/°Ð=UÕVr!   )rŒ   r�   rŽ   rŠ   r±   r�   r   ró   rõ   rc   rö   rø   r=   rÉ   )r   r‡   r®   rÃ   r  r  r  r  s   `     @@r   r~   zIRCUser.irc_PRIVMSGÚ  sÙ   ú€ ð
	Ø ™ˆJÜ˜*¤eÔ,Ø'×.Ñ.¨t¯}©}Ó=�
ð ˜R‘jˆØ× Ñ  Ô%Ø—Z‘Z×+Ñ+¨J°q°r¨NÓ;‰Fà—Z‘Z×*Ñ*¨:Ó6×BÑBÙ&óˆFõ	Eõ	Wð 	×Ñ˜H hÕ/øô/ "ò 	Ø×ÑÜ×"Ñ"Ø�q‘	ØHôñ
 ð	ús   …0B4 Â4-C$Ã#C$c                 óh  ‡ ‡— 	 |d   Št        ‰t        «      r‰j                  ‰ j                  «      Š‰j                  d«      r‰dd Šˆ fd„}ˆˆ fd„}‰ j                  j                  ‰«      j                  ||«       y# t        $ r' ‰ j                  t        j                  |d   d«       Y yw xY w)zm
        Join message

        Parameters: ( <channel> *( "," <channel> ) [ <key> *( "," <key> ) ] )
        r   ú1:No such channel (could not decode your unicode!)Nrš   rï   c                 óf   •‡ — ˆ ˆfd„}‰j                   j                  ‰ «      j                  |«      S )Nc                 óö   •— ‰j                  ‰‰«       ‰j                  ‰j                  d‰j                  z   ‰j                  «       D �cg c]  }|j                  ‘Œ c}«       ‰j	                  ‰«       y c c}w ©Nrš   )r9   Únamesr   rX   Ú
_sendTopic)Úignr0   rj   r   s     €€r   rk   z1IRCUser.irc_JOIN.<locals>.cbGroup.<locals>.cbJoin  s\   ø€ Ø—‘  tÔ,Ø—
‘
Ø—I‘IØ˜%Ÿ*™*Ñ$Ø+0¯?©?Ó+<Ö= 4�T—Y“YÒ=ôð
 —‘ Õ&ùò >s   Á
A6©rƒ   rm   r=   )rj   rk   r   s   ` €r   ÚcbGroupz!IRCUser.irc_JOIN.<locals>.cbGroup  s*   ù€ õ'ð —;‘;×#Ñ# EÓ*×6Ñ6°vÓ>Ð>r!   c                 óN   •— ‰j                  t        j                  d‰z   d«       y )Nrš   z:No such channel.)r�   r   rì   ©r&   Ú	groupNamer   s    €€r   rî   z!IRCUser.irc_JOIN.<locals>.ebGroup  s#   ø€ Ø×ÑÜ×%Ñ% s¨Y¡Ð8Kõr!   )rŒ   r�   rŽ   rŠ   r±   r�   r   rì   rõ   rc   ÚgetGrouprÉ   )r   r‡   r®   r  rî   r  s   `    @r   Úirc_JOINzIRCUser.irc_JOINý  s¬   ù€ ð
	Ø˜q™	ˆIÜ˜)¤UÔ+Ø%×,Ñ,¨T¯]©]Ó;�	ð ×Ñ Ô$Ø! ! "˜ˆIô
	?õ	ð
 	�
‰
×Ñ˜IÓ&×3Ñ3°G¸WÕEøô9 "ò 	Ø×ÑÜ×%Ñ%Ø�q‘	ØCôñ
 ð	úó   „0B Â-B1Â0B1c                 óæ  ‡ ‡‡— 	 |d   Št        |d   t        «      r|d   j                  ‰ j                  «      Š‰j                  d«      r‰dd Št        |«      dkD  r'|d   Št        ‰t        «      r‰j                  d«      ŠndŠˆˆ fd„}ˆˆ fd„}‰ j                  j                  ‰«      j                  ||«       y# t        $ r' ‰ j                  t        j                  |d   d«       Y yw xY w)	zc
        Part message

        Parameters: <channel> *( "," <channel> ) [ <Part Message> ]
        r   z:Could not decode your unicode!Nrš   rï   r{   c                 ój   •‡ — ˆ ˆˆfd„}‰j                   j                  ‰ ‰«      j                  |«      S )Nc                 ó,   •— ‰j                  ‰‰‰«       y r#   )rD   )r/   rj   rF   r   s    €€€r   rp   z2IRCUser.irc_PART.<locals>.cbGroup.<locals>.cbLeave@  s   ø€ Ø—‘˜e T¨6Õ2r!   )rƒ   rq   r=   )rj   rp   rF   r   s   ` €€r   r  z!IRCUser.irc_PART.<locals>.cbGroup?  s,   ù€ ö3ð —;‘;×$Ñ$ U¨FÓ3×?Ñ?ÀÓHÐHr!   c                 ó®   •— | j                  t        j                  «       ‰j                  t        j
                  d‰z   d| j                  «       z   «       y )Nrš   ú:)rê   r   rë   r�   r   ÚERR_NOTONCHANNELr,   r  s    €€r   rî   z!IRCUser.irc_PART.<locals>.ebGroupE  sB   ø€ Ø�H‰H”V×'Ñ'Ô(Ø×ÑÜ×$Ñ$ c¨I¡o°s¸S×=PÑ=PÓ=RÑ7Rõr!   )rŒ   r�   rŽ   rŠ   r±   r�   r   r  rõ   rI   rc   rö   rÉ   )r   r‡   r®   r  rî   r  rF   s   `    @@r   Úirc_PARTzIRCUser.irc_PART%  så   ú€ ð	Ø˜q™	ˆIÜ˜& ™)¤UÔ+Ø" 1™I×,Ñ,¨T¯]©]Ó;�	ð ×Ñ Ô$Ø! ! "˜ˆIäˆv‹;˜Š?Ø˜A‘YˆFÜ˜&¤%Ô(ØŸ™ wÓ/‘àˆFõ	Iõ	ð 	�
‰
×Ñ˜yÓ)×6Ñ6°wÀÕHøô9 "ò 	Ø×ÑÜ×$Ñ$ f¨Q¡iÐ1Rôñ ð		ús   …6C  Ã -C0Ã/C0c                 óh  ‡ ‡— 	 |d   Št        ‰t        «      r‰j                  ‰ j                  «      Š‰j                  d«      r‰dd Šˆ fd„}ˆˆ fd„}‰ j                  j                  ‰«      j                  ||«       y# t        $ r' ‰ j                  t        j                  |d   d«       Y yw xY w)zb
        Names message

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r«   r  Nrš   rï   c                 ó°   •— ‰j                  ‰j                  d| j                  z   | j                  «       D �cg c]  }|j                  ‘Œ c}«       y c c}w r  )r  r   rX   )rj   r0   r   s     €r   r  z"IRCUser.irc_NAMES.<locals>.cbGroupe  s<   ø€ Ø�J‰JØ—	‘	˜3 §¡Ñ+ÀEÇOÁOÓDUÖ-V¸D¨d¯i«iÒ-VõùÚ-Vs   ¸Ac                 ó„   •— | j                  t        j                  «       ‰j                  ‰j                  d‰z   g «       y r  )rê   r   rë   r  r   ©r&   Úchannelr   s    €€r   rî   z"IRCUser.irc_NAMES.<locals>.ebGroupj  s-   ø€ Ø�H‰H”V×'Ñ'Ô(à�J‰J�t—y‘y #¨¡-°Õ4r!   )rŒ   r�   rŽ   rŠ   r±   r�   r   rì   rõ   rc   rö   rÉ   )r   r‡   r®   r  rî   r"  s   `    @r   Ú	irc_NAMESzIRCUser.irc_NAMESM  sª   ù€ ð
	Ø˜R‘jˆGÜ˜'¤5Ô)Ø!Ÿ.™.¨¯©Ó7�ð ×Ñ˜cÔ"Ø˜a˜b�kˆGô	õ
	5ð
 	�
‰
×Ñ˜wÓ'×4Ñ4°W¸gÕFøô+ "ò 	Ø×ÑÜ×%Ñ%Ø�r‘
ØCôñ
 ð	úr  c                 ó`  — 	 |d   }t        |d   t        «      r|j                  | j                  «      }|j                  d«      r|dd }t        |«      dkD  r| j                  ||d   «       y| j                  |«       y# t        $ r# | j                  t        j                  d«       Y yw xY w)zJ
        Topic message

        Parameters: <channel> [ <topic> ]
        r   z<:That channel doesn't exist (could not decode your unicode!)Nrš   rï   )rŒ   r�   rŽ   rŠ   r±   r�   r   rì   rõ   rI   Ú	_setTopicÚ	_getTopic)r   r‡   r®   r"  s       r   Ú	irc_TOPICzIRCUser.irc_TOPICq  s¤   € ð		Ø˜Q‘iˆGÜ˜& ™)¤UÔ+Ø!Ÿ.™.¨¯©Ó7�ð ×Ñ˜cÔ"Ø˜a˜b�kˆGäˆv‹;˜Š?Ø�N‰N˜7 F¨1¡IÕ.à�N‰N˜7Õ#øô "ò 	Ø×ÑÜ×%Ñ%ØNôñ ð	ús   ‚3B Â)B-Â,B-c                 ó`  — |j                   j                  d«      }|r‘|j                   j                  d«      xs d}|j                   j                  dd«      }| j                  | j                  d|j                  z   |«       | j	                  | j                  d|j                  z   ||«       yy)zP
        Send the topic of the given group to this user, if it has one.
        r   r   z<noone>Ú
topic_dater   rš   N)r   r£   r   r   ÚtopicAuthor)r   rj   r   r©   Údates        r   r  zIRCUser._sendTopicŠ  s‡   € ð —
‘
—‘˜wÓ'ˆÙØ—Z‘Z—^‘^ NÓ3Ò@°yˆFØ—:‘:—>‘> ,°Ó2ˆDØ�J‰J�t—y‘y #¨¯
©
Ñ"2°EÔ:Ø×Ñ˜TŸY™Y¨¨e¯j©jÑ(8¸&À$ÕGð	 r!   c                 ó~   ‡ ‡— ˆˆ fd„}‰ j                   j                  ‰«      j                  ‰ j                  |«       y )Nc                 óˆ   •— | j                  t        j                  «       ‰j                  t        j
                  d‰d«       y ©Nú=rè   ré   r!  s    €€r   rî   z"IRCUser._getTopic.<locals>.ebGroup™  ó3   ø€ Ø�H‰H”V×'Ñ'Ô(Ø×ÑÜ×%Ñ% s¨GÐ5Sõr!   )rc   rö   rÉ   r  )r   r"  rî   s   `` r   r&  zIRCUser._getTopic•  s-   ù€ õ	ð 	�
‰
×Ñ˜wÓ'×4Ñ4°T·_±_ÀgÕNr!   c                 óx   ‡ ‡‡— ˆ ˆfd„}ˆˆ fd„}‰ j                   j                  ‰«      j                  ||«       y )Nc                 óÚ   •‡ — ‰ j                   j                  «       }‰|d<   ‰j                  |d<   t        t	        «       «      |d<   ˆ ˆfd„}‰ j                  |«      j                  |«      S )Nr   r   r)  c                 ób   •— ‰j                  t        j                  d‰j                  z   d«       y )Nrš   z.:You need to be a channel operator to do that.)r�   r   ÚERR_CHANOPRIVSNEEDEDr   )r&   rj   r   s    €€r   ÚebSetz1IRCUser._setTopic.<locals>.cbGroup.<locals>.ebSet«  s)   ø€ Ø× Ñ Ü×,Ñ,Ø˜%Ÿ*™*Ñ$ØDõr!   )r   Úcopyr   Úintr   rU   r:   )rj   ÚnewMetar5  r   r   s   `  €€r   r  z"IRCUser._setTopic.<locals>.cbGroup¥  s^   ù€ Ø—j‘j—o‘oÓ'ˆGØ$ˆG�GÑØ&*§i¡iˆG�NÑ#Ü$'¬«£KˆG�LÑ!õð ×$Ñ$ WÓ-×8Ñ8¸Ó?Ð?r!   c                 óˆ   •— | j                  t        j                  «       ‰j                  t        j
                  d‰d«       y r.  ré   r!  s    €€r   rî   z"IRCUser._setTopic.<locals>.ebGroup´  r0  r!   )rc   rö   rÉ   )r   r"  r   r  rî   s   ```  r   r%  zIRCUser._setTopic¡  s/   ú€ õ	@õ	ð 	�
‰
×Ñ˜wÓ'×4Ñ4°W¸gÕFr!   c                 ó¶   — |D ]4  \  }}}| j                  t        j                  |t        |«      d|z   «       Œ6 | j                  t        j                  d«       y)zõ
        Send a group of LIST response lines

        @type channels: C{list} of C{(str, int, str)}
        @param channels: Information about the channels being sent:
            their name, the number of participants, and their topic.
        r  z:End of /LISTN)r�   r   ÚRPL_LISTÚstrÚRPL_LISTEND)r   Úchannelsr   rK   r   s        r   r‹   zIRCUser.list¼  sP   € ð "*ò 	IÑˆD�$˜Ø×ÑœSŸ\™\¨4´°T³¸CÀ%¹KÕHð	Ià×ÑœŸ™¨/Õ:r!   c                 ó:  ‡ — |rµ	 |d   }t        |t        «      r|j                  ‰ j                  «      }|j	                  d«      }g }|D ]B  }|j                  d«      r|dd }|j                  ‰ j                  j                  |«      «       ŒD t        j                  |d¬«      }|j                  d	„ «       n‰ j                  j!                  «       }ˆ fd
„}|j                  |«       y# t
        $ r' ‰ j                  t        j                  |d   d«       Y yw xY w)zÎ
        List query

        Return information about the indicated channels, or about all
        channels if none are specified.

        Parameters: [ <channel> *( "," <channel> ) [ <target> ] ]
        r   ú,r  Nrš   rï   T)ÚconsumeErrorsc                 ó>   — | D ��cg c]
  \  }}|sŒ	|‘Œ c}}S c c}}w r#   r\   )ÚgsÚsÚrs      r   rÿ   z"IRCUser.irc_LIST.<locals>.<lambda>ë  s   € ¸2×*C±°!°QÂª1Ó*C€ ùÓ*Cs   †
‘c           	      óÂ   •— d„ }t        j                  | D �cg c]"  }|j                  «       j                  ||«      ‘Œ$ c}«      }|j                  ˆfd„«       |S c c}w )Nc                 óR   — |j                   | |j                  j                  d«      fS )Nr   )r   r   r£   )rK   rj   s     r   ÚgotSizez3IRCUser.irc_LIST.<locals>.cbGroups.<locals>.gotSizeñ  s    € Ø—z‘z 4¨¯©¯©¸Ó)@Ð@Ð@r!   c                 ó^   •— ‰j                  | D ��cg c]
  \  }}|sŒ	|‘Œ c}}«      S c c}}w r#   )r‹   )r-   rD  rE  r   s      €r   rÿ   z4IRCUser.irc_LIST.<locals>.cbGroups.<locals>.<lambda>÷  s%   ø€ ¨$¯)©)ÀW×4R¹6¸A¸qÒPQ²QÓ4RÓ*S€ ùÓ4Rs   ’
)
�)
)r
   r<   rK   r=   )r`   rH  rj   r@   r   s       €r   ÚcbGroupsz"IRCUser.irc_LIST.<locals>.cbGroupsð  sV   ø€ òAô ×"Ñ"ØGMÖN¸e�—‘“×)Ñ)¨'°5Õ9ÒNóˆAð �M‰MÓSÔTØˆHùò Os   ˜'A)rŒ   r�   rŽ   rŠ   Úsplitr±   r�   r   rì   rõ   r;   rc   rö   r
   r<   r=   ru   )r   r‡   r®   ÚallChannelsr>  r`   ÚchrJ  s   `       r   Úirc_LISTzIRCUser.irc_LISTÈ  s  ø€ ñ ðØ$ Q™i�Ü˜k¬5Ô1Ø"-×"4Ñ"4°T·]±]Ó"C�KØ&×,Ñ,¨SÓ1�ð ˆFØò :�Ø—=‘= Ô%Ø˜A˜B˜�BØ—‘˜dŸj™j×4Ñ4°RÓ8Õ9ð:ô
 ×'Ñ'¨¸dÔCˆFØ×ÑÑCÕDð —Z‘Z×*Ñ*Ó,ˆFô	ð 	×Ñ˜8Õ$øô= &ò Ø× Ñ Ü×)Ñ)Ø˜1‘IØGôñ
 ðús   …AC* Ã*-DÄDc                 ó   — | j                  | j                  d|j                  z   |j                  «       D �cg c]G  }|j                  | j                  | j                  j                  |j                  dd|j                  f‘ŒI c}«       y c c}w )Nrš   ÚHr   )Úwhor   rX   r€   rc   )r   rj   Úms      r   Ú_channelWhozIRCUser._channelWhoü  sl   € Ø�‰Ø�I‰IØ�%—*‘*Ñð Ÿ™Ó*öàð —‘˜Ÿ™¨¯
©
¯©¸¿¹ÀÀaÈÏÉÒPòõ	
ùòs   ·ABc                 óD   — | j                  t        j                  d«       y )Nz:User /WHO not implemented)r�   r   ÚRPL_ENDOFWHO©r   r0   s     r   Ú_userWhozIRCUser._userWho  s   € Ø×Ñœ×)Ñ)Ð+GÕHr!   c                 ó4  ‡ ‡— |s!‰ j                  t        j                  d«       y	 |d   Št        ‰t        «      r‰j                  ‰ j                  «      Š‰j                  d«      rAˆˆ fd„}‰ j                  j                  ‰dd «      }|j                  ‰ j                  |«       yˆˆ fd„}‰ j                  j                  ‰«      }|j                  ‰ j                  |«       y# t        $ r' ‰ j                  t        j                  |d   d«       Y yw xY w)	zC
        Who query

        Parameters: [ <mask> [ "o" ] ]
        z:/WHO not supported.Nr   z2:End of /WHO list (could not decode your unicode!)rš   c                 ó†   •— | j                  t        j                  «       ‰j                  t        j
                  ‰d«       y ©Nz:End of /WHO list.)rê   r   rë   r�   r   rU  ©r&   rù   r   s    €€r   rî   z IRCUser.irc_WHO.<locals>.ebGroup*  s.   ø€ Ø—‘œ×+Ñ+Ô,Ø× Ñ ¤×!1Ñ!1°=ÐBVÕWr!   rï   c                 ó†   •— | j                  t        j                  «       ‰j                  t        j
                  ‰d«       y rZ  )rê   r   Ú
NoSuchUserr�   r   rU  r[  s    €€r   rô   zIRCUser.irc_WHO.<locals>.ebUser2  s.   ø€ Ø—‘œ×*Ñ*Ô+Ø× Ñ ¤×!1Ñ!1°=ÐBVÕWr!   )r�   r   rU  rŒ   r�   rŽ   rŠ   r±   rõ   rc   rö   rÉ   rS  rø   rW  )r   r‡   r®   rî   r@   rô   rù   s   `     @r   Úirc_WHOzIRCUser.irc_WHO	  sú   ù€ ñ Ø×ÑœS×-Ñ-Ð/EÔFØð
	Ø" 1™IˆMÜ˜-¬Ô/Ø -× 4Ñ 4°T·]±]Ó C�ð ×#Ñ# CÔ(õXð —
‘
×&Ñ& }°Q°RÐ'8Ó9ˆAØ�N‰N˜4×+Ñ+¨WÕ5õXð —
‘
×%Ñ% mÓ4ˆAØ�N‰N˜4Ÿ=™=¨&Õ1øô/ "ò 	Ø×ÑÜ× Ñ Ø�q‘	ØDôñ
 ð	ús   §0C' Ã'-DÄDc                 ó<  ‡ ‡— ˆ fd„}ˆˆ fd„}	 ‰d   }t        |t        «      r|j                  ‰ j                  «      }‰ j                  j                  |«      j                  ||«       y# t        $ r' ‰ j                  t        j                  ‰d   d«       Y yw xY w)zV
        Whois query

        Parameters: [ <target> ] <mask> *( "," <mask> )
        c                 óˆ  •— ‰j                  ‰j                  | j                  | j                  ‰j                  j                  | j                  ‰j                  j                  ddt        t	        «       | j
                  z
  «      | j                  | j                  «       D �cg c]  }d|j                  z   ‘Œ c}«       y c c}w )NzHi mom!Frš   )Úwhoisr   rc   r7  r   ra   re   ru   )r0   rj   r   s     €r   ÚcbUserz!IRCUser.irc_WHOIS.<locals>.cbUser@  s‡   ø€ Ø�J‰JØ—	‘	Ø—	‘	Ø—	‘	Ø—
‘
—‘Ø—	‘	Ø—
‘
—‘ØØÜ”D“F˜T×-Ñ-Ñ-Ó.Ø—‘Ø/3¯©Ó/@ÖA e��u—z‘zÓ!ÒAõùò Bs   Â!B?c                 óŒ   •— | j                  t        j                  «       ‰j                  t        j
                  ‰d   d«       y )Nr   ú:No such nick/channel)rê   r   r]  r�   r   ró   rí   s    €€r   rô   z!IRCUser.irc_WHOIS.<locals>.ebUserO  s2   ø€ Ø�H‰H”V×&Ñ&Ô'Ø×ÑœS×/Ñ/°¸±Ð<SÕTr!   r   rd  N)rŒ   r�   rŽ   rŠ   r±   r�   r   ró   rc   rø   rÉ   )r   r‡   r®   rb  rô   r0   s   ` `   r   Ú	irc_WHOISzIRCUser.irc_WHOIS9  sŠ   ù€ ô	õ	Uð	Ø˜!‘9ˆDÜ˜$¤Ô&Ø—{‘{ 4§=¡=Ó1�ð
 	�
‰
×Ñ˜dÓ#×0Ñ0°¸Õ@øô	 "ò 	Ø×ÑœS×/Ñ/°¸±Ð<SÔTÙð	ús   �0A+ Á+-BÂBc                 óD   — | j                  t        j                  d«       y)zE
        Oper message

        Parameters: <name> <password>
        z:O-lines not applicableN)r�   r   ÚERR_NOOPERHOSTr­   s      r   Úirc_OPERzIRCUser.irc_OPER^  s   € ð 	×Ñœ×+Ñ+Ð-FÕGr!   r#   )7rY   rZ   r[   Ú__doc__r`   rx   rƒ   rc   rŠ   r�   r…   r�   r9   rD   rM   rS   r¶   r¬   r¯   r»   r¾   r}   r¹   r   ÚRPL_WELCOMEÚRPL_YOURHOSTÚRPL_CREATEDÚ
RPL_MYINFOrÍ   ÚRPL_MOTDSTARTÚRPL_ENDOFMOTDr·   rÊ   rË   r×   rÙ   rá   rå   rú   rü   r~   r  r  r#  r'  r  r&  r%  r‹   rN  rS  rW  r^  re  rh  r\   r!   r   rz   rz   ¦   sl  „ ñð
 €Fð €Fð €Fð €Eð €Hò(ò
ò3òPó
òò"	ð €HØ€Hò#ò -òD	#ò-ò.Nð 
�‰Ð5Ð6à×ÑØOð	
ð 
�‰ÐHÐIð
 �N‰Nð 5ð		
ðÐð& 
×	Ñ	ÐFÐGØ	×	Ñ	Ð4Ð5ð€Mò

Dò(ò4ò(ó?óò$SòLò!0òF&FòP&IòP"GòH$ò2	Hò
OòGò6
;ò2%òh
òIò.2ò`"AóJHr!   rz   c                   ó   — e Zd ZdZeZd„ Zy)Ú
IRCFactorya  
    IRC server that creates instances of the L{IRCUser} protocol.

    @ivar _serverInfo: A dictionary mapping:
        "serviceName" to the name of the server,
        "serviceVersion" to the copyright version,
        "creationDate" to the time that the server was started.
    c                 óŠ   — || _         || _        | j                   j                  t        j                  t        «       dœ| _        y )N)ÚserviceNameÚserviceVersionÚcreationDate)rc   r	   r   r   Úversionr   r¸   )r   rc   r	   s      r   r    zIRCFactory.__init__s  s3   € ØˆŒ
ØˆŒàŸ:™:Ÿ?™?Ü'×/Ñ/Ü!›Gñ
ˆÕr!   N)rY   rZ   r[   ri  rz   r   r    r\   r!   r   rq  rq  g  s   „ ñð €Hó
r!   rq  c                   ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚPBMindc                  ó   — y r#   r\   rJ   s    r   r    zPBMind.__init__~  ó   € Ør!   c                 ó°   — t        j                  t        «      }t        |t        «      r|j                  d«      }||j                  j                  | «      fS ©Nr{   )r   Úqualrx  rŒ   r<  r‰   ÚinvokerÚregisterReference©r   Újellierr}  s      r   ÚjellyForzPBMind.jellyFor�  sB   € Ü�|‰|œFÓ#ˆÜ�dœCÔ Ø—;‘;˜wÓ'ˆDØ�W—_‘_×6Ñ6°tÓ<Ð<Ð<r!   c                  ó   — y r#   r\   )r   r0   rj   s      r   Úremote_userJoinedzPBMind.remote_userJoined‡  rz  r!   c                  ó   — y r#   r\   )r   r0   rj   rF   s       r   Úremote_userLeftzPBMind.remote_userLeftŠ  rz  r!   c                  ó   — y r#   r\   ©r   rN   rO   rP   s       r   Úremote_receivezPBMind.remote_receive�  rz  r!   c                  ó   — y r#   r\   ©r   rj   r   s      r   Úremote_groupMetaUpdatezPBMind.remote_groupMetaUpdate�  rz  r!   N)	rY   rZ   r[   r    r‚  r„  r†  r‰  rŒ  r\   r!   r   rx  rx  }  s    „ òò=òòòór!   rx  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zy)ÚPBMindReferencer   c                 ó,  — t         j                  j                  |«      r"t        | j                  | j
                  |«      }n!t        | j                  | j
                  |«      }| j                  dt        | j                  | j
                  |«      ||«      S )NrM   )r   r¢   r5   ÚPBGrouprc   rƒ   ÚPBUserÚ
callRemote)r   rN   rO   rP   Úrecs        r   rM   zPBMindReference.receive˜  sk   € Ü�=‰=×#Ñ# IÔ.Ü˜$Ÿ*™* d§k¡k°9Ó=‰Cä˜Ÿ™ T§[¡[°)Ó<ˆCØ�‰Ø”v˜dŸj™j¨$¯+©+°vÓ>ÀÀWó
ð 	
r!   c                 óf   — | j                  dt        | j                  | j                  |«      |«      S )NrS   )r’  r�  rc   rƒ   r‹  s      r   rS   zPBMindReference.groupMetaUpdate¡  s+   € Ø�‰Øœw t§z¡z°4·;±;ÀÓFÈó
ð 	
r!   c           	      ó¤   — | j                  dt        | j                  | j                  |«      t	        | j                  | j                  |«      «      S )Nr9   ©r’  r�  rc   rƒ   r‘  r›   s      r   r9   zPBMindReference.userJoined¦  s>   € Ø�‰ØÜ�D—J‘J §¡¨UÓ3Ü�4—:‘:˜tŸ{™{¨DÓ1ó
ð 	
r!   Nc           	      ó¦   — | j                  dt        | j                  | j                  |«      t	        | j                  | j                  |«      |«      S )NrD   r–  rŸ   s       r   rD   zPBMindReference.userLeft­  sA   € Ø�‰ØÜ�D—J‘J §¡¨UÓ3Ü�4—:‘:˜tŸ{™{¨DÓ1Øó	
ð 	
r!   r#   )rY   rZ   r[   r   rM   rS   r9   rD   r\   r!   r   rŽ  rŽ  ”  s   „ à€Dò
ò
ò

ô
r!   rŽ  c                   ó,   — e Zd Zd„ Zd„ Zd„ Zdd„Zd„ Zy)r�  c                 ó.   — || _         || _        || _        y r#   )rc   rƒ   rj   )r   rc   rƒ   rj   s       r   r    zPBGroup.__init__º  s   € ØˆŒ
ØˆŒØˆ�
r!   c                 ó–   — t        | j                  j                  | j                  j                  | j                  j                  f«      S r#   )Úhashrc   r   rƒ   rj   rJ   s    r   ÚprocessUniqueIDzPBGroup.processUniqueID¿  s.   € Ü�T—Z‘Z—_‘_ d§k¡k×&6Ñ&6¸¿
¹
¿¹ÐHÓIÐIr!   c                 ó,  — t        j                  | j                  «      }t        |t        «      r|j                  d«      }| j                  j                  }t        |t        «      r|j                  d«      }|||j                  j                  | «      fS r|  )
r   r}  Ú	__class__rŒ   r<  r‰   rj   r   r~  r  )r   r�  r}  rj   s       r   r‚  zPBGroup.jellyForÂ  sm   € Ü�|‰|˜DŸN™NÓ+ˆÜ�dœCÔ Ø—;‘;˜wÓ'ˆDØ—
‘
—‘ˆÜ�eœSÔ!Ø—L‘L Ó)ˆEØ�U˜GŸO™O×=Ñ=¸dÓCÐCÐCr!   Nc                 óN   — | j                   j                  | j                  |«      S r#   )rƒ   rq   rj   r„   s     r   Úremote_leavezPBGroup.remote_leaveË  s   € Ø�{‰{× Ñ  §¡¨VÓ4Ð4r!   c                 óN   — | j                   j                  | j                  |«      S r#   )rƒ   rs   rj   ©r   rP   s     r   Úremote_sendzPBGroup.remote_sendÎ  s   € Ø�{‰{×Ñ §
¡
¨GÓ4Ð4r!   r#   )rY   rZ   r[   r    rœ  r‚  r   r£  r\   r!   r   r�  r�  ¹  s   „ òò
JòDó5ó5r!   r�  c                   óF   — e Zd Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zdd„Z	d	„ Z
d
„ Zy)ÚPBGroupReferencec                 óð   — |\  }}}|| _         t        t        k7  r:t        | j                   t        «      r | j                   j	                  d«      | _         t
        j                  j                  | |||g«      S r|  )r   r�   r<  rŒ   rŽ   r   ÚRemoteReferenceÚ
unjellyFor)r   Ú	unjellierÚunjellyListÚclsNamer   Úrefs         r   r¨  zPBGroupReference.unjellyForÔ  s^   € Ø(Ñˆ��sØˆŒ	Ü”CŠ<œJ t§y¡y´%Ô8ØŸ	™	×(Ñ(¨Ó1ˆDŒIÜ×!Ñ!×,Ñ,¨T°9¸wÈ¸nÓMÐMr!   Nc                 ó&   — | j                  d|«      S )Nrq   ©r’  r„   s     r   rq   zPBGroupReference.leaveÛ  s   € Ø�‰˜w¨Ó/Ð/r!   c                 ó&   — | j                  d|«      S )Nrs   r®  r¢  s     r   rs   zPBGroupReference.sendÞ  s   € Ø�‰˜v wÓ/Ð/r!   c                  ó   — y r#   r\   rV  s     r   rA   zPBGroupReference.addá  ó   € àr!   c                  ó   — y r#   r\   rJ   s    r   rX   zPBGroupReference.iteruserså  r±  r!   c                  ó   — y r#   r\   rˆ  s       r   rM   zPBGroupReference.receiveé  r±  r!   c                  ó   — y r#   r\   )r   r0   rF   s      r   r+   zPBGroupReference.removeí  r±  r!   c                  ó   — y r#   r\   )r   r   s     r   rU   zPBGroupReference.setMetadatañ  r±  r!   c                  ó   — y r#   r\   rJ   s    r   rK   zPBGroupReference.sizeõ  r±  r!   r#   )rY   rZ   r[   r¨  rq   rs   rA   rX   rM   r+   rU   rK   r\   r!   r   r¥  r¥  Ò  s0   „ òNó0ò0òòòóòór!   r¥  c                   ó   — e Zd Zd„ Zd„ Zy)r‘  c                 ó.   — || _         || _        || _        y r#   )rc   rƒ   r0   )r   rc   rƒ   r0   s       r   r    zPBUser.__init__þ  s   € ØˆŒ
ØˆŒØˆ�	r!   c                 ó–   — t        | j                  j                  | j                  j                  | j                  j                  f«      S r#   )r›  rc   r   rƒ   r0   rJ   s    r   rœ  zPBUser.processUniqueID  s.   € Ü�T—Z‘Z—_‘_ d§k¡k×&6Ñ&6¸¿	¹	¿¹ÐGÓHÐHr!   N)rY   rZ   r[   r    rœ  r\   r!   r   r‘  r‘  ý  s   „ òó
Ir!   r‘  c                   ól   — e Zd Zd„ Zd„ Zd„ Zed„ «       Zej                  d„ «       Zd„ Z	d„ Z
d„ Zdd
„Zy	)Ú
ChatAvatarc                 ó   — || _         y r#   )rƒ   )r   rƒ   s     r   r    zChatAvatar.__init__	  s	   € Øˆ�r!   c                 ó¼   — t        j                  | j                  «      }t        |t        «      r|j                  d«      }||j                  j                  | «      fS r|  )r   r}  rž  rŒ   r<  r‰   r~  r  r€  s      r   r‚  zChatAvatar.jellyFor  sF   € Ü�|‰|˜DŸN™NÓ+ˆÜ�dœCÔ Ø—;‘;˜wÓ'ˆDØ�W—_‘_×6Ñ6°tÓ<Ð<Ð<r!   c                 ó~   ‡ — ˆ fd„}‰ j                   j                  j                  |«      }|j                  |«       |S )Nc                 ón   •‡ — ˆ ˆfd„}‰j                   j                  ‰ «      }|j                  |«       |S )Nc                 óZ   •— t        ‰j                  j                  ‰j                  ‰«      S r#   )r�  rƒ   rc   )Úignoredrj   r   s    €€r   rk   z7ChatAvatar.remote_join.<locals>.cbGroup.<locals>.cbJoin  s    ø€ Ü˜tŸ{™{×0Ñ0°$·+±+¸uÓEÐEr!   r  )rj   rk   r@   r   s   `  €r   r  z'ChatAvatar.remote_join.<locals>.cbGroup  s0   ù€ õFð —‘× Ñ  Ó'ˆAØ�M‰M˜&Ô!ØˆHr!   )rƒ   rc   r  r=   )r   r  r  r@   s   `   r   Úremote_joinzChatAvatar.remote_join  s5   ø€ ô	ð �K‰K×Ñ×&Ñ& yÓ1ˆØ	�‰�gÔØˆr!   c                  ó   — y r#   r\   rJ   s    r   r   zChatAvatar.name  ó   € ð 	r!   c                  ó   — y r#   r\   )r   r*   s     r   r   zChatAvatar.name$  rÄ  r!   c                  ó   — y r#   r\   r‹  s      r   rS   zChatAvatar.groupMetaUpdate)  r±  r!   c                  ó   — y r#   r\   rˆ  s       r   rM   zChatAvatar.receive-  r±  r!   c                  ó   — y r#   r\   r›   s      r   r9   zChatAvatar.userJoined1  r±  r!   Nc                  ó   — y r#   r\   rŸ   s       r   rD   zChatAvatar.userLeft5  r±  r!   r#   )rY   rZ   r[   r    r‚  rÂ  Úpropertyr   ÚsetterrS   rM   r9   rD   r\   r!   r   r»  r»    sQ   „ òò=òð ñó ðð 
‡[�[ñó ðòòòôr!   r»  c                   ó   — e Zd Zd„ Zd„ Zy)ÚAvatarReferencec                 ó&   — | j                  d|«      S )Nrm   r®  )r   r  s     r   rm   zAvatarReference.join>  s   € Ø�‰˜v yÓ1Ð1r!   c                 ó´   ‡— t        j                  «       Š| j                  j                  ˆfd„«       | j                  j                  j                  «        ‰S )Nc                  ó&   •— ‰ j                  d «      S r#   )Úcallback)r@   s   €r   rÿ   z&AvatarReference.quit.<locals>.<lambda>C  s   ø€ ¨q¯z©z¸$Ó/?€ r!   )r
   ÚDeferredÚbrokerÚnotifyOnDisconnectr´   rµ   )r   r@   s    @r   ÚquitzAvatarReference.quitA  s=   ø€ Ü�N‰NÓˆØ�‰×&Ñ&Ó'?Ô@Ø�‰×Ñ×,Ñ,Ô.Øˆr!   N)rY   rZ   r[   rm   rÕ  r\   r!   r   rÍ  rÍ  =  s   „ ò2ór!   rÍ  c                   ól   — e 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y)Ú
WordsRealmr{   c                 ó   — || _         y r#   )r   r   s     r   r    zWordsRealm.__init__O  s	   € Øˆ�	r!   c                 ó   — t        |«      S r#   )r^   r   s     r   ÚuserFactoryzWordsRealm.userFactoryR  s   € Ü�D‹zÐr!   c                 ó   — t        |«      S r#   )r   r   s     r   ÚgroupFactoryzWordsRealm.groupFactoryU  s   € Ü�T‹{Ðr!   c                 ó   ‡‡— ˆˆfd„}|S )Nc                  óH   •—  t        ‰dd„ «      «        d x‰ _        ‰ _        y )Nrx   c                   ó   — y r#   r\   r\   r!   r   rÿ   z:WordsRealm.logoutFactory.<locals>.logout.<locals>.<lambda>[  s   � r!   )Úgetattrrc   rd   )rƒ   Úfacets   €€r   rx   z(WordsRealm.logoutFactory.<locals>.logoutY  s"   ø€ à2ŒG�E˜8¡\Ó2Ô4Ø)-Ð-ˆFŒL˜6�;r!   r\   )r   rƒ   rá  rx   s    `` r   ÚlogoutFactoryzWordsRealm.logoutFactoryX  s   ù€ õ	.ð
 ˆr!   c                 ó°   ‡ ‡‡‡— t        ‰t        «      r‰j                  ‰ j                  «      Šˆˆˆˆ fd„}‰ j	                  ‰«      j                  |«      S )Nc                 óü   •— | j                   �t        j                  «       ‚‰D ]K  } || d «      }|€Œ| j                  ‰‰«       ‰‰_        ‰‰_         | ‰_        ||‰j                  | |«      fc S  t        ‰‰«      ‚r#   )rc   r   rÑ   rf   r   rƒ   râ  ÚNotImplementedError)rƒ   rÎ   rá  ÚavatarIdÚ
interfacesrd   r   s      €€€€r   Ú	gotAvatarz+WordsRealm.requestAvatar.<locals>.gotAvatard  s‹   ø€ Ø�|‰|Ð'Ü×,Ñ,Ó.Ð.Ø#ò K�Ù˜f dÓ+�ØÑ$Ø—O‘O D¨$Ô/Ø (�D”IØ!%�D”JØ"(�D”KØ  %¨×);Ñ);¸FÀEÓ)JÐJÒJðKô & d¨JÓ7Ð7r!   )rŒ   r�   rŽ   Ú	_encodingÚgetUserr=   )r   ræ  rd   rç  rè  s   ```` r   ÚrequestAvatarzWordsRealm.requestAvatar`  s@   û€ Ü�h¤Ô&Ø—‘ t§~¡~Ó6ˆH÷	8ð �|‰|˜HÓ%×1Ñ1°)Ó<Ð<r!   c                  ó   — y r#   r\   rJ   s    r   ru   zWordsRealm.itergroupss  r±  r!   FTc                 ó   — t         ‚r#   ©rå  r   s     r   rø   zWordsRealm.lookupUser{  ó   € Ü!Ð!r!   c                 ó   — t         ‚r#   rî  ©r   rj   s     r   rö   zWordsRealm.lookupGroup~  rï  r!   c                 ó   — t         ‚)aÓ  
        Add the given user to this service.

        This is an internal method intended to be overridden by
        L{WordsRealm} subclasses, not called by external code.

        @type user: L{IUser}

        @rtype: L{twisted.internet.defer.Deferred}
        @return: A Deferred which fires with L{None} when the user is
        added, or which fails with
        L{twisted.words.ewords.DuplicateUser} if a user with the
        same name exists already.
        rî  rV  s     r   ÚaddUserzWordsRealm.addUser�  s
   € ô "Ð!r!   c                 ó   — t         ‚)aY  
        Add the given group to this service.

        @type group: L{IGroup}

        @rtype: L{twisted.internet.defer.Deferred}
        @return: A Deferred which fires with L{None} when the group is
        added, or which fails with
        L{twisted.words.ewords.DuplicateGroup} if a group with the
        same name exists already.
        rî  rñ  s     r   ÚaddGroupzWordsRealm.addGroup’  s
   € ô "Ð!r!   c                 óŒ   ‡ ‡— ‰ j                   r&ˆˆ fd„}‰ j                  ‰«      j                  |«      S ‰ j                  ‰«      S )Nc                 ód   •— | j                  t        j                  «       ‰j                  ‰«      S r#   )rê   r   ÚDuplicateGrouprö   ©r&   r   r   s    €€r   rî   z$WordsRealm.getGroup.<locals>.ebGroup£  s&   ø€ Ø—‘œ×.Ñ.Ô/Ø×'Ñ'¨Ó-Ð-r!   )ÚcreateGroupOnRequestÚcreateGroupr:   rö   )r   r   rî   s   `` r   r  zWordsRealm.getGroup   s@   ù€ Ø×$Ò$õ.ð ×#Ñ# DÓ)×4Ñ4°WÓ=Ð=Ø×Ñ Ó%Ð%r!   c                 óŒ   ‡ ‡— ‰ j                   r&ˆˆ fd„}‰ j                  ‰«      j                  |«      S ‰ j                  ‰«      S )Nc                 ód   •— | j                  t        j                  «       ‰j                  ‰«      S r#   )rê   r   ÚDuplicateUserrø   rù  s    €€r   rô   z"WordsRealm.getUser.<locals>.ebUser­  s$   ø€ Ø—‘œ×-Ñ-Ô.Ø—‘ tÓ,Ð,r!   )ÚcreateUserOnRequestÚ
createUserr:   rø   )r   r   rô   s   `` r   rê  zWordsRealm.getUserª  s<   ù€ Ø×#Ò#õ-ð —?‘? 4Ó(×3Ñ3°FÓ;Ð;Ø�‰˜tÓ$Ð$r!   c                 ó¼   ‡ ‡— ˆfd„}ˆˆ fd„}‰j                  «       Š‰ j                  ‰«      }|j                  ||«       |j                  ‰ j                  «       |S )Nc                 óT   •— t        j                  t        j                  ‰«      «      S r#   )r   r$   r   rþ  )r0   r   s    €r   ÚcbLookupz'WordsRealm.createUser.<locals>.cbLookupµ  s   ø€ Ü—?‘?¤6×#7Ñ#7¸Ó#=Ó>Ð>r!   c                 ód   •— | j                  t        j                  «       ‰j                  ‰«      S r#   )rê   r   r]  rÚ  rù  s    €€r   ÚebLookupz'WordsRealm.createUser.<locals>.ebLookup¸  s&   ø€ Ø�H‰H”V×&Ñ&Ô'Ø×#Ñ# DÓ)Ð)r!   )rÂ   rø   rÉ   r=   ró  ©r   r   r  r  r@   s   ``   r   r   zWordsRealm.createUser´  sK   ù€ ô	?õ	*ð �z‰z‹|ˆØ�O‰O˜DÓ!ˆØ	�‰�x Ô*Ø	�‰�d—l‘lÔ#Øˆr!   c                 ó¼   ‡ ‡— ˆfd„}ˆˆ fd„}‰j                  «       Š‰ j                  ‰«      }|j                  ||«       |j                  ‰ j                  «       |S )Nc                 óT   •— t        j                  t        j                  ‰«      «      S r#   )r   r$   r   rø  )rj   r   s    €r   r  z(WordsRealm.createGroup.<locals>.cbLookupÃ  s   ø€ Ü—?‘?¤6×#8Ñ#8¸Ó#>Ó?Ð?r!   c                 ód   •— | j                  t        j                  «       ‰j                  ‰«      S r#   )rê   r   rë   rÜ  rù  s    €€r   r  z(WordsRealm.createGroup.<locals>.ebLookupÆ  s&   ø€ Ø�H‰H”V×'Ñ'Ô(Ø×$Ñ$ TÓ*Ð*r!   )rÂ   rö   rÉ   r=   rõ  r  s   ``   r   rû  zWordsRealm.createGroupÂ  sN   ù€ ô	@õ	+ð �z‰z‹|ˆØ×Ñ˜TÓ"ˆØ	�‰�x Ô*Ø	�‰�d—m‘mÔ$Øˆr!   N)rY   rZ   r[   ré  r    rÚ  rÜ  râ  rë  ru   rú  rÿ  rø   rö   ró  rõ  r  rê  r   rû  r\   r!   r   r×  r×  K  s[   „ à€Iòòòòò=ò&ð
 !ÐØÐò"ò"ò"ò""ò&ò%òór!   r×  c                   ó<   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )ÚInMemoryWordsRealmc                 ó@   •— t        ‰| �  |i |¤Ž i | _        i | _        y r#   )Úsuperr    r   r`   )r   Úar“   rž  s      €r   r    zInMemoryWordsRealm.__init__Ò  s#   ø€ Ü‰Ñ˜!Ð"˜rÒ"ØˆŒ
Øˆ�r!   c                 ó\   — t        j                  | j                  j                  «       «      S r#   )r
   r>   r`   r7   rJ   s    r   ru   zInMemoryWordsRealm.itergroups×  s   € Ü�}‰}˜TŸ[™[×/Ñ/Ó1Ó2Ð2r!   c                 ó  — |j                   | j                  v r:t        j                  t	        j
                  t        j                  «       «      «      S || j                  |j                   <   t        j                  |«      S r#   )	r   r   r
   Úfailr   r$   r   rþ  r>   rV  s     r   ró  zInMemoryWordsRealm.addUserÚ  sT   € Ø�9‰9˜Ÿ
™
Ñ"Ü—:‘:œgŸo™o¬f×.BÑ.BÓ.DÓEÓFÐFØ $ˆ�
‰
�4—9‘9ÑÜ�}‰}˜TÓ"Ð"r!   c                 ó  — |j                   | j                  v r:t        j                  t	        j
                  t        j                  «       «      «      S || j                  |j                   <   t        j                  |«      S r#   )	r   r`   r
   r  r   r$   r   rø  r>   rñ  s     r   rõ  zInMemoryWordsRealm.addGroupà  sT   € Ø�:‰:˜Ÿ™Ñ$Ü—:‘:œgŸo™o¬f×.CÑ.CÓ.EÓFÓGÐGØ"'ˆ�‰�E—J‘JÑÜ�}‰}˜UÓ#Ð#r!   c                 ó   — |j                  «       }	 | j                  |   }t        j                  |«      S # t        $ r> t        j
                  t        j                  t        j                  |«      «      «      cY S w xY wr#   )
rÂ   r   r
   r>   rE   r  r   r$   r   r]  )r   r   r0   s      r   rø   zInMemoryWordsRealm.lookupUseræ  sg   € Ø�z‰z‹|ˆð	'Ø—:‘:˜dÑ#ˆDô —=‘= Ó&Ð&øô ò 	HÜ—:‘:œgŸo™o¬f×.?Ñ.?ÀÓ.EÓFÓGÒGð	Húó   ’6 ¶AA=Á<A=c                 ó   — |j                  «       }	 | j                  |   }t        j                  |«      S # t        $ r> t        j
                  t        j                  t        j                  |«      «      «      cY S w xY wr#   )
rÂ   r`   r
   r>   rE   r  r   r$   r   rë   )r   r   rj   s      r   rö   zInMemoryWordsRealm.lookupGroupï  sg   € Ø�z‰z‹|ˆð	(Ø—K‘K Ñ%ˆEô —=‘= Ó'Ð'øô ò 	IÜ—:‘:œgŸo™o¬f×.@Ñ.@ÀÓ.FÓGÓHÒHð	Iúr  )
rY   rZ   r[   r    ru   ró  rõ  rø   rö   Ú__classcell__)rž  s   @r   r  r  Ñ  s!   ø„ ôò
3ò#ò$ò'ö(r!   r  )r   r^   r×  r  N)6ri  r   r   Úzope.interfacer   Útwistedr   Útwisted.credr   r   rÒ   r	   Útwisted.internetr
   r   Útwisted.pythonr   r   r   Útwisted.python.componentsr   Útwisted.spreadr   Útwisted.wordsr   r   Útwisted.words.protocolsr   r¢   r   rÈ   r^   r²   r4   r�   rz   ÚServerFactoryrq  ÚReferenceablerx  r§  rŽ  ÚsetUnjellyableForClassr�  r¥  r‘  r»  ÚIPerspectiverÍ  ÚIRealmÚIChatServicer×  r  Ú__all__r\   r!   r   ú<module>r'     s'  ðñ
÷2 å &å ß <Ñ <ß ,ß 0Ñ 0Ý 5Ý ß (Ý 'ñ ˆV�]‰]Ó÷J)ð J)ó ðJ)ñZ ˆV�\‰\Ó÷%ð %ó ð%ðP (€ñ ˆV×ÑÓ ô}
Hˆc�g‰gó }
Hó !ð}
Hô@
�×'Ñ'ô 
ô,ˆR×Ñô ñ. ˆV×ÑÓ ô
�b×(Ñ(ó 
ó !ð
ðB €× Ñ ˜& /Ô 2ô5ˆb×Ñô 5ñ2 ˆV�]‰]Óô$�r×)Ñ)ó $ó ð$ðN €× Ñ ˜'Ð#3Ô 4ôIˆR×Ñô Iñ ˆV×ÑÓ ô/�×!Ñ!ó /ó !ð/ñd �
˜FŸL™L¨"¯/©/Ô :ô�b×(Ñ(ô ð €× Ñ ˜* oÔ 6ñ ˆV�]‰]˜F×/Ñ/Ó0÷Bð Bó 1ðBôJ%(˜ô %(òP�r!   