a
    dKx                     @   s(  d Z ddlmZ ddlmZ ddlZddlmZ ddlm  m	Z
 ddlmZ ddlmZmZmZmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZ ddlmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z, ddgZ-G dd dej.Z/G dd dej.Z0dyddZ1dzddZ2d{ddZ3d|ddZ4d}ddZ5d~ddZ5dd!d"Z6e*e6d d#e6d$d%d&d'e6d(d)d*d+d,d-d&d.e6d/d&d+d,d(d)d*d0d1e6d2d&d$d3e6d4d&d$d3e6d5d&d$d3e6d6d$d7e6d8d&eed9e6d:d&eed9e6d;d&eed9e6d<d&eed9e6d=d&eed9e6d>d&eed9e6d?d&d@dAdBe6dCd&d@dAdBe6dDd&dEdFdAdGdHe6 e6dId&d$d3e6dJd&d$d3e6dKd&d$d3e6 dLZ7e+de/dMdNdOZ8e+de/dMdPdQZ9e+de/dMdRdSZ:e+de/dMdTdUZ;e+de/dMdVdWZ<e+de/dMdXdYZ=e+de/dMdZd[Z>e+de/dMd\d]Z?e+de/dMd^d_Z@e+de/dMd`daZAe+de/dMdbdcZBe+de/dMdddeZCe+de/dMdfdgZDe+de/dMdhdiZEe+de/dMdjdkZFe+de/dMdldmZGe+de/dMdndoZHe+de/dMdpdqZIe+de/dMdrdsZJe+de/dMdtduZKe,eLdvdwdx dS )z MobileNet V3

A PyTorch impl of MobileNet-V3, compatible with TF weights from official impl.

Paper: Searching for MobileNetV3 - https://arxiv.org/abs/1905.02244

Hacked together by / Copyright 2019, Ross Wightman
    )partial)ListN)
checkpoint)IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STDIMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)SelectAdaptivePool2dLinearcreate_conv2dget_norm_act_layer   )build_model_with_cfgpretrained_cfg_for_features)SqueezeExcite)EfficientNetBuilderdecode_arch_defefficientnet_init_weightsround_channelsresolve_bn_argsresolve_act_layerBN_EPS_TF_DEFAULT)FeatureInfoFeatureHooks)checkpoint_seq)generate_default_cfgsregister_modelregister_model_deprecationsMobileNetV3MobileNetV3Featuresc                       s   e Zd ZdZdddddddd	d	d	ded
d
df fdd	Zdd Zejj	dddZ
ejj	d ddZejj	dd Zd!ddZdd Zd"edddZdd Z  ZS )#r   a   MobiletNet-V3

    Based on my EfficientNet implementation and building blocks, this model utilizes the MobileNet-v3 specific
    'efficient head', where global pooling is done before the head convolution without a final batch-norm
    layer before the classifier.

    Paper: `Searching for MobileNetV3` - https://arxiv.org/abs/1905.02244

    Other architectures utilizing MobileNet-V3 efficient head that are supported by this impl include:
      * HardCoRe-NAS - https://arxiv.org/abs/2102.11646 (defn in hardcorenas.py uses this class)
      * FBNet-V3 - https://arxiv.org/abs/2006.02049
      * LCNet - https://arxiv.org/abs/2109.15099
            F   T N        avgc              
      s2  t t|   |	ptj}	|
p tj}
t|
|	}|p2t}|| _|| _	|| _
d| _|sX||}t||dd|d| _||dd| _td||||	|
||d}tj||| | _|j| _|j}t|d	| _|| j  }t|| j	d
||d| _|	dd| _|rtd
nt | _|dkrt| j	|nt | _t|  d S )NFr!      ZstridepaddingTZinplace    )output_stridepad_typeround_chs_fnse_from_exp	act_layer
norm_layerse_layerdrop_path_rateZ	pool_typer   )r)   Zbiasr   ) superr   __init__nnReLUBatchNorm2dr   r   num_classesnum_features	drop_rategrad_checkpointingr   	conv_stembn1r   
Sequentialblocksfeaturesfeature_infoZin_chsr	   global_poolZ	feat_mult	conv_headact2FlattenIdentityflattenr
   
