
    ~Oda                        d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddlm"Z" ej#        Z$ddg ddd	d
dddZ%i di ddddddddddddddddddddddddddd dd!dd"dd#ddd$dd%dd&dg ddd'dd(ddd)dg ddd*ddg ddd+dd,ddd-ddd.d/d0d1dddd2d3d4d5e	d6 ee	          did7d8ed9id:ed;igd<ed=id>gd? ee ee           ee                    d@edAidBdCdDedEidFedGigd<ed=idHdIgdJedKdLdMdNdOed9idPedQigdRd<ed=idHd>dSgedTdUdVe	d6igdWedXedJdYgZ& eee          dZi eee          dZiedUi eee          d[e	d6igi eee          d[e	d6igiedV ee	e          d6 ee	e          d\igi eee          d]i eee          d]idd^	 eee          d_ ee ee                    d`e
daed_i eee          db ee ee                    dce
dbedbi eee          dS ee ee                    dde
ddedSi eee
e          dSiedeiedfiedgidh ee          dii eee e!dj                    diedkiedli ee e ee          e                    dmi ee e ee           ee                              dni ee eee                    doi ee ee ee                              dpiged<d>gied=igedqedriedsigedtieduiedSig eee          ddvedwidxedyigdSdIed=idHg eee          dzed{ied|ied}iged~ieduig eee          ddvdde
ddedied ee          didg ee
e eee                    ddedkidedidedigdedSig ee
e          dzd]edg
Z'i Z(d Z)d Z*dS )aK  

Build call-back mechanism for f2py2e.

Copyright 2000 Pearu Peterson all rights reserved,
Pearu Peterson <pearu@ioc.ee>
Permission to use, modify, and distribute this software is given under the
terms of the NumPy License.

NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
$Date: 2005/07/20 11:27:58 $
Pearu Peterson

   )__version__)
applyrules	debugcapi
dictappenderrmessgetargshasnoteisarray	iscomplexiscomplexarrayiscomplexfunction
isfunction
isintent_cisintent_hideisintent_inisintent_inoutisintent_nothideisintent_out
isoptional
isrequiredisscalarisstringisstringfunctionissubroutinel_andl_notl_oroutmessreplace
stripcommathrow_error)cfuncszPtypedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);a^  
#begintitle#
typedef struct {
    PyObject *capi;
    PyTupleObject *args_capi;
    int nofargs;
    jmp_buf jmpbuf;
} #name#_t;

#if defined(F2PY_THREAD_LOCAL_DECL) && !defined(F2PY_USE_PYTHON_TLS)

static F2PY_THREAD_LOCAL_DECL #name#_t *_active_#name# = NULL;

static #name#_t *swap_active_#name#(#name#_t *ptr) {
    #name#_t *prev = _active_#name#;
    _active_#name# = ptr;
    return prev;
}

static #name#_t *get_active_#name#(void) {
    return _active_#name#;
}

#else

static #name#_t *swap_active_#name#(#name#_t *ptr) {
    char *key = "__f2py_cb_#name#";
    return (#name#_t *)F2PySwapThreadLocalCallbackPtr(key, ptr);
}

static #name#_t *get_active_#name#(void) {
    char *key = "__f2py_cb_#name#";
    return (#name#_t *)F2PyGetThreadLocalCallbackPtr(key);
}

#endif

/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/
#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) {
    #name#_t cb_local = { NULL, NULL, 0 };
    #name#_t *cb = NULL;
    PyTupleObject *capi_arglist = NULL;
    PyObject *capi_return = NULL;
    PyObject *capi_tmp = NULL;
    PyObject *capi_arglist_list = NULL;
    int capi_j,capi_i = 0;
    int capi_longjmp_ok = 1;
