
    ce{                        d Z ddlZddlZddlZddlZddlZddlZddlZ	 ddl	m
Z ddlmZ ddlmZ ddlZddlmZ ddlZddlmZ ddlmZ ddlZ ej:                  e      ZdgZ  ejB                  d	d
       ejD                  dddd       ejF                  ddd       ejH                  ddd       ejH                  ddd       ejB                  dddg dd      gZ%d  Z&d! Z'e(d"e)d#e*d$iZ+d% Z, G d& d'      Z-d( Z.d) Z/d* Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d:d7Z=d:d8Z>ed9k(  r e>        yy# e$ r
 ddlZdZY w xY w);zSample configuration generator

Tool for generating a sample configuration file. See
../doc/source/cli/generator.rst for details.

.. versionadded:: 1.4
    N)core)nodes)roles)cfg)_messageDEFAULTzoutput-filez1Path of the file to write to. Defaults to stdout.)helpz
wrap-widthF   z!The maximum length of help lines.)defaultminr	   	namespaceTzHOption namespace under "oslo.config.opts" in which to query for options.)requiredr	   minimalFz*Generate a minimal required configuration.)r   r	   	summarizezaOnly output summaries of help text to config files. Retain longer help text for Sphinx documents.formatzDesired format for the output.ini))r   z;The only format that can be used directly with oslo.config.)jsonz_Intended for third-party tools that want to write config files based on the sample config data.)yamlzSame as json)rstzzCan be used to dump the text given to Sphinx when building documentation using the Sphinx extension. Useful for debugging,format_)r	   r   choicesdestc                 .    | j                  t               y)a
  Register the formatter's CLI options with a ConfigOpts instance.

    Note, this must be done before the ConfigOpts instance is called to parse
    the configuration.

    :param conf: a ConfigOpts instance
    :raises: DuplicateOptError, ArgsAlreadyParsedError
    N)register_cli_opts_generator_opts)confs    7/usr/lib/python3/dist-packages/oslo_config/generator.pyr   r   a   s     	?+    c                    t        | t        j                        r9| j                  | j                  }nC| j                  sdg}n2| j                  }n$| j                  t        | j                        }n| j                  d}nt        | t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f	      rt        | j                        }nDt        | t        j                        r%t        | j                        j!                         }nt        | t        j"                  t        j$                  t        j&                  f      r#dj)                  d | j                  D              }nt        | t        j*                        r[t-        | j                  j/                         t1        j2                  d            }dj)                  |D cg c]  }d|z  	 c}      }n4t4        j7                  dt9        |              t        | j                        }|g}g }|D ]F  }t        |t
              st        |      }|j;                         |k7  rd	|z  }|j=                  |       H |S c c}w )
z*Return a list of formatted default values. <None>,c              3   2   K   | ]  }t        |        y wNstr).0ds     r   	<genexpr>z#_format_defaults.<locals>.<genexpr>   s     "?a3q6"?s   r   keyz%s:%szUnknown option type: %sz"%s")
isinstancer   MultiStrOptsample_defaultr   r&   StrOptIntOptFloatOptIPOptPortOptHostnameOptHostAddressOptURIOptOptBoolOptlowerListOpt_ConfigFileOpt_ConfigDirOptjoinDictOptsorteditemsoperator
itemgetterLOGwarningreprstripappend)optdefaultsdefault_strsorted_itemsiresultss         r   _format_defaultsrN   m   s   #s')))HtH{{H)c001K[[ "Kcjj#**cllCII!kk3??C<N<N!jj#''3 4 ckk*KS[[)ckk*002Kckk3+=+=!//1 2(("?3;;"??KS[[)!#++"3"3"5&.&9&9!&<>L((#FAGaK#FGKKK149=ckk*K=G $+s+k*K+- ;.K{#$ N $Gs   -Kzstring valuezinteger valuezfloating point valuec                 l    	 | j                   S # t        $ r Y nw xY w	 t        |    S # t        $ r Y yw xY w)z3Format the type name to use in describing an optionzunknown value)	type_nameAttributeError_TYPE_NAMESKeyError)opt_types    r   _format_type_namerU      sJ    !!! 8$$ s    	' 	33c                   <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
y)_OptFormatterz3Format configuration option descriptions to a file.Nc                 P   |xs t         j                  | _        |j                  xs d| _        |j                  | _        |j
                  | _        t        rt        j                  j                         D ]1  \  }}t        j                  ||      }t        j                  ||       3 t        j                  j                         D ]  \  }}t        j                  ||        dD ]<  }t        j                  |t        j                        }t        j                  ||       > yy)zConstruct an OptFormatter object.

        :param conf: The config object from _generator_opts
        :param output_file: a writeable file object
        i  )zoslo.config:optionzoslo.config:groupN)sysstdoutoutput_file
