hyb
2025-12-31 6cdcd01f77e11b72c323603e27ebdb85b15223c9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
Ë
oñúhçAãó—dZddlmZddlmZddlZddlmZddl    Z
ddl    m Z ddl m Zer ddlmZddlmZdd    „Zdd
„Zd „Zdd „Zdd d „Zd„Zd!d„Zd„Zd"d„Zd#d„Zd!d„Zd$d„Zd%d„Z    dd„Z ifd„Z!d&d„Z"d„Z#d„Z$d'd„Z%d„Z&d„Z'y)(zF
Module consolidating common testing functions for checking plotting.
é)Ú annotations)Ú TYPE_CHECKINGN)Ú is_list_like)ÚSeries)ÚSequence©ÚAxescóä—|r |€ td«‚t|«}|D]Q}|r;|j«€J‚t|j«j    «|«Œ@|j«€ŒQJ‚y)a)
    Check each axes has expected legend labels
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
    labels : list-like
        expected legend labels
    visible : bool
        expected legend visibility. labels are checked only when visible is
        True
    Nz-labels must be specified when visible is True)Ú
ValueErrorÚ_flatten_visibleÚ
get_legendÚ_check_text_labelsÚ    get_texts)ÚaxesÚlabelsÚvisibleÚaxs    úOH:\Change_password\venv_build\Lib\site-packages\pandas/tests/plotting/common.pyÚ_check_legend_labelsrsp€ñFNÜÐHÓIÐIÜ ˜DÓ !€DØò+ˆÙ Ø—=‘=“?Ð.Ð .Ð.Ü ˜rŸ}™}›×8Ñ8Ó:¸FÕ Cà—=‘=“?Ñ*Ð *Ð*ñ +ócóė|r |€ td«‚|r8|j«\}}|Dcgc]}|j«‘Œ}}||k(sJ‚y|j«J‚ycc}w)a
    Check ax has expected legend markers
 
    Parameters
    ----------
    ax : matplotlib Axes object
    expected_markers : list-like
        expected legend markers
    visible : bool
        expected legend visibility. labels are checked only when visible is
        True
    Nz.Markers must be specified when visible is True)r Úget_legend_handles_labelsÚ
get_markerr )rÚexpected_markersrÚhandlesÚ_ÚhandleÚmarkerss       rÚ_check_legend_markerr/sp€ñÐ$Ð,ÜÐIÓJÐJÙØ×1Ñ1Ó3‰
ˆØ5<Ö=¨66×$Ñ$Õ&Ð=ˆÐ=ØÐ*Ò*Ð*Ñ*à}‰}‹Ð&Ð&Ñ&ùò>s©Acó8—ddlm}|j«}|j«}t|«t|«k(sJ‚t    ||«D];\}}|j «}|j «}t j||«Œ=|jd«y)zŒ
    Check each axes has identical lines
 
    Parameters
    ----------
    xp : matplotlib Axes object
    rs : matplotlib Axes object
    rNÚall)    Úmatplotlib.pyplotÚpyplotÚ    get_linesÚlenÚzipÚ
get_xydataÚtmÚassert_almost_equalÚclose)    ÚxpÚrsÚpltÚxp_linesÚrs_linesÚxplÚrslÚxpdataÚrsdatas             rÚ _check_datar4Fsƒ€õ$à|‰|‹~€H؏|‰|‹~€Hä ˆx‹=œC ›MÒ )Ð)Ð )ܘ (Ó+ò/‰ˆˆSØ—‘Ó!ˆØ—‘Ó!ˆÜ
×јv vÕ.ð/ð
‡IIˆeÕrcó|—ddlm}t||«st|«s|g}|D]}|j    «|k(rŒJ‚y)zà
    Check each artist is visible or not
 
    Parameters
    ----------
    collections : matplotlib Artist or its list-like
        target Artist or its list or collection
    visible : bool
        expected visibility
    r)Ú