#decl#
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_clock();
#endif
    cb = get_active_#name#();
    if (cb == NULL) {
        capi_longjmp_ok = 0;
        cb = &cb_local;
    }
    capi_arglist = cb->args_capi;
    CFUNCSMESS("cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\n");
    CFUNCSMESSPY("cb:#name#_capi=",cb->capi);
    if (cb->capi==NULL) {
        capi_longjmp_ok = 0;
        cb->capi = PyObject_GetAttrString(#modulename#_module,"#argname#");
        CFUNCSMESSPY("cb:#name#_capi=",cb->capi);
    }
    if (cb->capi==NULL) {
        PyErr_SetString(#modulename#_error,"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\n");
        goto capi_fail;
    }
    if (F2PyCapsule_Check(cb->capi)) {
    #name#_typedef #name#_cptr;
    #name#_cptr = F2PyCapsule_AsVoidPtr(cb->capi);
    #returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#);
    #return#
    }
    if (capi_arglist==NULL) {
        capi_longjmp_ok = 0;
        capi_tmp = PyObject_GetAttrString(#modulename#_module,"#argname#_extra_args");
        if (capi_tmp) {
            capi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);
            Py_DECREF(capi_tmp);
            if (capi_arglist==NULL) {
                PyErr_SetString(#modulename#_error,"Failed to convert #modulename#.#argname#_extra_args to tuple.\n");
                goto capi_fail;
            }
        } else {
            PyErr_Clear();
            capi_arglist = (PyTupleObject *)Py_BuildValue("()");
        }
    }
    if (capi_arglist == NULL) {
        PyErr_SetString(#modulename#_error,"Callback #argname# argument list is not set.\n");
        goto capi_fail;
    }
#setdims#
#ifdef PYPY_VERSION
#define CAPI_ARGLIST_SETITEM(idx, value) PyList_SetItem((PyObject *)capi_arglist_list, idx, value)
    capi_arglist_list = PySequence_List(capi_arglist);
    if (capi_arglist_list == NULL) goto capi_fail;
#else
#define CAPI_ARGLIST_SETITEM(idx, value) PyTuple_SetItem((PyObject *)capi_arglist, idx, value)
#endif
#pyobjfrom#
#undef CAPI_ARGLIST_SETITEM
#ifdef PYPY_VERSION
    CFUNCSMESSPY("cb:capi_arglist=",capi_arglist_list);
#else
    CFUNCSMESSPY("cb:capi_arglist=",capi_arglist);
#endif
    CFUNCSMESS("cb:Call-back calling Python function #argname#.\n");
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_call_clock();
#endif
#ifdef PYPY_VERSION
    capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist_list);
    Py_DECREF(capi_arglist_list);
    capi_arglist_list = NULL;
#else
    capi_return = PyObject_CallObject(cb->capi,(PyObject *)capi_arglist);
#endif
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_call_clock();
#endif
    CFUNCSMESSPY("cb:capi_return=",capi_return);
    if (capi_return == NULL) {
        fprintf(stderr,"capi_return is NULL\n");
        goto capi_fail;
    }
    if (capi_return == Py_None) {
        Py_DECREF(capi_return);
        capi_return = Py_BuildValue("()");
    }
    else if (!PyTuple_Check(capi_return)) {
        capi_return = Py_BuildValue("(N)",capi_return);
    }
    capi_j = PyTuple_Size(capi_return);
    capi_i = 0;
#frompyobj#
    CFUNCSMESS("cb:#name#:successful\n");
    Py_DECREF(capi_return);
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_clock();
#endif
    goto capi_return_pt;
capi_fail:
    fprintf(stderr,"Call-back #name# failed.\n");
    Py_XDECREF(capi_return);
    Py_XDECREF(capi_arglist_list);
    if (capi_longjmp_ok) {
        longjmp(cb->jmpbuf,-1);
    }
capi_return_pt:
    ;
#return#
}
#endtitle#
)zsetjmp.h
CFUNCSMESSF2PY_THREAD_LOCAL_DECLz#maxnofargs#z#nofoptargs#zF    def #argname#(#docsignature#): return #docreturn#\n\
#docstrsigns#zc
{{}\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}
#routnote#

#latexdocstrsigns#z1def #argname#(#docsignature#): return #docreturn#)
cbtypedefsbodyneed
maxnofargs
nofoptargsdocstrlatexdocstrdocstrshortseparatorsfordecl
args,optargs 	pyobjfromfreememargs_td
optargs_tdargs_nm
optargs_nm	frompyobjsetdimsdocstrsignsz\n"
"latexdocstrsignslatexdocstrreqlatexdocstroptlatexdocstroutlatexdocstrcbsz/*decl*/z/*pyobjfrom*/z/*frompyobj*/return
strarglensz/*freemem*/strarglens_tdstrarglens_nmnoargsz/*setdims*/z    Required arguments:z    Optional arguments:z    Return objects:z    Call-back functions:z\noindent Required arguments:z\noindent Optional arguments:z\noindent Return objects:z\noindent Call-back functions:z
--- #note#)r<   r=   	docstrreq	docstropt	docstrout	docstrcbs	docreturndocsign
docsignoptr>   r?   r@   rA   routnotez    #ctype# return_value = 0;z,    CFUNCSMESS("cb:Getting return_value->");a      if (capi_j>capi_i) {
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,
          "#ctype#_from_pyobj failed in converting return_value of"
          " call-back function #name# to C #ctype#\n");
    } else {
        fprintf(stderr,"Warning: call-back function #name# did not provide"
                       " return value (index=%d, type=#ctype#)\n",capi_i);
    }z8    fprintf(stderr,"#showvalueformat#.\n",return_value);z#ctype#_from_pyobjr#   GETSCALARFROMPYTUPLEz    return return_value;)r.   r:   r'   rB   _checkzB    fprintf(stderr,"debug-capi:cb:#name#:%d:\n",return_value_len);z)#ctype# return_value,int return_value_lenzreturn_value,&return_value_lenz#ctype# ,intz.    CFUNCSMESS("cb:Getting return_value->\"");a      if (capi_j>capi_i) {
        GETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);
    } else {
        fprintf(stderr,"Warning: call-back function #name# did not provide"
                       " return value (index=%d, type=#ctype#)\n",capi_i);
    }z:    fprintf(stderr,"#showvalueformat#\".\n",return_value);zstring.hGETSTRFROMPYTUPLEzreturn;)r4   r0   r8   r6   r:   r'   rB   rP   z<
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *return_value
#endif
z3
#ifndef F2PY_CB_RETURNCOMPLEX
return_value
#endif
z0
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *
#endif
zH
#ifdef F2PY_CB_RETURNCOMPLEX
    #ctype# return_value = {0, 0};