wrap_widthr   r   rst2txtsphinx_rolesgeneric_docrolesr@   docutils_rolesGenericRoleregister_local_rolespecific_docrolesdocutils_nodesstrong)selfr   r[   rolename	nodeclassgenericfuncs          r   __init__z_OptFormatter.__init__   s     '4#**//0S||'3'D'D'J'J'L F#)(44XyI228WEF #/"@"@"F"F"H C$228TBC H F(44X5C5J5JL228WEF r   c                    t         rot        j                  |t        j                         d| j                  i      j                         }d}|j                         D ]  }||rd|z   dz   ndz  } |g}|S | j                  dkD  rad}|j                         D ]G  }dj                  t        j                  || j                  dddd	            }||dk(  rd
n|z  }|dz  }I |g}|S d|z   dz   g}|S )zyFormat the help for a group or option to the output file.

        :param help_text: The text of the help string
        r\   )sourcewritersettings_overridesr    # 
z#
r   F)initial_indentsubsequent_indentbreak_long_wordsreplace_whitespace#)
r]   docutils_corepublish_stringWriterr\   decode
splitlinesr=   textwrapwrap)rf   	help_textlineslinewrappedtexts         r   _format_helpz_OptFormatter._format_help   s"   
 %44 ~~'$0$//#B fh	  E!,,. ?tt+>? GE  __q G!,,.  yytT__>BAE@EBG	"I J
 $"*3$64  IE  I%,-Er   c                 *    |y|dk(  ryt        |      S )Nr!   r    z''r%   )rf   choices     r   _get_choice_textz_OptFormatter._get_choice_text   s    >r\6{r   c                     t        |t        j                        r=|}d|j                  z  g}|j                  r'|| j                  |j                        z  }n|}d|z  g}| j                  |       y)zFormat the description of a group header to the output file

        :param group_or_groupname: a cfg.OptGroup instance or a name of group
        :returns: a formatted group description string
        z[%s]
N)r,   r   OptGroupnamer	   r   
writelines)rf   group_or_groupnamegroupr   	groupnames        r   format_groupz_OptFormatter.format_group   sg     (#,,7&E

*+Ezz**5::66*I	)*Er   c           	      
   |j                   s t        j                  d|j                         t	        |j
                        }d}|j                  r|j                   j                  d      sd}|j                   rz| j                  rW|j                   j                  d      }|d   j                  d      j                  d      }t        |      d	kD  r|d
z  }|dz  }n|j                   }||d|d}nd|z  }| j                  |      }t        |j
                  dd      4|j                  dj                  |j
                  j                                t        |j
                  dd      4|j                  dj                  |j
                  j"                               t        |j
                  dd      r}|j                  d       |j
                  j$                  D ]S  }	| j'                  |	      d|j
                  j$                  |	   xs d}|j)                  | j                  |             U 	 |j*                  r|j                  d       |j:                  D ]\  }|j<                  sd|j<                  vs|j                  d|j>                  xs |d|j<                  xs |j                  d        ^ |j                  r|j@                  r|j                  d!|j@                  z         n|j                  d"       |j                  d#       |jB                  r-|j)                  | j                  d$|jB                  z                |jD                  r|j                  d%       |jF                  r|j                  d&       tI        |j
                  d'      r1|j
                  jK                  |jL                  |jF                        }n8t        jO                  d(|j
                  |j<                  d)       tQ        |      }|D ]i  }|rd*|jS                  d d+      z   }| jT                  r"|j                  |j                  d,|d        H|j                  d-|j                  d,|d        k | jW                  |       y# t,        $ ry}
ddl}t1        |t2        j4                        s/|j7                  d|j                  d|j8                  d|
       n!|j7                  d|j                  d|
       Y d}
~
d}
~
ww xY w).zFormat a description of an option to the output file.

        :param opt: a cfg.Opt instance
        :param group_name: name of the group to which the opt is assigned
        :returns: a formatted opt description string
        z"%s" is missing a help stringr    
