+
    Ŝi                       R t ^ RIHt ^ RIt^ RIt^ RIHtHtHtH	t	 ^ RI
t^ RIHtHt ^ RIHu Ht ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IH t H!t!H"t"H#t#H$t$ ^ R
I%H&t&H't' ^ RI(H)t) ^ RI*H+t+ ^ RI,H-t- ^ RI.H/t/H0t0H1t1H2t2 ^ RI3H4t4 ^ RI5H6t6H7t7H8t8H9t9H:t: ]'       d   ^ RI;H<t<H=t=H>t>H?t? ^ RI@HAtA R R ltBR tC ! R R4      tD ! R R4      tE ! R R]E4      tFR R ltG ! R R]],          4      tH ! R  R!]H4      tI ! R" R#]H4      tJR# )$a  
Provide classes to perform the groupby aggregate operations.

These are not exposed to the user and provide implementations of the grouping
operations, primarily in cython. These classes (BaseGrouper and BinGrouper)
are contained *in* the SeriesGroupBy and DataFrameGroupBy objects.
)annotationsN)TYPE_CHECKINGAnyGenericfinal)NaTlib)	ArrayLikeAxisIntNDFrameTShapenptAbstractMethodError)cache_readonly)maybe_downcast_to_dtype)ensure_float64ensure_int64ensure_platform_intensure_uint64is_1d_only_ea_dtype)isna
maybe_fill)Categorical)	DataFrame)grouper)CategoricalIndexIndex
MultiIndexensure_index)Series)compress_group_indexdecons_obs_group_idsget_group_indexget_group_index_sorterget_indexer_dict)Callable	GeneratorHashableIterator)NDFramec                   V ^8  d   QhRR/#    returnNone )formats   "`/Users/mibo/.openclaw/workspace/.venv-ak/lib/python3.14/site-packages/pandas/core/groupby/ops.py__annotate__r3   Q   s     > >d >    c                v    \        V \        P                  4      '       d   V\        8w  d   \	        R 4      hR# R# )zMust produce aggregated valueN)
isinstancenpndarrayobject
ValueError)objdtypes   &&r2   check_result_arrayr=   Q   s4     #rzz""F? <==  #r4   c                    \        V R4      '       d7   V P                  p V P                  ^8X  d   \        V 4      ^8X  d
   V ^ ,          p V # )zV
Extract the result object, it might be a 0-dim ndarray
or a len-1 0-dim, or a scalar
_values)hasattrr?   ndimlen)ress   &r2   extract_resultrD   \   s=    
 sIkk88q=SX]a&CJr4   c                     ] tR t^jt$ Rt]! . RLO4      tR R ltR	/ R]P                  ! ]
P                  RR
7      bR]P                  ! ]
P                  RR
7      bRRbRRbR]P                  ! ]
P                  RR7      bR]P                  ! ]
P                  RR7      bRRbRRbRRbRRbRRbR]P                  ! ]
P                  RR7      bR]P                  ! ]
P                  RR7      bRRbRRbR R!bR"R#bR$R%/CR&R'R(R)R*R+R,R-R.RR///tR0]R1&   R$^/t]R2 R3 l4       t]]P&                  R4 R5 l4       4       tR6 R7 ltR8 R9 ltR: R; ltR< R= lt]R>R?R@R?RA^ /RB RC ll4       t]RA^ /RD RE ll4       t]RF RG l4       t]RHRM/RI RJ ll4       tRKtR?# )NWrappedCythonOpa  
Dispatch logic for functions defined in _libs.groupby

Parameters
----------
kind: str
    Whether the operation is an aggregate or transform.
how: str
    Operation name, e.g. "mean".
has_dropped_na: bool
    True precisely when dropna=True and the grouper contains a null value.
anyallrankidxminidxmaxc               (    V ^8  d   QhRRRRRRRR/# )r-   kindstrhowhas_dropped_naboolr.   r/   r0   )r1   s   "r2   r3   WrappedCythonOp.__annotate__~   s(     - -S -s -D -T -r4   c                	*    Wn         W n        W0n        R # NrM   rO   rP   )selfrM   rO   rP   s   &&&&r2   __init__WrappedCythonOp.__init__~   s    	,r4   	aggregate)val_testsum	group_sumprod
group_prod)namemin	group_minmax	group_maxmean
group_meanmediangroup_median_float64var	group_varstdsemskew
group_skewkurt
group_kurtfirst	group_nthlast
group_lastohlc
group_ohlc	transformcumprodgroup_cumprodcumsumgroup_cumsumcummingroup_cummincummaxgroup_cummax
group_rankzdict[str, dict]_CYTHON_FUNCTIONSc                    V ^8  d   QhRRRR/# )r-   rO   rN   r.   r0   )r1   s   "r2   r3   rR      s      C C r4   c                	8    WP                   R ,          9   d   R # R# )rY   rv   )r   )clsrO   s   &&r2   get_kind_from_how!WrappedCythonOp.get_kind_from_how   s    ''44r4   c               (    V ^8  d   QhRRRRRRRR/# )r-   rM   rN   rO   r<   np.dtype
is_numericrQ   r0   )r1   s   "r2   r3   rR      s,     ' '' ')1'?C'r4   c                	   VP                   pV P                  V,          V,          p\        V4      '       d   TpM\        \        V4      pV'       d   V# V\
        P                  ! \        4      8X  dR   VR9   d   \        RV RV R24      hVR9   d   V# VR9   d    V# RVP                  9  d   \        RV RV R24      hV# \        RV4      h)	rf   z2function is not implemented for this dtype: [how->z,dtype->]r9   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)rf   rw   )rj   rk   rJ   rK   rl   rn   )
r_   r   callablegetattr
libgroupbyr7   r<   r9   NotImplementedError__signatures__)r   rM   rO   r<   r   	dtype_strftypefs   &&&&&   r2   _get_cython_function$WrappedCythonOp._get_cython_function   s    
 JJ	%%d+C0 E??A
E*AHbhhv&&++) E)A7  ::(( H !1!11) E)A7  H%0 r4   c                    V ^8  d   QhRRRR/# )r-   values
np.ndarrayr.   r0   )r1   s   "r2   r3   rR      s     # #z #j #r4   c                ^   V P                   pVR9   d   \        V4      pV# VP                  P                  R9   dr   VR9   g$   V P                  R8X  d    V P                  '       d   \        V4      pV# VR9   d4   VP                  P                  R8X  d   \        V4      pV# \        V4      pV# )z
Cast numeric dtypes to float64 for functions that only support that.