classifierr   )self
block_argsr:   in_chans	stem_sizefix_stemr;   	head_biasr-   r0   r1   r2   r/   r.   r<   r3   rD   Znorm_act_layerbuilderZhead_chsZnum_pooled_chs	__class__ `/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/mobilenetv3.pyr6   -   sB    



 zMobileNetV3.__init__c                 C   sV   | j | jg}|| j || j| j| jg |t t	| j
| jg tj| S N)r>   r?   extendrA   rD   rE   rF   r7   rG   ZDropoutr<   rJ   r@   )rK   ZlayersrT   rT   rU   as_sequentiali   s
    zMobileNetV3.as_sequentialc                 C   s   t d|rdnddS )Nz^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))stemrA   )dict)rK   ZcoarserT   rT   rU   group_matcherp   s    
zMobileNetV3.group_matcherc                 C   s
   || _ d S rV   r=   rK   enablerT   rT   rU   set_grad_checkpointingw   s    z"MobileNetV3.set_grad_checkpointingc                 C   s   | j S rV   )rJ   )rK   rT   rT   rU   get_classifier{   s    zMobileNetV3.get_classifierc                 C   sL   || _ t|d| _|r tdnt | _|dkr>t| j|nt | _	d S )Nr4   r   r   )
r:   r	   rD   r7   rG   rH   rI   r
   r;   rJ   )rK   r:   rD   rT   rT   rU   reset_classifier   s    zMobileNetV3.reset_classifierc                 C   sD   |  |}| |}| jr6tj s6t| j|dd}n
| |}|S )NT)rI   )r>   r?   r=   torchjitis_scriptingr   rA   rK   xrT   rT   rU   forward_features   s    


zMobileNetV3.forward_features)
pre_logitsc                 C   sX   |  |}| |}| |}| |}|r0|S | jdkrNtj|| j| jd}| |S )Nr%   )ptraining)	rD   rE   rF   rI   r<   FZdropoutrj   rJ   )rK   rf   rh   rT   rT   rU   forward_head   s    




zMobileNetV3.forward_headc                 C   s   |  |}| |}|S rV   )rg   rl   re   rT   rT   rU   forward   s    

zMobileNetV3.forward)F)T)r&   )F)__name__
__module____qualname____doc__r   r6   rX   rb   rc   ignorer[   r_   r`   ra   rg   boolrl   rm   __classcell__rT   rT   rR   rU   r      s8   <

	c                       sd   e Zd ZdZddddddded	d
d
d
ddf fdd	ZejjdddZ	e
ej dddZ  ZS )r   z MobileNetV3 Feature Extractor

    A work-in-progress feature extraction module for MobileNet-V3 to use as a backbone for segmentation
    and object detection models.
    )r   r   r'   r!      
bottleneckr!   r"   Fr+   r$   TNr%   c                    s   t t|   |ptj}|p tj}|p(t}|| _d| _|sB|	|}t	||dd|d| _
||| _|dd| _t|||	|
|||||d	}tj||| | _t|j | _ fdd	t| jD | _t|  d | _|d
kr| jjdd}t||  | _d S )NFr!   r'   r(   Tr*   )	r,   r-   r.   r/   r0   r1   r2   r3   feature_locationc                    s"   i | ]\}}| v r|d  |qS )ZstagerT   ).0ivout_indicesrT   rU   
<dictcomp>       z0MobileNetV3Features.__init__.<locals>.<dictcomp>rv   )moduleZ	hook_type)keys)r5   r   r6   r7   r8   r9   r   r<   r=   r   r>   r?   act1r   r@   rA   r   rB   rC   	enumerate_stage_out_idxr   feature_hooksZ	get_dictsr   Znamed_modules)rK   rL   r|   rw   rM   rN   rO   r,   r-   r.   r/   r0   r1   r2   r<   r3   rQ   hooksrR   r{   rU   r6      s<    


zMobileNetV3Features.__init__c                 C   s
   || _ d S rV   r\   r]   rT   rT   rU   r_      s    z*MobileNetV3Features.set_grad_checkpointingreturnc                 C   s   |  |}| |}| |}| jd u rg }d| jv r@|| t| jD ]D\}}| jrnt	j
 snt||}n||}|d | jv rJ|| qJ|S | | | j|j}t| S d S )Nr   r   )r>   r?   r   r   r   appendr   rA   r=   rb   rc   rd   r   Z
get_outputZdevicelistvalues)rK   rf   rB   ry   boutrT   rT   rU   rm      s"    