CollectionN)Úmatplotlib.collectionsr6Ú
isinstancerÚ get_visible)Ú collectionsrr6Úpatchs    rÚ_check_visibler<]sE€õ2ä k :Ô .´|ÀKÔ7PØ"mˆ àò.ˆØ× Ñ Ó" gÓ-Ð-Ð-ñ.rcól—t|«}|D]$}|jD]}|j|k(rŒJ‚Œ&y)z¹
    Check for each artist whether it is filled or not
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
    filled : bool
        expected filling
    N)r ÚpatchesÚfill)rÚfilledrr;s    rÚ_check_patches_all_filledrAqsB€ô ˜DÓ !€DØò(ˆØ—Z‘Zò    (ˆEØ—:‘: Ó'Ð 'Ð'ñ    (ñ(rcó—|j«}tt||««}|jDcgc]}||‘Œ    c}Scc}w©N)ÚuniqueÚdictr&Úvalues)ÚseriesÚcolorsrDÚmappedÚvs     rÚ_get_colors_mappedrK‚s<€Ø ]‰]‹_€Fô”#f˜fÓ%Ó &€FØ%Ÿ}™}Ö -˜!ˆF1‹IÒ -Ð-ùÒ -s´ AcóR—ddlm}ddlm}m}m}ddlm}|j}    |Ê|t||«}|dt|«}t|«t|«k(sJ‚t||«D]†\}
} t|
|«r"|
j«} |    j| «} n;t|
||f«rt|
j!«d«} n|
j!«} |    j| «} | | k(rŒ†J‚|·|t||«}|dt|«}t|«t|«k(sJ‚t||«D]r\}
} t|
|«r|
j#«d} n|
j#«} t| t$j&«r t| «} |    j| «} | | k(rŒrJ‚yy)aÿ
    Check each artist has expected line colors and face colors
 
    Parameters
    ----------
    collections : list-like
        list or collection of target artist
    linecolors : list-like which has the same length as collections
        list of expected line colors
    facecolors : list-like which has the same length as collections
        list of expected face colors
    mapping : Series
        Series used for color grouping key
        used for andrew_curves, parallel_coordinates, radviz test
    r)rH)r6ÚLineCollectionÚPolyCollection)ÚLine2DN)Ú