Parameters
----------
values : np.ndarray

Returns
-------
values : np.ndarray
iurv   i)rf   rj   rk   rl   rn   )rh   rd   )r[   rt   r]   ry   rw   )rO   r   r<   rM   rP   r   r   )rV   r   rO   s   && r2   _get_cython_vals WrappedCythonOp._get_cython_vals   s     hh:: $F+F"  \\$&o%		[(T-@-@-@ (/  DD<<$$+)&1F  +62Fr4   c               $    V ^8  d   QhRRRRRR/# )r-   ngroupsintr   r   r.   r   r0   )r1   s   "r2   r3   rR      s!       j U r4   c                	   V P                   pV P                  pV P                  P                  V^4      pVR8X  d   W3pV# V^8  d   \	        R4      hVR8X  d   VP
                  pV# V.VP
                  R,          O5pV# )   rt   z<arity of more than 1 is not supported for the 'how' argumentrv   r   NN)rO   rM   _cython_aritygetr   shape)rV   r   r   rO   rM   arity	out_shapes   &&&    r2   _get_output_shape!WrappedCythonOp._get_output_shape   s    hhyy""&&sA. &= (I  QY%N  [ I  !46<<#34Ir4   c                    V ^8  d   QhRRRR/# r-   r<   r   r.   r0   )r1   s   "r2   r3   rR     s     # #H # #r4   c                	    V P                   pVR 8X  d   RpM8VR9   d   RpM.VP                  R9   d   VP                   VP                   2pMRp\        P                  ! V4      # )rI   float64intpiufcbr9   rJ   rK   )rO   rM   itemsizer7   r<   )rV   r<   rO   	out_dtypes   &&  r2   _get_out_dtypeWrappedCythonOp._get_out_dtype  s^    hh&=!I(( IZZ7" ::,u~~&67I Ixx	""r4   c                    V ^8  d   QhRRRR/# r   r0   )r1   s   "r2   r3   rR     s      x H r4   c                V   V P                   pVR9   dG   V\        P                  ! \        4      8X  d%   \        P                  ! \        P                  4      #  V# VR9   dI   VP
                  R9   d   V# VP
                  R9   d%   \        P                  ! \        P                  4      # V# )z
Get the desired dtype of a result based on the
input dtype and how it was computed.

Parameters
----------
dtype : np.dtype

Returns
-------
np.dtype
    The desired dtype of the result.
fciub)r[   ry   r[   r]   rw   )rd   rf   rh   rj   rk   )rO   r7   r<   rQ   int64rM   r   )rV   r<   rO   s   && r2   _get_result_dtype!WrappedCythonOp._get_result_dtype  s     hh==&xx)) '  ;;zzT!u$xx

++r4   maskNresult_maskinitialc               8    V ^8  d   QhRRRRRRRRRRR	RR
RRR/# r-   r   r   	min_countr   r   comp_idsr   znpt.NDArray[np.bool_] | Noner   r   r   r.   r0   )r1   s   "r2   r3   rR   8  sZ     ,
 ,
,
 	,

 ,
 ,
 +,
 2,
 ,
 
,
r4   c               	@   VP                   ^8X  dp   VR,          p	Ve
   VR,          pVe
   VR,          pV P                  ! V	3RVRVRVRVRVRV/VB p
V
P                  ^ ,          ^8X  d
   V
^ ,          # V
P                  # V P                  ! V3RVRVRVRVRVRV/VB # )r   r   r   r   r   r   r   )N:NNN)rA   _call_cython_opr   T)rV   r   r   r   r   r   r   r   kwargsvalues2drC   s   &&$$$$$$,  r2   _cython_op_ndim_compat&WrappedCythonOp._cython_op_ndim_compat7  s    ;;!gHG}&)'2&&	#	  	 "		
 	 (	  	 	C yy|q 1v 55L##	
	
 	
 		

 	
 $	
 	
 	
 		
r4   c               8    V ^8  d   QhRRRRRRRRRRR	RR
RRR/# r   r0   )r1   s   "r2   r3   rR   g  sd     c cc 	c
 c c +c 2c c 
cr4   c               	$	   Tp	VP                   p
V
P                  R 9   pV
P                  R9   pV P                  R9   d   Vf   \        V4      pV'       d   VP	                  R4      pRpM"V
P                  R8X  d   VP	                  R4      pVP                   R8X  d    VP                  \        P                  4      pV P                  R9   d   V
\        8X  d>   VR,          '       d/   Ve+   VP                  4       '       d   VP                  4       pRW&   VP                  \        RR	7      P	                  \        P                  4      pRpVP                  pVe   VP                  pVe   VP                  pV P                  W14      pV P                  V P                  V P                  VP                   V4      pV P!                  V4      pV P#                  VP                   4      p\%        \        P&                  ! WR
7      4      pV P                  R8X  Ed8   \        P(                  ! V\        P*                  R
7      pV P                  R9   d/   V P                  R8X  d   WxR&   V! RRVRVRVRVRVRVRVRV/VB  MV P                  R9   d)   V P                  R9   d   WR&   V! VVVV3RVRVRV/VB  MV P                  R9   d+   V! RRVRVRVRVRV/VB  VP                  \        RR	7      pMV P                  R 9   d6   V! RRVRVRVRVRVRV/VB  V
\        8X  d   VP                  \        4      pMA\-        V P                   R24      hV P                  R8w  d   WhR&   V! RRVRVRVRVRVRV/VB  V P                  R8X  d   V P                  R!9  d   VP                   P                  R9   d   V'       g   \/        V P                  R"9   d   ^ M^V4      pXV8  pVP                  4       '       dI   Ve!   VV,          P1                  4       '       g   Q hM$VP                  R4      p\        P2                  VV&   VP                  pV P                  V P4                  9  d*   V P7                  V	P                   4      p\9        VV4      pV# TpV# )#r   mMr   Tbuint8float16skipnaFcopyr<   rY   r[   r   outcountsr   labelsr   r   r   is_datetimelikez is not implementedrI   r   r   r   )rG   rH   )	rJ   rK   r`   rb   rd   rr   rp   r[   rf   r0   )rk   rj   rh   rt   r]   )rj   rk   r   r   )r[   r]   )r<   rM   rO   r   viewastyper7   float32r9   rG   r   rQ   int8r   r   r   r   r   r   emptyzerosr   r   rb   rH   nancast_blocklistr   r   )rV   r   r   r   r   r   r   r   r   orig_valuesr<   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results   &&$$$$$$,             r2   r   WrappedCythonOp._call_cython_opf  s    ZZ7*
**,88~%|F|[[)FJZZ3[[)F<<9$]]2::.F88~%(##'DHHJJ!''+]]4e]499"''BFJ66D&)mm**7;	((DHHfllJW&&v.''5	BHHY@A99#XXgRXX6Fxx 
 
 88u$ )09% 

!
 "
 $	

 (
 
 !,
 %4
 
 BB88~-0?,-		
 (	 	 !,	 	 ^+ ! $ 	
 !,   t%8-- ! " $	
  !,  F?#]]62F *TXXJ6I*JKK xx6!(3}%     	
 !0   99#8L(L ||  D($((o"=Q1iP%##%%".*<8<<>>>> "(y!9/1vv|,884...
 ..{/@/@AI/	BI  Ir4   c               $    V ^8  d   QhRRRRRR/# )r-   axisr
   r   r	   r.   r/   r0   )r1   s   "r2   r3   rR     s!      7 I $ r4   c                	    VP                   ^8  d   \        R4      hVP                   ^8X  d   V^8X  g   Q V4       hR# \        VP                  4      '       g   V^ 8X  g   Q hR# R# )r-   z.number of dimensions is currently limited to 2N)rA   r   r   r<   )rV   r   r   s   &&&r2   _validate_axisWrappedCythonOp._validate_axis  sX    ;;?%&VWW;;!19"d"9$V\\22 199 3r4   r   c               0    V ^8  d   QhRRRRRRRRR	RR
R/# )r-   r   r	   r   r
   r   r   r   r   r   r.   r0   )r1   s   "r2   r3   rR     sH     !
 !
 !
 	!

 !
 !
 !
 
!
r4   c                   V P                  W!4       \        V\        P                  4      '       g1   VP                  ! R	RV P
                  RV P                  RVRVRV/VB # V P                  ! V3RVRVRVRR/VB # )
zG
Call our cython function, with appropriate pre- and post- processing.
rO   rP   r   r   idsr   r   Nr0   )r   r6   r7   r8   _groupby_oprO   rP   r   )rV   r   r   r   r   r   r   s   &$$$$$,r2   cython_operation WrappedCythonOp.cython_operation  s     	D)&"**--%% HH#22 $  	
    **

 
 	

 
 
 	