zMobileNetV3Features.forward)T)rn   ro   rp   rq   r   r6   rb   rc   rr   r_   r   ZTensorrm   rt   rT   rT   rR   rU   r      s&   	8Fc                 K   sT   d}t }d }|ddr$d}d}t}t|| |f| |d|}|rPt|j|_|S )NFfeatures_onlyT)r:   r;   Z	head_convrP   rD   )Zpretrained_strictkwargs_filter)r   popr   r   r   Zdefault_cfg)variant
pretrainedkwargsr   Z	model_clsr   modelrT   rT   rU   _create_mnv3   s(    r         ?c                 K   s   dgddgdgg ddgdgdgg}t f t|d	tt|d
ttjfi t|t|dttddd|}t	| |fi |}|S )Creates a MobileNet-V3 model.

    Ref impl: ?
    Paper: https://arxiv.org/abs/1905.02244

    Args:
      channel_multiplier: multiplier to number of channels per layer.
    Zds_r1_k3_s1_e1_c16_nre_noskipir_r1_k3_s2_e4_c24_nreir_r1_k3_s1_e3_c24_nreir_r3_k5_s2_e3_c40_se0.25_nreZir_r1_k3_s2_e6_c80zir_r1_k3_s1_e2.5_c80zir_r2_k3_s1_e2.3_c80ir_r2_k3_s1_e6_c112_se0.25ir_r3_k5_s2_e6_c160_se0.25cn_r1_k1_s1_c960F
multiplier
hard_swishhard_sigmoid)
gate_layer)rL   rP   r.   r1   r0   r2   )
rZ   r   r   r   r7   r9   r   r   r   r   r   channel_multiplierr   r   arch_defmodel_kwargsr   rT   rT   rU   _gen_mobilenet_v3_rw  s(    

	r   c           
      K   s@  d| v rld}d| v r@t |d}dgddgdd	gd
gdgdgg}qt |d}dgddgddgdgdgdgg}njd}d| v rt |d}dgddgdgg ddgdgdgg}n.t |d}dgdd gd!gg dd"gd#gdgg}ttd$tjtd%}tf t||d&|d'k tt|d(ttjfi t	|||d)|}t
| |fi |}	|	S )*r   smalli   ZminimalZreluZds_r1_k3_s2_e1_c16zir_r1_k3_s2_e4.5_c24zir_r1_k3_s1_e3.67_c24Zir_r1_k3_s2_e4_c40Zir_r2_k3_s1_e6_c40Zir_r2_k3_s1_e3_c48Zir_r3_k3_s2_e6_c96Zcn_r1_k1_s1_c576r   zds_r1_k3_s2_e1_c16_se0.25_nrezir_r1_k3_s2_e4.5_c24_nrezir_r1_k3_s1_e3.67_c24_nreir_r1_k5_s2_e4_c40_se0.25zir_r2_k5_s1_e6_c40_se0.25zir_r2_k5_s1_e3_c48_se0.25zir_r3_k5_s2_e6_c96_se0.25r#   Zds_r1_k3_s1_e1_c16Zir_r1_k3_s2_e4_c24Zir_r1_k3_s1_e3_c24Zir_r3_k3_s2_e3_c40r   Zir_r2_k3_s1_e6_c112Zir_r3_k3_s2_e6_c160r   Zds_r1_k3_s1_e1_c16_nrer   r   r   r   r   r   )r   force_act_layerrd_round_fnr"         ?r   )rL   r;   rN   rO   r.   r1   r0   r2   )r   r   r   r7   r8   r   rZ   r   r9   r   r   )
r   r   r   r   r;   r0   r   r2   r   r   rT   rT   rU   _gen_mobilenet_v33  sl    	




	r   c                 K   s.  |  dd }|dv rFd}dgddgdd	gd