matplotlibrHr7r6rMrNÚmatplotlib.linesrOÚColorConverterrKr%r&r8Ú    get_colorÚto_rgbaÚtupleÚ get_edgecolorÚ get_facecolorÚnpÚndarray)r:Ú
linecolorsÚ
facecolorsÚmappingrHr6rMrNrOÚconvr;ÚcolorÚresultÚexpecteds              rÚ _check_colorsraŠs±€õ "÷ñõ
(à ×  Ñ  €DØÐØ Ð Ü+¨G°ZÓ@ˆJØ#Ð$6¤c¨+Ó&6Ð7ˆJä;Ó¤3 z£?Ò2Ð2Ð2Ü  ¨ZÓ8ò     &‰LˆE5ܘ% Ô(ØŸ™Ó*àŸ™ fÓ-‘ܘE N°NÐ#CÔDܘu×2Ñ2Ó4°QÑ7Ó8‘à×,Ñ,Ó.à—|‘| EÓ*ˆHؘXÓ%Ð %Ð%ð     &ðÐØ Ð Ü+¨G°ZÓ@ˆJØ#Ð$6¤c¨+Ó&6Ð7ˆJä;Ó¤3 z£?Ò2Ð2Ð2Ü  ¨ZÓ8ò     &‰LˆE5ܘ% Ô,à×,Ñ,Ó.¨qÑ1‘à×,Ñ,Ó.ä˜&¤"§*¡*Ô-ܘv›à—|‘| EÓ*ˆHؘXÓ%Ð %Ð%ñ     &ð rcóò—t|«s|j«|k(sJ‚y|Dcgc]}|j«‘Œ}}t|«t|«k(sJ‚t||«D] \}}||k(rŒ J‚ycc}w)a
    Check each text has expected labels
 
    Parameters
    ----------
    texts : matplotlib Text object, or its list-like
        target text, or its list
    expected : str or list-like which has the same length as texts
        expected text label, or its list
    N)rÚget_textr%r&)Útextsr`ÚtrÚlabelÚes      rrrÊs{€ô ˜Ô ؏~‰~Ó 8Ò+Ð+Ñ+à(-Ö. 1!—*‘*•,Ð.ˆÐ.ܐ6‹{œc (›mÒ+Ð+Ð+ܘF HÓ-ò    ‰HˆE1ؘA“:Ð :ñ    ùò/s¦A4cóú—ddlm}t|«}|D]d}|€|¬t|jj «|«r|j «}n#|j «|j d¬«z}|D]O}|$tj|j«|«|€Œ,tj|j«|«ŒQ|€|€Œ¹t|jj «|«r|j«}n#|j«|jd¬«z}|D]O}|$tj|j«|«|€Œ,tj|j«|«ŒQŒgy)ac
    Check each axes has expected tick properties
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
    xlabelsize : number
        expected xticks font size
    xrot : number
        expected xticks rotation
    ylabelsize : number
        expected yticks font size
    yrot : number
        expected yticks rotation
    r)Ú NullFormatterNT)Úminor) Úmatplotlib.tickerrir r8ÚxaxisÚget_minor_formatterÚget_xticklabelsr(r)Ú get_fontsizeÚ get_rotationÚyaxisÚget_yticklabels)    rÚ
xlabelsizeÚxrotÚ
ylabelsizeÚyrotrirrrfs             rÚ_check_ticks_propsrwÞsf€õ 0ä ˜DÓ !€DØóGˆØ Ð ! TÐ%5ܘ"Ÿ(™(×6Ñ6Ó8¸-ÔHð×+Ñ+Ó-‘à×+Ñ+Ó-°×0BÑ0BÈÐ0BÓ0NÑNàò GØÐ)Ü×*Ñ*¨5×+=Ñ+=Ó+?ÀÔLØÑ#Ü×*Ñ*¨5×+=Ñ+=Ó+?ÀÕFð     Gð Ð ! TÑ%5ܘ"Ÿ(™(×6Ñ6Ó8¸-ÔHØ×+Ñ+Ó-‘à×+Ñ+Ó-°×0BÑ0BÈÐ0BÓ0NÑNàò GØÐ)Ü×*Ñ*¨5×+=Ñ+=Ó+?ÀÔLØÑ#Ü×*Ñ*¨5×+=Ñ+=Ó+?ÀÕFò     Gñ+Grcó¤—t|«}|D]@}|jj«|k(sJ‚|jj«|k(rŒ@J‚y)zö
    Check each axes has expected scales
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
    xaxis : {'linear', 'log'}
        expected xaxis scale
    yaxis : {'linear', 'log'}
        expected yaxis scale
    N)r rlÚ    get_scalerq)rrlrqrs    rÚ_check_ax_scalesrz sS€ô ˜DÓ !€DØò-ˆØx‰x×!Ñ!Ó# uÒ,Ð,Ð,؏x‰x×!Ñ!Ó# uÓ,Ð,Ð,ñ-rcó\—ddlm}|€d}t|«}|5t|«|k(sJ‚|D] }t|j    ««dkDrŒ J‚|Št «}t «}||«D]N}|j «j«}    |j|    dd«|j|    dd«ŒPt|«t|«f}
|
|k(sJ‚tj|djj«tj|tj¬««y)až
    Check expected number of axes is drawn in expected layout
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
    axes_num : number
        expected number of axes. Unnecessary axes should be set to
        invisible.
    layout : tuple
        expected layout, (expected number of rows , columns)
    figsize : tuple
        expected figsize. default is matplotlib default
    r©Ú flatten_axesN)gš™™™™™@g333333@é)Údtype)Ú!pandas.plotting._matplotlib.toolsr}r r%Ú get_childrenÚsetÚ get_positionÚ
get_pointsÚaddr(Úassert_numpy_array_equalÚfigureÚget_size_inchesrXÚarrayÚfloat64) rÚaxes_numÚlayoutÚfigsizer}Ú visible_axesrÚx_setÚy_setÚpointsr_s            rÚ_check_axes_shaper’s€õ?à€ØˆÜ# DÓ)€LàÐܐ<Ó  HÒ,Ð,Ð,Øò    .ˆBär—‘Ó(Ó)¨AÓ-Ð -Ð-ð    .ðÐÜ“ˆÜ“ˆÙ˜tÓ$ò    $ˆBà—_‘_Ó&×1Ñ1Ó3ˆFØ I‰If˜Q‘i ‘lÔ #Ø I‰If˜Q‘i ‘lÕ #ð        $ô
e“*œc %›jÐ)ˆØ˜ÒÐÐä×ÑØQ‰×Ñ×.Ñ.Ó0Ü
‰¤§
¡
Ô+õrcól—ddlm}||«}|Dcgc]}|j«sŒ|‘Œ}}|Scc}w)zƒ
    Flatten axes, and filter only visible
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
 
    rr|)r€r}r9)rr}Ú axes_ndarrayrs    rr r Ks7€õ?á Ó%€LØ%Ö :2¨¯©Õ)9ŠBÐ :€DÐ :Ø €Kùò ;s“1©1cóėt|«}|D]P}|j}d}d}|D]+}t|dd«}t|dd«}    |r|dz }|    sŒ'|dz }Œ-||k(sJ‚||k(rŒPJ‚y)zø
    Check axes has expected number of errorbars
 
    Parameters
    ----------
    axes : matplotlib Axes object, or its list-like
    xerr : number
        expected number of x errorbar
    yerr : number
        expected number of y errorbar
    rÚhas_xerrFÚhas_yerrr~N)r Ú
containersÚgetattr)
rÚxerrÚyerrrr˜Ú
xerr_countÚ
yerr_countÚcr–r—s
          rÚ_check_has_errorbarsrŸ[s‘€ô ˜DÓ !€DØò "ˆØ—]‘]ˆ
؈
؈
Øò     ˆAܘq *¨eÓ4ˆHܘq *¨eÓ4ˆHÙØ˜a‘
ÚØ˜a‘‘
ð      ðzÒ!Ð!Ð!ؐzÓ!Ð!Ð!ñ "rcó6—ddlm}t|tdœ}|€P|€d}t    |||«sJ‚|dk(r5t    |j
|«sJ‚t    |j t«sJ‚yy|€t|«D]}t    ||«rŒJ‚yt    |t«sJ‚t|j««t|«k(sJ‚|j«D]Æ\}}t    |||«sJ‚|dk(r|sŒ|j«|k(rŒ3J‚|dk(rV|r|j
j«|k(sJ‚t    |j
|«sJ‚t    |j t«rŒŽJ‚|dk(r-|dd}    |    j}
|sŒ¬|
j«|k(rŒÀJ‚t‚y)    a<
    Check box returned type is correct
 
    Parameters
    ----------
    returned : object to be tested, returned from boxplot
    return_type : str
        return_type passed to boxplot
    expected_keys : list-like, optional
        group labels in subplot case. If not passed,
        the function checks assuming boxplot uses single ax
    check_ax_title : bool
        Whether to check the ax.title is the same as expected_key
        Intended to be checked by calling from ``boxplot``.
        Normal ``plot`` doesn't attach ``ax.title``, it must be disabled.
    rr)rErÚbothNrEr¡rÚmedians)Úmatplotlib.axesr    rErUr8rÚlinesr rÚsortedÚkeysÚitemsÚ    get_titlerÚAssertionError) ÚreturnedÚ return_typeÚ expected_keysÚcheck_ax_titler    ÚtypesÚrÚkeyÚvalueÚliners            rÚ_check_box_return_typer³ws¦€õ&%ä 4´Ñ 7€EØÐà Ð Ø ˆKä˜( E¨+Ñ$6Ô7Ð7Ð7Ø ˜&Ò  Ü˜hŸk™k¨4Ô0Ð 0Ð0ܘhŸn™n¬dÔ3Ð 3Ñ3ð !ð
Ð Ü% hÓ/ò +Ü! ! TÕ*Ð*Ð*ð +à ä˜(¤FÔ+Ð+Ð+äh—m‘m“oÓ&¬&°Ó*?Ò?Ð?Ð?Ø"Ÿ.™.Ó*ò    %‰JˆCÜ˜e U¨;Ñ%7Ô8Ð 8Ð8à˜fÒ$Ú!Ø Ÿ?™?Ó,°Ó3Ð3Ð3Ø Ò&Ù!Ø Ÿ8™8×-Ñ-Ó/°3Ò6Ð6Ð6Ü! %§(¡(¨DÔ1Ð1Ð1Ü! %§+¡+¬tÕ4Ð4Ð4Ø Ò&ؘYÑ'¨Ñ*Ø—y‘yÚ!ØŸ>™>Ó+¨sÓ2Ð2Ð2ä$Ð$ñ#    %rcóü‡—ddlŠˆfd„}d}|D]ê}‰jjddt|«z|«|dz }‰j    dd¬«|j
d d|i|¤Ž|«rJ‚‰jj «‰jjddt|«z|«|dz }‰j    dd    ¬«|j
d |dd
œ|¤Ž|«rJ‚‰jj «|d vsŒú‰jjddt|«z|«|dz }‰j    dd    ¬«|j
d d|i|¤Ž|«sJ‚‰jj «‰jjddt|«z|«|dz }‰j    dd¬«|j
d |d    d
œ|¤Ž|«sJ‚‰jj «Œíy) Nrcó"•—‰jj«jj«}‰jj«jj«}t d„|D««}t d„|D««}|xr| S)Nc3óRK—|]}|jj« –—Œ!y­wrC©Úgridliner9©Ú.0Úgs  rú    <genexpr>z;_check_grid_settings.<locals>.is_grid_on.<locals>.<genexpr>¼ó èø€Ò@°Aq—z‘z×-Ñ-Ó/Ô/Ñ@ùó‚%'c3óRK—|]}|jj« –—Œ!y­wrCr·r¹s  rr¼z;_check_grid_settings.<locals>.is_grid_on.<locals>.<genexpr>½r½r¾)r#ÚgcarlÚget_major_ticksrqr!)ÚxticksÚyticksÚxoffÚyoffÚmpls    €rÚ
is_grid_onz(_check_grid_settings.<locals>.is_grid_on¹snø€Ø—‘—‘Ó!×'Ñ'×7Ñ7Ó9ˆØ—‘—‘Ó!×'Ñ'×7Ñ7Ó9ˆÜÑ@¸Ô@Ó@ˆÜÑ@¸Ô@Ó@ˆà’M˜TÐ"Ð"rr~érF)ÚgridÚkindT)rÊrÉ)ÚpieÚhexbinÚscatter©)rPr#Úsubplotr%ÚrcÚplotÚclf)ÚobjÚkindsÚkwsrÇÚspndxrÊrÆs      @rÚ_check_grid_settingsr×´sÆø€óô#ð €EØóˆØ 
‰
×ј1˜a¤# e£*™n¨eÔ4Ø ‰
ˆØ ‰ˆv˜EˆÔ"؈‰Ñ"dÐ"˜cÒ"Ù”<ÐÐØ 
‰
‰Ôà 
‰
×ј1˜a¤# e£*™n¨eÔ4Ø ‰
ˆØ ‰ˆv˜DˆÔ!؈‰Ð.d Ñ.¨#Ò.Ù”<ÐÐØ 
‰
‰Ôà Ð3Ò 3Ø J‰J× Ñ ˜q !¤c¨%£j¡.°%Ô 8Ø Q‰JˆEØ F‰F6 ˆFÔ %Ø ˆCH‰HÑ &˜$Ð & #Ò &Ù”<Ð <Ø J‰JN‰NÔ à J‰J× Ñ ˜q !¤c¨%£j¡.°%Ô 8Ø Q‰JˆEØ F‰F6 ˆFÔ &Ø ˆCH‰HÐ 1˜$ TÑ 1¨SÒ 1Ù”<Ð <Ø J‰JN‰NÖ ñ9rcó8—|dDcgc]}||‘Œ    c}Scc}w)zL
    Auxiliary function for correctly unpacking cycler after MPL >= 1.5
    zaxes.prop_cyclerÎ)ÚrcParamsÚfieldrJs   rÚ_unpack_cyclerrÛás"€ð'Ð'8Ñ9Ö :˜ˆAˆe‹HÒ :Ð:ùÒ :sˆ có —|jdS)NÚx©Ú _shared_axes©rs rÚ
get_x_axisráèó€Ø ?‰?˜3Ñ Ðrcó —|jdS)NÚyrÞràs rÚ
get_y_axisråìrârc ó.—ddlm}|rt}nt}d}    |j    d|j ««}|j «|||fi|¤ŽD]}tj|«Œ    |j|«|S#|j«wxYw)a×
    Create plot and ensure that plot return object is valid.
 
    Parameters
    ----------
    f : func
        Plotting function.
    default_axes : bool, optional
        If False (default):
            - If `ax` not in `kwargs`, then create subplot(211) and plot there
            - Create new subplot(212) and plot there as well
            - Mind special corner case for bootstrap_plot (see `_gen_two_subplots`)
        If True:
            - Simply run plotting function with kwargs provided
            - All required axes instances will be created automatically
            - It is recommended to use it when the plotting function
            creates multiple axes itself. It helps avoid warnings like
            'UserWarning: To output multiple subplots,
            the figure containing the passed axes is being cleared'
    **kwargs
        Keyword arguments passed to the plotting function.
 
    Returns
    -------
    Plot object returned by the last plotting.
    rNr‡)
r"r#Ú_gen_default_plotÚ_gen_two_subplotsÚgetÚgcfrÒr(Ú"assert_is_valid_plot_return_objectr*)ÚfÚ default_axesÚkwargsr-Ú    gen_plotsÚretÚfigs       rÚ_check_plot_worksròðs‡€õ6$áÜ%‰    ä%ˆ    à
€Cð؏j‰j˜ 3§7¡7£9Ó-ˆØ ‰Œ    á˜Q Ñ. vÑ.ò    7ˆCÜ × 1Ñ 1°#Õ 6ñ    7ð         ‰    #Œà €Jøð         ‰    #ús ™ABÂBc+ó K—|di|¤Ž–—y­w)z'
    Create plot in a default way.
    NrÎrΩrìrñrîs   rrçrç sèø€ñ ‰+ˆf‰+Óùs‚ c+óÊK—d|vr|jd«|di|¤Ž–—|tjjurd|vsJ‚|jd«|d<|di|¤Ž–—y­w)z9
    Create plot on two subplots forcefully created.
    réÓéÔNrÎ)Ú add_subplotÚpdÚplottingÚbootstrap_plotrôs   rrèrè'sfèø€ð 6ÑØ ‰˜ÔÙ
‰+ˆf‰+ÒàŒBK‰K× &Ñ &Ñ&ؘ6Ñ!Ð!Ð!à—‘ sÓ+ˆˆt‰ Ù
‰+ˆf‰+Óùs‚A!A#)NT)T)rúAxes | Sequence[Axes]r@ÚboolÚreturnÚNone)NNN)NNNN)Úlinearr)rrürþzSequence[Axes])rr)r^)F)(Ú__doc__Ú
__future__rÚtypingrÚnumpyrXÚpandas.core.dtypes.apirÚpandasrùrÚpandas._testingÚ_testingr(Úcollections.abcrr£r    rrr4r<rArKrarrwrzr’r rŸr³r×rÛráråròrçrèrÎrrú<module>r
s¥ðñõ#å ãå/ãÝÝáÝ(å$ó+ó0'ò.ó..ô((ò".ó=&ò@ó(,Gó^-ó$)óX ó "ð:?Có:%ðz*,ó*óZ;ò ò ó-ò`ó r