r4   )rP   rO   rM   )rG   rH   rI   countsizerJ   rK   )__name__
__module____qualname____firstlineno____doc__	frozensetr   rW   	functoolspartialr   group_any_allgroup_idxmin_idxmaxri   r   __annotations__r   classmethodr   cacher   r   r   r   r   r   r   r   r   r   __static_attributes__r0   r4   r2   rF   rF   j   sx    CN- 	 
9$$Z%=%=N
9$$Z%=%=N
 ;
 L	

 i''
(F(FXV
 i''
(F(FXV
 ;
 ;
 L
 ,
 ;
 9$$Z%9%9F
 9$$Z%9%9F
 L
 L
  [!
" L#
$ L%
( 	nnnL
+* < QKM  __'  'R#J&#4 ,
 .2,
 59,
 ,
 ,
\ c c cJ   !

 !
 !
r4   rF   c                     ] tR tRt$ RtR]R&   RCR R llt]R R l4       tR	 R
 lt	]R R l4       t
R R lt]R R l4       t]R R l4       t]]R R l4       4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]]R R  l4       4       t]]R! R" l4       4       t]R# R$ l4       t]]R% R& l4       4       t]R' R( l4       t]R) R* l4       t]R+ R, l4       t]R- R. l4       t]R/ R0 l4       tR1 R2 ltR3 R4 lt ]R5 R6 l4       t!]RDR7 R8 ll4       t"]RER9 R: ll4       t#]R; R< l4       t$]R= R> l4       t%]]R? R@ l4       4       t&RAt'RB# )FBaseGrouperi<  a`  
This is an internal Grouper class, which actually holds
the generated groups

Parameters
----------
axis : Index
groupings : Sequence[Grouping]
    all the grouping instances to handle in this grouper
    for example for grouper list to groupby, need to pass the list
sort : bool, default True
    whether this grouper will give sorted result or not

r   r   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r-   r   r   	groupingslist[grouper.Grouping]sortrQ   dropnar.   r/   r0   )r1   s   "r2   r3   BaseGrouper.__annotate__N  s<       * 	
  
r4   c                	p    \        V\        4      '       g   Q V4       hWn        W n        W0n        W@n        R # rT   )r6   r   r   
_groupings_sortr  )rV   r   r  r
  r  s   &&&&&r2   rW   BaseGrouper.__init__N  s0     $&&,,&	#
r4   c                   V ^8  d   QhRR/# r-   r.   r	  r0   )r1   s   "r2   r3   r  ]  s      1 r4   c                	    V P                   # rT   )r  rV   s   &r2   r  BaseGrouper.groupings\  s    r4   c                   V ^8  d   QhRR/# )r-   r.   zIterator[Hashable]r0   )r1   s   "r2   r3   r  `  s     " ", "r4   c                	,    \        V P                  4      # rT   )iterindicesr  s   &r2   __iter__BaseGrouper.__iter__`  s    DLL!!r4   c                   V ^8  d   QhRR/# r-   r.   r   r0   )r1   s   "r2   r3   r  d  s     # #s #r4   c                	,    \        V P                  4      # rT   )rB   r  r  s   &r2   nkeysBaseGrouper.nkeysc  s    4>>""r4   c                    V ^8  d   QhRRRR/# )r-   datar   r.   z#Iterator[tuple[Hashable, NDFrameT]]r0   )r1   s   "r2   r3   r  g  s     4 4 4.Q 4r4   c              #  v   "   V P                  V4      pV P                  p\        W2RR7       Rj  xL
  R#  L5i)j
Groupby iterator