dgddgg ddgg}nt|dkr~d}dgddgddgddgddgg ddgg}n<|dkrd}dgddgd d!gd"d#gd$d%gg d&d'gg}nttt|d(d)}ttd*|d+}t|d,}	tf t|d-d.||d.ttj	fi t
||	|d/	|}
t| |fi |
}|S )0z FBNetV3
    Paper: `FBNetV3: Joint Architecture-Recipe Search using Predictor Pretraining`
        - https://arxiv.org/abs/2006.02049
    FIXME untested, this is a preliminary impl of some FBNet-V3 variants.
    _)ar   r"   Zds_r2_k3_s1_e1_c16Zir_r1_k5_s2_e4_c24Zir_r3_k5_s1_e2_c24zir_r1_k5_s2_e5_c40_se0.25zir_r4_k5_s1_e3_c40_se0.25Zir_r1_k5_s2_e5_c72Zir_r4_k3_s1_e3_c72zir_r1_k3_s1_e5_c120_se0.25zir_r5_k5_s1_e3_c120_se0.25)zir_r1_k3_s2_e6_c184_se0.25zir_r5_k5_s1_e4_c184_se0.25zir_r1_k5_s1_e6_c224_se0.25Zcn_r1_k1_s1_c1344d   Zir_r1_k3_s2_e5_c24Zir_r5_k3_s1_e2_c24r   zir_r4_k3_s1_e3_c40_se0.25Zir_r1_k3_s2_e5_c72zir_r1_k3_s1_e5_c128_se0.25zir_r6_k5_s1_e3_c128_se0.25)zir_r1_k3_s2_e6_c208_se0.25zir_r5_k5_s1_e5_c208_se0.25zir_r1_k5_s1_e6_c240_se0.25Zcn_r1_k1_s1_c1440gr+   Zds_r3_k3_s1_e1_c24Zir_r1_k5_s2_e4_c40Zir_r4_k5_s1_e2_c40zir_r1_k5_s2_e4_c56_se0.25zir_r4_k5_s1_e3_c56_se0.25Zir_r1_k5_s2_e5_c104Zir_r4_k3_s1_e3_c104zir_r1_k3_s1_e5_c160_se0.25zir_r8_k5_s1_e3_c160_se0.25)zir_r1_k3_s2_e6_c264_se0.25zir_r6_k5_s1_e5_c264_se0.25zir_r2_k5_s1_e6_c288_se0.25Zcn_r1_k1_s1_c1728ffffff?)r   Zround_limitr   )r   r   r   i  F)	rL   r;   rP   rN   r.   r/   r1   r0   r2   )splitNotImplementedr   r   r   r   rZ   r   r7   r9   r   r   )r   r   r   r   ZvlrN   r   r.   r2   r0   r   r   rT   rT   rU   _gen_fbnetv3  sd    		


r   c                 K   s   dgdgdgddgdgdgg}t f t|dtt|d	ttjfi t|t|d
ttdtj	ddd|}t
| |fi |}|S a   LCNet
    Essentially a MobileNet-V3 crossed with a MobileNet-V1

    Paper: `PP-LCNet: A Lightweight CPU Convolutional Neural Network` - https://arxiv.org/abs/2109.15099

    Args:
      channel_multiplier: multiplier to number of channels per layer.
    Zdsa_r1_k3_s1_c32Zdsa_r2_k3_s2_c64Zdsa_r2_k3_s2_c128Zdsa_r1_k3_s2_c256Zdsa_r1_k5_s1_c256Zdsa_r4_k5_s1_c256zdsa_r2_k5_s2_c512_se0.25r"   r   r   r   )r   r   r#   )rL   rN   r.   r1   r0   r2   r;   rZ   r   r   r   r7   r9   r   r   r   r8   r   r   rT   rT   rU   
