ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     3

  \                 @   s  d Z ddlmZmZmZ ddlmZmZmZ ddlm	Z	 ddl
mZmZ ddlmZ ejZejZejZejjZejjZejjZejjZej Zejddejdd	ejdd
ejddejddejddejddejddejddd	ZG dd deZdd Zdd ZG dd dZeeefZ G dd deZ!G dd deZ"G dd de"Z#G d d! d!e"Z$d"Z%d#e% Z&G d$d% d%eZ'G d&d' d'Z(G d(d) d)e(eZ)G d*d+ d+e(e'Z*G d,d- d-e+Z,G d.d/ d/eZ-d;d1d2Z.d<d3d4Z/d=d5d6Z0d>d7d8Z1d9d: Z2dS )?zFacility to use the Expat parser to load a minidom instance
from a string or file.

This avoids all the overhead of SAX and pulldom to gain performance.
    )
xmlbuilderminidomNode)EMPTY_NAMESPACEEMPTY_PREFIXXMLNS_NAMESPACE)expat)_append_child_set_attribute_node)
NodeFilterNZcdataenumerationentityentitiesidZidrefZidrefsZnmtokenZnmtokens)	ZCDATAENUMZENTITYZENTITIESIDZIDREFZIDREFSZNMTOKENZNMTOKENSc               @   sZ   e Zd ZdZdddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd ZdS )ElementInfo
_attr_info_modeltagNameNc             C   s   || _ g | _|| _d S )N)r   r   r   )selfr   model r   ,/usr/lib64/python3.6/xml/dom/expatbuilder.py__init__?   s    zElementInfo.__init__c             C   s   | j | j| jfS )N)r   r   r   )r   r   r   r   __getstate__D   s    zElementInfo.__getstate__c             C   s   |\| _ | _| _d S )N)r   r   r   )r   stater   r   r   __setstate__G   s    zElementInfo.__setstate__c             C   sJ   xB| j D ]8}|d |kr|d }|d dkr4td S t|d  S qW tjS )N      r   (r   r!   )r   _typeinfo_mapr   _no_type)r   anameinfotr   r   r   getAttributeTypeJ   s    zElementInfo.getAttributeTypec             C   s   t jS )N)r   r#   )r   ZnamespaceURIZ	localNamer   r   r   getAttributeTypeNST   s    zElementInfo.getAttributeTypeNSc             C   s,   | j r$| j d }|tjjtjjfkS dS d S )Nr   F)r   r   r   ZXML_CTYPE_ANYZXML_CTYPE_MIXED)r   typer   r   r   isElementContentW   s
    
zElementInfo.isElementContentc             C   s    | j r| j d tjjkS dS d S )Nr   F)r   r   r   ZXML_CTYPE_EMPTY)r   r   r   r   isEmpty_   s    zElementInfo.isEmptyc             C   s,   x&| j D ]}|d |kr|d dkS qW dS )Nr   r   r   Fr!   )r   )r   r$   r%   r   r   r   isIde   s    zElementInfo.isIdc             C   s   | j ||fS )N)r,   )r   ZeuriZenameZaurir$   r   r   r   isIdNSk   s    zElementInfo.isIdNS)r   r   r   )N)__name__
__module____qualname__	__slots__r   r   r   r'   r(   r*   r+   r,   r-   r   r   r   r   r   <   s   

r   c             C   s   | j ||S )N)_intern_setdefault)buildersr   r   r   _interno   s    r5   c             C   s   |j d}| j}t|dkrR|\}}}|||}d||f }|||}|||}n4t|dkrz|\}}t}||| }}ntd| ||||||fS )N    z%s:%sr   z4Unsupported syntax: spaces in URIs not supported: %r)splitr2   lenr   
ValueError)r3   namepartsinternuri	localnameprefixqnamer   r   r   _parse_ns_namer   s    



rB   c               @   s   e Zd ZdZd;ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: ZdS )<ExpatBuilderzPDocument builder that uses Expat to build a ParsedXML.DOM document
    instance.Nc             C   sP   |d krt j }|| _| jjd k	r2t| jj| _nd | _t| _d | _| j	  d S )N)
