+
    üÐjÁF  ã                  ó*  € R t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHtHtHtHtHtHtHtHtHtHtHtHt ^ RIHtHt ^ R	IHt ^ R
IH t  ^ RI!H"t"H#t#H$t$H%t%H&t&H't' ^ RI(H)t)H*t*H+t+ ^ RI,H-t-H.t. ]! R4      t/]t0 ]]1]2]&]"]$]%]]0R3,          ]]0,          ]]0RR3,          ]#]]0,          ]]]0,          ]3]03,          ]-3,          t4 R't5R R lt6R R lt7R R lt8R R lt9R R lt:R(R R llt;R R lt<R R  lt=R! R" lt>R# R$ lt?R% R& lt@R# ))zu
Context-free flattener/serializer for rendering Python objects, possibly
complex or arbitrarily nested, as strings.
)Úannotations)Úiscoroutine)ÚBytesIO)Úexc_info)Ú
extract_tb)ÚGeneratorType)ÚAnyÚCallableÚ	CoroutineÚ	GeneratorÚListÚMappingÚOptionalÚSequenceÚTupleÚTypeVarÚUnionÚcast)ÚDeferredÚensureDeferred)ÚnativeString)ÚFailure)ÚCDATAÚCharRefÚCommentÚTagÚslotÚvoidElements)ÚFlattenerErrorÚUnfilledSlotÚUnsupportedType)ÚIRenderableÚIRequestÚT.Nc               ó    € V ^8„  d   QhRRRR/# ©é   ÚdatazUnion[bytes, str]ÚreturnÚbytes© )Úformats   "Ú6/usr/lib/python3/dist-packages/twisted/web/_flatten.pyÚ__annotate__r-   G   s   € ÷ ñ Ð,ð °ñ ó    c                ó¸   € \        V \        4      '       d   V P                  R4      p V P                  RR4      P                  RR4      P                  RR4      p V # )a{  
Escape some character or UTF-8 byte data for inclusion in an HTML or XML
document, by replacing metacharacters (C{&<>}) with their entity
equivalents (C{&amp;&lt;&gt;}).

This is used as an input to L{_flattenElement}'s C{dataEscaper} parameter.

@param data: The string to escape.

@return: The quoted form of C{data}.  If C{data} is L{str}, return a utf-8
    encoded string.
úutf-8ó   &s   &amp;ó   <s   &lt;ó   >s   &gt;©Ú
isinstanceÚstrÚencodeÚreplace©r'   s   &r,   ÚescapeForContentr:   G   sN   € ô �$œ×ÒØ�{‰{˜7Ó#ˆØ�<‰<˜˜hÓ'×/Ñ/°°gÓ>×FÑFÀtÈWÓU€DØ€Kr.   c               ó    € V ^8„  d   QhRRRR/# r%   r*   )r+   s   "r,   r-   r-   Z   s   € ÷ ñ Ð'8ð ¸Uñ r.   c                óT   € \        V \        4      '       d   V P                  R4      # V # )a  
Escape some character or UTF-8 byte data for inclusion in the top level of
an attribute.  L{attributeEscapingDoneOutside} actually passes the data
through unchanged, because L{writeWithAttributeEscaping} handles the
quoting of the text within attributes outside the generator returned by
L{_flattenElement}; this is used as the C{dataEscaper} argument to that
L{_flattenElement} call so that that generator does not redundantly escape
its text output.

@param data: The string to escape.

