dnl dnl makra pro praci s html dnl dnl dnl konvece: _prikaz je nejaky prikaz zerouci nejake argumenty dnl __var je neco co se suse vyexpanduje (vzdy stejne) dnl dnl promene a fce dnl dnl _title(.) -- titulek a hlavicka html dnl _titleh(.) -- titulek a hlavicka html + _h() dnl _background(.) -- obrazek pozadi (nutno pred _title) dnl _head_add(.) -- prida do hlavicky (..) veci dnl nutno pouzit jeste pred _title() dnl _h() -- zopakuje nazev titulku do

...

dnl dnl _redirect(url, title) -- dnl redirect this page somewre dnl _url(.) -- odkaz na url URL dnl _uri(.) -- jako _url ale lokalne, prida index.html, kdyz treba dnl _mailto(.) -- odkaz na mail MAIL dnl _antispam(.) -- . -> 'tecka', @ -> zavinac dnl dnl _setyes(.) -- nastavi promenou na yes dnl _setno(.) -- nastavi promenou na no dnl _ifyes(__prom,2,3) -- pokud je __prom yes vyexpanduje se 2, jinak 3 dnl dnl _defadd(.,.) -- pridefinuj k promene $1 jeste string $2 dnl dnl __bodyarg -- behem title se vlozi viz _background dnl __keywords -- keywordy stranky (da se do meta) dnl __shorcut_icon -- ikona stranek, (nektere prohlizece zobrazuji). dnl __description -- nazev pri nalezeni prohledavacem dnl __bottom -- paticka dnl __acces -- ? vlozit pocitadlo do paticky dnl __oprava -- ? vlozit odkaz na oravu do paticky dnl dnl __jn jmeno souboru index.html dnl __jn_wo_ext jmeno souboru bez pripony index dnl __jn_pr jmeno pro tisk pokud exisutje index.print.html dnl __jn_orig jmeno souboru na jehoz zaklade (tj. bez .printing) dnl dnl _ifpr(true,else) vyprocesi pouze pokud jde o verzi pro tisk dnl _ifnopr(true,else) vyprocesi pouze pokud nejde o verzi pro tisk dnl _ifprex(true,else) vyprocesi pouze pokud existuje verze pro tisk dnl (a zaroven nejde o verzi o tisk) dnl dnl dokument ma structuru: dnl dnl , dnl | $1 .... dnl | <meta... __description __keyword __charset dnl | dnl _title < dnl | dnl | <body __bodyarg> dnl | __page_preambule -- co obaluje vlastni stranku (tabulka) dnl ` _mark dnl dnl vlastni text il2 dnl , dnl | __page_postamble -- uzavreni preabule dnl __bottom < __back -- dnl | __heel ... v patice je __bot_img dnl ` </body></html> dnl dnl drobne utilitky dnl dnl _obs(txt, tag) <li><a href="#tag">txt</a></li> dnl _obsbeg() zacatek obsahu v tabulce (<table><tr><td><ul>) dnl _obssep() odelovac slupecku (</ul></td><td><ul>) dnl _obsend() ukonci co treba (</ul></td></tr></table>) dnl _kap(txt, tag, siz) kapitola (<a name="tag"><h2>txt</h2>) dnl dnl _cfmt(list,list) nahradi carky &; -- obsolete dnl _carky(list,list) nahradi carky &; dnl _var({jmeno_promene_bez__}) ladeni: vytiskne promenou dnl dnl _li(file, shortdesc, desc) -- udela klasicke <li><a href></a> kec dnl dnl html-meta description a keywords dnl muze byt zmene pomoci define({__*}, text) dnl nebo pridano muze byt pomoci _defadd({__*}, text) define({__description}, {hpp:description can be changet by {define(&[__description&]&; (text))}}) define({__keywords}, {hpp:keywords can be changet by {define&<&[__keywords&]&;(text)i&>}}) dnl. dnl _title([title]) udela zacatek stranky, titulek bude 'title' dnl define({_title}, {<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> <title>$1 ifdef(__shorcut_icon,, { })dnl ifelse({__style_text},,,{})dnl define({__title}, {$1}) dnl __page_preambule() __page_beg_mark }) define({__page_beg_mark}, { }) define({__page_end_mark}, { }) dnl. dnl _titleh() -- vytvori stranku i s nadpisem dnl define({_titleh}, {_title($1) _h}) dnl. dnl _style_add(txt) dnl prida do stylu ... dnl define({_style_add}, {_defadd({__style_text}, {{$1}})}) define({_style_add}, {define({__style_text}, __style_text(){{$1}})}) dnl to co bude jeste v hlavickce define({__style_text}) dnl dnl paticka: (bude zapojena za konec souboru) dnl define({__page_preambule}) define({__page_postamble}) define({__back}) define({__heel}) define({__bottom}, { __page_end_mark() __page_postamble() __heel()dnl paticka }) dnl. dnl _ifpr(true,else) vyprocesi pouze pokud jde o verzi pro tisk dnl define({_ifpr}, {ifdef({__pr}, {$1}, {$2})}) dnl. dnl _ifprex(true,else) vyprocesi pouze pokud existuje verze pro tisk dnl (a zaroven nejde o verzi o tisk) dnl define({_ifprex}, {ifdef({__pr_ex}, {$1}, {$2})}) dnl. dnl _ifnopr(true,else) vyprocesi pouze pokud nejde o verzi pro tisk dnl define({_ifnopr}, {ifdef({__pr}, {$2}, {$1})}) dnl. dnl _navig(to_see, to_href) vytvori klikabilni cestu k aktualnimu souboru. dnl dnl 'to_see' co ma byt misto rootu (napr. /pikomat/) dnl 'to_href' doc root define({_navig}, { dnl basedir: __basedir _navig_lo( $1,$2,{}, patsubst( patsubst( __basedir()ifelse(__jn(),index.html,,{__jn()}), ^/,/), /, {/,}))dnl }) define({__jn_wo_ext}, patsubst(__jn, \.html$)) define({__jn_pr}, __jn_wo_ext().print.html) define({__jn_orig}, _ifpr({patsubst(__jn, .print.html).html},{__jn})) dnl _navig_lo(1:to_see, 2:to_href, 3:prefix, 4:fst, sec, ...) dnl _navig_lo(,/~,vitas/vs/, txt/, pohadky/, ...) define({_navig_lo}, {ifelse($4,,, {_uri($2$3$4,$1$4)dnl _navig_lo(,$2,$3$4, shift(shift(shift(shift($@))))) })}) dnl. dnl _redirect() dnl define({_redirect}, { ifelse($2,,Redirect,$2)

Přesun na $1

define({__bottom},{})}) dnl _defadd({_prom}, text) dnl pridefinuj k promene _prom jeste string 'text' dnl define({_defadd}, {define({$1}, $1{$2})}) dnl. dnl __bodyarg() dnl dnl to co se da do (viz _background) dnl define({__bodyarg}, {}) dnl dnl pozadi.zpusobi . muzi byt volano pred _title dnl define({_background}, {define({__bodyarg}, BACKGROUND="$1")}) dnl dnl zacatek html (tedy ne jen title) az po dnl dnl. dnl _safe_tilda(url-nebo-txt) -- nahradi ~ za &^ cimz ji uchrani pred dnl nahrazeni nezalomietlnou mezerou (coz se jinak deje). ve vysledku dnl bude tilda jak ma byt. define({_safe_tilda}, {patsubst($1, ~, &^)}) dnl. dnl _url(url) at se to nemusi psat dvakrat dnl define({_url}, {ifelse($2,,_safe_tilda($1),$2)}) dnl. dnl _uri(url) at se to nemusi psat dvakrat dnl zrelativni odkaz pokud je absolutni (/neco/kuk/ahoj.html) dnl a za ahoj/ prida index.html pokdu je to potreba (tj. _cd_version) dnl define({_uri}, {ifelse($2,,$1,$2)}) dnl. dnl _href(url-nebo-uri) pokud jde o odkaz ven (http://...) dnl necha jak je. pokud je relativni pouzije _rel($1) dnl define({_href}, {ifelse(patsubst($1, ^http://.*$),,{$1}, {_rel($1)})}) dnl. dnl _if_http(url, true, false) pokud $1 =~ http provede se prvni vetev dnl define({_if_http}, {ifelse(patsubst($1, ^http://.*$),, {$1}, {$2})}) dnl. dnl _mailto(email [, real name]) at se to nemusi psat dvakrat dnl 'real name' text okazu (ne-li: email) dnl define({_mailto}, {$1}) dnl. dnl _mailto_antispam(email [, real name]) at se to nemusi psat dvakrat dnl podobne jako _mailto, ale udela z emailu obrazek. dnl define({_mailto_antispam}, {pímejl:dnl define({__email_png}, translit(translit($1, { _.@}, ____),_,-).png) syscmd(__hpplib/email-to-img.sh -one "$1" _rel(__mail_img_dir)) _antispam($1)ifelse($2,,$2)}) define({_mailto_antispam}, {pímejl:dnl define({__email_png}, translit(translit($1, { _.@}, ____),_,-).png) syscmd(__hpplib/email-to-img.sh -one "$1" _rel(__mail_img_dir)) _antispam($1)ifelse($2,,$2)}) define({__mail_img_dir}, /img/mail/) dnl. dnl _antispam(email) zamlzi email . -> 'tecka', @ -> zavinac dnl define({_antispam}, {patsubst(patsubst($1, \., { tečka }), @, { zavináč })}) dnl. dnl _h([head]) nazev dokumentu v

. dnl ne-li 'head' pouzije se string zadany pocmoci _title dnl define({_h}, {

ifelse($1,,{__title()},$1)

}) dnl dnl _up([up-doc]) udela -^- odaz na nadrazeny dokument, dnl ne-li 'up-doc', pouzije index.html dnl define({_up}, {

-^-}) dnl. dnl _prewnext(prev,next[,up]) sipecky <<-- -^- -->> na prechozi('prev') dnl nasledujici('next') dokument a up, (ne-li 'up' bude ./). dnl pokud je neco --(dva minusy) neucela ale pouze <<(plain text) (popr. >>) dnl define({_prewnext}, {


ifelse({$1}, {--}, {<<}, { _uri($1,<<) } ) ifelse({$3},,{_uri(./,-^-)>}, { _uri($3, -^-) } ) ifelse({$2}, {--}, {>>}, { _uri($2,>>) } )
_war({_prewnext: obsolte mackro: missled macro name}) }) define({_prevnext}, {
ifelse({$1}, {--}, {<<-}, {_uri($1,<<-) } ) ifelse({$3},, {_uri(./,-^-) }, {$3},--,-^-, {_uri($3,-^-) } ) ifelse({$2}, {--}, {->>}, {_uri($2,->>) } )
}) dnl. dnl _def_chain(chainname, topfile, file:file: [, chain_root] ) dnl definuje retez dokumentu, dnl 'chainame' naze retezu, dnl 'topfile' soubor 'up' k danemu retezu, dnl 'file:file' seznam souboru oddeleny :(dvojtecka), dnl 'chain_root' k cemu jsou nazvy souboru relativni dnl define({_def_chain}, { define({__chain_$1}, --:--:--patsubst(:$3, :\([^-:][^:]*\), :$4\1):--:--) define({__chain_top_$1}, ifelse($4,,$2, _rel($4$2))) define({__chain_jn_$1}, ifelse($4,, {__jn}, {__basedir()__jn})) }) dnl. dnl _chain_prevnext(chainame) udela okdazy na nasledujici a dnl prechazejiici soubory v retezu 'chainname' (<<-- -^- -->). dnl dnl define({_chain_prevnext}, {_chain_prevnext_lo( $1, patsubst(patsubst( __chain_$1, ^.*:\([^:]*:__chain_jn_$1:[^:]*\).*$, {\1}),:,{,}))}) dnl dnl _chain_next_filename(chainame) dnl define({_chain_next_filename}, {_chain_fst_arg( patsubst(patsubst(__chain_$1, ^.*:[^:]*:__jn:\([^:]*\).*$, {\1}),:,{,}))}) dnl dnl _chain_prev_filename(chainame) dnl define({_chain_prev_filename}, {_chain_fst_arg( patsubst(patsubst(__chain_$1, ^.*:\([^:]*:__jn:[^:]*\).*$, {\1}),:,{,}))}) dnl _chain_fst_arg(dlksjf, fsakdfsa,df sa,df ) vrati prvni argument dnl define({_chain_fst_arg}, {$1}) dnl dnl _chain_prevnext_lo(chainame, prv, cur, nxt) dnl define({_chain_prevnext_lo}, {_prevnext(_rel($2),_rel($4),_rel(__chain_top_$1))}) dnl. dnl link _a(url, [popis]) dnl define({_a}, {
ifelse($2,,$1,$2)} ) dnl _lifile(file, popis) dnl _li(uri,des,popis) desdefile define({_li},{
  • $2ifelse($3,,, { -- _carky(shift(shift($@)))})
  • }) dnl _var({jmeno_promene_bez__}) ladeni: vytiskne promenou define({_var}, {$1:[__$1]}) define({_lifile},{_li($1,$@)}) dnl. dnl _i(txt) italik dnl define({_i}, {$1} ) dnl dnl rindex(str, i) dnl najde nejpravejsi vyskyt `i' (i jednopismenne jinak to bude blbnout) dnl define({rindex}, {regexp($1, {$2[^$2]*$})}) define({_last_arg}, {ifelse($2,,$1,{_last_arg(shift($@))})}) define({__jn_last}, _last_arg(translit(__jn, /, {,}))) dnl dnl vytiskne cestu az dnl _path(cesta, ukousnuto=`') dnl define({_path_url}, { define({__i}, index($1, {/})) ifelse(__i,-1,,{ define({__n}, substr($1, 0, __i)) define({__r}, substr($1, incr(__i))) _uri($2/__n()/, __n) , _path_url(__r, $2/__n) })}) dnl dnl fotky vyexpanduje na tabulky po 4 fotkach dnl _fotky(adresar_fotek, --, [ filename.jpg, popis ] * ) dnl vytvori se zaroven soubory ardresar_fotek/filename.html dnl ktere na sebe navzajem ukazuji dnl dnl doporucuji psat kazdy argument (krome prvnich dvou) dnl na zvlastni radek, aby to koresponodovalo s opravnikem. dnl define({_fotky}, {_fotky_lo(0, $@)}) dnl pomocne makro, udela __hdir ($1) a __jpg ($2) __html nazev dnl htmlka odpovidajiciho, pokud je __jpg `--' vrati zase `--' define({_makebase}, {ifelse($2,--,--,patsubst(patsubst($1,.jpg$),^.*/))}) dnl dnl pomocne makro dnl _fotky_lo(num 1, hdir 2, prew 3, cur 4, popis 5 , 6... dnl num pocet zpracovanych fotek modululo 4 dnl __num kolikaty v tabulce (0, 1, 2, 3) dnl __hprew, __jcur, __desc, predchozi h, stavajici j, popis dnl __jnext nasledujici j, dnl __hdir kam davat *.html dnl dnl __basename nazev bez pripony bez predpony (adresar) dnl define({_fotky_lo}, {ifelse({$4},{},{ifelse($1,0,,)},{ define({__num}, {$1})dnl define({__hdir}, patsubst({$2},/$))dnl define({__bprew}, {$3})dnl define({__cur}, {$4})dnl define({__desc}, {$5})dnl define({__next}, {$6})dnl define({__bcur}, _makebase(__cur)) define({__bnext}, _makebase(__next)) define({__hcur}, __hdir()/__bcur().html) define({__jcur}, __hdir()/__cur()) define({__jnext}, __hdir()/__next()) define({__ijcur}, patsubst(__jcur, .jpg$, _m.jpg)) define({__num}, eval( (__num() + 1 ) % 4)) ifelse(__num, 1, ) ifelse(__num, 0,
    dnl
    __desc()
    ) syscmd( cat < __hcur() {$5} ifelse(__bprew,--,<<,{ << }) ^ ifelse(__bnext(),,>>,{ >> }) {$5}

    __bottom() EOF) dnl syscmd( cat /usr/users/vitas/www/pikomat/bottom.html >> __hcur()) _fotky_lo(__num, __hdir, __bcur(),shift(shift(shift(shift(shift($@)))))) })}) #dnl #dnl alternativa k tomu #dnl _fotky_lo(num 1, adr 2, prew 3, cur 4, popis 5 , 6... #dnl #define({_fotky_lo}, #{ifelse({$4},{},{ifelse($1,0,,)},{ #define({__i}, substr($4, 0, index($4,.)))dnl #define({__n}, ifelse($6,,--,{substr($6, 0, index($6,.))}))dnl #define({__col_num}, ifelse($1,3,0,{eval($1+1)}))dnl #ifelse(__col_num, 1, ) # #ifelse(__col_num, 0,
    # dnl #
    $5 #
    ) #syscmd( cat < $2/__i().il2 #{_fotka_file}($3, __uri(), __n(), __i(), {{$5}}) #EOF) #_fotky_lo(__col_num, $2,__i(),shift(shift(shift(shift(shift($@)))))) #})}) # #dnl {_fotka_file}($3, __uri, __n(), __i(), $5) #dnl #dnl _fotka_file(prew, up, next, fotka.jpg, popis #dnl #define({_fotka_file}, #{ #_title($5) #_h #ifelse($1,--,<<,{ << }) #^ #ifelse($3,--,>>,{ >> }) #$5 #
    #

    #
    #}) dnl seznam ucastniku dnl _seznam(prezdivka, primeni, jmeno,datum narozeni,ulice,cp,mesto,psc,jpg) dnl define({_seznam}, { _seznam_lo($@)
    přezdívka jmeno d.n. adresa
    }) dnl dnl pomocne makro dnl define({_seznam_lo}, {ifelse({$1},,,{_seznam_one($1) _seznam_lo(shift($@))})}) dnl dnl jeste pomocnejsi makro dnl define({_seznam_one}, { ifelse($9,,,) $1$2 $3$4 $5 $6 $7 $8 }) dnl dnl oprava. cgicko ktere umoznuje upozornit na chybky dnl define({__url_oprava}, {__url_ms()/cw/vstr4611/oprava.cgi?uri=__uri()}) dnl dnl pro paticku obcas chceme, zakazat nejake opicky dnl pres _setyes(__co) _setno(__co) je to nejlespi dnl v patice pak rozkzkok pomoci _ifyes(__co, {co kdyz jo}, {co kdyz ne}) dnl dnl. dnl _setno(&[__promenna&]) nastavi promenou na 'no', nutne pouzit dnl slozene zavorky dnl define({_setno}, {define({$1}, {no})}) dnl. dnl _setyes({__promenna}) nastavi promenou na 'yes', nutne pozit dnl slozene zavorky dnl define({_setyes}, {define({$1}, {yes})}) dnl. dnl _ifyes(promena, trueblock [, falsefalse]) dnl vyexpanduje 'trueblock' pokud je '__promena' yes dnl define({_ifyes}, {ifelse($1,{yes}, {$2}, {$3})}) dnl dnl defaltne v patice bude oprava i pocitadlo accesu dnl _setyes(__oprava) _setno(__acces) dnl dnl __basedir adresar ve kterem se nalezam, (vzhledem k webu) dnl obsolete define({__basedir}, patsubst(patsubst(__pwd/, {^.*/WWW}, /), //,/)) define({__basejn}, __basedir(){}ifelse(__jn(),index.html,,__jn())) dnl vytvori z cesty /tabor/2000/fotky/ regexp na kousani dnl /tabor/\|/tabor/2000/\|/tabor/2000/fotky/ dnl pomoci ktereho se snadno vykousne dnl spolecna cesta s __basedir dnl obsolete: define({__basedir_regexp}, _dir_to_regexp(__basedir)) define({_dir_to_regexp}, {ifelse($1,/,,$1,,, {$1\|_dir_to_regexp(patsubst($1,{/[^/]*.$})/)})}) define({__my_root}, ifelse(__basedir,/,., {patsubst(patsubst(patsubst(substr(__basedir,1),[^/]),/,../), /$)})) define({__root}, {_war(usage of {__root} is obsolete)}) dnl dnl _common_prefix(txt1, txt2, cumulated-prefix) dnl define({_common_prefix}, {ifelse( {$1},,{$3}, {$2},,{$3}, substr({$1},0,1),substr({$2},0,1), {_common_prefix(substr({$1},1),substr({$2},1),$3{}substr({$1},0,1))}, {$3})}) dnl _path_slash(path) -- zaridi aby na konci cesty bylo jedno / define({_path_slash}, {patsubst({$1}/, //,/)}) dnl _cut_beg(prefix, prefix/what) --> what define({_cut_beg}, {substr({$2}, len({$1}))}) dnl dnl _dir_plus_index(uri) pokud uri konci na / prida /index.html, dnl (pokud jde o cd verzi). dnl define({_dir_plus_index}, {ifdef({__cd_version}, {patsubst($1, /$,/index.html)}, {$1})}) dnl. dnl _rel(uri) --> prevede na relatvni vzhledem k aktualnimu adresari, dnl kdyz jde o adresar, pripoji index.html dnl define({_rel}, {define({__p}, _common_prefix(__basedir, {$1}))dnl define({__ret}, patsubst( patsubst(_cut_beg(__p, __basedir), [^/]),/, ../)_cut_beg(__p, {$1}))dnl ifelse(__ret,,.,_dir_plus_index(__ret))}) dnl. dnl _rel -- zrelativni absolutni odkaz... pokud uz je relativni dnl (nezacina '/') necha ho na pokoji. dnl (kdyz je cd verze, k adresari pripoji index.html) dnl define({_rel}, {_dir_plus_index(ifelse(substr($1,0,1),/,{__my_root()$1},$1))}) dnl _set_root_dir(dir) adresar kde je / webu define({_set_root_dir}, {define({__p}, _common_prefix(_path_slash({$1}),_path_slash(__pwd))) define({__basedir}, _path_slash(/{}_cut_beg(__p, __pwd)))dnl ifelse(__p,_path_slash({$1}),, {_err(rootdir __p() is not prefix pwd(__pwd)[_path_slash({$1})])}) define({__my_root}, ifelse(__basedir,/,., {patsubst(patsubst(patsubst(substr(__basedir,1),[^/]),/,../), /$)}))}) dnl helpfull makra pro vytvoreni obsahu na zacatku dlouhe stranky dnl. dnl _obs(txt) todo dnl dnl _obs(txt, tag)
  • txt
  • dnl _obsbeg() zacatek obsahu v tabulce (
    ) dnl _obssep() odelovac slupecku (
      ) dnl _obsend() ukonci co treba (
    dnl _kap(txt, tag, siz) kapitola (

    txt

    ) define({_obs}, {
  • $1
  • }) define({_obsbeg}, {
      }) define({_obssep}, {
      }) define({_obsend}, {
    }) define({_kap}, {

    $1

    }) dnl dnl _cfmt(list, list) --> list&; list&; obsolete dnl dnl carky premen na metacarky (, --> &;) dnl bug: za carku se da jedna mezera coz nemusi byt vzdy vitane. dnl dnl define({_cfmt}, {_war({_cf{}mt() je obsoltete use _ca{}rky() insted}) dnl dnl ifelse($#,0,,$#,1,$1,{$1&; _cakry(shift($@))})}) define({_cfmt}, {_war({_.c.f.m.t() je obsoltete use _ carky() insted}) dnl _carky($@)}) dnl. dnl _carky(list, list) --> list&; list&;. dnl carky premen na metacarky (, --> &;), vhodne v makrech, ktere dnl zerou jeden argumet a to text, pokud by v textu byla carka, byl by dnl nasledujici text povazovan za druhy argument, proto s vyhodou (_carky($@)). dnl bug: za carku se da jedna mezera coz nemusi byt vzdy vitane. dnl define({_carky}, {ifelse($#,0,,$#,1,$1,{$1&; _carky(shift($@))})}) dnl. dnl _uv(text) ,,text`` dnl dnl define({_uv}, {&;&;_carky($@)``}) dnl saman zmenil So dub 24 08:59:36 CEST 2004 na: define({_uv}, {&„_carky($@)&“}) dnl dnl tr(cell, cell, cell) dnl dnl. dnl _tr(b1, b2, b3...) zkratka za b1 b2 ... define({_tr}, { _tr_lo($@) }) define({_tr_lo}, { ifelse($1,,,{$1{}_tr_lo(shift($@))}) }) dnl. dnl date() dnesni datum dnl define({_date}, {syscmd(LANG=cz date +"%d.%m.%Y %H:%M:%S")}) dnl define({_uv}, {&;&;$1``}) dnl _style_add( img.email-img &[ border: 0cm ; float=midle &] ) _style_add( img.imgMail &; img.imgProtisk &; img.imgMapa &; img.imgIco &[ border: 0 ; vertical-align:middle ; &] ) _style_add( p.center &[ text-align : center &] )