Returns
-------
Generator yielding sequence of (name, subsetted object)
for each group
TstrictN)_get_splitterresult_indexzip)rV   r"  splitterkeyss   &&  r2   get_iteratorBaseGrouper.get_iteratorg  s2      %%d+  td333s   .979c                    V ^8  d   QhRRRR/# )r-   r"  r*   r.   DataSplitterr0   )r1   s   "r2   r3   r  v  s     
 
' 
l 
r4   c                    \        V\        4      '       d   \        pM\        pV! VV P                  V P
                  V P                  R7      # )z6
Returns
-------
Generator yielding subsetted objects
)
sorted_idssort_idx)r6   r    SeriesSplitterFrameSplitterr   _sorted_idsresult_ilocs)rV   r"  klasss   && r2   r'  BaseGrouper._get_splitteru  sF     dF##(6E "ELL''&&	
 	
r4   c                   V ^8  d   QhRR/# )r-   r.   z$dict[Hashable, npt.NDArray[np.intp]]r0   )r1   s   "r2   r3   r    s      = r4   c                $   \        V P                  4      ^8X  d?   \        V P                  \        4      '       d   V P                  ^ ,          P
                  pM9V P                   Uu. uF  q"P                  NK  	  pp\        W0P                  4      pV P                  '       g   \        V P                  \        4      pV'       gd   V P                  P                  '       dH   VP                  4        UUu/ uF)  w  rV\        V4      '       d   \        P                  MTVbK+  	  pppV# V'       dO   VP                  4        UUu/ uF2  w  rV\         ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      VbK4  	  pppV# u upi u uppi u uppi )z"dict {group name -> group indices}c              3  h   "   T F(  p\        V4      '       d   \        P                  MTx  K*  	  R # 5irT   )r   r7   r   ).0comps   & r2   	<genexpr>&BaseGrouper.indices.<locals>.<genexpr>  s!     ISTDJJ"&&D8Ss   02)rB   r  r6   r(  r   r  codesr%   levelsr  r   hasnansitemsr   r7   r   tuple)rV   r   ping
codes_listhas_mikeyvalues   &      r2   r  BaseGrouper.indices  s7    t~~!#
43D3DFV(W(W^^A&..F15@**J@%j++>F{{{ 1 1:>Fd//777JP,,.JXJCd3iiBFFS%7.    
 '-lln '5
 EISIEEISII5P&4   ! A

s   'F5/F8Fc                   V ^8  d   QhRR/# r-   r.   npt.NDArray[np.intp]r0   )r1   s   "r2   r3   r    s      2 r4   c                N   V P                   pV P                  '       dB   \        P                  ! V^ 8  4      p\        P                  ! VR8H  4      V,          pW,          p\        WP                  4      pV P                  '       d   V\        P                  ! XV4      ,          pV# )zB
Get the original integer locations of result_index in the input.
r   )r   rP   r7   wherery   r$   r   take)rV   r   r   	null_gapsr   s   &    r2   r6  BaseGrouper.result_ilocs  s}     hh88C1H%D		#),T2I)C'\\:bggi00Fr4   c                   V ^8  d   QhRR/# )r-   r.   z#list[npt.NDArray[np.signedinteger]]r0   )r1   s   "r2   r3   r    s     7 7: 7r4   c                	V    V P                    Uu. uF  qP                  NK  	  up# u upi rT   )r  r@  rV   rE  s   & r2   r@  BaseGrouper.codes  s     '+~~6~t

~666   &c                   V ^8  d   QhRR/# r-   r.   list[Index]r0   )r1   s   "r2   r3   r    s     ' ' 'r4   c                	    \        V P                  4      ^8  d    \        V P                  P                  4      # V P                  .# r   )rB   r  listr(  rA  r  s   &r2   rA  BaseGrouper.levels  s9    t~~"))0011%%&&r4   c                   V ^8  d   QhRR/# r-   r.   list[Hashable]r0   )r1   s   "r2   r3   r    s     6 6~ 6r4   c                	V    V P                    Uu. uF  qP                  NK  	  up# u upi rT   )r  r_   rU  s   & r2   namesBaseGrouper.names  s     &*nn5nd		n555rW  c                   V ^8  d   QhRR/# )r-   r.   r    r0   )r1   s   "r2   r3   r    s     O Of Or4   c                    V P                   pV P                  pV'       d#   \        P                  ! WR8g  ,          VR7      pM. p\	        W0P
                  RRR7      # )z
Compute group sizes.
)	minlengthr   F)indexr<   r   r   )r   r   r7   bincountr    r(  )rV   r   r   r   s   &   r2   r   BaseGrouper.size  sI    
 hh,,++c)n@CCc!2!2'NNr4   c                   V ^8  d   QhRR/# )r-   r.   zdict[Hashable, Index]r0   )r1   s   "r2   r3   r    s      - r4   c                   \        V P                  4      ^8X  d   V P                  ^ ,          P                  # V P                  w  rVP                  p\
        P                  ! V\        \        V4      4      R7      pVP                  4       P                  4        UUu/ uF'  w  rVW5,          V P                  P                  V4      bK)  	  pppV# u uppi )!dict {group name -> group labels})