@return: The string, unchanged, except for encoding.
r0   )r5   r6   r7   r9   s   &r,   ÚattributeEscapingDoneOutsider=   Z   s%   € ô �$œ×ÒØ�{‰{˜7Ó#Ð#Ø€Kr.   c               ó    € V ^8„  d   QhRRRR/# )r&   ÚwriteúCallable[[bytes], object]r(   zCallable[[bytes], None]r*   )r+   s   "r,   r-   r-   m   s   € ÷ ,ñ ,Ø$ð,àñ,r.   c                ó   a € R V 3R llpV# )aÙ  
Decorate a C{write} callable so that all output written is properly quoted
for inclusion within an XML attribute value.

If a L{Tag <twisted.web.template.Tag>} C{x} is flattened within the context
of the contents of another L{Tag <twisted.web.template.Tag>} C{y}, the
metacharacters (C{<>&"}) delimiting C{x} should be passed through
unchanged, but the textual content of C{x} should still be quoted, as
usual.  For example: C{<y><x>&amp;</x></y>}.  That is the default behavior
of L{_flattenElement} when L{escapeForContent} is passed as the
C{dataEscaper}.

However, when a L{Tag <twisted.web.template.Tag>} C{x} is flattened within
the context of an I{attribute} of another L{Tag <twisted.web.template.Tag>}
C{y}, then the metacharacters delimiting C{x} should be quoted so that it
can be parsed from the attribute's value.  In the DOM itself, this is not a
valid thing to do, but given that renderers and slots may be freely moved
around in a L{twisted.web.template} template, it is a condition which may
arise in a document and must be handled in a way which produces valid
output.  So, for example, you should be able to get C{<y attr="&lt;x /&gt;"
/>}.  This should also be true for other XML/HTML meta-constructs such as
comments and CDATA, so if you were to serialize a L{comment
<twisted.web.template.Comment>} in an attribute you should get C{<y
attr="&lt;-- comment --&gt;" />}.  Therefore in order to capture these
meta-characters, flattening is done with C{write} callable that is wrapped
with L{writeWithAttributeEscaping}.

The final case, and hopefully the much more common one as compared to
serializing L{Tag <twisted.web.template.Tag>} and arbitrary L{IRenderable}
objects within an attribute, is to serialize a simple string, and those
should be passed through for L{writeWithAttributeEscaping} to quote
without applying a second, redundant level of quoting.

@param write: A callable which will be invoked with the escaped L{bytes}.

@return: A callable that writes data with escaping.
c               ó    € V ^8„  d   QhRRRR/# )r&   r'   r)   r(   ÚNoner*   )r+   s   "r,   r-   Ú0writeWithAttributeEscaping.<locals>.__annotate__–   s   € ÷ ?ñ ?�Uð ?˜tñ ?r.   c                óJ   <€ S! \        V 4      P                  R R4      4       R# )ó   "s   &quot;N)r:   r8   )r'   r?   s   &€r,   Ú_writeÚ*writeWithAttributeEscaping.<locals>._write–   s   ø€ ÙÔ˜tÓ$×,Ñ,¨T°9Ó=Ö>r.   r*   )r?   rG   s   f r,   ÚwriteWithAttributeEscapingrI   m   s   ø€ ÷R?ð ?ð €Mr.   c               ó    € V ^8„  d   QhRRRR/# r%   r*   )r+   s   "r,   r-   r-   œ   s   € ÷ 4ñ 4Ð(ð 4¨Uñ 4r.   c                ót   € \        V \        4      '       d   V P                  R4      p V P                  RR4      # )z¯
Escape CDATA for inclusion in a document.

@param data: The string to escape.

@return: The quoted form of C{data}. If C{data} is unicode, return a utf-8
    encoded string.
r0   ó   ]]>s   ]]]]><![CDATA[>r4   r9   s   &r,   ÚescapedCDATArM   œ   s1   € ô �$œ×ÒØ�{‰{˜7Ó#ˆØ�<‰<˜Ð 2Ó3Ð3r.   c               ó    € V ^8„  d   QhRRRR/# r%   r*   )r+   s   "r,   r-   r-   ª   s   € ÷ ñ Ð*ð ¨uñ r.   c                ó®   € \        V \        4      '       d   V P                  R4      p V P                  RR4      p V '       d   V RR R8X  d
   V R,          p V # )a¼  
Within comments the sequence C{-->} can be mistaken as the end of the comment.
To ensure consistent parsing and valid output the sequence is replaced with C{--&gt;}.
Furthermore, whitespace is added when a comment ends in a dash. This is done to break
the connection of the ending C{-} with the closing C{-->}.

@param data: The string to escape.

@return: The quoted form of C{data}. If C{data} is unicode, return a utf-8
    encoded string.
r0   ó   -->s   --&gt;Nó   -ó    éÿÿÿÿr4   r9   s   &r,   ÚescapedCommentrT   ª   sM   € ô �$œ×ÒØ�{‰{˜7Ó#ˆØ�<‰<˜ 	Ó*€Dß��R�S�	˜TÔ!Ø��ˆØ€Kr.   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r&   Únamer6   ÚslotDataz-Sequence[Optional[Mapping[str, Flattenable]]]ÚdefaultzOptional[Flattenable]r(   ÚFlattenabler*   )r+   s   "r,   r-   r-   ¾   s0   € ÷ !ñ !Ø
ð!à;ð!ð #ð!ð ñ	!r.   c                ót   € \        V4       F  pVf   K	  W9   g   K  W0,          u # 	  Ve   V# \        V 4      h)zC
Find the value of the named slot in the given stack of slot data.
)Úreversedr   )rV   rW   rX   Ú	slotFrames   &&& r,   Ú_getSlotValuer]   ¾   s>   € ô ˜hÖ'ˆ	ØÔ  TÖ%6Ø•?Ò"ñ (ð ÒØˆNÜ˜4Ó Ð r.   c               ó    € V ^8„  d   QhRRRR/# )r&   ÚdzDeferred[T]r(   r*   )r+   s   "r,   r-   r-   Ï   s   € ÷ ñ ˆ[ð ˜[ñ r.   c                ón   a a€ \        V 3R l4      oR V3R llpR V3R llpS P                  W4       S# )z‡
Create a new L{Deferred} based on C{d} that will fire and fail with C{d}'s
result or error, but will not modify C{d}'s callback type.
c                ó$   <€ SP                  4       # ©N)Úcancel)Ú_r_   s   &€r,   Ú<lambda>Ú_fork.<locals>.<lambda>Ô   s   ø€ ¨¯©¬r.   c               ó    € V ^8„  d   QhRRRR/# )r&   Úresultr#   r(   r*   )r+   s   "r,   r-   Ú_fork.<locals>.__annotate__Ö   s   € ÷ ñ ˜ð ˜qñ r.   c                ó*   <€ SP                  V 4       V # rb   )Úcallback)rh   Úd2s   &€r,   rk   Ú_fork.<locals>.callbackÖ   s   ø€ Ø
�‰�FÔØˆr.   c               ó    € V ^8„  d   QhRRRR/# )r&   Úfailurer   r(   r*   )r+   s   "r,   r-   ri   Ú   s   € ÷ ñ ˜ð  Wñ r.   c                ó*   <€ SP                  V 4       V # rb   )Úerrback)ro   rl   s   &€r,   rq   Ú_fork.<locals>.errbackÚ   s   ø€ Ø
�
‰
�7ÔØˆr.   )r   ÚaddCallbacks)r_   rk   rq   rl   s   f  @r,   Ú_forkrt   Ï   s7   ù€ ô
 Ô3Ó4€B÷ð ÷ð ð ‡N�N�8Ô%Ø€Ir.   c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r&   ÚrequestúOptional[IRequest]ÚrootrY   r?   r@   rW   z)List[Optional[Mapping[str, Flattenable]]]ÚrenderFactoryúOptional[IRenderable]ÚdataEscaperú$Callable[[Union[bytes, str]], bytes]r(   zMGenerator[Union[Generator[Any, Any, Any], Deferred[Flattenable]], None, None]r*   )r+   s   "r,   r-   r-   â   sX   € ÷ N$ñ N$ØðN$à