DEPRECATEDzDEPRECATED: 

r   :.   z%. For more information, refer to the zdocumentation.z ()z(%s)r   Nz# Minimum value: {}
maxz# Maximum value: {}
r   z# Possible values:
z - z<No description provided>z7# Note: This option can be changed without restarting.
zIncompatible option class for z): z"Failed to fully format sample for z: -z# Deprecated group/name - [z]/rq   z2# This option is deprecated for removal since %s.
z)# This option is deprecated for removal.
z3# Its value may be silently ignored in the future.
zReason: z# Advanced Option: intended for advanced users and not used
# by the majority of users, and might have a significant
# effect on stability and/or performance.
z#
# This option has a sample default set, which means that
# its actual default value may vary from the one documented
# below.
format_defaultszThe type for option %(name)s which is %(type)s is not a subclass of types.ConfigType and doesn't provide a 'format_defaults' method. A default formatter is not available so the best-effort formatter will be used.)typer    z
#    z =rv   ),r	   rC   rD   r   rU   r   deprecated_for_removal
startswithr   splitrstriplenr   getattrrG   r   r   r   r   r   extendmutablerQ   warningsr,   r   r7   warn	__class__deprecated_optsr   r   deprecated_sincedeprecated_reasonadvancedr.   hasattrr   r   debugrN   replacer   r   )rf   rH   
group_namerT   
opt_prefix_splitopt_helpr~   r   r   errr   r(   rI   rJ   s                  r   r   z_OptFormatter.format  s0    xxKK7B$SXX.
&&HH''5'J88 ~~/!!9++C077<v;? GGH 00H88'18XFI)I!!),388UD)5LL077EF388UD)5LL077EF388Y-LL/0((** ;))&1HH$$V,K0KKM	 T..y9:	;	/{{N, $$ 	JA vv#QVV+gg33QVV5Gsxx5GI J	J %%##I,,./ @BLLFH$$%%j33H3H&HIK <<LL> LL 388./xx//030B0BDH IIG 38846 (,H# 	DK!K$7$7i$HH||388[ABCHHkBC	D 	W  	/ c377+XXs}}c3
 "xx. /!	/s   4R 	T	A.TT	c                 :    | j                   j                  |       y)z]Write an arbitrary string to the output file.

        :param s: an arbitrary string
        N)r[   write)rf   ss     r   r   z_OptFormatter.write  s    
 	q!r   c                 :    | j                   j                  |       y)zvWrite an arbitrary sequence of strings to the output file.

        :param lines: a list of arbitrary strings
        N)r[   r   )rf   r   s     r   r   z_OptFormatter.writelines  s    
 	##E*r   r$   )__name__
__module____qualname____doc__rk   r   r   r   r   r   r    r   r   rW   rW      s,    =F4B B"+r   rW   c                    t        j                         }| D ]  \  }}||vrt        j                         ||<   |D ]  \  }}|rt        |dt        |            }|j	                         t
        v r|j	                         }n|j                         }||k7  r-t        j                  d||       t        |d      r||_
        n|}|||   vrt        j                         ||   |<   |D ]  }|||   |   |j                  <      |D 	cg c]6  }|||   D 	cg c]#  }	|	t        ||   |	   j                               f% c}	f8 }
}}	|
S c c}	w c c}	}w )a  Cleanup duplicate options in namespace groups

    Return a structure which removes duplicate options from a namespace group.
    NOTE:(rbradfor) This does not remove duplicated options from repeating
    groups in different namespaces:

    :param read_opts: a list (namespace, [(group, [opt_1, opt_2])]) tuples
    :returns: a list of (namespace, [(group, [opt_1, opt_2])]) tuples
    r   znormalizing group name %r to %r)collectionsOrderedDictr   r&   upperUPPER_CASE_GROUP_NAMESr9   rC   rD   r   r   r   listvalues)	read_optscleanr   listingr   optsr   normalized_gnrH   gcleaned_optss              r   _cleanup_optsr     s    ##%E' 8	7E!*668E)" 	8KE4 $UFCJ?
##%)??$.$4$4$6M$.$4$4$6M J.KK A: -/uf-%2
 -E),,*5*A*A*Ci ' 847i '18'	88<   