categories)rB   r  groupsresult_index_and_idsr?   r   
from_codesrange_reverse_indexerrC  r   rP  )rV   r(  r   r   rn  group
axis_ilocsr   s   &       r2   ro  BaseGrouper.groups  s     t~~!#>>!$+++ 55%% ++CE#lBS<TU
 &0%@%@%B%H%H%J
 &K! M499>>*55%J 	 

 
s   -Cc                   V ^8  d   QhRR/# r-   r.   rQ   r0   )r1   s   "r2   r3   r    s     C Cd Cr4   c                	D    \        V P                  R R7      P                  # )Fr   )r   r   is_monotonic_increasingr  s   &r2   is_monotonicBaseGrouper.is_monotonic  s     TXXE*BBBr4   c                   V ^8  d   QhRR/# rx  r0   )r1   s   "r2   r3   r    s     * * *r4   c                N    \        V P                  ^ 8  P                  4       4      # )z5
Whether grouper has null value(s) that are dropped.
)rQ   r   rG   r  s   &r2   rP   BaseGrouper.has_dropped_na  s      TXX\&&())r4   c                   V ^8  d   QhRR/# rL  r0   )r1   s   "r2   r3   r    s      0 r4   c                	    V P                   # rT   r   r  s   &r2   
codes_infoBaseGrouper.codes_info  s     xxr4   c                   V ^8  d   QhRR/# r  r0   )r1   s   "r2   r3   r    s     & & &r4   c                	,    \        V P                  4      # rT   )rB   r(  r  s   &r2   r   BaseGrouper.ngroups  s     4$$%%r4   c                   V ^8  d   QhRR/# )r-   r.   r   r0   )r1   s   "r2   r3   r    s     , ,e ,r4   c                	(    V P                   ^ ,          # )    rp  r  s   &r2   r(  BaseGrouper.result_index       ((++r4   c                   V ^8  d   QhRR/# rL  r0   )r1   s   "r2   r3   r    s     , ,) ,r4   c                	(    V P                   ^,          # r\  r  r  s   &r2   r   BaseGrouper.ids  r  r4   c                   V ^8  d   QhRR/# )r-   r.   z"tuple[Index, npt.NDArray[np.intp]]r0   )r1   s   "r2   r3   r  	  s     X! X!&H X!r4   c           
     	   V P                    Uu. uF%  p\        P                  ! VP                  R R7      NK'  	  ppV P                    Uu. uF'  qP                  ;'       g    VP
                  '       * NK)  	  ppV P                    Uu. uF  qP                  NK  	  pp\        \        V P                   VRR7      4       F9  w  pw  rVP
                  '       g   K  VP                  VP                  4      W%&   K;  	  \        V P                   4      ^8X  dA   V^ ,          pV P                  ^ ,          Vn        \        V P                  ^ ,          4      pWx3# \!        V4      '       d-   V P#                  W P                  V P                  V4      w  rxWx3# \%        V4      '       g,   V P'                  W P                  V P                  4      w  rxWx3# V P                  p	V P                    Uu. uF  qP                  NK  	  p
p\        V4       UUu. uF  w  rV'       g   K  VNK  	  ppp\        V4       UUu. uF  w  rV'       d   K  VNK  	  pppT P#                  V Uu. uF  qV,          NK  	  upV Uu. uF  qV,          NK  	  upV Uu. uF  qV,          NK  	  upV Uu. uF  qV,          NK  	  upR7      w  ppT P'                  V Uu. uF  qV,          NK  	  upV Uu. uF  qV,          NK  	  upV Uu. uF  qV,          NK  	  upR7      w  pp\(        P*                  ! \(        P,                  ! VP                  \        V4      4      \(        P.                  ! VP                  \        V4      ^R7      .^ R7      p\(        P0                  ! W,           RR7      w  pp\3        \5        VP6                  4      \5        VP6                  4      ,           V\5        VP                  4      \5        VP                  4      ,           R7      P9                  V4      p\        V4      V,          V,           p\%        V4      '       d   \        V4      p\        \;        V4      ^4       UUu. uF  w  ppV'       d   K  VV,
          NK  	  ppp\        V4      ^ 8  d!   VP=                  V4      P?                  4       pMVP?                  4       pVPA                  V4      p\(        P0                  ! VRR7      w  pp\        V4      pVPA                  V4      pMv\C        VR R7      w  pp\        V4      p\(        P*                  ! V\(        PD                  ! \(        PF                  ! \        V4      4      V4      .4      pVPA                  V4      pV PH                  '       d&   \(        PJ                  ! V^ 8  V^ 8  ,          R	V4      pWx3# u upi u upi u upi u upi u uppi u uppi u upi u upi u upi u upi u upi u upi u upi u uppi )
Fr   Tr%  )rA  r@  rc  sorts)rA  r@  rc  r   return_indexr
  r   )&r  r   _with_inferuniques	_observed_passed_categoricalr  	enumerater)  set_categories
_orig_catsrB   rc  r_   r   r@  rH   _ob_index_and_idsrG   _unob_index_and_idsr7   concatenatetilerepeatuniquer   r]  rA  reorder_levelsreversed_drop_level_numbersargsortrP  r!   deletearanger  rO  )rV   rE  rA  obsr  klevelr(  r   rc  r@  idxob
ob_indicesunob_indicesob_indexob_ids
unob_indexunob_idsresult_index_codes_rh  n_levelsr
  drop_levelssorterr  takers   &                           r2   rp   BaseGrouper.result_index_and_ids  s    EINN
DRDEdll7N 	 
 HL~~
GUtNN::$":":::~ 	 
 )-77 )#dnnfT*R SA}'''!00A	 !T t~~!#!!9L $

1L%djjm4CP   O XX $ 6 6