r   ZOptions_optionsfilterFilterVisibilityController_filterr   _finish_start_element_parserreset)r   optionsr   r   r   r      s    zExpatBuilder.__init__c             C   s   t j S )zCreate a new parser object.)r   ParserCreate)r   r   r   r   createParser   s    zExpatBuilder.createParserc             C   sF   | j s@| j | _ | j jj| _d| j _d| j _d| j _| j| j  | j S )z7Return the parser object, creating a new one if needed.T)	rI   rM   r=   
setdefaultr2   Zbuffer_textZordered_attributesZspecified_attributesinstall)r   r   r   r   	getParser   s    
zExpatBuilder.getParserc             C   s,   t jtdd| _| j| _| jj| _d| _dS )z6Free all data structures used during DOM construction.NF)theDOMImplementationZcreateDocumentr   documentcurNode
_elem_info_cdata)r   r   r   r   rJ      s
    
zExpatBuilder.resetc             C   s   | j |_| j|_| j|_| j|_| jj	r0| j
|_| j|_| jjrH| j|_| jjrj| j|_| j|_| j|_n| j|_| j|_| j|_| j|_| j|_ dS )z>Install the callbacks needed to build the DOM into the parser.N)!start_doctype_decl_handlerStartDoctypeDeclHandlerfirst_element_handlerStartElementHandlerend_element_handlerEndElementHandler
pi_handlerProcessingInstructionHandlerrD   r   entity_decl_handlerEntityDeclHandlernotation_decl_handlerNotationDeclHandlercommentscomment_handlerCommentHandlerZcdata_sectionsstart_cdata_section_handlerStartCdataSectionHandlerend_cdata_section_handlerEndCdataSectionHandlercharacter_data_handler_cdataCharacterDataHandlercharacter_data_handlerexternal_entity_ref_handlerExternalEntityRefHandlerxml_decl_handlerZXmlDeclHandlerelement_decl_handlerZElementDeclHandlerattlist_decl_handlerZAttlistDeclHandler)r   parserr   r   r   rO      s$    
zExpatBuilder.installc             C   s   | j  }d}yLx:|jd}|s P |j|d |rB| jjrB| j| d}qW |jdd W n tk
rl   Y nX | j}| j  d| _|S )	zIParse a document from a file object, returning the document
        node.T   i   r   F Ni @  )	rP   readParserR   documentElement_setup_subsetParseEscaperJ   rI   )r   filerq   Zfirst_bufferbufferdocr   r   r   	parseFile   s$    

zExpatBuilder.parseFilec             C   sP   | j  }y|j|d | j| W n tk
r6   Y nX | j}| j  d| _|S )z<Parse a document from a string, returning the document node.TN)rP   ru   rw   rx   rR   rJ   rI   )r   stringrq   r{   r   r   r   parseString   s    zExpatBuilder.parseStringc             C   s.   | j jr*t }|j| |j }|| j j_dS )z/Load the internal subset if there might be one.N)rR   doctypeInternalSubsetExtractorr~   	getSubsetinternalSubset)r   rz   Z	extractorsubsetr   r   r   rw      s
    
zExpatBuilder._setup_subsetc             C   s   | j jj|||}| j |_t| j | || j _| jrj| jj|tkrjd | j _| j j	d= d }d | j
_d | j
_|r|d k	rg |j_g |j_d | j
_d | j
_| j| j
_d S )Nr   )rR   implementationZcreateDocumentTypeownerDocumentr	   r   rG   
acceptNodeFILTER_REJECT
childNodesrI   r_   ra   r   _seq	notationsrd   r]   end_doctype_decl_handlerEndDoctypeDeclHandler)r   ZdoctypeNamesystemIdpublicIdhas_internal_subsetr   r   r   r   rV      s$    

