You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
615 lines
19 KiB
C
615 lines
19 KiB
C
//----------------------------------------------------------------
|
|
//
|
|
// libhtdig_api.h
|
|
//
|
|
// Header function for htdig shared library API
|
|
//
|
|
// 1/25/2002 created
|
|
//
|
|
// Neal Richter nealr@rightnow.com
|
|
//
|
|
// Part of the ht://Dig package <http://www.htdig.org/>
|
|
// Copyright (c) 1995-2004 The ht://Dig Group
|
|
// For copyright details, see the file COPYING in your distribution
|
|
// or the GNU Library General Public License (LGPL) version 2 or later or later
|
|
// <http://www.gnu.org/copyleft/lgpl.html>
|
|
//
|
|
// $Id: libhtdig_api.h,v 1.4 2004/05/28 13:15:29 lha Exp $
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
#ifndef LIBHTDIG_API_H
|
|
#define LIBHTDIG_API_H
|
|
|
|
#include <time.h>
|
|
|
|
#ifndef TRUE
|
|
#define TRUE 1
|
|
#endif
|
|
|
|
#ifndef FALSE
|
|
#define FALSE 0
|
|
#endif
|
|
|
|
|
|
#define HTDIG_MAX_FILENAME_PATH_L 1024
|
|
#define HTDIG_DOCUMENT_ID_L 32
|
|
#define HTDIG_DOCUMENT_TITLE_L 256
|
|
#define HTDIG_DOCUMENT_META_L 4096
|
|
#define HTDIG_DOCUMENT_CONTENT_TYPE_L 32
|
|
#define HTDIG_DOCUMENT_EXCERPT_L 1024
|
|
//make sure HTDIG_DOCUMENT_EXCERPT_L is more than config 'excerpt_length'
|
|
|
|
//default failsafe size of 'excerpt' document
|
|
//make sure it's more than config 'max_head_length'
|
|
#define HTDIG_DEFAULT_EXCERPT_SIZE 524288
|
|
|
|
//should be the same as the default value in HTDIG
|
|
#define HTDIG_MAX_QUERY_L 256
|
|
|
|
|
|
#define HTDIG_CUSTOM_TEXT_MIME_TYPE "text/vnd.customdocument"
|
|
|
|
//htfuzzy
|
|
#define HTDIG_ALG_ACCENTS 0x00000100 //"accents"
|
|
#define HTDIG_ALG_ACCENTS_STR "accents"
|
|
|
|
#define HTDIG_ALG_ENDINGS 0x00001000 //"endings"
|
|
#define HTDIG_ALG_ENDINGS_STR "endings"
|
|
|
|
#define HTDIG_ALG_METAPHONE 0x00000010 //"metaphone"
|
|
#define HTDIG_ALG_METAPHONE_STR "metaphone"
|
|
|
|
#define HTDIG_ALG_SOUNDEX 0x00000001 //"soundex"
|
|
#define HTDIG_ALG_SOUNDEX_STR "soundex"
|
|
|
|
#define HTDIG_ALG_SYNONYMS 0x00010000 //"synonyms"
|
|
#define HTDIG_ALG_SYNONYMS_STR "synonyms"
|
|
|
|
|
|
//searching
|
|
#define HTSEARCH_ALG_AND 0x00000100 //"and"
|
|
#define HTSEARCH_ALG_AND_STR "and"
|
|
|
|
#define HTSEARCH_ALG_BOOLEAN 0x00000001 //"boolean"
|
|
#define HTSEARCH_ALG_BOOLEAN_STR "boolean"
|
|
|
|
#define HTSEARCH_ALG_OR 0x00000010 //"or"
|
|
#define HTSEARCH_ALG_OR_STR "or"
|
|
|
|
|
|
#define HTSEARCH_FORMAT_LONG 0x00000001 //"long"
|
|
#define HTSEARCH_FORMAT_LONG_STR "long"
|
|
|
|
#define HTSEARCH_FORMAT_SHORT 0x00000010 //"short"
|
|
#define HTSEARCH_FORMAT_SHORT_STR "short"
|
|
|
|
|
|
#define HTSEARCH_SORT_SCORE 0x00000001 //"score"
|
|
#define HTSEARCH_SORT_SCORE_STR "score"
|
|
|
|
#define HTSEARCH_SORT_REV_SCORE 0x00000010 //"reverse score"
|
|
#define HTSEARCH_SORT_REV_SCORE_STR "reverse score"
|
|
|
|
#define HTSEARCH_SORT_TIME 0x00000100 //"time"
|
|
#define HTSEARCH_SORT_TIME_STR "time"
|
|
|
|
#define HTSEARCH_SORT_REV_TIME 0x00001000 //"reverse time"
|
|
#define HTSEARCH_SORT_REV_TIME_STR "reverse time"
|
|
|
|
#define HTSEARCH_SORT_TITLE 0x00010000 //"title"
|
|
#define HTSEARCH_SORT_TITLE_STR "title"
|
|
|
|
#define HTSEARCH_SORT_REV_TITLE 0x00100000 //"reverse title"
|
|
#define HTSEARCH_SORT_REV_TITLE_STR "reverse title"
|
|
|
|
|
|
|
|
#define HTDIG_ERROR_CONFIG_READ -101
|
|
#define HTDIG_ERROR_URL_PART -102
|
|
#define HTDIG_ERROR_URL_REWRITE -103
|
|
#define HTDIG_ERROR_URL_CREATE_FILE -104
|
|
#define HTDIG_ERROR_IMAGE_CREATE_FILE -105
|
|
#define HTDIG_ERROR_OPEN_CREATE_DOCDB -106
|
|
#define HTDIG_ERROR_LOGFILE_OPEN -107
|
|
#define HTDIG_ERROR_LOGFILE_CLOSE -108
|
|
|
|
#define HTDIG_ERROR_TESTURL_EXCLUDE -109
|
|
#define HTDIG_ERROR_TESTURL_BADQUERY -110
|
|
#define HTDIG_ERROR_TESTURL_EXTENSION -111
|
|
#define HTDIG_ERROR_TESTURL_EXTENSION2 -112
|
|
#define HTDIG_ERROR_TESTURL_LIMITS -113
|
|
#define HTDIG_ERROR_TESTURL_LIMITSNORM -114
|
|
#define HTDIG_ERROR_TESTURL_SRCH_RESTRICT -115
|
|
#define HTDIG_ERROR_TESTURL_SRCH_EXCLUDE -116
|
|
#define HTDIG_ERROR_TESTURL_REWRITE_EMPTY -117
|
|
#define HTDIG_ERROR_TESTURL_ROBOT_FORBID -118
|
|
|
|
#define HTSEARCH_ERROR_NO_MATCH -201
|
|
#define HTSEARCH_ERROR_BAD_MATCH_INDEX -202
|
|
#define HTSEARCH_ERROR_BAD_DOCUMENT -203
|
|
#define HTSEARCH_ERROR_TEMPLATE_ERROR -204
|
|
#define HTSEARCH_ERROR_LOGFILE_OPEN -205
|
|
#define HTSEARCH_ERROR_LOGFILE_CLOSE -206
|
|
#define HTSEARCH_ERROR_CONFIG_READ -207
|
|
#define HTSEARCH_ERROR_URL_PART -208
|
|
#define HTSEARCH_ERROR_WORDDB_READ -209
|
|
#define HTSEARCH_ERROR_DOCINDEX_READ -210
|
|
#define HTSEARCH_ERROR_DOCDB_READ -211
|
|
#define HTSEARCH_ERROR_EXCERPTDB_READ -212
|
|
|
|
#define HTMERGE_ERROR_LOGFILE_OPEN -301
|
|
#define HTMERGE_ERROR_LOGFILE_CLOSE -302
|
|
#define HTMERGE_ERROR_CONFIG_READ -303
|
|
#define HTMERGE_ERROR_URL_PART -304
|
|
#define HTMERGE_ERROR_WORDDB_READ -305
|
|
#define HTMERGE_ERROR_DOCINDEX_READ -306
|
|
#define HTMERGE_ERROR_DOCDB_READ -307
|
|
#define HTMERGE_ERROR_EXCERPTDB_READ -308
|
|
|
|
#define PHP_HTDIG_CONFIGFILE_PARM "configFile"
|
|
#define PHP_HTDIG_URL_PARM "URL"
|
|
#define PHP_HTDIG_LIMITTO_PARM "limit_urls_to"
|
|
#define PHP_HTDIG_LIMITN_PARM "limit_normalized"
|
|
#define PHP_HTDIG_EXCLUDEURLS_PARM "exclude_urls"
|
|
#define PHP_HTDIG_SEARCHRESTRICT_PARM "search_restrict"
|
|
#define PHP_HTDIG_SEARCHEXCLUDE_PARM "search_exclude"
|
|
#define PHP_HTDIG_MAXHOPCOUNT_PARM "max_hop_cont"
|
|
#define PHP_HTDIG_URLREWRITE_PARM "url_rewrite_rules"
|
|
#define PHP_HTDIG_BAD_QUERYSTR_PARM "bad_querystr"
|
|
|
|
//=============================================================================
|
|
//===== HTDIG INDEXING API ====================================================
|
|
|
|
|
|
/***************************************************
|
|
* HTDIG_DOCUMENTATION for htdig_parameters_struct
|
|
*
|
|
* DEBUGGING PARAMETERS
|
|
*
|
|
* int debug
|
|
* Verbose mode. This increases the verbosity of the
|
|
* program. Using more than 2 is probably only useful
|
|
* for debugging purposes. The default verbose mode
|
|
* gives a nice progress report while digging.
|
|
*
|
|
* char logFile
|
|
* File to stream debugging & error messages to!
|
|
*
|
|
* BOOLEAN PARAMETERS
|
|
*
|
|
* int initial
|
|
* Initial. Do not use any old databases. This is
|
|
* accomplished by first erasing the databases
|
|
*
|
|
* int create_text_database
|
|
* Create an ASCII version of the document database.
|
|
* This database is easy to parse with other programs so
|
|
* that information can be extracted from it.
|
|
*
|
|
* int report_statistics
|
|
* Report statistics after completion.
|
|
*
|
|
* int alt_work_area
|
|
* Use alternate work files.
|
|
* Tells htdig to append .work to database files, causing
|
|
* a second copy of the database to be built. This allows
|
|
* the original files to be used by htsearch during the
|
|
* indexing run.
|
|
*
|
|
*
|
|
* STRING PARAMETERS
|
|
*
|
|
* char configFile
|
|
* configfile
|
|
* Use the specified configuration file instead of the
|
|
* default.
|
|
*
|
|
* char credentials
|
|
* username:password
|
|
* Tells htdig to send the supplied username and
|
|
* password with each HTTP request. The credentials
|
|
* will be encoded using the 'Basic' authentication scheme.
|
|
* There *HAS* to be a colon (:) between the username
|
|
* and password.
|
|
*
|
|
*
|
|
* char maxhops //9 digit limit
|
|
* hopcount
|
|
* Limit the stored documents to those which are at
|
|
* most hopcount links away from the start URL.
|
|
*
|
|
* char minimalFile
|
|
*
|
|
* char URL
|
|
* 'command-line' URLs from stdin
|
|
* fetches & indexes these URLs
|
|
*
|
|
******************************************************************/
|
|
|
|
typedef struct htdig_parameters_struct {
|
|
|
|
char configFile[HTDIG_MAX_FILENAME_PATH_L];
|
|
char DBpath[HTDIG_MAX_FILENAME_PATH_L];
|
|
char credentials[HTDIG_MAX_FILENAME_PATH_L];
|
|
char max_hops[10]; //9 digit limit
|
|
char minimalFile[HTDIG_MAX_FILENAME_PATH_L];
|
|
|
|
//debugging & logfile
|
|
char logFile[HTDIG_MAX_FILENAME_PATH_L]; //location of log file
|
|
int debug; //0, 1 ,2, 3, 4, 5
|
|
|
|
//booelan values
|
|
int initial;
|
|
int create_text_database;
|
|
int report_statistics;
|
|
int alt_work_area;
|
|
int use_cookies;
|
|
|
|
//spidering filters
|
|
char URL[HTDIG_MAX_FILENAME_PATH_L];
|
|
char limit_urls_to[HTDIG_MAX_FILENAME_PATH_L];
|
|
char limit_normalized[HTDIG_MAX_FILENAME_PATH_L];
|
|
char exclude_urls[HTDIG_MAX_FILENAME_PATH_L];
|
|
char search_restrict[HTDIG_MAX_FILENAME_PATH_L];
|
|
char search_exclude[HTDIG_MAX_FILENAME_PATH_L];
|
|
char url_rewrite_rules[HTDIG_MAX_FILENAME_PATH_L];
|
|
char bad_querystr[HTDIG_MAX_FILENAME_PATH_L];
|
|
char locale[16];
|
|
char title_factor[16];
|
|
char text_factor[16];
|
|
char meta_description_factor[16];
|
|
int max_hop_count;
|
|
|
|
//the rewritten URL - OUTGOING after htdig_index_test_url
|
|
char rewritten_URL[HTDIG_MAX_FILENAME_PATH_L];
|
|
|
|
} htdig_parameters_struct;
|
|
|
|
/*****************************************************************
|
|
* HTDIG_DOCUMENTATION for htdig_simple_doc_struct
|
|
*
|
|
* STRING PARAMETERS
|
|
*
|
|
* char location
|
|
* the 'URL' of the document. Can be any usefull string.
|
|
*
|
|
* char documentid
|
|
* document id of document [NOT CURRENTLY USED - IGNORED]
|
|
*
|
|
* char title
|
|
* document title
|
|
*
|
|
* char meta
|
|
* content that is indexed but won appear in an search excerpts
|
|
*
|
|
* char * contents
|
|
* pointer to a NULL TERMINATED string on information to be
|
|
* indexed.
|
|
*
|
|
* char content_type
|
|
* a MIME-like string
|
|
* custom MIME-type defined above, others are supported by
|
|
* htdig as well.
|
|
*
|
|
*
|
|
*****************************************************************/
|
|
|
|
typedef struct htdig_simple_doc_struct {
|
|
|
|
char location[HTDIG_MAX_FILENAME_PATH_L];
|
|
char documentid[HTDIG_DOCUMENT_ID_L];
|
|
char title[HTDIG_DOCUMENT_TITLE_L];
|
|
char meta[HTDIG_DOCUMENT_META_L];
|
|
char *contents; //MUST ALLOCATE & FREE!!!
|
|
char content_type[HTDIG_DOCUMENT_CONTENT_TYPE_L]; //MIME-ISH string
|
|
//struct tm time_tm; // use to override index time
|
|
time_t doc_time;
|
|
|
|
} htdig_simple_doc_struct;
|
|
|
|
|
|
int htdig_index_open(htdig_parameters_struct *);
|
|
int htdig_index_simple_doc(htdig_simple_doc_struct * );
|
|
int htdig_index_urls(void);
|
|
int htdig_index_reset(void);
|
|
int htdig_index_close(void);
|
|
|
|
int htdig_index_test_url(htdig_parameters_struct *htparms);
|
|
|
|
int htdig_get_max_head_length(void);
|
|
|
|
|
|
|
|
|
|
//=============================================================================
|
|
//===== HTDIG MERGING API =====================================================
|
|
|
|
/**************************************************
|
|
* HTDIG_DOCUMENTATION for htmerge_parameters_struct
|
|
*
|
|
* DEBUGGING PARAMETERS
|
|
*
|
|
* int debug
|
|
* Verbose mode. This increases the verbosity of the
|
|
* program. Using more than 2 is probably only useful
|
|
* for debugging purposes. The default verbose mode
|
|
* gives a progress on what it is doing and where it is.
|
|
*
|
|
* char logFile
|
|
* File to stream debugging & error messages to!
|
|
*
|
|
*
|
|
* BOOLEAN PARAMETERS
|
|
*
|
|
* int alt_work_area
|
|
* Use alternate work files.
|
|
* Tells htmerge to append .work to database files causing
|
|
* a second copy of the database to be built. This allows
|
|
* original files to be used by htsearch during the indexing run.
|
|
*
|
|
*
|
|
* STRING PARAMETERS
|
|
*
|
|
* char configFile
|
|
* configfile
|
|
* Use the specified configuration file instead of the default.
|
|
*
|
|
* char merge_configFile
|
|
* merge_configfile
|
|
* Merge the databases specified into the databases specified
|
|
* by -c or the default.
|
|
*
|
|
*
|
|
*************************************************/
|
|
|
|
typedef struct htmerge_parameters_struct {
|
|
|
|
char configFile[HTDIG_MAX_FILENAME_PATH_L];
|
|
char merge_configFile[HTDIG_MAX_FILENAME_PATH_L];
|
|
|
|
//debugging & logfile
|
|
char logFile[HTDIG_MAX_FILENAME_PATH_L]; //location of log file
|
|
int debug; //0, 1 ,2, 3, 4, 5
|
|
|
|
//booelan values
|
|
int alt_work_area;
|
|
|
|
} htmerge_parameters_struct;
|
|
|
|
int htmerge_index_merge(htmerge_parameters_struct *);
|
|
|
|
|
|
|
|
|
|
|
|
//=============================================================================
|
|
//===== HTDIG HTFUZZY API =====================================================
|
|
|
|
|
|
|
|
/**************************************************
|
|
* HTDIG_DOCUMENTATION for htfuzzy_parameters_struct
|
|
*
|
|
* DEBUGGING PARAMETERS
|
|
*
|
|
* int debug
|
|
* Verbose mode. This increases the verbosity of the
|
|
* program. Using more than 2 is probably only useful
|
|
* for debugging purposes.
|
|
*
|
|
* char logFile
|
|
* File to stream debugging & error messages to!
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
*
|
|
* char configFile
|
|
* configfile
|
|
* Use the specified configuration file instead of the default.
|
|
*
|
|
* int algorithms_flag
|
|
* Bitwise Flags to signal algorithms to be used
|
|
*
|
|
* soundex == HTDIG_ALG_SOUNDEX
|
|
* metaphone == HTDIG_ALG_METAPHONE
|
|
* accents == HTDIG_ALG_ACCENTS
|
|
* endings == HTDIG_ALG_ENDINGS
|
|
* synonyms == HTDIG_ALG_SYNONYMS
|
|
*
|
|
***************************************************/
|
|
|
|
|
|
typedef struct htfuzzy_parameters_struct {
|
|
|
|
char configFile[HTDIG_MAX_FILENAME_PATH_L];
|
|
int algorithms_flag;
|
|
|
|
//debugging & logfile
|
|
char logFile[HTDIG_MAX_FILENAME_PATH_L]; //location of log file
|
|
int debug; //0, 1 ,2, 3, 4, 5
|
|
|
|
//booelan values
|
|
|
|
} htfuzzy_parameters_struct;
|
|
|
|
|
|
// htfuzzy functions
|
|
int htfuzzy_index(htfuzzy_parameters_struct *);
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
//===== HTDIG SEARCHING API ====================================================
|
|
|
|
/************************************************
|
|
* HTDIG_DOCUMENTATION for htsearch_parameters_struct
|
|
*
|
|
* DEBUGGING PARAMETERS
|
|
*
|
|
* int debug
|
|
* Verbose mode. This increases the verbosity of the;
|
|
* program. Using more than 2 is probably only useful;
|
|
* for debugging purposes. The default verbose mode;
|
|
* gives a progress on what it is doing and where it is.;
|
|
*
|
|
* char logFile
|
|
* File to stream debugging & error messages to!
|
|
*
|
|
* STRING PARAMETERS
|
|
*
|
|
* char configFile
|
|
* configfile
|
|
* Use the specified configuration file instead of the default.
|
|
*
|
|
*
|
|
**************************************************/
|
|
|
|
typedef struct htsearch_parameters_struct {
|
|
|
|
char configFile[HTDIG_MAX_FILENAME_PATH_L];
|
|
char DBpath[HTDIG_MAX_FILENAME_PATH_L];
|
|
char locale[16];
|
|
|
|
//debugging & logfile
|
|
char logFile[HTDIG_MAX_FILENAME_PATH_L]; //location of log file
|
|
int debug; //0, 1 ,2, 3, 4, 5
|
|
|
|
//filters
|
|
char search_restrict[HTDIG_MAX_FILENAME_PATH_L];
|
|
char search_exclude[HTDIG_MAX_FILENAME_PATH_L];
|
|
char title_factor[16];
|
|
char text_factor[16];
|
|
char meta_description_factor[16];
|
|
|
|
} htsearch_parameters_struct;
|
|
|
|
|
|
|
|
|
|
/*****************************************************************
|
|
* HTDIG_DOCUMENTATION for htsearch_query_struct
|
|
*
|
|
* STRING PARAMETERS
|
|
*
|
|
* char raw_query
|
|
* STRING of text that is the search query -- syntax is important
|
|
*
|
|
* INTEGER PARAMETERS
|
|
*
|
|
* int algorithms_flag [ALSO CALLED 'method' IN HTDIG]
|
|
* HTSEARCH_ALG_BOOLEAN
|
|
* HTSEARCH_ALG_OR
|
|
* HTSEARCH_ALG_AND
|
|
*
|
|
* int sortby_flag
|
|
* score, date, title & reversed
|
|
* HTSEARCH_SORT_SCORE
|
|
* HTSEARCH_SORT_REV_SCORE
|
|
* HTSEARCH_SORT_TIME
|
|
* HTSEARCH_SORT_REV_TIME
|
|
* HTSEARCH_SORT_TITLE
|
|
* HTSEARCH_SORT_REV_TITLE
|
|
*
|
|
* int format
|
|
* short, long (with excerpt)
|
|
* HTSEARCH_FORMAT_LONG
|
|
* HTSEARCH_FORMAT_SHORT
|
|
*
|
|
*
|
|
*
|
|
* TODO: 'Connect' these htsearch features to this API
|
|
*
|
|
* config
|
|
* Specifies the name of the configuration file.
|
|
*
|
|
* exclude
|
|
* This value is a pattern that specifies which URLs are to be excluded from
|
|
* the search results.
|
|
*
|
|
* keywords
|
|
* Used to specify a list of required words that have to be in the documents.
|
|
*
|
|
* restrict
|
|
* This value is a pattern that all URLs of the search results will have to
|
|
* match.
|
|
*
|
|
* startyear, startmonth, startday, endyear, endmonth, endday
|
|
* These values specify the allowed range of document modification dates
|
|
* allowed in the search results.
|
|
*
|
|
*
|
|
*
|
|
*****************************************************************/
|
|
|
|
typedef struct htsearch_query_struct {
|
|
|
|
char raw_query[HTDIG_MAX_QUERY_L];
|
|
|
|
int algorithms_flag;
|
|
int sortby_flag;
|
|
int format;
|
|
|
|
} htsearch_query_struct;
|
|
|
|
|
|
/*****************************************************************
|
|
* HTDIG_DOCUMENTATION for htsearch_query_match_struct
|
|
*
|
|
* STRING PARAMETERS
|
|
*
|
|
* char title
|
|
* Title of document returned
|
|
*
|
|
* char URL
|
|
* URL/location-string of document returned
|
|
*
|
|
* char excerpt
|
|
* Excerpt with search words highlighted with
|
|
* <strong>searchword</strong>
|
|
*
|
|
* INTEGER PARAMETERS
|
|
*
|
|
* int score
|
|
* score in 'number of stars'
|
|
* [MAX NUMBER OF STARS DECLARED IN CONFIG FILE]
|
|
*
|
|
* int score_percent //top result is 100%
|
|
*
|
|
* time_t time [DOCUMENT TIME]
|
|
* struct tm time_tm [DOCUMENT TIME]
|
|
* int size [TOTAL DOCUMENT SIZE]
|
|
*
|
|
*
|
|
*****************************************************************/
|
|
|
|
typedef struct htsearch_query_match_struct {
|
|
|
|
char title[HTDIG_DOCUMENT_TITLE_L];
|
|
char URL[HTDIG_MAX_FILENAME_PATH_L];
|
|
char excerpt[HTDIG_DOCUMENT_EXCERPT_L];
|
|
int score;
|
|
int score_percent; //top result is 100%
|
|
struct tm time_tm;
|
|
int size;
|
|
|
|
} htsearch_query_match_struct;
|
|
|
|
|
|
// htsearch functions
|
|
|
|
int htsearch_open(htsearch_parameters_struct *);
|
|
int htsearch_query(htsearch_query_struct *);
|
|
|
|
int htsearch_get_nth_match(int, htsearch_query_match_struct *);
|
|
int htsearch_close();
|
|
|
|
//htsearch_free(indicator)
|
|
|
|
char * htsearch_get_error();
|
|
|
|
|
|
#endif /* LIBHTDIG_API_H */
|
|
|