DJJ!LL   G S $ 8 8TZZ XLD    JJE,0NN;NDZZNE;-6s^B^'#r##^JB/8~H~GCRCC~LH#55/9:zsz:-78ZcSzzZ8-78ZcSzzZ8-78ZcSzzZ8	  6  Hf $(#;#;/;<|s|<-9:\cSzz\:-9:\cSzz\: $< $ J "$GGJ,,c(m<IIhnnc*oAF " yy!:NHAu%J--.hoo1FF(:++,tHNN/CC nU#	  j/F*X5C5zzu: &/x%B%B	T #HsNN%B  
 {#a')==kJRRTF)113F+00899V$?5)#.jjo  4CeDW)#.bii		#l2C(DgNO  ,007{{{hh
x!|<b#F  o

 8& <BH:888 =::0sk   +W
W!WW(WWW4WWW#4W(
W-"W2W7$W<
;X(X:Xc                   V ^8  d   QhRR/# r-   r.   r  r0   )r1   s   "r2   r3   r  d  s     & &+ &r4   c                	    \         ;QJ d&    R  V P                   4       F  '       d   K   RM	  RM! R  V P                   4       4      '       d   V # V P                  # )c              3  8   "   T F  qP                   x  K  	  R # 5irT   )r  )r<  rE  s   & r2   r>  /BaseGrouper.observed_grouper.<locals>.<genexpr>e  s     9.$~~.   FT)rH   r  _observed_grouperr  s   &r2   observed_grouperBaseGrouper.observed_grouperc  s<    39$..93339$..999K%%%r4   c                   V ^8  d   QhRR/# r  r0   )r1   s   "r2   r3   r  k  s      ; r4   c                	    V P                    Uu. uF  qP                  NK  	  pp\        V P                  W P                  V P
                  R 7      pV# u upi ))r
  r  )r  observed_groupingr  r   r  r  )rV   rE  r  r   s   &   r2   r  BaseGrouper._observed_grouperj  sC    8<G++	GdiiDKKX Hs   Ac          
     ,    V ^8  d   QhRRRRRRRRR	R
/# )r-   rA  rZ  r@  list[npt.NDArray[np.intp]]rc  ra  r  z
list[bool]r.   'tuple[MultiIndex, npt.NDArray[np.intp]]r0   )r1   s   "r2   r3   r  p  s<     &  & &  *&  	& 
 &  
1& r4   c                	  a \         ;QJ d&    V3R  lSR,           4       F  '       d   K   RM	  RM! V3R  lSR,           4       4      pV'       d
   S^ ,          MRp\        ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      p\        W'RRR7      p\        WR7      w  r\	        V	4      p	\        WWrRR7      p\        VVVRR7      pV'       g   \        V4      ^ 8  d   \        S4      p\        \        S4      ^4       UUu. uF  w  rV'       d   K  W,
          NK  	  ppp\        V4      ^ 8  d!   VP                  V4      P                  4       pMVP                  4       pVP                  V4      p\        P                  ! VRR	7      w  pp\        P                  ! V	R
8H  R
VP                  V	4      4      p	\	        V	4      p	W3# u uppi )c              3  <   <"   T F  pS^ ,          V8H  x  K  	  R# 5i)r  Nr0   )r<  r
  r  s   & r2   r>  0BaseGrouper._ob_index_and_ids.<locals>.<genexpr>w  s      HidqT!1is   r   FTc              3  8   "   T F  p\        V4      x  K  	  R # 5irT   rB   r<  r  s   & r2   r>  r  y       5fUc%jjfr  r
  xnullr  )r  )rA  r@  rc  verify_integrityr  r   )rH   rD  r#   r!   r   r"   r   rB   r  r  r  r  rP  r7   r  rO  )rV   rA  r@  rc  r  consistent_sortingsort_in_compressr   group_indexr  obs_group_idsob_index_codesr  r  r  r
  r  r  r  rh  s   &&&&f               r2   r  BaseGrouper._ob_index_and_idsp  s    !S HeBi HSSS HeBi HH'958u5f55f55%eTJ 4[ X$V,-5t
  "	
 "c(ma&75zH "+8E?A!>!>IC !>  
 ;!#!55kBJJL!))+}}V,Hyyd;HAuXXflB

60BCF$V,s   GGc               (    V ^8  d   QhRRRRRRRR/# )	r-   rA  rZ  r@  r  rc  ra  r.   r  r0   )r1   s   "r2   r3   r    s2     
$ 
$
$ *
$ 	
$
 
1
$r4   c                	    \         ;QJ d    . R  V 4       F  NK  	  5M! R  V 4       4      p\        W$RRR7      p\        P                  ! WR7      p\	        V4      pWe3# )c              3  8   "   T F  p\        V4      x  K  	  R # 5irT   r  r  s   & r2   r>  2BaseGrouper._unob_index_and_ids.<locals>.<genexpr>  r  r  Tr  )rc  )rD  r#   r   from_productr   )rV   rA  r@  rc  r   r  r  s   &&&&   r2   r  BaseGrouper._unob_index_and_ids  sS     5f55f55"5d$G,,VA
&x0##r4   c                   V ^8  d   QhRR/# )r-   r.   zGenerator[Index]r0   )r1   s   "r2   r3   r    s     ; ;"2 ;r4   c              #  	   "   V P                   p\        V P                  4      ^8X  d   Vx  R# \        VP                  ^,
          RR4       F  pVP                  V4      x  K  	  R# 5i)r   Nr   )r(  rB   r  rr  nlevelsget_level_values)rV   r(  r  s   &  r2   get_group_levelsBaseGrouper.get_group_levels  sY      ((t~~!#|33a7R@"33E:: As   A'A)c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r-   rM   rN   rO   r   r
   r   r   r.   r	   r0   )r1   s   "r2   r3   r    s<     
 

 	

 
 
 

r4   c                    VR9   g   Q h\        WV P                  R7      pVP                  ! RRVRVRVRV P                  RV P                  /VB # )	z+
Returns the values of a cython operation.
rU   r   r   r   r   r   )rv   rY   r0   )rF   rP   r   r   r   )rV   rM   r   rO   r   r   r   cy_ops   &&&&&&, r2   _cython_operationBaseGrouper._cython_operation  sx     1111T4CVCVW%% 


  
 XX	

 LL
 
 	
r4   c               (    V ^8  d   QhRRRRRRRR/# )	r-   r;   r    r   r&   preserve_dtyperQ   r.   r	   r0   )r1   s   "r2   r3   r    s,     8 88!)8;?8	8r4   c                Z    V P                  W4      pVP                  P                  V4      # )z
Parameters
----------
obj : Series
func : function taking a Series and returning a scalar-like
preserve_dtype : bool
    Whether the aggregation is known to be dtype-preserving.

Returns
-------
np.ndarray or ExtensionArray
)_aggregate_series_pure_pythonarray_cast_pointwise_result)rV   r;   r   r  r   s   &&&& r2   
agg_seriesBaseGrouper.agg_series  s)      33C>yy//77r4   c               $    V ^8  d   QhRRRRRR/# )r-   r;   r    r   r&   r.   znpt.NDArray[np.object_]r0   )r1   s   "r2   r3   r    s$      !)	 r4   c                	   \         P                  ! V P                  R R7      pRpV P                  V4      p\	        V4       F;  w  rgV! V4      p\        V4      pV'       g   \        WP                  4       RpWV&   K=  	  V# )Or   FT)r7   r   r   r'  r  rD   r=   r<   )	rV   r;   r   r   initializedr*  r   rt  rC   s	   &&&      r2   r  )BaseGrouper._aggregate_series_pure_python  ss     $,,c2%%c*!(+HAu+C %C"34"1I , r4   c               $    V ^8  d   QhRRRRRR/# )r-   r   r&   r"  zDataFrame | Seriesr.   ztuple[list, bool]r0   )r1   s   "r2   r3   r    s$     %& %&%&!3%&	%&r4   c                	   R pV P                  V4      pV P                  p. p\        WTRR7      pV F\  w  r\        P	                  V	RV4       V	P
                  p