z'ExpatBuilder.start_doctype_decl_handlerc             C   s2   | j jr| j| j_| j| j_| jp&| js.t	| _
d S )N)rD   rb   rc   rI   rd   r\   r]   rT   rG   r   _finish_end_element)r   r   r   r   r     s
    

z%ExpatBuilder.end_doctype_decl_handlerc             C   s@   | j j||}t| j| | jr<| jj|tkr<| jj| d S )N)rR   ZcreateProcessingInstructionr	   rS   rG   r   r   removeChild)r   targetdatanoder   r   r   r\     s    zExpatBuilder.pi_handlerc             C   s   | j j}| jrH| jr4|d jtkr4|d j| d S | jj|}d| _nD|rv|d jt	krv|d }|j
| }||_
d S tj }||_
| j|_t| j | d S )Nr   Tr   r   r   r   )rS   r   rU   _cdata_continuenodeTypeCDATA_SECTION_NODEZ
appendDatarR   ZcreateCDATASection	TEXT_NODEr   r   Textr   r	   )r   r   r   r   valuer   r   r   ri     s"    
z)ExpatBuilder.character_data_handler_cdatac             C   s^   | j j}|r2|d jtkr2|d }|j| |_d S tj }|j| |_| j|_t	| j | d S )Nr   r   r   )
rS   r   r   r   r   r   r   rR   r   r	   )r   r   r   r   r   r   r   rk   &  s    z#ExpatBuilder.character_data_handlerc       
      C   s   |rd S | j jsd S | jj||||}|d k	rF| jj|}	|jj|	 | jjjjj| | j	r|| j	j
|tkr|| jjjjd= d S )Nr   r   )rD   r   rR   Z_create_entityZcreateTextNoder   appendr   r   rG   r   r   )
r   Z
entityNameZis_parameter_entityr   baser   r   notationNamer   childr   r   r   r^   1  s    
z ExpatBuilder.entity_decl_handlerc             C   sJ   | j j|||}| j jjjj| | jrF| jj|tkrF| j jjjd= d S )Nr   r   )	rR   Z_create_notationr   r   r   r   rG   r   FILTER_ACCEPT)r   r   r   r   r   r   r   r   r   r`   C  s    z"ExpatBuilder.notation_decl_handlerc             C   s>   | j j|}t| j| | jr:| jj|tkr:| jj| d S )N)rR   ZcreateCommentr	   rS   rG   r   r   r   )r   r   r   r   r   r   rc   I  s    zExpatBuilder.comment_handlerc             C   s   d| _ d| _d S )NTF)rU   r   )r   r   r   r   re   O  s    z(ExpatBuilder.start_cdata_section_handlerc             C   s   d| _ d| _d S )NF)rU   r   )r   r   r   r   rg   S  s    z&ExpatBuilder.end_cdata_section_handlerc             C   s   dS )Nr   r   )r   contextr   r   r   r   r   r   rl   W  s    z(ExpatBuilder.external_entity_ref_handlerc             C   s4   | j d kr| j rt| _| j| j _| j|| d S )N)rG   rT   r   r   start_element_handlerrP   rY   )r   r;   
attributesr   r   r   rX   Z  s    z"ExpatBuilder.first_element_handlerc             C   s   | j j|}t| j| || _|rtxPtdt|dD ]<}tj|| td t	}||d  }||_
| j |_t|| q4W || j jk	r| j| d S )Nr   r   r   )rR   ZcreateElementr	   rS   ranger9   r   Attrr   r   r   r   r
   rv   rH   )r   r;   r   r   iar   r   r   r   r   `  s    z"ExpatBuilder.start_element_handlerc             C   sj   | j rf|| jjkrd S | j j|}|tkr4t|  n|tkrFt|  nd S |j| _	|jj
| |j  d S )N)rG   rR   rv   startContainerr   RejecterFILTER_SKIPSkipper
parentNoderS   r   unlink)r   r   Zfiltr   r   r   rH   q  s    