_gen_lcnet  s(    

r   c                 K   s   dgdgdgddgdgdgg}t f t|dtt|d	ttjfi t|t|d
ttdtj	ddd|}t
| |fi |}|S r   r   r   rT   rT   rU   r     s(    

r$   c                 K   s   | dddddt tddd
|S )	Nr    )r!      r   )   r   g      ?bilinearr>   rJ   )
urlr:   
input_size	pool_sizecrop_pctinterpolationmeanstdZ
first_convrJ   )r   r   )r   r   rT   rT   rU   _cfg  s    r   )r   Zbicubiczvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_large_100_ra-f55367f5.pthztimm/)r   r   	hf_hub_idr   )r%   r%   r%   )r   r   r   z+https://github.com/Alibaba-MIIL/ImageNet21KzarXiv:2104.10972v4zhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mobilenetv3_large_100_1k_miil_78_0-66471c13.pth)r   r   r   
origin_url	paper_idsr   r   z~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mobilenetv3_large_100_in21k_miil-d71cc17b.pthi+  )r   r   r   r   r   r   r   r:   zyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_small_050_lambc-4b7bbe87.pth)r   r   r   zyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_small_075_lambc-384766db.pthzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_small_100_lamb-266a294c.pthzmhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/mobilenetv3_100-35495452.pth)r   r   zvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_large_075-150ee8b0.pth)r   r   r   r   zvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_large_100-427764d5.pthz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_large_minimal_100-8596ae28.pthzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_small_075-da427f52.pthzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_small_100-37f49e2b.pthz~https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/tf_mobilenetv3_small_minimal_100-922a7843.pthzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetv3_b_224-ead5d2a1.pth)r!      r   r   )r   r   test_input_sizer   zkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetv3_d_224-c98bce42.pthzkhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/fbnetv3_g_240-0b1df83b.pth)r!      r   )r!      r   )   r   )r   r   r   r   r   r   zghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/lcnet_050-f447553b.pthzghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/lcnet_075-318cad2c.pthzghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/lcnet_100-a929038c.pth)zmobilenetv3_large_075.untrainedzmobilenetv3_large_100.ra_in1k(mobilenetv3_large_100.miil_in21k_ft_in1k mobilenetv3_large_100.miil_in21kzmobilenetv3_small_050.lamb_in1kzmobilenetv3_small_075.lamb_in1kzmobilenetv3_small_100.lamb_in1kzmobilenetv3_rw.rmsp_in1kztf_mobilenetv3_large_075.in1kztf_mobilenetv3_large_100.in1kz%tf_mobilenetv3_large_minimal_100.in1kztf_mobilenetv3_small_075.in1kztf_mobilenetv3_small_100.in1kz%tf_mobilenetv3_small_minimal_100.in1kzfbnetv3_b.ra2_in1kzfbnetv3_d.ra2_in1kzfbnetv3_g.ra2_in1kzlcnet_035.untrainedzlcnet_050.ra2_in1kzlcnet_075.ra2_in1kzlcnet_100.ra2_in1kzlcnet_150.untrainedr   c                 K   s   t dd| i|}|S ) MobileNet V3 mobilenetv3_large_075r   r   )r   r   r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )r   mobilenetv3_large_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )r   mobilenetv3_small_050      ?r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )r   mobilenetv3_small_075r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )r   mobilenetv3_small_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s"   | rt |d< tdd| i|}|S )r   bn_epsmobilenetv3_rwr   r   )r   r   )r   r   r   rT   rT   rU   r     s    r   c                 K   s&   t |d< d|d< tdd| i|}|S )r   r   samer-   tf_mobilenetv3_large_075r   r   )r   r   r   r   r   rT   rT   rU   r     s    r   c                 K   s&   t |d< d|d< tdd| i|}|S )r   r   r   r-   tf_mobilenetv3_large_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s&   t |d< d|d< tdd| i|}|S )r   r   r   r-    tf_mobilenetv3_large_minimal_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s&   t |d< d|d< tdd| i|}|S )r   r   r   r-   tf_mobilenetv3_small_075r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s&   t |d< d|d< tdd| i|}|S )r   r   r   r-   tf_mobilenetv3_small_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s&   t |d< d|d< tdd| i|}|S )r   r   r   r-    tf_mobilenetv3_small_minimal_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )z FBNetV3-B 	fbnetv3_br   )r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )z FBNetV3-D 	fbnetv3_dr   )r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )z FBNetV3-G 	fbnetv3_gr   )r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )z PP-LCNet 0.35	lcnet_035ffffff?r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )z PP-LCNet 0.5	lcnet_050r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S ) PP-LCNet 1.0	lcnet_075r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )r   	lcnet_100r   r   )r   r   r   r   rT   rT   rU   r     s    r   c                 K   s   t dd| i|}|S )z PP-LCNet 1.5	lcnet_150      ?r   )r   r   r   r   rT   rT   rU   r     s    r   r   r   )Zmobilenetv3_large_100_miilZ mobilenetv3_large_100_miil_in21k)F)r   F)r   F)r   F)r   F)r   F)r$   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)Mrq   	functoolsr   typingr   rb   Ztorch.nnr7   Ztorch.nn.functionalZ
functionalrk   Ztorch.utils.checkpointr   Z	timm.datar   r   r   r   Ztimm.layersr	   r
   r   r   Z_builderr   r   Z_efficientnet_blocksr   Z_efficientnet_builderr   r   r   r   r   r   r   Z	_featuresr   r   Z_manipulater   	_registryr   r   r   __all__Moduler   r   r   r   r   r   r   r   Zdefault_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rn   rT   rT   rT   rU   <module>   sX  $ Y

&
a
=
&
&

^	