ðN$ð %ðN$ð 8ð	N$ð
 )ðN$ð 6ðN$ð SñN$r.   c           
   #  óØ  a aa"  € VVV3R V V3R llloR V3R llp\        V\        \        34      '       d   V! V! V4      4       R	# \        V\        4      '       d.   \	        VP
                  SVP                  4      pS! V4      x € R	# \        V\        4      '       d.   V! R4       V! \        VP                  4      4       V! R4       R	# \        V\        4      '       d.   V! R4       V! \        VP                  4      4       V! R4       R	# \        V\        4      '       Edø   SP                  VP                  4       VP                  pVeb   Vf   \!        R
V R24      hVP#                  R4      p	R	V	n        VP%                  V4      p
V
! S V	4      pS! V4      x € SP'                  4        R	# VP(                  '       g   S! VP*                  4      x € R	# V! R4       \        VP(                  \        4      '       d   VP(                  P-                  R4      pMVP(                  pV! V4       VP.                  P1                  4        Fd  w  rÞ\        V\        4      '       d   VP-                  R4      pV! RV,           R,           4       S! V\2        \5        V4      R7      x € V! R4       Kf  	  VP*                  '       g   \7        V4      \8        9  d:   V! R4       S! VP*                  \:        4      x € V! RV,           R,           4       R	# V! R4       R	# \        V\<        \>        \@        34      '       d   V F  pS! V4      x € K  	  R	# \        V\B        4      '       d.   RVPD                  3,          pV! VP-                  R4      4       R	# \        V\F        4      '       d   V! \I        V4      4      x € R	# \K        V4      '       dP   V! \F        PL                  ! \O        \P        \F        \R        ,          \T        \R        3,          V4      4      4      x € R	# \V        PX                  ! V4      '       d   VP                  S 4      pS! W±R7      x € R	# \[        V4      h5i)a  
Make C{root} slightly more flat by yielding all its immediate contents as
strings, deferreds or generators that are recursive calls to itself.