z"ExpatBuilder._finish_start_elementc             C   s   | j }|j| _ | j| d S )N)rS   r   r   )r   r;   rS   r   r   r   rZ     s    z ExpatBuilder.end_element_handlerc             C   s\   | j j|j}|r| j|| | jrX|| jjkr4d S | jj|tkrX| j	j
| |j  d S )N)rT   getr   _handle_white_text_nodesrG   rR   rv   r   r   rS   r   r   )r   rS   r%   r   r   r   r     s    z ExpatBuilder._finish_end_elementc             C   sf   | j js|j  rd S g }x.|jD ]$}|jtkr"|jj  r"|j| q"W x|D ]}|j	| qPW d S )N)
rD   Zwhitespace_in_element_contentr*   r   r   r   r   stripr   r   )r   r   r%   Lr   r   r   r   r     s    

z%ExpatBuilder._handle_white_text_nodesc             C   s0   | j j|}|d kr&t||| j |< n||_d S )N)rT   r   r   r   )r   r;   r   r%   r   r   r   ro     s    z!ExpatBuilder.element_decl_handlerc          	   C   sF   | j j|}|d kr&t|}|| j |< |jjd |d d |d||g d S )Nr   )rT   r   r   r   r   )r   elemr;   r)   defaultZrequiredr%   r   r   r   rp     s    
z!ExpatBuilder.attlist_decl_handlerc             C   s2   || j _|| j _|dkr.|r&d| j _nd| j _d S )Nr   TF)rR   versionencoding
standalone)r   r   r   r   r   r   r   rn     s    
zExpatBuilder.xml_decl_handler)N) r.   r/   r0   __doc__r   rM   rP   rJ   rO   r|   r~   rw   rV   r   r\   ri   rk   r^   r`   rc   re   rg   rl   rX   r   rH   rZ   r   r   ro   rp   rn   r   r   r   r   rC      s:   
rC   c               @   s   e Zd ZdZd
Zdd Zdd Zdd Zej	e
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jeje
jej e
j!iZ"d	S )rF   zoWrapper around a DOMBuilderFilter which implements the checks
    to make the whatToShow filter attribute work.rE   c             C   s
   || _ d S )N)rE   )r   rE   r   r   r   r     s    z#FilterVisibilityController.__init__c             C   sT   | j |j }| jj|@ rL| jj|}|tkr0t|tkrHtdt	| |S t
S d S )Nz)startContainer() returned illegal value: )_nodetype_maskr   rE   
whatToShowr   FILTER_INTERRUPTrx   _ALLOWED_FILTER_RETURNSr:   reprr   )r   r   maskvalr   r   r   r     s    z)FilterVisibilityController.startContainerc             C   s   | j |j }| jj|@ r| jj|}|tkr0t|tkrd|j}x |j	d d  D ]}|j
| qNW tS |tkr|tdt| |S tS d S )Nz%acceptNode() returned illegal value: )r   r   rE   r   r   r   rx   r   r   r   ZappendChildr   r   r:   r   r   )r   r   r   r   parentr   r   r   r   r     s    z%FilterVisibilityController.acceptNodeN)rE   )#r.   r/   r0   r   r1   r   r   r   r   ZELEMENT_NODEr   ZSHOW_ELEMENTZATTRIBUTE_NODEZSHOW_ATTRIBUTEr   Z	SHOW_TEXTr   ZSHOW_CDATA_SECTIONZENTITY_REFERENCE_NODEZSHOW_ENTITY_REFERENCEZENTITY_NODEZSHOW_ENTITYZPROCESSING_INSTRUCTION_NODEZSHOW_PROCESSING_INSTRUCTIONZCOMMENT_NODEZSHOW_COMMENTDOCUMENT_NODEZSHOW_DOCUMENTZDOCUMENT_TYPE_NODEZSHOW_DOCUMENT_TYPEZDOCUMENT_FRAGMENT_NODEZSHOW_DOCUMENT_FRAGMENTZNOTATION_NODEZSHOW_NOTATIONr   r   r   r   r   rF     s"   rF   c               @   s   e Zd ZdZdd ZdS )	FilterCrutch_builder_level
_old_start_old_endc             C   s6   d| _ || _|j}|j| _|j| _| j|_| j|_d S )Nr   )	r   r   rI   rY   r   r[   r   r   rZ   )r   r3   rq   r   r   r   r     s    zFilterCrutch.__init__N)r   r   r   r   )r.   r/   r0   r1   r   r   r   r   r   r     s   r   c               @   s(   e Zd Zf Zdd Zdd Zdd ZdS )r   c             C   s0   t j| | |j}xdD ]}t||d  qW d S )Nr]   rd   rj   rf   rh   rm   )r]   rd   rj   rf   rh   rm   )r   r   rI   setattr)r   r3   rq   r;   r   r   r   r     s        zRejecter.__init__c             G   s   | j d | _ d S )Nr   )r   )r   argsr   r   r   r     s    zRejecter.start_element_handlerc             G   s@   | j dkr0| jj}| jj| | j|_| j|_n| j d | _ d S )Nr   r   )r   r   rI   rO   r   rY   r   r[   )r   r   rq   r   r   r   rZ      s    

zRejecter.end_element_handlerN)r.   r/   r0   r1   r   r   rZ   r   r   r   r   r     s   r   c               @   s    e Zd Zf Zdd Zdd ZdS )r   c             G   s.   | j j}| j|  | j j|k	r*| jd | _d S )Nr   )r   rS   r   r   )r   r   r   r   r   r   r   -  s    
zSkipper.start_element_handlerc             G   sD   | j dkr*| j| jj_| j| jj_d | _n| j d | _ | j|  d S )Nr   r   )r   r   r   rI   rY   r   r[   )r   r   r   r   r   rZ   3  s    
zSkipper.end_element_handlerN)r.   r/   r0   r1   r   rZ   r   r   r   r   r   *  s   r   z8http://xml.python.org/entities/fragment-builder/internalz<!DOCTYPE wrapper
  %%s [
  <!ENTITY fragment-builder-internal
    SYSTEM "%s">
%%s
]>
<wrapper %%s
>&fragment-builder-internal;</wrapper>c               @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )FragmentBuilderzBuilder which constructs document fragments given XML source
    text and a context node.

    The context node is expected to provide information about the
    namespace declarations which are in scope at the start of the
    fragment.
    Nc             C   s6   |j tkr|| _|| _n|j| _|| _tj| | d S )N)r   r   originalDocumentr   r   rC   r   )r   r   rK   r   r   r   r   [  s    
zFragmentBuilder.__init__c             C   s   t j|  d | _d S )N)rC   rJ   fragment)r   r   r   r   rJ   d  s    
zFragmentBuilder.resetc             C   s   | j |j S )zRParse a document fragment from a file object, returning the
        fragment node.)r~   rt   )r   ry   r   r   r   r|   h  s    zFragmentBuilder.parseFilec       	   	   C   s   || _ | j }| jj}d}|rV|jp*| j }|jrDd|j|jf }qZ|jrZd|j }nd}| j }t	|||f }y|j
|d W n   | j   Y nX | j}| j  |S )zMParse a document fragment from a string, returning the
        fragment node.rs   zPUBLIC "%s" "%s"zSYSTEM "%s"r   )_sourcerP   r   r   r   _getDeclarationsr   r   _getNSattrs_FRAGMENT_BUILDER_TEMPLATEru   rJ   r   )	r   r}   rq   r   Zidentr   ZnsattrsrR   r   r   r   r   r~   m  s,    zFragmentBuilder.parseStringc             C   s  | j jj}d}|rxbt|jjD ]R}|jj|}|r>|d }d||jf }|jrfd||j|j	f }q"d||j	f }q"W xt|j
jD ]}|j
j|}|r|d }d||jf }|jrd||j|j	f }n&|j	rd||j	f }nd	||jjf }|jrd
||jf }|d }qW |S )zRe-create the internal subset from the DocumentType node.

        This is only needed if we don't already have the
        internalSubset as a string.
        rs   z
  z%s<!NOTATION %sz!%s PUBLIC "%s"
             "%s">z%s SYSTEM "%s">z%s<!ENTITY %sz %s PUBLIC "%s"
             "%s"z%s SYSTEM "%s"z%s "%s"z%s NOTATION %s>)r   r   r   r   r   ZlengthitemZnodeNamer   r   r   Z
firstChildr   r   )r   r   r4   r   Znotationr   r   r   r   r     s6    
z FragmentBuilder._getDeclarationsc             C   s   dS )Nrs   r   )r   r   r   r   r     s    zFragmentBuilder._getNSattrsc             C   s~   |t krh| j}| j}| jj|}| j| _| jj | _| j| _z|j| j	d W d || _|| _d | _	X dS t
j| ||||S d S )Nr   r   )$_FRAGMENT_BUILDER_INTERNAL_SYSTEM_IDrR   rS   rI   ZExternalEntityParserCreater   ZcreateDocumentFragmentr   ru   r   rC   rl   )r   r   r   r   r   Zold_documentZold_cur_noderq   r   r   r   rl     s    z+FragmentBuilder.external_entity_ref_handler)N)r.   r/   r0   r   r   rJ   r|   r~   r   r   rl   r   r   r   r   r   R  s   
	$r   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )
Namespacesz7Mix-in class for builders; adds support for namespaces.c             C   s
   g | _ d S )N)_ns_ordered_prefixes)r   r   r   r   _initNamespaces  s    zNamespaces._initNamespacesc             C   s   t jdd}d|_|S )z'Create a new namespace-handling parser.r6   )Znamespace_separatorT)r   rL   Znamespace_prefixes)r   rq   r   r   r   rM     s    zNamespaces.createParserc             C   s    t j| | | jjr| j|_dS )z.Insert the namespace-handlers onto the parser.N)rC   rO   rD   Znamespace_declarationsstart_namespace_decl_handlerZStartNamespaceDeclHandler)r   rq   r   r   r   rO     s    zNamespaces.installc             C   s   | j j||f dS )z/Push this namespace declaration on our storage.N)r   r   )r   r@   r>   r   r   r   r     s    z'Namespaces.start_namespace_decl_handlerc             C   s  d|krt | |\}}}}nt}|}d }t}tj||||}| j|_t| j| || _| j	rxZ| j	D ]P\}}|rtj
t| d| t|d}ntj
dtdt}||_| j|_t|| qdW | j	d d = |r|j  |j}	|j}
xtdt|dD ]}|| }||d  }d|krJt | |\}}}}tj
||||}||	|< ||
||f< n$tj
|t|t}||	|< ||
t|f< | j|_||_||_qW d S )Nr6   zxmlns:xmlnsr   r   r   )rB   r   r   r   ZElementrR   r   r	   rS   r   r   r5   r   r   r
   Z_ensure_attributes_attrs_attrsNSr   r9   ZownerElement)r   r;   r   r>   r?   r@   rA   r   r   r   r   r   r$   r   r   r   r   r     sP    
z Namespaces.start_element_handlerN)	r.   r/   r0   r   r   rM   rO   r   r   r   r   r   r   r     s   /r   c               @   s   e Zd ZdZdd ZdS )ExpatBuilderNSz*Document builder that supports namespaces.c             C   s   t j|  | j  d S )N)rC   rJ   r   )r   r   r   r   rJ   )  s    
zExpatBuilderNS.resetN)r.   r/   r0   r   rJ   r   r   r   r   r   &  s   r   c               @   s    e Zd ZdZdd Zdd ZdS )FragmentBuilderNSz*Fragment builder that supports namespaces.c             C   s   t j|  | j  d S )N)r   rJ   r   )r   r   r   r   rJ   1  s    
zFragmentBuilderNS.resetc             C   s   d}| j }g }xv|rt|dr|x\|jj D ]N\}}||kr<q*|j| |rTd| }nd}|rld|||f }q*d||f }q*W |j}qW |S )zNReturn string of namespace attributes from this element and
        ancestors.rs   _ns_prefix_urizxmlns:r   z%s
    %s='%s'z %s='%s')r   hasattrr   itemsr   r   )r   attrsr   r   r@   r>   Zdeclnamer   r   r   r   5  s"    



zFragmentBuilderNS._getNSattrsN)r.   r/   r0   r   rJ   r   r   r   r   r   r   .  s   r   c               @   s   e Zd ZdZdS )rx   zEException raised to short-circuit parsing in InternalSubsetExtractor.N)r.   r/   r0   r   r   r   r   r   rx   S  s   rx   c               @   sL   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )r   zBXML processor which can rip out the internal document type subset.Nc             C   s   | j S )z'Return the internal subset as a string.)r   )r   r   r   r   r   \  s    z!InternalSubsetExtractor.getSubsetc             C   s*   yt j| | W n tk
r$   Y nX d S )N)rC   r|   rx   )r   ry   r   r   r   r|   `  s    z!InternalSubsetExtractor.parseFilec             C   s*   yt j| | W n tk
r$   Y nX d S )N)rC   r~   rx   )r   r}   r   r   r   r~   f  s    z#InternalSubsetExtractor.parseStringc             C   s   | j |_| j|_d S )N)rV   rW   r   rY   )r   rq   r   r   r   rO   l  s    zInternalSubsetExtractor.installc             C   s0   |r&| j  }g | _| jj|_| j|_nt d S )N)rP   r   r   ZDefaultHandlerr   r   rx   )r   r;   r   r   r   rq   r   r   r   rV   p  s    