#endif
a      if (capi_j>capi_i) {
#ifdef F2PY_CB_RETURNCOMPLEX
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,
          "#ctype#_from_pyobj failed in converting return_value of call-back"
          " function #name# to C #ctype#\n");
#else
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,
          "#ctype#_from_pyobj failed in converting return_value of call-back"
          " function #name# to C #ctype#\n");
#endif
    } else {
        fprintf(stderr,
                "Warning: call-back function #name# did not provide"
                " return value (index=%d, type=#ctype#)\n",capi_i);
    }z#ifdef F2PY_CB_RETURNCOMPLEX
    fprintf(stderr,"#showvalueformat#.\n",(return_value).r,(return_value).i);
#else
    fprintf(stderr,"#showvalueformat#.\n",(*return_value).r,(*return_value).i);
#endif
zP
#ifdef F2PY_CB_RETURNCOMPLEX
    return return_value;
#else
    return;
#endif
z#ctype#)r2   r9   r7   r.   r:   rB   r'   rP   z        #pydocsignout#z"\item[]{{}\verb@#pydocsignout#@{}}z#rname#,)rI   r@   rK   rP   )rP   rB   z        #pydocsign#z\item[]{{}\verb@#pydocsign#@{}}z--- See above.z
#varname#,)	rH   rG   rI   r?   r>   r@   rL   rM   dependz#ctype# #varname_i#z#ctype# *#varname_i#_cb_capiz#ctype# *#varname_i#z#varname_i#z#varname_i#_cb_capiz	#ctype# *z,int #varname_i#_cb_lenz,intz,#varname_i#_cb_len)r0   r8   r6   r'   rC   rD   rE   z/    #ctype# #varname_i#=(*#varname_i#_cb_capi);z8intent(c,out) is forbidden for callback scalar argumentsz)    CFUNCSMESS("cb:Getting #varname#->");z    if (capi_j>capi_i)
        GETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname_i#_cb_capi,#ctype#,"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\n");z7    fprintf(stderr,"#showvalueformat#.\n",#varname_i#);z@    fprintf(stderr,"#showvalueformat#.\n",*#varname_i#_cb_capi);zK    fprintf(stderr,"#showvalueformat#.\n",(#varname_i#).r,(#varname_i#).i);z]    fprintf(stderr,"#showvalueformat#.\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);)r.   errorr:   r'   rP   z    if (cb->nofargs>capi_i)
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyobj_from_#ctype#1(#varname_i#)))
            goto capi_fail;z    if (cb->nofargs>capi_i)
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyarr_from_p_#ctype#1(#varname_i#_cb_capi)))
            goto capi_fail;zpyobj_from_#ctype#1zpyarr_from_p_#ctype#1)r4   r'   rP   	_optionalz+    CFUNCSMESS("cb:Getting #varname#->\"");zf    if (capi_j>capi_i)
        GETSTRFROMPYTUPLE(capi_return,capi_i++,#varname_i#,#varname_i#_cb_len);zP    fprintf(stderr,"#showvalueformat#\":%d:.\n",#varname_i#,#varname_i#_cb_len);)r:   r'   rP   ze    fprintf(stderr,"debug-capi:cb:#varname#=#showvalueformat#:%d:\n",#varname_i#,#varname_i#_cb_len);z    if (cb->nofargs>capi_i)
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyobj_from_#ctype#1size(#varname_i#,#varname_i#_cb_len)))
            goto capi_fail;z    if (cb->nofargs>capi_i) {
        int #varname_i#_cb_dims[] = {#varname_i#_cb_len};
        if (CAPI_ARGLIST_SETITEM(capi_i++,pyarr_from_p_#ctype#1(#varname_i#,#varname_i#_cb_dims)))
            goto capi_fail;
    }zpyobj_from_#ctype#1sizez6    npy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};z    #cbsetdims#;)r.   r;   rP   _dependz0    fprintf(stderr,"debug-capi:cb:#varname#\n");a      if (cb->nofargs>capi_i) {
        /* tmp_arr will be inserted to capi_arglist_list that will be
           destroyed when leaving callback function wrapper together
           with tmp_arr. */
        PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,
          #rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,#elsize#,
          NPY_ARRAY_CARRAY,NULL);
a      if (cb->nofargs>capi_i) {
        /* tmp_arr will be inserted to capi_arglist_list that will be
           destroyed when leaving callback function wrapper together
           with tmp_arr. */
        PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,
          #rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,#elsize#,
          NPY_ARRAY_FARRAY,NULL);
z
        if (tmp_arr==NULL)
            goto capi_fail;
        if (CAPI_ARGLIST_SETITEM(capi_i++,(PyObject *)tmp_arr))
            goto capi_fail;
})r4   rP   rT   z    if (capi_j>capi_i) {
        PyArrayObject *rv_cb_arr = NULL;
        if ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail;
        rv_cb_arr =  array_from_pyobj(#atype#,#varname_i#_Dims,#rank#,F2PY_INTENT_INz|F2PY_INTENT_Ca8  ,capi_tmp);
        if (rv_cb_arr == NULL) {
            fprintf(stderr,"rv_cb_arr is NULL\n");
            goto capi_fail;
        }
        MEMCOPY(#varname_i#,PyArray_DATA(rv_cb_arr),PyArray_NBYTES(rv_cb_arr));
        if (capi_tmp != (PyObject *)rv_cb_arr) {
            Py_DECREF(rv_cb_arr);
        }
    }z    fprintf(stderr,"<-.\n");MEMCOPY)rK   rP   c                     g t           | d         <   | d         D ]J}|d         dk    r<|d         D ]3}|rt          || d                    t          d| d         z             4Kd S )Nnamer&   block	interfacezwarning: empty body for %s
)cb_mapbuildcallbackr   )mbibs      3lib/python3.11/site-packages/numpy/f2py/cb_rules.pybuildcallbacksra     s    F1V9i J Jg;+%%Z J J J!!QvY////:aiHIIIIJ J    c                    ddl m} t          d| d         d|d           t          |           \  }}||_        | d         }|                    | |          }t          i |          }t          |                             | d         |d         g           t          D ]<}d|v r |d         |           sd|vr!t          |||           }	t          ||	          }=i }
t          |          D ]\  }}|                    |||         |	          }||
|<   t          D ]m}d
|v rd|v rt          ||                   r!d|v r |d         ||                   sd|vr-t          ||||                   }	t          ||	          }d|v r nn|D ]}|
|         }t          D ]q}d
|v rd|vsd|v rt          ||                   r%d|v r |d         ||                   sd|vr-t          ||||                   }	t          ||	          }d|v r nr|D ]j}|
|         }t          D ]X}d
|vrd|v rd|v r |d         ||                   sd|vr-t          ||||                   }	t          ||	          }d|v r nYkd|v rLd|v rHt!          |d         t"                    r-|d         dgz   |d<   |d         dgz   |d<   |d         dgz   |d<   t!          |d         t"                    r(t%          t'          dd|d         i                    |d<   t%          t'          dd|d         i                    }|dk    r)t%          t'          dd|d         i                    |d<   nt'          d|d         |d          |d<   |d                             dd          |d<   |d                             dd           |d<   g |d!<   g |d"<   d#D ]}||v r/t!          ||         t"                    r|d!         ||         z   |d!<   d$|z   }||v rPt!          ||         t"                    r5|d"         ||         d%d         z   d&gz   ||         dd          z   d'gz   |d"<   d|vrd|d<   d|d(<   d|d)<   |                    d          s/|                    d          s|                    d*          sd+|d,<   t          t*          |          }	|	d-         t,          j        |d         <   t!          |	d.         t0                    r|	d.         g|	d.<   d.|v rFt,          j                                        D ]'}||d.         v r|	d.                             |           (|	d/         t,          j        |d         d0z   <   |	d.                             |d         d0z              |	d.         t,          j        |d         <   |	d1         |	d2         |	d3         |	d4         |d5         d6|j        |d         <   t          d7|	d8         z             d S )9Nr   )	capi_mapsz(    Constructing call-back function "cb_rX   _in_z"
varsrP   )indexrU   rT   _breakr0   r2   z(
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
r9   r7   rK   z#docreturn#z#docsignopt#rM   r3   z	#docsign#rL   docsignaturez#docsign#[#docsignopt#])rL   rM   _z\_latexdocsignaturer1   z, r<   r=   )rG   rH   rI   rJ   latex    z\begin{description}z\end{description}r6   r8   rC   voidrF   r&   r'   r%   _typedefr(   r)   r*   r+   argname)r(   r)   r*   r+   rp   z	      %s
r,   )r3   rd   r   r   depargscb_routsign2mapr   r[   appendcb_rout_rulesr   	enumeratecb_sign2mapcb_arg_rulesr   r   
isinstancelistr    r   getcb_routine_rulesr"   	callbacksstrtypedefskeystypedefs_generatedneedslcb2_map)routumrd   r0   rq   varvrdrdrarsavevrdiar2   kts                   r`   r\   r\     s>   G&\\\222      DMMMD'I
v,C

#
#D"
-
-C	B		B
2JtF|RZ0111 $ $MMkak$//MXQ5F5FAsD))BB##BG$  1##As1vQ#77
 		 		AA~~aJs1v$6$6A+!H+c!f"5"581;L;L3A//B''q==E  aj 		 		AA~~1$$+*:*:z#a&?Q?Q*:A+!H+c!f"5"581;L;L3A//B''q==E  aj 		 		A!!aA+!H+c!f"5"581;L;L3A//B''q==E||	RbmT** 	yM . - ByM
  ",/ 4 3  B|
  ",/ 4 3  B|
 "[/4(( D$MKK#ABBD D;".<0@!A# # $ $G "}}'K)R	]!;<<> >> %%>13I4;&( &() )> !088eDDB !45==c4HHBB}BA ' '77z"Q%..7 "= 1BqE 9B}aK77z"Q%..7%'(:%;beAaCj%H'(&)+-a59&5%&&'B!" R6
99FF6NN bffY// 266,3G3G 8	$b	)	)B#%f:FRZ "V*c"" "j\6
||%%'' 	% 	%ABvJ6
!!!$$$9;L9IFbj:56vJbj:-...!&zFLF46|4D46|4D028575F13I	&( &(Ir&z" LB}-.///
Frb   N)+__doc__r3   r   auxfuncsr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   versionf2py_versionr{   rt   rw   r[   ra   r\    rb   r`   <module>r      s
                                                                              " e[x A@@  
 GSj j X 	&$ 	 #	'0"	6A4	IRTX	#S	*6	 $S	 +7	 &t		 .7		
 (	 -d	 +D	 3CD	 +D	 3CD	 	
 ( ;F 	 r $,R 2>r DMm 	2 $R *9" 	2 $R *9" 	"  	=!" r..*/Bb::6;lEE'NNB?7  : 0FG	 HJ
 &	<'@BXY,%
EE*:$;$;UUCT=U=UVV% *  !fg;3!IJ	 KM
 &	<'@02") .


 FG	    %
4 &	<'@3Y@#q9 9t +> ,/1	 
 y11MGV eJ(899;PQeJ(899;PQ"$<= 5-=>>AdBI<AXAZ [ 5-=>>AdBI<AXAZ ['*P+05-+H+H,+05:J+K+KM]+_*` a E*&677FuZ)9::LI " E(J'')>E(EE*--..0N++	
 E(J''E(EE*--..0E]m	
 E(J''E(EE*--..[i	
 h22I>!:;"F+"$9:1 6 z""$UV%
L#$^__a a !"MN# kluYeeI.>.>
(K(KLLTVuYeeI.>.>z@R@R(S(STT]_uYi(D(DEEhjuYi
9K9K(L(LMMz| !57M NO\*,' * # %   & (  	! 45 "9:Y') %"233  !"PQS km /\*J8%,//
 
 9;     & (	 
 89 "9:<%"233% , I%	  !"UV! $ uZ(( +&)4 %!144^3T3TUU9 < !"MNX "#34		 !"AB!$ ^Y78%..) , " GgT 
J J J| | | | |rb   