a ÕDOgLšã@s dZddlZddlZddlZddlZddlZddlZddlZz ddlZWne y^dZYn0ddl m Z ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd lmZd d„ZGdd„de jƒZGdd„dejejƒZGdd„deƒZGdd„deƒZdS))ÚBaseSelectorEventLoopéNé)Ú base_events)Ú constants)Úevents)Úfutures)Ú protocols)Ússlproto)Ú transports)Útrsock)ÚloggercCs6z| |¡}Wnty"YdS0t|j|@ƒSdS©NF)Úget_keyÚKeyErrorÚboolr)ÚselectorÚfdZeventÚkey©rúd?„Z!d@dA„Z"dBdC„Z#dWdDdE„Z$dFdG„Z%dHdI„Z&dJdK„Z'dLdM„Z(dNdO„Z)dPdQ„Z*‡Z+S)XrNcsFtƒ ¡|durt ¡}t d|jj¡||_|  ¡t   ¡|_ dS)NzUsing selector: %s) ÚsuperÚ__init__Ú selectorsZDefaultSelectorr ÚdebugÚ __class__Ú__name__Ú _selectorÚ_make_self_pipeÚweakrefZWeakValueDictionaryÚ _transports)Úselfr©rrrr1s zBaseSelectorEventLoop.__init__©ÚextraÚservercCst||||||ƒS©N)Ú_SelectorSocketTransport)r!ÚsockÚprotocolÚwaiterr$r%rrrÚ_make_socket_transport;s ÿz,BaseSelectorEventLoop._make_socket_transportF)Ú server_sideÚserver_hostnamer$r%Ússl_handshake_timeoutc Cs0tj||||||| d} t||| ||d| jS)N)r.r#)r Z SSLProtocolr'Z_app_transport) r!Zrawsockr)Ú sslcontextr*r,r-r$r%r.Z ssl_protocolrrrÚ_make_ssl_transport@sýÿz)BaseSelectorEventLoop._make_ssl_transportcCst||||||ƒSr&)Ú_SelectorDatagramTransport)r!r(r)Úaddressr*r$rrrÚ_make_datagram_transportMsÿz.BaseSelectorEventLoop._make_datagram_transportcsL| ¡rtdƒ‚| ¡rdS| ¡tƒ ¡|jdurH|j ¡d|_dS)Nz!Cannot close a running event loop)Z is_runningÚ RuntimeErrorÚ is_closedÚ_close_self_piperÚcloser©r!r"rrr7Rs   zBaseSelectorEventLoop.closecCsB| |j ¡¡|j ¡d|_|j ¡d|_|jd8_dS)Nr)Ú_remove_readerÚ_ssockÚfilenor7Ú_csockÚ _internal_fdsr8rrrr6]s   z&BaseSelectorEventLoop._close_self_pipecCsNt ¡\|_|_|j d¡|j d¡|jd7_| |j ¡|j¡dS)NFr) ÚsocketZ socketpairr:r<Ú setblockingr=Ú _add_readerr;Ú_read_from_selfr8rrrres   z%BaseSelectorEventLoop._make_self_pipecCsdSr&r©r!ÚdatarrrÚ_process_self_datamsz(BaseSelectorEventLoop._process_self_datacCsTz"|j d¡}|sWqP| |¡Wqty8YqYqtyLYqPYq0qdS)Ni)r:ÚrecvrDÚInterruptedErrorÚBlockingIOErrorrBrrrrAps   z%BaseSelectorEventLoop._read_from_selfcCsL|j}|durdSz| d¡Wn&tyF|jrBtjdddYn0dS)Nóz3Fail to write a null byte into the self-pipe socketT©Úexc_info)r<ÚsendÚOSErrorÚ_debugr r)r!ZcsockrrrÚ_write_to_self|s þz$BaseSelectorEventLoop._write_to_selfédc Cs"| | ¡|j||||||¡dSr&)r@r;Ú_accept_connection)r!Úprotocol_factoryr(r/r%Úbacklogr.rrrÚ_start_servingŽs þz$BaseSelectorEventLoop._start_servingc Cst|ƒD]ú}z0| ¡\}} |jr0t d|| |¡| d¡WnžtttfyXYdSt yÚ} zl| j t j t j t j t jfvrÄ| d| t |¡dœ¡| | ¡¡| tj|j||||||¡n‚WYd} ~ qd} ~ 00d| i} | ||| |||¡} | | ¡qdS)Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ exceptionr>Úpeername)ÚrangeÚacceptrMr rr?rGrFÚConnectionAbortedErrorrLÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr ÚTransportSocketr9r;Z call_laterrZACCEPT_RETRY_DELAYrSÚ_accept_connection2Z create_task) r!rQr(r/r%rRr.Ú_ÚconnÚaddrÚexcr$rXrrrrP•s@  ÿ ÿýý þz(BaseSelectorEventLoop._accept_connectionc Ãsôd}d}zr|ƒ}| ¡} |r8|j|||| d|||d}n|j||| ||d}z| IdHWntyv| ¡‚Yn0Wntttfy’‚Yn^tyî} zF|jrÚd| dœ} |durÀ|| d<|durÐ|| d<| | ¡WYd} ~ n d} ~ 00dS)NT)r*r,r$r%r.)r*r$r%z3Error on transport creation for incoming connection)rTrUr)Ú transport) Ú create_futurer0r+Ú BaseExceptionr7Ú SystemExitÚKeyboardInterruptrMr[) r!rQr_r$r/r%r.r)rbr*raÚcontextrrrr]Ás@ýþ  ýz)BaseSelectorEventLoop._accept_connection2c CsŠ|}t|tƒsHzt| ¡ƒ}Wn(tttfyFtd|›ƒd‚Yn0z|j|}WntyhYn0| ¡s†t d|›d|›ƒ‚dS)NzInvalid file object: zFile descriptor z is used by transport ) Ú isinstanceÚintr;ÚAttributeErrorÚ TypeErrorÚ ValueErrorr rÚ is_closingr4)r!rr;rbrrrÚ_ensure_fd_no_transportês   ÿÿz-BaseSelectorEventLoop._ensure_fd_no_transportc Gs’| ¡t |||d¡}z|j |¡}Wn(tyP|j |tj|df¡Yn>0|j|j }\}}|j  ||tjB||f¡|durŽ|  ¡|Sr&) Ú _check_closedrÚHandlerrrÚregisterrÚ EVENT_READrCÚmodifyÚcancel© r!rÚcallbackÚargsÚhandlerÚmaskÚreaderÚwriterrrrr@üs  ÿ ÿz!BaseSelectorEventLoop._add_readercCs’| ¡r dSz|j |¡}Wnty0YdS0|j|j}\}}|tjM}|sb|j |¡n|j  ||d|f¡|durŠ|  ¡dSdSdS©NFT) r5rrrrrCrrrÚ unregisterrsrt©r!rrryrzr{rrrr9 s  z$BaseSelectorEventLoop._remove_readerc Gs’| ¡t |||d¡}z|j |¡}Wn(tyP|j |tjd|f¡Yn>0|j|j }\}}|j  ||tjB||f¡|durŽ|  ¡|Sr&) rorrprrrrqrÚ EVENT_WRITErCrsrtrurrrÚ _add_writer!s  ÿ ÿz!BaseSelectorEventLoop._add_writercCs’| ¡r dSz|j |¡}Wnty0YdS0|j|j}\}}|tjM}|sb|j |¡n|j  |||df¡|durŠ|  ¡dSdSdSr|) r5rrrrrCrrr}rsrtr~rrrÚ_remove_writer1s  z$BaseSelectorEventLoop._remove_writercGs"| |¡|j||g|¢RŽdSr&)rnr@©r!rrvrwrrrÚ add_readerHs z BaseSelectorEventLoop.add_readercCs| |¡| |¡Sr&)rnr9©r!rrrrÚ remove_readerMs z#BaseSelectorEventLoop.remove_readercGs"| |¡|j||g|¢RŽdSr&)rnr€r‚rrrÚ add_writerRs z BaseSelectorEventLoop.add_writercCs| |¡| |¡Sr&)rnrr„rrrÚ remove_writerWs z#BaseSelectorEventLoop.remove_writerc Ãs˜t |¡|jr$| ¡dkr$tdƒ‚z | |¡WSttfyFYn0| ¡}|  ¡}|  |¡|  ||j |||¡}|  tj|j||d¡|IdHS©Nrúthe socket must be non-blocking©rx)rÚ_check_ssl_socketrMÚ gettimeoutrlrErGrFrcr;rnr@Ú _sock_recvÚadd_done_callbackÚ functoolsÚpartialÚ_sock_read_done)r!r(ÚnÚfutrrxrrrÚ sock_recv\s   ÿzBaseSelectorEventLoop.sock_recvcCs|dus| ¡s| |¡dSr&)Ú cancelledr…©r!rr“rxrrrr‘rsz%BaseSelectorEventLoop._sock_read_donec Cs„| ¡r dSz| |¡}WnZttfy2YdSttfyH‚Yn8tyt}z| |¡WYd}~nd}~00| |¡dSr&) ÚdonerErGrFrerfrdÚ set_exceptionÚ set_result)r!r“r(r’rCrarrrrvs z BaseSelectorEventLoop._sock_recvc Ãs˜t |¡|jr$| ¡dkr$tdƒ‚z | |¡WSttfyFYn0| ¡}|  ¡}|  |¡|  ||j |||¡}|  tj|j||d¡|IdHSrˆ)rr‹rMrŒrlÚ recv_intorGrFrcr;rnr@Ú_sock_recv_intorŽrrr‘)r!r(Úbufr“rrxrrrÚsock_recv_into†s   ÿz$BaseSelectorEventLoop.sock_recv_intoc Cs„| ¡r dSz| |¡}WnZttfy2YdSttfyH‚Yn8tyt}z| |¡WYd}~nd}~00| |¡dSr&) r—ršrGrFrerfrdr˜r™)r!r“r(rœÚnbytesrarrrr››s z%BaseSelectorEventLoop._sock_recv_intoc Ãs¶t |¡|jr$| ¡dkr$tdƒ‚z| |¡}WnttfyLd}Yn0|t|ƒkr^dS|  ¡}|  ¡}|  |¡|  ||j ||t|ƒ|g¡}| tj|j||d¡|IdHSrˆ)rr‹rMrŒrlrKrGrFÚlenrcr;rnr€Ú _sock_sendallÚ memoryviewrŽrrÚ_sock_write_done)r!r(rCr’r“rrxrrrÚ sock_sendall¬s&     ÿÿz"BaseSelectorEventLoop.sock_sendallc Cs´| ¡r dS|d}z| ||d…¡}Wn\ttfyBYdSttfyX‚Yn0ty†}z| |¡WYd}~dSd}~00||7}|t|ƒkr¨|  d¡n||d<dS)Nr) r—rKrGrFrerfrdr˜rŸr™)r!r“r(ZviewÚposÚstartr’rarrrr Ës    z#BaseSelectorEventLoop._sock_sendallcÃs”t |¡|jr$| ¡dkr$tdƒ‚|jtjksBtjrt|jtj krt|j ||j|j |j |dIdH}|d\}}}}}|  ¡}| |||¡|IdHS)Nrr‰)ÚfamilyÚtypeÚprotoÚloop)rr‹rMrŒrlr¦r>ZAF_INETZ _HAS_IPv6ZAF_INET6Z_ensure_resolvedr§r¨rcÚ _sock_connect)r!r(r2Zresolvedr^r“rrrÚ sock_connectás   ÿ ÿþ z"BaseSelectorEventLoop.sock_connectc Cs´| ¡}z| |¡WnŽttfyb| |¡| ||j|||¡}| tj |j ||d¡YnNt t fyx‚Yn8t y¤}z| |¡WYd}~nd}~00| d¡dS)NrŠ)r;ZconnectrGrFrnr€Ú_sock_connect_cbrŽrrr¢rerfrdr˜r™)r!r“r(r2rrxrarrrrªös   ÿÿ z#BaseSelectorEventLoop._sock_connectcCs|dus| ¡s| |¡dSr&)r•r‡r–rrrr¢ sz&BaseSelectorEventLoop._sock_write_donec Cs | ¡r dSz,| tjtj¡}|dkr6t|d|›ƒ‚WnXttfyNYnNtt fyd‚Yn8t y}z|  |¡WYd}~nd}~00|  d¡dS)NrzConnect call failed ) r—Z getsockoptr>Z SOL_SOCKETZSO_ERRORrLrGrFrerfrdr˜r™)r!r“r(r2Úerrrarrrr¬s z&BaseSelectorEventLoop._sock_connect_cbcÃsBt |¡|jr$| ¡dkr$tdƒ‚| ¡}| ||¡|IdHS)Nrr‰)rr‹rMrŒrlrcÚ _sock_accept)r!r(r“rrrÚ sock_accept"s   z!BaseSelectorEventLoop.sock_acceptc CsÂ| ¡}z| ¡\}}| d¡WnŒttfyl| |¡| ||j||¡}| t j |j ||d¡YnRt t fy‚‚Yn<ty®}z| |¡WYd}~nd}~00| ||f¡dS)NFrŠ)r;rXr?rGrFrnr@r®rŽrrr‘rerfrdr˜r™)r!r“r(rr_r2rxrarrrr®1s  ÿ z"BaseSelectorEventLoop._sock_acceptc Ãsœ|j|j=| ¡}| ¡| ¡IdHzL|j|j|||ddIdHW| ¡|rZ| ¡||j|j<S||j|j<n"| ¡|rŠ| ¡||j|j<0dS)NF)Zfallback) r Ú_sock_fdÚ is_readingÚ pause_readingÚ_make_empty_waiterZ sock_sendfileÚ_sockÚ_reset_empty_waiterÚresume_reading)r!ZtranspÚfileÚoffsetÚcountr¶rrrÚ_sendfile_nativeBs* ÿ  úýz&BaseSelectorEventLoop._sendfile_nativecCs€|D]v\}}|j|j}\}}|tj@rL|durL|jrB| |¡n | |¡|tj@r|dur|jrp| |¡q| |¡qdSr&) ÚfileobjrCrrrZ _cancelledr9Z _add_callbackrr)r!Z event_listrryr»rzr{rrrÚ_process_eventsPs    z%BaseSelectorEventLoop._process_eventscCs| | ¡¡| ¡dSr&)r9r;r7)r!r(rrrÚ _stop_serving^sz#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)N)N),rÚ __module__Ú __qualname__rr+rZSSL_HANDSHAKE_TIMEOUTr0r3r7r6rrDrArNrSrPr]rnr@r9r€rrƒr…r†r‡r”r‘rrr›r£r r«rªr¢r¬r¯r®rºr¼r½Ú __classcell__rrr"rr+sh ÿ ÿü ÿ   þ ý .ý )  rcs’eZdZdZeZdZd‡fdd„ Zdd„Zdd„Z d d „Z d d „Z d d„Z dd„Z ejfdd„Zddd„Zdd„Zdd„Zdd„Zdd„Z‡ZS) Ú_SelectorTransportiNcsêtƒ ||¡t |¡|jd<z| ¡|jd<WntyLd|jd<Yn0d|jvrŠz| ¡|jd<Wntj yˆd|jd<Yn0||_ |  ¡|_ d|_ | |¡||_| ¡|_d|_d|_|jdurÚ|j ¡||j|j <dS)Nr>ZsocknamerVFr)rrr r\Ú_extraZ getsocknamerLZ getpeernamer>Úerrorr´r;r°Ú_protocol_connectedÚ set_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ _conn_lostÚ_closingZ_attachr )r!r©r(r)r$r%r"rrros,       z_SelectorTransport.__init__cCsÖ|jjg}|jdur | d¡n|jr0| d¡| d|j›¡|jdurÆ|j ¡sÆt|jj |jt j ƒ}|rz| d¡n | d¡t|jj |jt j ƒ}|r¢d}nd}|  ¡}| d|›d |›d ¡d  d  |¡¡S) NÚclosedÚclosingzfd=z read=pollingz read=idleÚpollingZidlezwrite=z<{}>ú )rrr´ÚappendrÊr°Ú_loopr5rrrrrrÚget_write_buffer_sizeÚformatÚjoin)r!ÚinforÍÚstateÚbufsizerrrÚ__repr__‰s.    ÿ  þz_SelectorTransport.__repr__cCs| d¡dSr&)Ú _force_closer8rrrÚabort¥sz_SelectorTransport.abortcCs||_d|_dS©NT)Ú _protocolrÄ©r!r)rrrrŨsz_SelectorTransport.set_protocolcCs|jSr&)rÜr8rrrÚ get_protocol¬sz_SelectorTransport.get_protocolcCs|jSr&)rÊr8rrrrm¯sz_SelectorTransport.is_closingcCsT|jr dSd|_|j |j¡|jsP|jd7_|j |j¡|j |jd¡dS©NTr) rÊrÑr9r°rÈrÉrÚ call_soonÚ_call_connection_lostr8rrrr7²sz_SelectorTransport.closecCs,|jdur(|d|›t|d|j ¡dS)Nzunclosed transport )Úsource)r´ÚResourceWarningr7)r!Z_warnrrrÚ__del__¼s z_SelectorTransport.__del__úFatal error on transportcCsNt|tƒr(|j ¡r@tjd||ddn|j ||||jdœ¡| |¡dS)Nz%r: %sTrI)rTrUrbr)) rhrLrÑÚ get_debugr rr[rÜrÙ)r!rarTrrrÚ _fatal_errorÁs  üz_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j ¡|j |j¡|jsBd|_|j |j¡|jd7_|j |j |¡dSrß) rÉrÈÚclearrÑrr°rÊr9ràrá©r!rarrrrÙÏs z_SelectorTransport._force_closecCsŽzN|jr|j |¡W|j ¡d|_d|_d|_|j}|durŠ| ¡d|_n:|j ¡d|_d|_d|_|j}|durˆ| ¡d|_0dSr&)rÄrÜZconnection_lostr´r7rÑrÆZ_detach)r!rar%rrrráÛs& ù z(_SelectorTransport._call_connection_lostcCs t|jƒSr&)rŸrÈr8rrrrÒész(_SelectorTransport.get_write_buffer_sizecGs$|jr dS|jj||g|¢RŽdSr&)rÊrÑr@r‚rrrr@ìsz_SelectorTransport._add_reader)NN)rå)rr¾r¿Úmax_sizeÚ bytearrayrÇr´rrØrÚrÅrÞrmr7ÚwarningsÚwarnrärçrÙrárÒr@rÀrrr"rrÁcs    rÁcsªeZdZdZejjZd#‡fdd„ Z‡fdd„Z dd„Z d d „Z d d „Z d d„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z‡fdd„Zdd „Zd!d"„Z‡ZS)$r'TNcs~d|_tƒ |||||¡d|_d|_d|_t |j¡|j   |j j |¡|j   |j |j|j¡|durz|j   tj|d¡dSr )Ú_read_ready_cbrrÚ_eofÚ_pausedÚ _empty_waiterrZ _set_nodelayr´rÑràrÜÚconnection_mader@r°Ú _read_readyrÚ_set_result_unless_cancelled)r!r©r(r)r*r$r%r"rrrøs  ÿ ÿz!_SelectorSocketTransport.__init__cs.t|tjƒr|j|_n|j|_tƒ |¡dSr&)rhrZBufferedProtocolÚ_read_ready__get_bufferrîÚ_read_ready__data_receivedrrÅrÝr"rrrÅs  z%_SelectorSocketTransport.set_protocolcCs|j o|j Sr&)rðrÊr8rrrr±sz#_SelectorSocketTransport.is_readingcCs>|js |jrdSd|_|j |j¡|j ¡r:t d|¡dS)NTz%r pauses reading)rÊrðrÑr9r°rær rr8rrrr²s   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_| |j|j¡|j ¡rÿ      z_SelectorSocketTransport.writec Cs|jr dSz|j |j¡}Wnˆttfy2YnàttfyH‚YnÊty¤}zF|j   |j ¡|j  ¡|  |d¡|jdur|j |¡WYd}~nvd}~00|r¶|jd|…=| ¡|js|j   |j ¡|jdurê|j d¡|jrü| d¡n|jr|j tj¡dS)Nrü)rÉr´rKrÈrGrFrerfrdrÑrr°rèrçrñr˜Ú_maybe_resume_protocolr™rÊrárïÚshutdownr>ÚSHUT_WR)r!r’rarrrr§s2   "    z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|j tj¡dSrÛ)rÊrïrÈr´rr>rr8rrrÚ write_eofÅs  z"_SelectorSocketTransport.write_eofcCsdSrÛrr8rrrÚ can_write_eofÌsz&_SelectorSocketTransport.can_write_eofcs*tƒ |¡|jdur&|j tdƒ¡dS)NzConnection is closed by peer)rrárñr˜ÚConnectionErrorrér"rrráÏs   ÿz._SelectorSocketTransport._call_connection_lostcCs6|jdurtdƒ‚|j ¡|_|js0|j d¡|jS)NzEmpty waiter is already set)rñr4rÑrcrÈr™r8rrrr³Õs    z+_SelectorSocketTransport._make_empty_waitercCs d|_dSr&)rñr8rrrrµÝsz,_SelectorSocketTransport._reset_empty_waiter)NNN)rr¾r¿Z_start_tls_compatiblerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrÅr±r²r¶rórõrörùrrrrrár³rµrÀrrr"rr'ós(ÿ %' r'csFeZdZejZd ‡fdd„ Zdd„Zdd„Zd dd „Z d d „Z ‡Z S)r1Ncs^tƒ ||||¡||_|j |jj|¡|j |j|j|j ¡|durZ|j t j |d¡dSr&) rrÚ_addressrÑràrÜròr@r°rórrô)r!r©r(r)r2r*r$r"rrrås ÿ ÿz#_SelectorDatagramTransport.__init__cCstdd„|jDƒƒS)Ncss|]\}}t|ƒVqdSr&)rŸ)Ú.0rCr^rrrÚ óózC_SelectorDatagramTransport.get_write_buffer_size..)ÚsumrÈr8rrrrÒòsz0_SelectorDatagramTransport.get_write_buffer_sizec Cs¼|jr dSz|j |j¡\}}Wnˆttfy6Yn‚tyd}z|j |¡WYd}~n\d}~0t t fyz‚Yn>t y¨}z|  |d¡WYd}~nd}~00|j  ||¡dS)Nz&Fatal read error on datagram transport)rÉr´ZrecvfromrêrGrFrLrÜÚerror_receivedrerfrdrçZdatagram_received©r!rCr`rarrrróõs "z&_SelectorDatagramTransport._read_readyc Cs„t|tttfƒs$tdt|ƒj›ƒ‚|s,dS|jrV|d|jfvrPtd|j›ƒ‚|j}|j rŠ|jrŠ|j t j krxt   d¡|j d7_ dS|jsdz,|jdr¬|j |¡n|j ||¡WdSttfyæ|j |j|j¡Yn~ty}z|j |¡WYd}~dSd}~0ttfy0‚Yn4tyb}z| |d¡WYd}~dSd}~00|j  t|ƒ|f¡| !¡dS)Nrúz!Invalid address: must be None or rûrrVú'Fatal write error on datagram transport)"rhrýrër¡rkr§rr rlrÉrrþr rÿrÈrÂr´rKÚsendtorGrFrÑr€r°Ú _sendto_readyrLrÜrrerfrdrçrÐrrrrrrsJÿ ÿ     ÿz!_SelectorDatagramTransport.sendtoc Cs|jrâ|j ¡\}}z*|jdr.|j |¡n|j ||¡Wqttfyh|j ||f¡YqâYqt y˜}z|j   |¡WYd}~dSd}~0t t fy®‚YqtyÞ}z| |d¡WYd}~dSd}~00q| ¡|js|j |j¡|jr| d¡dS)NrVr)rÈÚpopleftrÂr´rKrrGrFÚ appendleftrLrÜrrerfrdrçrrÑrr°rÊrárrrrr0s0  ÿz(_SelectorDatagramTransport._sendto_ready)NNN)N) rr¾r¿Ú collectionsÚdequerÇrrÒrórrrÀrrr"rr1ásÿ  +r1)Ú__all__rrZrrr>rìrZsslÚ ImportErrorÚrrrrrr r r Úlogr rZ BaseEventLooprZ_FlowControlMixinZ TransportrÁr'r1rrrrÚsB             <ÿo