V! V	4      pV'       g   \        W4      '       g   RpVP                  V4       K^  	  \        V4      ^ 8X  d,   \        VRR4      R9   d   V! VP                  R,          4       Wc3# )FTr%  r_   r   N:Nr  N)rl   rn   r[   r]   )r'  r(  r)  r9   __setattr__axes_is_indexed_likeappendrB   r   iloc)rV   r   r"  mutatedr*  
group_keysresult_valueszippedrH  rt  
group_axesrC   s   &&&         r2   apply_groupwiseBaseGrouper.apply_groupwise  s     %%d+&&
 Z$7 JC ufc2 JE(C#3C#D#D  % ! z?aGAz4$@ E
 %
 diim%%r4   c                   V ^8  d   QhRR/# rL  r0   )r1   s   "r2   r3   r  "  s      1 r4   c                	    V P                   P                  V P                  4      p\        V R R4      '       d   W^ 8  ,          pV# )r  T)r   rP  r6  r   )rV   r   s   & r2   r5  BaseGrouper._sorted_ids   s<     t00144((aK(Fr4   )r  r  r   r  N)TT)r   )F)(r   r   r   r   r   r  rW   propertyr  r  r  r,  r   r'  r   r  r6  r@  rA  rc  r   ro  r{  rP   r  r   r(  r   rp  r  r  r  r  r  r  r  r  r  r5  r  r0   r4   r2   r  r  <  sL    K  " # #4 
 
&  0   . 7 7 ' ' 6 6 O O   C  C *  *   &  & , , , , X! X!t & &  
& P
$ ; ; 
 
2 8 8$  * %& %&T   r4   r  c                     ] tR tRt$ RtR]R&   R]R&   RR R	 llt]R
 4       t]	R R l4       t
]R R l4       tR R lt]R 4       t]R R l4       t]R 4       t]	R R l4       t]	R R l4       t]	R R l4       t]	R R l4       tRtR# )
BinGrouperi*  a  
This is an internal Grouper class

Parameters
----------
bins : the split index of binlabels to group the item of axis
binlabels : the label list
indexer : np.ndarray[np.intp], optional
    the indexer created by Grouper
    some groupers (TimeGrouper) will sort its axis and its
    group_info is also sorted, so need the indexer to reorder

Examples
--------
bins: [2, 4, 6, 8, 10]
binlabels: DatetimeIndex(['2005-01-01', '2005-01-03',
    '2005-01-05', '2005-01-07', '2005-01-09'],
    dtype='datetime64[ns]', freq='2D')

the group_info, which contains the label of each item in grouped
axis, the index of label in label list, group number, is

(array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4]), array([0, 1, 2, 3, 4]), 5)

means that, the grouped axis has 10 items, can be grouped into 5
labels, the first and second items belong to the first label, the
third and forth items belong to the second label, and so on

znpt.NDArray[np.int64]binsr   	binlabelsNc                   V ^8  d   QhRR/# r,   r0   )r1   s   "r2   r3   BinGrouper.__annotate__L  s     5 5
 
5r4   c                	    \        V4      V n        \        V4      V n        W0n        \        V P                  4      \        V P                  4      8X  g   Q hR # rT   )r   r  r   r  indexerrB   )rV   r  r  r  s   &&&&r2   rW   BinGrouper.__init__L  sB     !&	%i0 4>>"c$))n444r4   c                    \        V P                  V P                  RR7       UUu/ uF  w  rV\        Jg   K  WbK  	  pppV# u uppi )rm  Tr%  )r)  r  r  r   )rV   rH  rI  r   s   &   r2   ro  BinGrouper.groupsZ  sN     "$..$))DI
I
#~ CJI 	 

 
s
   AAc                   V ^8  d   QhRR/# r  r0   )r1   s   "r2   r3   r  g  s      s r4   c                	    ^# r\  r0   r  s   &r2   r  BinGrouper.nkeysf  s     r4   c                   V ^8  d   QhRR/# rL  r0   )r1   s   "r2   r3   r  l  s      0 r4   c                	    V P                   pV P                  e*   \        P                  ! WP                  34      pW,          pV# rT   )r   r  r7   lexsort)rV   r   r  s   &  r2   r  BinGrouper.codes_infok  s8     hh<<#ZZll 34F+C
r4   c                   V ^8  d   QhRR/# )r-   r"  r*   r0   )r1   s   "r2   r3   r  t  s     : : :r4   c              #    a"   V3R lp^ p\        V P                  V P                  RR7       F  w  rEV\        Jd   WR! W44      3x  TpK  	  V\	        S4      8  d!   V P                  R,          V! VR4      3x  R# R# 5i)r$  c                    < SP                   W # rT   )r  )startedger"  s   &&r2   <lambda>)BinGrouper.get_iterator.<locals>.<lambda>}  s    TYYu%:r4   Tr%  Nr   )r)  r  r  r   rB   )rV   r"  slicerr"  r#  labels   &f    r2   r,  BinGrouper.get_iteratort  s{      ; !tyy$..FKDCVE000E G
 3t9..$fUD&999 s   A=B c                	    \         P                  ! \        4      p^ p\        V P                  V P
                  RR7       F/  w  r4W$8  g   K  V\        Jd   \        \        W$4      4      W&   TpK1  	  V# )r  Tr%  )collectionsdefaultdictr]  r)  r  r  r   rr  )rV   r  r   r'  bins   &    r2   r  BinGrouper.indices  s^    ))$/dnndiiEJEw#%)%-%8GN	 F
 r4   c                   V ^8  d   QhRR/# )r-   r.   r  r0   )r1   s   "r2   r3   r    s      1 r4   c                	    V P                   .# rT   r  r  s   &r2   r@  BinGrouper.codes  s    zr4   c                	j   V P                   p\        V P                   4      ^ 8w  d,   \        V P                   ^ ,          4      '       d
   VR,          p\        V4      p\        P                  ! \        P
                  ^ V P                  3,          4      p\        V4      pV\        V P                  4      8X  d-   \        P                  ! \        P                  ! V4      V4      pMB\        P                  ! \        P
                  R\        P                  ! V4      3,          V4      p\        V4      pW3# )r  r   r   )