#I.0 eI.q188:;< 0 	1L  0s   E(E<EEc                     t         j                  j                  d| t        d      }|D cg c]  }|j                  |j
                  f c}S c c}w )zList the options available via the given namespaces.

    :param namespaces: a list of namespaces registered under 'oslo.config.opts'
    :returns: a list of (namespace, [(group, [opt_1, opt_2])]) tuples
    zoslo.config.optsF)nameson_load_failure_callbackinvoke_on_load	stevedorenamedNamedExtensionManagerr   r   plugin)
namespacesmgres      r   _get_raw_opts_loadersr     sL     //
/
/!9	 0 C
 ),,1QVVQXX,,,s   Ac                     t         j                  j                  d|z   | t        d      }|D cg c]  }|j                  |j
                  f c}S c c}w )Nzoslo.config.opts.F)r   r   r   r   r   )r   driver_option_namer   r   s       r   _get_driver_opts_loadersr     sP    
//
/
/%(::!9	 0 C
 ),,1QVVQXX,,,s   Ac                     i }t        ||       }|D ]C  \  }} |       j                         D ]&  \  }}|j                  |g       j                  |       ( E |S )ay  List the options available from plugins for drivers based on the option.

    :param driver_option_name: The name of the option controlling the
                               driver options.
    :param namespaces: a list of namespaces registered under
                       'oslo.config.opts.' + driver_option_name
    :returns: a dict mapping driver name to option list

    )r   r@   
setdefaultr   )r   r   all_optsloadersplugin_nameloaderdriver_nameoption_lists           r   _get_driver_optsr     sm     H&z3EFG& EV(.(8 	E$KR077D	EE Or   c                     t         j                  j                  d| dt        d      }|D cg c]  }|j                   c}S c c}w )Nzoslo.config.opts.defaultsF)r   warn_on_missing_entrypointr   r   )r   r   r   r   r   )r   r   eps      r   _get_opt_default_updatersr     sD    
//
/
/##(!9 0 C !$$"BII$$$s   Ac                 2    t        |       D ]	  } |         y)z7Let application hooks update defaults inside libraries.N)r   )r   updates     r   _update_defaultsr     s    +J7 r   c                 2   t        |       }t        |        g }|D ]  \  }}g } |       D ]  \  }}t        |      }t        |t        j
                        r|j                  rt        |j                  |       }i }	t        |j                               D ]>  \  }
}|	j                  |
g       j                  d |D               |j                  |       @ |j                  |	       |j                  ||f        |j                  ||f        t        |      S )a  List the options available via the given namespaces.

    Duplicate options from a namespace are removed.

    :param namespaces: a list of namespaces registered under 'oslo.config.opts'
    :returns: a list of (namespace, [(group, [opt_1, opt_2])]) tuples
    c              3   4   K   | ]  }|j                     y wr$   )r   )r'   os     r   r)   z_list_opts.<locals>.<genexpr>)  s      L2'(AFFL2s   )r   r   r   r,   r   r   driver_optionr   r?   r@   r   r   _save_driver_optsrG   r   )r   r   responser   r   namespace_valuesr   
group_optsdriver_optsdriver_opt_namesr   r   s               r   
_list_optsr     s7    $J/G Z  H$  7	6  "( 	9E: j)J%.&&"2++"#K (*$-3K4E4E4G-H 0)T )33KDKK L2,0L2 2"))$/0 ++,<=##UJ$783	94 	$456A 7B ""r   c                        r$   r   )argskwargss     r   r   r   2  s    	r   c                 
   | j                  |d   xs |       t        |d   t        j                  d            D ]{  \  }}| j	                  d|z         t        |t        j
                  d            D ]?  }	 | j                  r|j                  sn#| j	                  d       | j                  ||       A } y # t        $ r>}| j	                  d|j                  d       | j	                  d	|d       Y d }~d }~ww xY w)