@param request: A request object which will be passed to
    L{IRenderable.render}.

@param root: An object to be made flatter.  This may be of type C{unicode},
    L{str}, L{slot}, L{Tag <twisted.web.template.Tag>}, L{tuple}, L{list},
    L{types.GeneratorType}, L{Deferred}, or an object that implements
    L{IRenderable}.

@param write: A callable which will be invoked with each L{bytes} produced
    by flattening C{root}.

@param slotData: A L{list} of L{dict} mapping L{str} slot names to data
    with which those slots will be replaced.

@param renderFactory: If not L{None}, an object that provides
    L{IRenderable}.

@param dataEscaper: A 1-argument callable which takes L{bytes} or
    L{unicode} and returns L{bytes}, quoted as appropriate for the
    rendering context.  This is really only one of two values:
    L{attributeEscapingDoneOutside} or L{escapeForContent}, depending on
    whether the rendering context is within an attribute or not.  See the
    explanation in L{writeWithAttributeEscaping}.

@return: An iterator that eventually writes L{bytes} to C{write}.
    It can yield other iterators or L{Deferred}s; if it yields another
    iterator, the caller will iterate it; if it yields a L{Deferred},
    the result of that L{Deferred} will be another generator, in which
    case it is iterated.  See L{_flattenTree} for the trampoline that
    consumes said values.
c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r&   ÚnewRootrY   r{   r|   ry   rz   r?   r@   r(   z@Generator[Union[Flattenable, Deferred[Flattenable]], None, None]r*   )r+   s   "r,   r-   Ú%_flattenElement.<locals>.__annotate__  s;   € ÷ 
ñ 
Øð
à9ð
ð -ð
ð )ð	
ð
 
