U e@sdZddlmZmZmZddlZddlZddlmZm Z ddl m Z ddl m Z mZmZddlmZdd lmZeeGd d d eZeeGd d d eZdS)z*Module gathering all abstract base classes)ABCMetaabstractmethodabstractpropertyN)make_abc BYTE_TYPES)MySQLConverterBase) ClientFlag CharacterSetDEFAULT_CONFIGURATION)MySQLOptionsParser)errorsc@seZdZdZddZddZddZedd Zed d Z ed d Z eddZ e ddZ e jddZ eddZddZddZddZddZe ddZdd Zd!d"Zed#d$Zejd%d$Zed&d'Zejd(d'Zed)d*Zdd,d-Zdd/d0Zed1d2Zejd3d2Zed4d5Zejd6d5Zed7d8Zejd9d8Zed:d;Z e jdZ!ed?d@Z"ddAdBZ#edCdDZ$edEdFZ%edGdHZ&dIdJZ'edKdLZ(e(Z)dMdNZ*ddQdRZ+edSdTZ,eddVdWZ-edXdYZ.eddZd[Z/ed\d]Z0ed^d_Z1dd`daZ2ddbdcZ3dddeZ4eddfdgZ5dhdiZ6ddjdkZ7dldmZ8dndoZ9dpdqZ:ddrdsZ;dtduZdzd{Z?d|d}Z@dddZAddZBdddZCddZDddZEddZFddZGd+S)MySQLConnectionAbstractz7Abstract class for classes connecting to a MySQL servercKst|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_i|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_!d|_"d|_#dS) Z Initialize!NFz 127.0.0.1i rT)$r get_default _client_flags _charset_id _sql_mode _time_zone _autocommit_server_version _handshake_user _password _database_host_port _unix_socketZ _client_hostZ _client_port_sslZ _force_ipv6 _use_unicode _get_warnings_raise_on_warningsZ_connection_timeoutZ _buffered_unread_resultZ_have_next_result_rawZ_in_transactionZ_prepared_statementsZ _ssl_activeZ _auth_pluginZ_pool_config_version converter_converter_class _compress_consume_resultsselfkwargsr,n/opt/hc_python/lib64/python3.8/site-packages/../../../lib/python3.8/site-packages/mysql/connector/abstracts.py__init__)sD z MySQLConnectionAbstract.__init__cCs|S)zReturn self for weakref.proxy This method is used when the original object is needed when using weakref.proxy. r,r*r,r,r- _get_selfSsz!MySQLConnectionAbstract._get_selfc Csd|krz.t|dtr(|dg|d<|d}|d=Wntk rTddg}YnXt|dtrr|dg|d<tt|ddd}|d=|j|}i}|D]}z||D]t\}}z<|dkrd}t|||ks||d |d kr|||<Wqtk r"|dkrtd |YqXqWqtk rBYqYqXq|D]P\}}||krNzt |d ||<Wn&t t fk r|d ||<YnXqN|S) z Read option files for connection parameters. Checks if connection arguments contain option file arguments, and then reads option files accordingly. Z option_files option_groupsclientZconnector_pythonF)Z keep_dashessocket unix_socketrUnsupported argument '{0}'r) isinstancestrKeyErrorr listZ get_groups_as_dict_with_priorityitemsr AttributeErrorformateval NameError SyntaxError) r*configgroupsZ option_parserZconfig_from_fileZconfig_optionsgroupoptionvaluer,r,r-_read_option_files[sV       z*MySQLConnectionAbstract._read_option_filescCs|jS)z#User used while connecting to MySQL)rr/r,r,r-userszMySQLConnectionAbstract.usercCs|jS)zMySQL server IP address or name)rr/r,r,r- server_hostsz#MySQLConnectionAbstract.server_hostcCs|jS)zMySQL server TCP/IP port)rr/r,r,r- server_portsz#MySQLConnectionAbstract.server_portcCs|jS)zMySQL Unix socket file location)rr/r,r,r-r4sz#MySQLConnectionAbstract.unix_socketcCsdS)zGet the current databaseNr,r/r,r,r-databasesz MySQLConnectionAbstract.databasecCs|d|dS)zSet the current databasezUSE %sN) cmd_queryr*rDr,r,r-rIscCs|jS)z"Returns whether to consume results)r(r/r,r,r-can_consume_resultssz+MySQLConnectionAbstract.can_consume_resultsc Ks|}d|krtd||z|d|_|d=Wntk rLYnXz|d|_|d=Wntk rvYnXz$t}| |dp||d=Wntk rYnXz |drd|_ | tj gWntk rYnXz|ds| tj gWntk rYnXz|d s2d |_ nd|_ Wntk rVd |_ YnXd |ksld |krz|d }|d =Wntk rd }YnXz|d }|d =Wntk rd }YnXt||d|_z||dWn2tk rYntk rtdYnXdddg}|D]B\}}z ||krN||||<||=Wntk rlYnXq.d|ksd|krz|d} |d=Wntk r|j} YnXz|d} |d=Wntk r|j} YnX|| | zt|d|_|d=Wn4tk r Yn tk r>tdYnXd } |D]\} } z t| Wn$tk rtd| YnX| drd} |j | !dd| in@d| }zt"||| #Wn"tk rt"||| YnXqL| rd|jkrtd|jd<d|jks0|jdd kr8tdt$d |jkt$d!|jkkr`td"nPt%d#t%|jksd |jd <d |jd!<n&|jd d k|jd!d kkrtd$| tj&gd S)%zConfigure the MySQL Connection This method allows you to configure the MySQLConnection instance. Raises on errors. Zdsnz!Data source name is not supported get_warningsraise_on_warningsZ client_flagscompressTZallow_local_infileZconsume_resultsFcharset collationNrZconverter_classFConverter class should be a subclass of conversion.MySQLConverterBase.)dbrI)passwdpassword)connect_timeoutZconnection_timeoutrFrUportz'TCP/IP port number should be an integerr5ssl_r_Z verify_certZssl_verify_certcazMissing ssl_ca argument.keycertz;ssl_key and ssl_cert need to be both specified, or neither.)r[r\z5ssl_key and ssl_cert need to be both set, or neither.)'copyr NotSupportedErrorrErMr8rNr rset_client_flagsr'ZCOMPRESSZ LOCAL_FILESr(r get_charset_inforset_converter_class TypeErrorr;rr set_loginintr ValueErrorInterfaceErrorr:r r< startswithrupdatereplacesetattrstripboolsetZSSL)r*r+r@defaultrPrQZ compat_mapcompat translaterFrUZ set_ssl_flagr[rD attributer,r,r-r@s                                zMySQLConnectionAbstract.configcCst|tr|}td}||}|s4tdtdd| ddD}d| d kr~|d krtd |n|d krtd ||S) a7Check the MySQL version This method will check the MySQL version and raise an InterfaceError when it is not supported or invalid. It will return the version as a tuple with major, minor and patch. Raises InterfaceError if invalid server version. Returns tuple z$^(\d{1,2})\.(\d{1,2})\.(\d{1,3})(.*)zFailed parsing MySQL versioncSsg|] }t|qSr,)rd).0vr,r,r- hszAMySQLConnectionAbstract._check_server_version..rZfabric)rz#MySQL Fabric '{0}' is not supported)rvrz%MySQL Version '{0}' is not supported.) r6rdecoderecompilematchr rftuplerArBlowerr<)r*Zserver_versionZ regex_verr{versionr,r,r-_check_server_versionSs&    z-MySQLConnectionAbstract._check_server_versioncCs|jS)zGet the MySQL version This method returns the MySQL server version as a tuple. If not previously connected, it will return None. Returns a tuple or None. )rr/r,r,r-get_server_versiontsz*MySQLConnectionAbstract.get_server_versionc Cs,z |jdWSttfk r&YdSXdS)zGet the original MySQL version information This method returns the original MySQL server as text. If not previously connected, it will return None. Returns a string or None. Zserver_version_originalN)rrbr8r/r,r,r-get_server_info~s z'MySQLConnectionAbstract.get_server_infocCsdS)z'MySQL session has started a transactionNr,r/r,r,r-in_transactionsz&MySQLConnectionAbstract.in_transactioncCspt|tr|dkr||_nPt|ttfr`|D]0}|dkrN|jt|M_q,|j|O_q,n td|jS)aSet the client flags The flags-argument can be either an int or a list (or tuple) of ClientFlag-values. If it is an integer, it will set client_flags to flags as is. If flags is a list (or tuple), each flag will be set or unset when it's negative. set_client_flags([ClientFlag.FOUND_ROWS,-ClientFlag.LONG_FLAG]) Raises ProgrammingError when the flags argument is not a set or an integer bigger than 0. Returns self.client_flags rz+set_client_flags expect integer (>0) or set)r6rdrr|r9absr ProgrammingError)r*flagsflagr,r,r-r_sz(MySQLConnectionAbstract.set_client_flagscCs|j|@dkrdSdS)zCheck if a client flag is setrTF)r)r*rr,r,r-isset_client_flagsz)MySQLConnectionAbstract.isset_client_flagcCs|ddS)zGet the current time zonezSELECT @@session.time_zoner info_queryr/r,r,r- time_zonesz!MySQLConnectionAbstract.time_zonecCs|d|||_dS)zSet the time zonezSET @@session.time_zone = '{0}'N)rJr<rrKr,r,r-rscCs|ddS)zGet the SQL modezSELECT @@session.sql_moderrr/r,r,r-sql_modesz MySQLConnectionAbstract.sql_modecCs2t|ttfrd|}|d|||_dS)aSet the SQL mode This method sets the SQL Mode for the current connection. The value argument can be either a string with comma separate mode names, or a sequence of mode names. It is good practice to use the constants class SQLMode: from mysql.connector.constants import SQLMode cnx.sql_mode = [SQLMode.NO_ZERO_DATE, SQLMode.REAL_AS_FLOAT] ,zSET @@session.sql_mode = '{0}'N)r6r9r|joinrJr<rrKr,r,r-rs  cCsdS)z%Send a query which only returns 1 rowNr,r*queryr,r,r-rsz"MySQLConnectionAbstract.info_queryNcCs4|dk r||_nd|_|dk r*||_nd|_dS)zSet login information for MySQL Set the username and/or password for the user connecting to the MySQL Server. Nr)rkrr)r*usernamerUr,r,r-rcs  z!MySQLConnectionAbstract.set_loginTcCs||_|jr|j|dS)zuToggle unicode mode Set whether we return string fields as unicode or not. Default is True. N)r r% set_unicoderKr,r,r-rsz#MySQLConnectionAbstract.set_unicodecCs|dd}|dkrdSdS)z#Get whether autocommit is on or offzSELECT @@session.autocommitrrTFrrKr,r,r- autocommitsz"MySQLConnectionAbstract.autocommitcCs&|rdnd}|d|||_dS)zToggle autocommitONZOFFzSET @@session.autocommit = {0}N)rJr<r)r*rDswitchr,r,r-rs cCs|jS)zGet whether this connection retrieves warnings automatically This method returns whether this connection retrieves warnings automatically. Returns True, or False when warnings are not retrieved. )r!r/r,r,r-rMs z$MySQLConnectionAbstract.get_warningscCst|tstd||_dS)zSet whether warnings should be automatically retrieved The toggle-argument must be a boolean. When True, cursors for this connection will retrieve information about warnings (if any). Raises ValueError on error. Expected a boolean typeN)r6rlrer!rKr,r,r-rM s cCs|jS)zGet whether this connection raises an error on warnings This method returns whether this connection will raise errors when MySQL reports warnings. Returns True or False. )r"r/r,r,r-rNs z)MySQLConnectionAbstract.raise_on_warningscCs"t|tstd||_||_dS)aSet whether warnings raise an error The toggle-argument must be a boolean. When True, cursors for this connection will raise an error when MySQL reports warnings. Raising on warnings implies retrieving warnings automatically. In other words: warnings will be set to True. If set to False, warnings will be also set to False. Raises ValueError on error. rN)r6rlrer"r!rKr,r,r-rN"s cCs|jS)zGet whether there is an unread result This method is used by cursors to check whether another cursor still needs to retrieve its result set. Returns True, or False when there is no unread result. )r#r/r,r,r- unread_result5s z%MySQLConnectionAbstract.unread_resultcCst|tstd||_dS)zSet whether there is an unread result This method is used by cursors to let other cursors know there is still a result set that needs to be retrieved. Raises ValueError on errors. rN)r6rlrer#rKr,r,r-r@s cCst|jdS)a+Returns the character set for current connection This property returns the character set name of the current connection. The server is queried when the connection is active. If not connected, the configured character set name is returned. Returns a string. rr get_inforr/r,r,r-rPMs zMySQLConnectionAbstract.charsetcCs$t|jd}|dkrdS|SdS)ayReturns the Python character set for current connection This property returns the character set name of the current connection. Note that, unlike property charset, this checks if the previously set character set is supported by Python and if not, it returns the equivalent character set that Python supports. Returns a string. r)Zutf8mb4binaryutf8Nr)r*encodingr,r,r-python_charsetYs z&MySQLConnectionAbstract.python_charsetcCs|rRt|tr(||_t|\|_}}qjt|trHt||\|_}}qjtdn|rjtj|d\|_}}|d||z| |Wnt k rYnX|j r|j |dS)aVSets the character set and collation for the current connection This method sets the character set and collation to be used for the current connection. The charset argument can be either the name of a character set as a string, or the numerical equivalent as defined in constants.CharacterSet. When the collation is not given, the default will be looked up and used. For example, the following will set the collation for the latin1 character set to latin1_general_ci: set_charset('latin1','latin1_general_ci') z0charset should be either integer, string or None)rQzSET NAMES '{0}' COLLATE '{1}'N) r6rdrr r`r7re_execute_queryr<Zset_character_set_namer;r% set_charset)r*rPrQ charset_nameZcollation_namer,r,r-set_charset_collationjs0     z-MySQLConnectionAbstract.set_charset_collationcCst|jdS)aReturns the collation for current connection This property returns the collation name of the current connection. The server is queried when the connection is active. If not connected, the configured collation name is returned. Returns a string. )r r`rr/r,r,r-rQs z!MySQLConnectionAbstract.collationcCsdS)z>> cnx = mysql.connector.connect(..) >>> cnx.start_transaction(isolation_level='SERIALIZABLE') Raises ProgrammingError when a transaction is already in progress and when ValueError when isolation_level specifies an Unknown level. zTransaction already in progress- zREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READZ SERIALIZABLEzUnknown isolation level "{0}"z#SET TRANSACTION ISOLATION LEVEL {0}N)rwrwz6MySQL server version {0} does not support this featurez READ ONLYz READ WRITEzSET TRANSACTION {0}zSTART TRANSACTIONz WITH CONSISTENT SNAPSHOT) rr rrkriupperrer<rrrJ)r*Zconsistent_snapshotZisolation_levelreadonlylevelZlevelsZ access_moderr,r,r-start_transaction s>  z)MySQLConnectionAbstract.start_transactionc Cs|stdz |WnDtjtfk rb|jrFtdn||j|j |j |j YnX|sl|r| }|r| D]\}}|d||fq|r| D]\}}|d||fq|dS)aClears the current active session This method resets the session state, if the MySQL server is 5.7.3 or later active session will be reset without re-authenticating. For other server versions session will be reset by re-authenticating. It is possible to provide a sequence of variables and their values to be set after clearing the session. This is possible for both user defined variables and session variables. This method takes two arguments user_variables and session_variables which are dictionaries. Raises OperationalError if not connected, InternalError if there are unread results and InterfaceError on errors. zMySQL Connection not available.zZReset session is not supported with compression for MySQL server version 5.7.2 or earlier.zSET @`{0}` = %szSET SESSION `{0}` = %sN)rr ZOperationalErrorcmd_reset_connectionr^NotImplementedErrorr'cmd_change_userrrrrrr:executer<close)r*Zuser_variablesZsession_variablescurr[rDr,r,r- reset_session?s,    z%MySQLConnectionAbstract.reset_sessioncCs@|r4t|tr4t|jd}||_|||j|_ntddS)z Set the converter class to be used. This should be a class overloading methods and members of conversion.MySQLConverter. rrRN) issubclassrr rrr&r r%rb)r*Z convclassrr,r,r-rags z+MySQLConnectionAbstract.set_converter_classcCsdS)z)Get all rows returned by the MySQL serverNr,)r*countrcolumnsr,r,r-get_rowstsz MySQLConnectionAbstract.get_rowscCstdS)zChange the current databaseNr)r*rIr,r,r- cmd_init_dbysz#MySQLConnectionAbstract.cmd_init_dbcCstdS)z Send a query to the MySQL serverNr)r*rrrZ raw_as_stringr,r,r-rJ}sz!MySQLConnectionAbstract.cmd_querycCstdS)z/Send one or more statements to the MySQL serverNr)r*Z statementsr,r,r-cmd_query_itersz&MySQLConnectionAbstract.cmd_query_itercCstdS)z,Send the Refresh command to the MySQL serverNr)r*optionsr,r,r- cmd_refreshsz#MySQLConnectionAbstract.cmd_refreshcCstdS)z,Close the current connection with the serverNrr/r,r,r-cmd_quitsz MySQLConnectionAbstract.cmd_quitcCstdS)zShut down the MySQL ServerNr)r*Z shutdown_typer,r,r- cmd_shutdownsz$MySQLConnectionAbstract.cmd_shutdowncCstdS)z/Send the statistics command to the MySQL ServerNrr/r,r,r-cmd_statisticssz&MySQLConnectionAbstract.cmd_statisticscCstddS)akGet the process list of the MySQL Server This method is a placeholder to notify that the PROCESS_INFO command is not supported by raising the NotSupportedError. The command "SHOW PROCESSLIST" should be send using the cmd_query()-method or using the INFORMATION_SCHEMA database. Raises NotSupportedError exception z;Not implemented. Use SHOW PROCESSLIST or INFORMATION_SCHEMAN)r r^r/r,r,r-cmd_process_infos z(MySQLConnectionAbstract.cmd_process_infocCstdS)zKill a MySQL processNr)r*Z mysql_pidr,r,r-cmd_process_killsz(MySQLConnectionAbstract.cmd_process_killcCstdS)zSend the DEBUG commandNrr/r,r,r- cmd_debugsz!MySQLConnectionAbstract.cmd_debugcCstdS)zSend the PING commandNrr/r,r,r-cmd_pingsz MySQLConnectionAbstract.cmd_pingrrcCstdS)z!Change the current logged in userNr)r*rrUrIrPr,r,r-rsz'MySQLConnectionAbstract.cmd_change_usercCstdS)zPrepare a MySQL statementNr)r*Z statementr,r,r-cmd_stmt_preparesz(MySQLConnectionAbstract.cmd_stmt_preparer,cCstdS)z"Execute a prepared MySQL statementNr)r* statement_iddata parametersrr,r,r-cmd_stmt_executesz(MySQLConnectionAbstract.cmd_stmt_executecCstdS)z%Deallocate a prepared MySQL statementNrr*rr,r,r-cmd_stmt_closesz&MySQLConnectionAbstract.cmd_stmt_closecCstdS)zSend data for a columnNr)r*rZparam_idrr,r,r-cmd_stmt_send_long_datasz/MySQLConnectionAbstract.cmd_stmt_send_long_datacCstdS)z3Reset data for prepared statement sent as long dataNrrr,r,r-cmd_stmt_resetsz&MySQLConnectionAbstract.cmd_stmt_resetcCstdS)z2Resets the session state without re-authenticatingNrr/r,r,r-rsz,MySQLConnectionAbstract.cmd_reset_connection)NN)T)NN)rr)Frr)NNNNNN)FNN)NN)NFN)FFF)N)rrrr)r,r,r)H__name__ __module__ __qualname____doc__r.r0rEpropertyrFrGrHr4rrIsetterrLr@rrrrr_rrrrrrcrrrMrNrrPrrrQrrrrrrrrrrrrrrrrarrrJrrrrrrrrrrrrrrrrr,r,r,r-r$s*5       !!                     -            4 (       rc@seZdZdZddZed'ddZeddZed(d d Zed d Z eddZ ed)ddZ eddZ ddZ ddZd*ddZd+ddZedd Zed!d"Zed#d$Zd%d&ZdS),MySQLCursorAbstractzAbstract cursor class Abstract class defining cursor class with method and members required by the Python Database API Specification v2.0. cCs"d|_d|_d|_d|_d|_dS)ZInitializationNr) _description _rowcount_last_insert_id _warningsZ arraysizer/r,r,r-r.s zMySQLCursorAbstract.__init__r,cCsdS)aCalls a stored procedure with the given arguments The arguments will be set during this session, meaning they will be called like ___arg where is an enumeration (+1) of the arguments. Coding Example: 1) Defining the Stored Routine in MySQL: CREATE PROCEDURE multiply(IN pFac1 INT, IN pFac2 INT, OUT pProd INT) BEGIN SET pProd := pFac1 * pFac2; END 2) Executing in Python: args = (5,5,0) # 0 is to hold pprod cursor.callproc('multiply', args) print(cursor.fetchone()) Does not return a value, but a result set will be available when the CALL-statement execute successfully. Raises exceptions when something is wrong. Nr,)r*Zprocnameargsr,r,r-callprocszMySQLCursorAbstract.callproccCsdS)zClose the cursor.Nr,r/r,r,r-rszMySQLCursorAbstract.closeFcCsdS)aExecutes the given operation Executes the given operation substituting any markers with the given parameters. For example, getting all rows where id is 5: cursor.execute("SELECT * FROM t1 WHERE id = %s", (5,)) The multi argument should be set to True when executing multiple statements in one operation. If not set and multiple results are found, an InterfaceError will be raised. If warnings where generated, and connection.get_warnings is True, then self._warnings will be a list containing these warnings. Returns an iterator when multi is True, otherwise None. Nr,)r* operationparamsmultir,r,r-rszMySQLCursorAbstract.executecCsdS)aExecute the given operation multiple times The executemany() method will execute the operation iterating over the list of parameters in seq_params. Example: Inserting 3 new employees and their phone number data = [ ('Jane','555-001'), ('Joe', '555-001'), ('John', '555-003') ] stmt = "INSERT INTO employees (name, phone) VALUES ('%s','%s')" cursor.executemany(stmt, data) INSERT statements are optimized by batching the data, that is using the MySQL multiple rows syntax. Results are discarded. If they are needed, consider looping over data using the execute() method. Nr,)r*rZ seqparamsr,r,r- executemanyszMySQLCursorAbstract.executemanycCsdS)zQReturns next row of a query result set Returns a tuple or None. Nr,r/r,r,r-fetchone(szMySQLCursorAbstract.fetchonercCsdS)a Returns the next set of rows of a query result, returning a list of tuples. When no more rows are available, it returns an empty list. The number of rows returned can be specified using the size argument, which defaults to one Nr,)r*sizer,r,r- fetchmany0s zMySQLCursorAbstract.fetchmanycCsdS)zRReturns all rows of a query result set Returns a list of tuples. Nr,r/r,r,r-fetchall;szMySQLCursorAbstract.fetchallcCsdSzNot Implemented.Nr,r/r,r,r-nextsetCszMySQLCursorAbstract.nextsetcCsdSrr,)r*sizesr,r,r- setinputsizesGsz!MySQLCursorAbstract.setinputsizesNcCsdSrr,)r*rcolumnr,r,r- setoutputsizeKsz!MySQLCursorAbstract.setoutputsizeTcCsdS)zReset the cursor to defaultNr,)r*freer,r,r-resetOszMySQLCursorAbstract.resetcCs|jS)aReturns description of columns in a result This property returns a list of tuples describing the columns in in a result set. A tuple is described as follows:: (column_name, type, None, None, None, None, null_ok, column_flags) # Addition to PEP-249 specs Returns a list of tuples. )rr/r,r,r- descriptionSszMySQLCursorAbstract.descriptioncCs|jS)aReturns the number of rows produced or affected This property returns the number of rows produced by queries such as a SELECT, or affected rows when executing DML statements like INSERT or UPDATE. Note that for non-buffered cursors it is impossible to know the number of rows produced before having fetched them all. For those, the number of rows will be -1 right after execution, and incremented when fetching rows. Returns an integer. )rr/r,r,r-rowcountgszMySQLCursorAbstract.rowcountcCs|jS)aReturns the value generated for an AUTO_INCREMENT column Returns the value generated for an AUTO_INCREMENT column by the previous INSERT or UPDATE statement or None when there is no such value available. Returns a long value or None. )rr/r,r,r- lastrowidxs zMySQLCursorAbstract.lastrowidcCs|jS)zReturns Warnings.)rr/r,r,r- fetchwarningssz!MySQLCursorAbstract.fetchwarnings)r,)r,F)r)N)T)rrrrr.rrrrrrrrrrrrrrrrrr,r,r,r-rs6            r)rabcrrrryrZcatch23rr conversionr constantsr r r Z optionfilesr rr objectrrr,r,r,r-s&   .