Nobjectr   r   r*   z
#
# From %s
#
r   rq   z'# Warning: Failed to format sample for rp   )r   r?   rA   rB   r   
attrgetterr   r   r   	Exceptionr   )fr   
group_datar   r   rH   r   s          r   _output_optsr   6  s    NN:h'051#J|$<(0(;(;A(>@ +D	%	12$H$7$7
$CD 
	+C	+99S\\GGDMHHS%(
	++  +$ %C)**+s   :<B;;	D4C==Dc                     ddg di}| D ]c  \  }}|D ]Y  \  }}|s	|r|nd}t        |d      }|r|j                  n|}||vrdg d||<   |r|||   d<   ||   d   j                  ||f       [ e |S )a  Invert a list of groups by namespace into a dict by group name.

    :param conf_ns: a list of (namespace, [(<group>, [opt_1, opt_2])]) tuples,
                    such as returned by _list_opts.
    :returns: {<group_name>, {'object': <group_object>,
                              'namespaces': [(<namespace>, <opts>)]}}

    <group> may be a string or a group object.
    <group_name> is always a string.
    <group_object> will only be set if <group> was a group object in at least
    one namespace.

    Keying by group_name avoids adding duplicate group names in case a group is
    added as both an OptGroup and as a str, but still makes the additional
    OptGroup data available to the output code when possible.
    r   N)r   r   r   r   r   )r   r   rG   )conf_nsgroupsr   r   r   r   is_optgroupr   s           r   _get_groupsr  H  s    " D;<F% G	7" 
	GKE4"E	E!%0K'2J'04B%Gz"/4z"8,:|,33Y4EF
	GG Mr   c                 B   | j                   j                         D ci c]  \  }}|j                  d      s|| }}}||d<   t        |d   dd      r*t	        |d   j
                  j                               |d<   ng |d<   t        |d   dd      |d<   t        |d   dd      |d<   t        |d         |d<   g }|d   D ]P  }|j                  rd	|j                  vs|j                  |j                  xs ||j                  xs |d
   d       R ||d<   |S c c}}w )ar  Return a dict representing the passed in opt

    The dict will contain all public attributes of opt, as well as additional
    entries for namespace, choices, min, and max.  Any DeprecatedOpts
    contained in the deprecated_opts member will be converted to a dict with
    the format: {'group': <deprecated group>, 'name': <deprecated name>}

    :param opt: The Opt object to represent as a dict.
    :param group: The name of the group containing opt.
    :param namespace: The name of the namespace containing opt.
    :param conf: The ConfigOpts object containing the options for the
                 generator tool
    _r   r   r   Nr   r   r   r   r   )r   r   )
__dict__r@   r   r   r   r   rU   r   rG   r   )	rH   r   r   r   r+   valueentryr   deprecated_opts	            r   _build_entryr
  i  sC    +.,,*<*<*> )JCNN3' %Z )E )"E+
 uV}i.f 5 5 ; ; =>ii5=%6E%L5=%6E%L%eFm4E&MO 12  ""c1D1D&D""(..7%',,=f  /E
L3)s   Dc           	         i i i d}| j                         D ]"  \  }}g dd|d   |<   |d   D ]  }|d   D ]  }|d   r#j                  |d   j                                nj                  ddi d       t        |||d	   |      }d
   j	                  |       t        j                  |d         D ]K  }|j                  d      }	|d   }