Jñ
r.   c                ó    <€ \        SWSW!4      # rb   )Ú_flattenElement)r   r{   ry   r?   rv   rW   s   &&&&€€r,   Ú	keepGoingÚ"_flattenElement.<locals>.keepGoing  s   ø€ ô Ø�W X¨}ó
ð 	
r.   c               ó    € V ^8„  d   QhRRRR/# )r&   rh   zDeferred[Flattenable]r(   r*   )r+   s   "r,   r-   r€     s   € ÷ -ñ -Ð4ð -Ð9Nñ -r.   c                ó&   <€ V P                  S4      # rb   )ÚaddCallback)rh   rƒ   s   &€r,   ÚkeepGoingAsyncÚ'_flattenElement.<locals>.keepGoingAsync  s   ø€ Ø×!Ñ! )Ó,Ð,r.   s	   <![CDATA[rL   s   <!--rP   Nz$Tag wants to be rendered by method "z)" but is not contained in any IRenderableFr2   ÚasciirR   s   =")r?   rF   r3   s   </s    />z&#%d;)ry   ).r5   r)   r6   r   r]   rV   rX   r   rM   r'   r   rT   r   ÚappendrW   ÚrenderÚ
ValueErrorÚcloneÚlookupRenderMethodÚpopÚtagNameÚchildrenr7   Ú
attributesÚitemsr=   rI   r   r   r:   ÚtupleÚlistr   r   Úordinalr   rt   r   ÚfromCoroutiner   r
   rY   Úobjectr!   Ú
providedByr    )rv   rx   r?   rW   ry   r{   rˆ   Ú	slotValueÚrendererNameÚ	rootCloneÚrenderMethodrh   r‘   ÚkÚvÚelementÚescapedrƒ   s   f&&f&&           @r,   r‚   r‚   â   sb  úé € ðb =HØ/<Ø+0÷	
ó 
÷-ð -ô �$œ¤˜×%Ò%Ù‰k˜$ÓÖ Ü	�Dœ$×	Ò	Ü! $§)¡)¨X°t·|±|ÓDˆ	Ù˜	Ó"Ô"Ü	�Dœ%×	 Ò	 ÙˆlÔÙŒl˜4Ÿ9™9Ó%Ô&ÙˆfŽÜ	�Dœ'×	"Ò	"ÙˆgŒÙŒn˜TŸY™YÓ'Ô(ÙˆfŽÜ	�Dœ#×	Ó	Ø�‰˜Ÿ™Ô&Ø—{‘{ˆØÒ#ØÒ$Ü Ø:¸<¸.ð I>ð ?óð ð Ÿ
™
 5Ó)ˆIØ#ˆIÔØ(×;Ñ;¸LÓIˆLÙ! '¨9Ó5ˆFÙ˜FÓ#Ò#Ø�L‰LŒNÙà�|�|ˆ|Ù˜DŸM™MÓ*Ò*ÙáˆdŒÜ�d—l‘l¤C×(Ò(Ø—l‘l×)Ñ)¨'Ó2‰Gà—l‘lˆGÙˆgŒØ—O‘O×)Ñ)Ö+‰DˆAÜ˜!œS×!Ò!Ø—H‘H˜WÓ%�Ù�$˜•(˜UÕ"Ô#ñ ØÔ/Ô7QÐRWÓ7Xôò ñ �$ŽKñ ,ð �=�=ˆ=œL¨Ó1¼ÔEÙ�$ŒKñ ˜DŸM™MÔ+;Ó<Ò<Ù�%˜'•/ DÕ(Ö)á�&ŽMä	�Dœ5¤$¬Ð6×	7Ò	7ÛˆGÙ˜GÓ$Ô$ó ä	�Dœ'×	"Ò	"Ø˜TŸ\™\˜OÕ+ˆÙˆg�n‰n˜WÓ%Ö&Ü	�Dœ(×	#Ò	#ÙœU 4›[Ó)Ô)Ü	�T×	Ò	ÙÜ×"Ò"Ü”Yœx¬Õ4´f¼kÐIÕJÈDÓQóó
ô 	
ô
 