r  rB   r   r7   diffr_r  r   r  r  )rV   r(  r   repr   s   &    r2   rp  BinGrouper.result_index_and_ids  s    ~~t~~!#T^^A->(?(?'+Ll#ggbeeAtyyL)*!#&c$))n$))BIIg.4C))BEE"bii&8"893?C!#&  r4   c                   V ^8  d   QhRR/# rY  r0   )r1   s   "r2   r3   r    s          r4   c                	    V P                   .# rT   )r  r  s   &r2   rA  BinGrouper.levels  s    r4   c                   V ^8  d   QhRR/# r`  r0   )r1   s   "r2   r3   r    s     % %~ %r4   c                	0    V P                   P                  .# rT   )r  r_   r  s   &r2   rc  BinGrouper.names  s    ##$$r4   c                   V ^8  d   QhRR/# r  r0   )r1   s   "r2   r3   r    s      1 r4   c                	    V P                   pV P                  pVP                  V4      p\        P                  ! W3R RVP
                  R7      pV.# )FN)in_axisr  r  )r  r   rP  r   Groupingr?   )rV   levr@  r   rE  s   &    r2   r  BinGrouper.groupings  sG    nn%Es{{
 vr4   c                   V ^8  d   QhRR/# )r-   r.   r  r0   )r1   s   "r2   r3   r    s      * r4   c                	    V # rT   r0   r  s   &r2   r  BinGrouper.observed_grouper  s    r4   )r  r  r  rT   )r   r   r   r   r   r  rW   r   ro  r  r  r  r,  r  r@  rp  rA  rc  r  r  r  r0   r4   r2   r  r  *  s    <  5 	 	    :( 	 	   ! !"     % %    r4   r  c                   V ^8  d   QhRR/# rx  r0   )r1   s   "r2   r3   r3     s      4 r4   c                
   \        V \        4      '       d5   \        V4      ^8  d   R# V P                  P	                  V^ ,          4      # \        V \
        4      '       d#   V P                  P	                  V^ ,          4      # R# )r   F)r6   r    rB   rh  equalsr   )r;   r  s   &&r2   r  r    s_    #vt9q=yyQ((	C	#	#yyQ((r4   c                  P    ] tR tRtR R ltR R lt]R R l4       tR R	 ltR
t	R# )r/  i  c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r-   r"  r   r   r   r2  rM  r1  r.   r/   r0   )r1   s   "r2   r3   DataSplitter.__annotate__  s<     " "" "
 '" )" 
"r4   c               	6    Wn         W n        W@n        W0n        R # rT   )r"  r   _slabels	_sort_idx)rV   r"  r   r2  r1  s   &&&$$r2   rW   DataSplitter.__init__  s     	"!r4   c                   V ^8  d   QhRR/# )r-   r.   r)   r0   )r1   s   "r2   r3   rJ    s     	7 	7( 	7r4   c              #  	  "   V P                   ^ 8X  d   R# \        P                  ! V P                  V P                   4      w  rV P                  p\        WRR7       F"  w  rEV P                  V\        WE4      4      x  K$  	  R# 5i)r  NTr%  )r   r   generate_slicesrL  _sorted_datar)  _chopslice)rV   startsendssdatar"  ends   &     r2   r  DataSplitter.__iter__  sf     <<1 **4==$,,G!!f48JE**UE%$566 9s   BBc                   V ^8  d   QhRR/# )r-   r.   r   r0   )r1   s   "r2   r3   rJ    s     6 6h 6r4   c                	P    V P                   P                  V P                  ^ R7      # )r  r  )r"  rP  rM  r  s   &r2   rR  DataSplitter._sorted_data  s    yy~~dnn1~55r4   c                    V ^8  d   QhRRRR/# )r-   	slice_objrT  r.   r*   r0   )r1   s   "r2   r3   rJ    s     ( (e ( (r4   c                	    \        V 4      hrT   r   )rV   rW  r^  s   &&&r2   rS  DataSplitter._chop  s    !$''r4   )rL  rM  r"  r   N)
r   r   r   r   rW   r  r   rR  rS  r  r0   r4   r2   r/  r/    s*    "	7 6 6( (r4   r/  c                  "    ] tR tRtR R ltRtR# )r3  i  c               $    V ^8  d   QhRRRRRR/# )r-   rW  r    r^  rT  r.   r0   )r1   s   "r2   r3   SeriesSplitter.__annotate__  s!     9 96 9e 9 9r4   c                	    VP                   P                  V4      pVP                  W3P                  R 7      pVP                  Vn        VP                  VRR7      # )r  groupbymethod)_mgr	get_slice_constructor_from_mgrr  r_   _name__finalize__)rV   rW  r^  mgrsers   &&&  r2   rS  SeriesSplitter._chop  sN    jj""9-))#HH)=JJ	i88r4   r0   Nr   r   r   r   rS  r  r0   r4   r2   r3  r3    s    9 9r4   r3  c                  "    ] tR tRtR R ltRtR# )r4  i  c               $    V ^8  d   QhRRRRRR/# )r-   rW  r   r^  rT  r.   r0   )r1   s   "r2   r3   FrameSplitter.__annotate__  s!     8 89 8 89 8r4   c                	    VP                   P                  V^R7      pVP                  W3P                  R7      pVP	                  VRR7      # )r   r  re  rf  rg  )ri  rj  rk  r  rm  )rV   rW  r^  rn  dfs   &&&  r2   rS  FrameSplitter._chop  sG     jj""91"5((88(<uY77r4   r0   Nrq  r0   r4   r2   r4  r4    s    8 8r4   r4  )Kr   
__future__r   r*  r   typingr   r   r   r   numpyr7   pandas._libsr   r   pandas._libs.groupby_libsrf  r   pandas._typingr	   r
   r   r   r   pandas.errorsr   pandas.util._decoratorsr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   r   r   r   pandas.core.dtypes.missingr   r   pandas.core.arraysr   pandas.core.framer   pandas.core.groupbyr   pandas.core.indexes.apir   r   r   r   pandas.core.seriesr    pandas.core.sortingr!   r"   r#   r$   r%   collections.abcr&   r'   r(   r)   pandas.core.genericr*   r=   rD   rF   r  r  r  r/  r3  r4  r0   r4   r2   <module>r     s    #     * )  . 2 
 + ' '  &    ,>O
 O
dk k\T Tn(78$ (D9\ 98L 8r4   