|
j                  |	g        |d   |d<   ||d<   |
|	   j	                  |       M   d
   D cg c]  t        fdd   D              sd   ! }}|d<   % t        |      |d<   |S c c}w )a  Create data structure for machine readable sample config

    Returns a dictionary with the top-level keys 'options',
    'deprecated_options', and 'generator_options'.

    'options' contains a dict mapping group names to a list of options in
    that group.  Each option is represented by the result of a call to
    _build_entry.  Only non-deprecated options are included in this list.

    'deprecated_options' contains a dict mapping groups names to a list of
    opts from that group which were deprecated.

    'generator_options' is a dict mapping the options for the sample config
    generator itself to their values.

    :param groups: A dict of groups as returned by _get_groups.
    :param conf: The ConfigOpts object containing the options for the
                 generator tool
    )optionsdeprecated_optionsgenerator_optionsr    )r   r	   r  r   r   r   )dynamic_group_ownerr   r   r   r   r   r   r  r   replacement_namereplacement_groupc              3   8   K   | ]  }d    d   |   v   yw)r   r   Nr   )r'   r(   r   output_groups     r   r)   z2_generate_machine_readable_data.<locals>.<genexpr>  s,      = yL$?$BB =s   r   standard_optsr  )r@   r   _get_generator_datar
  rG   copydeepcopypopr   anydict)r  r   output_datar   r   r   rH   r  r	  r   r  r   non_driver_opt_namesr  s              ` @r   _generate_machine_readable_datar    s   ( !)+(*,K #),,. !=
J "B/-9Iz*#L1 	EI | Eh' ''"8,@@B !''/1)+')) 
 %S*ilDIV$++E2&*mmE:K4L&M EN*..w7E)45I)J&&11%<9>vN#56:DN#67&u-44^DEE	E4 "&) 
 = ,] ;= = fI 
  
 )=_%C!=F (,DzK#$ 
s   $Ec                 V    t        |j                               }| j                  |      S )zoslo_i18n yaml representer

    Returns a translated to the default locale string for yaml.safe_dump

    :param dumper: a SafeDumper instance passed by yaml.safe_dump
    :param data: a oslo_i18n._message.Message instance
    )r&   translationrepresent_str)dumperdataserializedDatas      r   i18n_representerr$    s(     ))+,N//r   c                 Z   t        | |      }|j                  dk(  rYt        j                  j	                  t
        j                  t               |j                  t        j                  |d             n&|j                  t        j                  |d             |j                  d       y)a  Write a machine readable sample config file

    Take the data returned by _generate_machine_readable_data and write it in
    the format specified by the format_ attribute of conf.

    :param groups: A dict of groups as returned by _get_groups.
    :param output_file: A file-like object to which the data should be written.
    :param conf: The ConfigOpts object containing the options for the
                 generator tool
    r   F)default_flow_styleT)	sort_keysrq   N)r  r   r   
SafeDumperadd_representerr   Messager$  r   	safe_dumpr   dumps)r  r[   r   r  s       r   _output_machine_readabler-    s     2&$?K||v''(8(8:JK$..<AC 	D 	$**[DABdr   c                     	 ddl m} t	        |j                  t        | d            }|j                  dj                  |             y# t        $ r t        d      w xY w)zWrite an RST formated version of the docs for the options.

    :param groups: A list of the namespaces to use for discovery.
    :param output_file: A file-like object to which the data should be written.
    r   )	sphinxextz@Could not import sphinxext. Please install Sphinx and try again.Frq   N)	oslo_configr/  ImportErrorRuntimeErrorr   _format_option_helprC   r   r=   )r   r[   r/  r  s       r   _output_human_readabler4    sd    
) y44Z  !Kdii,-  
3
 	

s   A	 	Ac                 \   | j                  t               d}|5| j                  rt        | j                  d      }d}nt        j
                  }t        t        | j                              }| j                  dk(  rit        | |      }t        |d|j                  d             t        |j                               D ]#  \  }}|j                  d       t        |||       % n5| j                  d	k(  rt!        | j                  |       nt#        ||| 
       |r|j%                          yy)a  Generate a sample config file.

    List all of the options available via the namespaces specified in the given
    configuration and write a description of them to the specified output file.

    :param conf: a ConfigOpts instance containing the generator's configuration
    FNwTr   )r[   r   r   r   )r[   r   )register_optsr   r[   openrY   rZ   r  r   r   r   rW   r   r  r?   r@   r   r4  r-  close)r   r[   own_filer  	formatterr   r   s          r   generater<    s	    	'Ht//5KH**KDNN34F||u!$K@	 	Y	6::i+@A "(!7 	7E:OOF#E:6	7 
	NN#	

 	!-8&*	,  r   c                 v   t         j                  j                  d      }t        j                  t        j
                         t        j                         }t        |       	  || |       t        |       y# t        j                  $ r+ |j                          t        j                  dd st         w xY w)z+The main function of oslo-config-generator.zoslo.config)level)versionr   N)	importlibmetadatar?  loggingbasicConfigWARNr   
ConfigOptsr   RequiredOptError
print_helprY   argv
SystemExitr<  )r   r?  r   s      r   mainrJ  2  s      ((7Ggll+>>DdT7# TN  xx|	s   $
A: :>B8__main__r$   )?r   r   r  importlib.metadatar@  r   rB  rA   rY   docutilsr   rw   docutils.parsers.rstr   rd   r   r`   r]   sphinxr^   r1  r|   r   r0  r   	oslo_i18nr   stevedore.namedr   	getLoggerr   rC   r   r/   r0   r-   r8   r   r   rN   r&   intfloatrR   rU   rW   r   r   r   r   r   r   r   r   r   r  r
  r  r$  r-  r4  r<  rJ  r   r   r   <module>rU     s  $       

.<<,    g!#  CJJ@B CJJ0	2
 COO
 CKK9; CKK12
 CJJ-	
 /&R	,'V 	!c+ c+L/d--$%1#h
+$B'T<~	0*.$*Z  zF s  Gs   E EE