×	Ò	 ×	%Ò	%Ø—‘˜WÓ%ˆÙ˜Ô3Ô3ä˜dÓ#Ð#ùs   …GQ*ÇDQ*Ë
E6Q*Ñ)Q*c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r&   rv   rw   rx   rY   r?   r@   r(   rC   r*   )r+   s   "r,   r-   r-   s  s2   € ÷ Eñ EØðEØ'2ðEØ;TðEà	ñEr.   c           	   ƒ  ó„  aa	a
a"  € . o	^ o
R V	V
V3R llpR V	V
V3R llo\        WV. R\        4      .pV'       dN    \        VR,          4      p\        V\        4      '       d   S! 4        VG Rj  x€L
 pVP                  V4       KU  S! 4        R#  L   \         d    TP                  4         K~  \         d�   p. pT F?  pTP                  f   K  TP                  TP                  P                  R,          4       KA  	  TP                  4        \        Yg\        \        4       ^,          4      4      hRp?ii ; i5i)aY  
Make C{root} into an iterable of L{bytes} and L{Deferred} by doing a depth
first traversal of the tree.

@param request: A request object which will be passed to
    L{IRenderable.render}.

@param root: An object to be made flatter.  This may be of type C{unicode},
    L{bytes}, L{slot}, L{Tag <twisted.web.template.Tag>}, L{tuple},
    L{list}, L{types.GeneratorType}, L{Deferred}, or something providing
    L{IRenderable}.

@param write: A callable which will be invoked with each L{bytes} produced
    by flattening C{root}.

@return: A C{Deferred}-returning coroutine that resolves to C{None}.
c               ó    € V ^8„  d   QhRRRR/# )r&   Úbsr)   r(   rC   r*   )r+   s   "r,   r-   Ú"_flattenTree.<locals>.__annotate__Œ  s   € ÷ ñ ˜%ð  Dñ r.   c                óv   <€ SP                  V 4       S\        V 4      ,          oS\        8¼  d
   S! 4        R # R # rb   )r‹   ÚlenÚBUFFER_SIZE)r¦   ÚbufÚbufSizeÚflushBuffers   &€€€r,   ÚbufferedWriteÚ#_flattenTree.<locals>.bufferedWriteŒ  s.   ø€ à�
‰
�2ŒØ”3�r“7ÕˆØ”kÔ!ÙŽMñ "r.   c               ó   € V ^8„  d   QhRR/# )r&   r(   rC   r*   )r+   s   "r,   r-   r§   ˜  s   € ÷ ñ ˜ñ r.   c                 óR   <€ S^ 8”  d   S! RP                  S 4      4       S R ^ oR# R# )é    r.   :NNNN)Újoin)r«   r¬   r?   s   €€€r,   r­   Ú!_flattenTree.<locals>.flushBuffer˜  s+   ø€ à�QŒ;Ù�#—(‘(˜3“-Ô Ø�A�ØŠGñ r.   Nrx   rS   )r‚   r:   Únextr5   r   r‹   ÚStopIterationr�   Ú	ExceptionÚgi_frameÚf_localsr   r   r   )rv   rx   r?   r®   Ústackr¡   ÚeÚrootsÚ	generatorr«   r¬   r­   s   &&f      @@@r,   Ú_flattenTreer¾   s  s	  ûé € ð( €CØ€G÷ò ÷ò ô 	˜ }°b¸$Ô@PÓQð-€E÷ ð	"Ü˜5 �9“oˆGÜ˜'¤8×,Ò,ñ ”Ø 'Ÿ-�ð �L‰L˜Ö!ñ †Mñ (øÜô 	Ø�I‰I�KÜô 	FØˆEÛ"�	Ø×%Ñ%Ô1Ø—L‘L ×!3Ñ!3×!<Ñ!<¸VÕ!DÖEñ #ð �I‰IŒKÜ  ¬:´h³jÀµmÓ+DÓEÐEûð	FüsS   †6E ¾4B Á2BÁ3B Á7E ÂB ÂD=Â0E Â3D=Â<D=Â=D8ÃA$D8Ä8D=Ä=E c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r&   rv   rw   rx   rY   r?   r@   r(   zDeferred[None]r*   )r+   s   "r,   r-   r-   »  s,   € ÷ >ñ >Øð>Ø'2ð>Ø;Tð>àñ>r.   c                ó,   € \        \        WV4      4      # )aÅ  
Incrementally write out a string representation of C{root} using C{write}.