z2InternalSubsetExtractor.start_doctype_decl_handlerc             C   s,   dj | jjddjdd}|| _t d S )Nrs   z

)joinr   replacerx   )r   r4   r   r   r   r   z  s    z0InternalSubsetExtractor.end_doctype_decl_handlerc             C   s
   t  d S )N)rx   )r   r;   r   r   r   r   r     s    z-InternalSubsetExtractor.start_element_handler)r.   r/   r0   r   r   r   r|   r~   rO   rV   r   r   r   r   r   r   r   W  s   
r   Tc          	   C   sL   |rt  }nt }t| tr>t| d}|j|}W dQ R X n
|j| }|S )z{Parse a document, returning the resulting Document node.

    'file' may be either a file name or an open file object.
    rbN)r   rC   
isinstancestropenr|   )ry   
namespacesr3   fpresultr   r   r   parse  s    

r   c             C   s   |rt  }nt }|j| S )zOParse a document from a string, returning the resulting
    Document node.
    )r   rC   r~   )r}   r   r3   r   r   r   r~     s    r~   c          	   C   sP   |rt |}nt|}t| trBt| d}|j|}W dQ R X n
|j| }|S )zParse a fragment of a document, given the context from which it
    was originally extracted.  context should be the parent of the
    node(s) which are in the fragment.

    'file' may be either a file name or an open file object.
    r   N)r   r   r   r   r   r|   )ry   r   r   r3   r   r   r   r   r   parseFragment  s    


r   c             C   s    |rt |}nt|}|j| S )zParse a fragment of a document from a string, given the context
    from which it was originally extracted.  context should be the
    parent of the node(s) which are in the fragment.
    )r   r   r~   )r}   r   r   r3   r   r   r   parseFragmentString  s    
r   c             C   s   | j rt| S t| S dS )z,Create a builder based on an Options object.N)r   r   rC   )rK   r   r   r   makeBuilder  s    r   )T)T)T)T)3r   Zxml.domr   r   r   r   r   r   Zxml.parsersr   Zxml.dom.minidomr	   r
   Zxml.dom.NodeFilterr   r   r   r   ZDOMBuilderFilterr   r   r   r   ZgetDOMImplementationrQ   ZTypeInfor"   objectr   r5   rB   rC   r   rF   r   r   r   r   r   r   r   r   r   	Exceptionrx   r   r   r~   r   r   r   r   r   r   r   <module>   s^   







3  C
:u_%,