In order to create a string representation, C{root} will be decomposed into
simpler objects which will themselves be decomposed and so on until strings
or objects which can easily be converted to strings are encountered.

@param request: A request object which will be passed to the C{render}
    method of any L{IRenderable} provider which is encountered.

@param root: An object to be made flatter.  This may be of type L{str},
    L{bytes}, L{slot}, L{Tag <twisted.web.template.Tag>}, L{tuple},
    L{list}, L{types.GeneratorType}, L{Deferred}, or something that
    provides L{IRenderable}.

@param write: A callable which will be invoked with each L{bytes} produced
    by flattening C{root}.

@return: A L{Deferred} which will be called back with C{None} when C{root}
    has been completely flattened into C{write} or which will be errbacked
    if an unexpected exception occurs.
)r   r¾   )rv   rx   r?   s   &&&r,   ÚflattenrÁ   »  s   € ô2 œ, w°eÓ<Ó=Ð=r.   c               ó$   € V ^8„  d   QhRRRRRR/# )r&   rv   rw   rx   rY   r(   zDeferred[bytes]r*   )r+   s   "r,   r-   r-   ×  s"   € ÷ $ñ $Ð-ð $°[ð $À_ñ $r.   c                ó¤   a€ \        4       o\        WSP                  4      pVP                  V3R l4       \	        \
        \        ,          V4      # )a«  
Collate a string representation of C{root} into a single string.

This is basically gluing L{flatten} to an L{io.BytesIO} and returning
the results. See L{flatten} for the exact meanings of C{request} and
C{root}.

@return: A L{Deferred} which will be called back with a single UTF-8 encoded
    string as its result when C{root} has been completely flattened or which
    will be errbacked if an unexpected exception occurs.
c                ó$   <€ SP                  4       # rb   )Úgetvalue)rd   Úios   &€r,   re   ÚflattenString.<locals>.<lambda>å  s   ø€ ˜BŸK™KœMr.   )r   rÁ   r?   r‡   r   r   r)   )rv   rx   r_   rÆ   s   && @r,   ÚflattenStringrÈ   ×  s:   ø€ ô 
‹€BÜ�˜rŸx™xÓ(€AØ‡M�MÔ)Ô*Ü”œ• Ó#Ð#r.   i   rb   )AÚ__doc__Ú
__future__r   Úinspectr   rÆ   r   Úsysr   Ú	tracebackr   Útypesr   Útypingr   r	   r
   r   r   r   r   r   r   r   r   r   Útwisted.internet.deferr   r   Útwisted.python.compatr   Útwisted.python.failurer   Útwisted.web._stanr   r   r   r   r   r   Útwisted.web.errorr   r   r    Útwisted.web.iwebr!   r"   r#   ÚFlattenableRecursiver)   r6   r™   rY   rª   r:   r=   rI   rM   rT   r]   rt   r‚   r¾   rÁ   rÈ   r*   r.   r,   Ú<module>r×      s  ðñ
õ #å Ý Ý Ý  Ý ÷÷ ÷ ó ÷ <Ý .Ý *ß N× Nß KÑ Kß 2áˆCƒL€àÐ ðð Ø	ØØØ	ØØØ	Ð
 Ð
#Õ$ØÐ	ÕØÐ" D¨$Ð.Õ/ØØÐ!Õ"ØˆhÐ+Õ,¨fÐ6JÐJÕKØðõ€ðð €õõ&õ&,õ^4õ÷(!õ"õ&N$õbEõP>÷8$r.   