diff options
19 files changed, 204 insertions, 38 deletions
diff --git a/Build/source/texk/web2c/ChangeLog b/Build/source/texk/web2c/ChangeLog index e799597795f..41f7d9c5314 100644 --- a/Build/source/texk/web2c/ChangeLog +++ b/Build/source/texk/web2c/ChangeLog @@ -1,3 +1,7 @@ +2012-01-24 Peter Breitenlohner <peb@mppmu.mpg.de> + + * pltotf.ch, vptovf.ch: Interpret "--" as "+", not "-". + 2012-01-22 Peter Breitenlohner <peb@mppmu.mpg.de> * tftopl.ch, vftovp.ch: Add missing space in error message. diff --git a/Build/source/texk/web2c/Makefile.in b/Build/source/texk/web2c/Makefile.in index e99a0823135..3f32a00385f 100644 --- a/Build/source/texk/web2c/Makefile.in +++ b/Build/source/texk/web2c/Makefile.in @@ -1571,6 +1571,7 @@ EXTRA_DIST = PROJECTS cftests cpascal.h help.h w2c/config.h \ omegaware/tests/ofontv5.opl omegaware/tests/ofontv5.ovp \ omegaware/tests/ofontv6.opl omegaware/tests/ofontv6.ovp \ omegaware/tests/Cherokee.pl omegaware/tests/OCherokee.ovp \ + omegaware/tests/realnum.opl omegaware/tests/realnum.out \ omegaware/tests/repeat.opl omegaware/tests/repeated.opl \ omegaware/tests/sample.out omegaware/tests/sample.ovp \ omegaware/tests/sample0-h.opl omegaware/tests/specialhex.ovp \ @@ -1647,12 +1648,13 @@ DISTCLEANFILES = $(EXTRA_LIBRARIES) CXXLD.sh tangle.c tangle.h \ omegaware/tests/OCherokee.ofm omegaware/tests/OCherokee.opl \ omegaware/tests/OCherokee.ovf omegaware/tests/xCherokee.* \ omegaware/tests/xOCherokee.* cftest.p \ - omegaware/tests/xrepeated.* omegaware/tests/sample*.ofm \ - omegaware/tests/sample.ovf omegaware/tests/sample1-h.opl \ - omegaware/tests/xsample.out omegaware/tests/specialhex.ofm \ - omegaware/tests/specialhex.opl omegaware/tests/specialhex.ovf \ - omegaware/tests/xspecialhex.* $(nodist_aleph_SOURCES) \ - aleph.web aleph.ch aleph-web2c aleph.p aleph.pool aleph-tangle + omegaware/tests/xrealnum.* omegaware/tests/xrepeated.* \ + omegaware/tests/sample*.ofm omegaware/tests/sample.ovf \ + omegaware/tests/sample1-h.opl omegaware/tests/xsample.out \ + omegaware/tests/specialhex.ofm omegaware/tests/specialhex.opl \ + omegaware/tests/specialhex.ovf omegaware/tests/xspecialhex.* \ + $(nodist_aleph_SOURCES) aleph.web aleph.ch aleph-web2c aleph.p \ + aleph.pool aleph-tangle CLEANFILES = TRIPTRAP_CLEAN = $(am__append_9) $(am__append_17) $(am__append_26) \ $(am__append_31) $(am__append_37) $(am__append_43) \ @@ -2624,7 +2626,7 @@ OTANGLE_tests = omegaware/odvicopy.test omegaware/odvitype.test \ omegaware/otangle.test OMFONTS_tests = omegaware/level1.test omegaware/ofonts.test \ - omegaware/omfonts.test omegaware/repeat.test \ + omegaware/omfonts.test omegaware/realnum.test omegaware/repeat.test \ omegaware/selectfont.test omegaware/specialhex.test diff --git a/Build/source/texk/web2c/omegafonts/ChangeLog b/Build/source/texk/web2c/omegafonts/ChangeLog index 8099dcb1392..f6163e2c8eb 100644 --- a/Build/source/texk/web2c/omegafonts/ChangeLog +++ b/Build/source/texk/web2c/omegafonts/ChangeLog @@ -1,3 +1,12 @@ +2012-01-24 Peter Breitenlohner <peb@mppmu.mpg.de> + + * pl-lexer.l: 'Correctly' scan real numbers for scan_fix(). + Reported by Tanaka Takuji <KXD02663@nifty.ne.jp>. + + * realnum.test, tests/realnum.opl, tests/realnum.out (new): + Shell script and data for a new test. + * Makefile.am: Add the new test. + 2012-01-03 Akira Kakuto <kakuto@fuk.kindai.ac.jp> * omfonts.c: fix a typo (omfomts ---> omfonts). diff --git a/Build/source/texk/web2c/omegafonts/Makefile.am b/Build/source/texk/web2c/omegafonts/Makefile.am index d770627dd89..e3666fcc816 100644 --- a/Build/source/texk/web2c/omegafonts/Makefile.am +++ b/Build/source/texk/web2c/omegafonts/Makefile.am @@ -1,6 +1,6 @@ ## Makefile.am for the TeX Live subdirectory texk/web2c/omegafonts/ ## -## Copyright (C) 2009-2011 Peter Breitenlohner <tex-live@tug.org> +## Copyright (C) 2009-2012 Peter Breitenlohner <tex-live@tug.org> ## You may freely use, modify and/or distribute this file. ## AM_CPPFLAGS = -I$(top_builddir)/.. -I$(top_srcdir) $(KPATHSEA_INCLUDES) -DNOT_WEB2C @@ -102,7 +102,8 @@ endif OTANGLE ## Tests ## -OMFONTS_tests = charwd.test level1.test omfonts.test repeat.test selectfont.test specialhex.test +OMFONTS_tests = charwd.test level1.test omfonts.test realnum.test \ + repeat.test selectfont.test specialhex.test if OTANGLE if OMFONTS TESTS = $(OMFONTS_tests) @@ -122,6 +123,9 @@ EXTRA_DIST += tests/Cherokee.pl tests/OCherokee.ovp DISTCLEANFILES += tests/Cherokee.tfm tests/OCherokee.ofm \ tests/OCherokee.opl tests/OCherokee.ovf \ tests/xCherokee.* tests/xOCherokee.* +## realnum.test +EXTRA_DIST += tests/realnum.opl tests/realnum.out +DISTCLEANFILES += tests/realnum.* ## repeat.test EXTRA_DIST += tests/repeat.opl tests/repeated.opl DISTCLEANFILES += tests/xrepeated.* diff --git a/Build/source/texk/web2c/omegafonts/Makefile.in b/Build/source/texk/web2c/omegafonts/Makefile.in index f8f62c70b33..85e52f65e6c 100644 --- a/Build/source/texk/web2c/omegafonts/Makefile.in +++ b/Build/source/texk/web2c/omegafonts/Makefile.in @@ -368,10 +368,10 @@ call_omfonts_LDADD = DISTCLEANFILES = pl-parser.output tests/charwdr.* tests/charwdv.* \ tests/xlevel1.ofm tests/xlevel1.opl tests/Cherokee.tfm \ tests/OCherokee.ofm tests/OCherokee.opl tests/OCherokee.ovf \ - tests/xCherokee.* tests/xOCherokee.* tests/xrepeated.* \ - tests/sample*.ofm tests/sample.ovf tests/sample1-h.opl \ - tests/xsample.out tests/specialhex.ofm tests/specialhex.opl \ - tests/specialhex.ovf tests/xspecialhex.* + tests/xCherokee.* tests/xOCherokee.* tests/realnum.* \ + tests/xrepeated.* tests/sample*.ofm tests/sample.ovf \ + tests/sample1-h.opl tests/xsample.out tests/specialhex.ofm \ + tests/specialhex.opl tests/specialhex.ovf tests/xspecialhex.* linked_programs = ofm2opl opl2ofm ovf2ovp ovp2ovf bin_links = \ omfonts$(EXEEXT):ofm2opl \ @@ -379,12 +379,15 @@ bin_links = \ omfonts$(EXEEXT):ovf2ovp \ omfonts$(EXEEXT):ovp2ovf -OMFONTS_tests = charwd.test level1.test omfonts.test repeat.test selectfont.test specialhex.test +OMFONTS_tests = charwd.test level1.test omfonts.test realnum.test \ + repeat.test selectfont.test specialhex.test + @OMFONTS_TRUE@@OTANGLE_TRUE@TESTS = $(OMFONTS_tests) EXTRA_DIST = $(OMFONTS_tests) tests/charwd-r.pl tests/charwd-v.vpl \ tests/level1.opl tests/Cherokee.pl tests/OCherokee.ovp \ - tests/repeat.opl tests/repeated.opl tests/sample.out \ - tests/sample.ovp tests/sample0-h.opl tests/specialhex.ovp + tests/realnum.opl tests/realnum.out tests/repeat.opl \ + tests/repeated.opl tests/sample.out tests/sample.ovp \ + tests/sample0-h.opl tests/specialhex.ovp all: all-am .SUFFIXES: diff --git a/Build/source/texk/web2c/omegafonts/pl-lexer.c b/Build/source/texk/web2c/omegafonts/pl-lexer.c index e75f0436d3f..f91560b9ea8 100644 --- a/Build/source/texk/web2c/omegafonts/pl-lexer.c +++ b/Build/source/texk/web2c/omegafonts/pl-lexer.c @@ -389,14 +389,14 @@ struct yy_trans_info }; static yyconst flex_int16_t yy_acclist[265] = { 0, - 9, 9, 206, 204, 205, 1, 204, 205, 2, 205, - 3, 204, 205, 4, 204, 205, 204, 205, 204, 205, + 206, 204, 205, 1, 204, 205, 2, 205, 3, 204, + 205, 4, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, 204, 205, - 204, 205, 1, 180, 42, 8, 8, 6, 179, 7, - 31, 44, 102, 41, 5, 107, 9, 43, 40, 46, + 1, 180, 9, 42, 8, 8, 6, 179, 7, 31, + 44, 102, 41, 5, 107, 9, 9, 43, 40, 46, 171, 23, 178, 151, 45, 77, 78, 79, 106, 75, 9, 150, 33, 32, 85, 86, 82, 83, 84, 181, @@ -422,22 +422,22 @@ static yyconst flex_int16_t yy_acclist[265] = static yyconst flex_int16_t yy_accept[801] = { 0, - 1, 2, 3, 4, 6, 9, 11, 14, 17, 19, - 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, - 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, - 61, 63, 64, 64, 64, 64, 64, 64, 64, 64, + 1, 1, 1, 2, 4, 7, 9, 12, 15, 17, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, + 59, 61, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 66, 66, 67, + 64, 64, 64, 64, 64, 64, 64, 65, 65, 66, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, - 73, 74, 75, 75, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, + 68, 69, 69, 69, 69, 70, 70, 70, 71, 71, + 72, 73, 74, 74, 74, 74, 74, 74, 74, 74, + 75, 75, 75, 75, 76, 76, 76, 76, 77, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, diff --git a/Build/source/texk/web2c/omegafonts/pl-lexer.l b/Build/source/texk/web2c/omegafonts/pl-lexer.l index 7f9c719eea2..35eb0bf791f 100644 --- a/Build/source/texk/web2c/omegafonts/pl-lexer.l +++ b/Build/source/texk/web2c/omegafonts/pl-lexer.l @@ -69,7 +69,7 @@ ws [ \t]+ hexnumber H{ws}[A-F0-9]+ octnumber O{ws}[0-7]+ decnumber D{ws}[0-9]+ -realnumber R[ \t+-]+[0-9]*("."[0-9]*){0,1} +realnumber R[ \t+-]+[0-9]*("."[0-9]*)? charnumber C{ws}. %% diff --git a/Build/source/texk/web2c/omegafonts/realnum.test b/Build/source/texk/web2c/omegafonts/realnum.test new file mode 100755 index 00000000000..705493de65f --- /dev/null +++ b/Build/source/texk/web2c/omegafonts/realnum.test @@ -0,0 +1,17 @@ +#! /bin/sh + +# Copyright (C) 2012 Peter Breitenlohner <tex-live@tug.org> +# You may freely use, modify and/or distribute this file. + +test -d tests || mkdir -p tests + +TEXMFCNF=$srcdir/../../kpathsea +OFMFONTS=tests +export TEXMFCNF OFMFONTS + +./omfonts -opl2ofm -verbose $srcdir/tests/realnum tests/xrealnum || exit 1 + +./omfonts -ofm2opl -verbose xrealnum tests/xrealnum || exit 1 + +diff $srcdir/tests/realnum.out tests/xrealnum.opl || exit 1 + diff --git a/Build/source/texk/web2c/omegafonts/tests/realnum.opl b/Build/source/texk/web2c/omegafonts/tests/realnum.opl new file mode 100644 index 00000000000..94a4ea43c69 --- /dev/null +++ b/Build/source/texk/web2c/omegafonts/tests/realnum.opl @@ -0,0 +1,14 @@ +(DESIGNSIZE R 10.0) +(CHARACTER C A + (COMMENT the R must be followed by a space, tab, or sign) + (CHARWD R ) + (CHARHT R 1.0) + (CHARDP R 0.1) + (CHARIC R+1) + ) +(CHARACTER C B + (CHARWD R .) + (CHARHT R 1.) + (CHARDP R .1) + (CHARIC R--1) + ) diff --git a/Build/source/texk/web2c/omegafonts/tests/realnum.out b/Build/source/texk/web2c/omegafonts/tests/realnum.out new file mode 100644 index 00000000000..c6b56b6a6bf --- /dev/null +++ b/Build/source/texk/web2c/omegafonts/tests/realnum.out @@ -0,0 +1,37 @@ +(FAMILY UNSPECIFIED) +(FACE F MRR) +(CODINGSCHEME UNSPECIFIED) +(DESIGNSIZE R 10.0) +(COMMENT DESIGNSIZE IS IN POINTS) +(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE) +(CHECKSUM H 0) +(FONTDIMEN + ) +(COMMENT + (CHARWD_ENTRY D 0 R 0.0) + (CHARWD_ENTRY D 1 R 0.0) + ) +(COMMENT + (CHARHT_ENTRY D 0 R 0.0) + (CHARHT_ENTRY D 1 R 1.0) + ) +(COMMENT + (CHARDP_ENTRY D 0 R 0.0) + (CHARDP_ENTRY D 1 R 0.1) + ) +(COMMENT + (CHARIC_ENTRY D 0 R 0.0) + (CHARIC_ENTRY D 1 R 1.0) + ) +(CHARACTER H 41 + (CHARWD R 0.0) + (CHARHT R 1.0) + (CHARDP R 0.1) + (CHARIC R 1.0) + ) +(CHARACTER H 42 + (CHARWD R 0.0) + (CHARHT R 1.0) + (CHARDP R 0.1) + (CHARIC R 1.0) + ) diff --git a/Build/source/texk/web2c/omegaware/ChangeLog b/Build/source/texk/web2c/omegaware/ChangeLog index 299ca6c1704..bce4803320c 100644 --- a/Build/source/texk/web2c/omegaware/ChangeLog +++ b/Build/source/texk/web2c/omegaware/ChangeLog @@ -1,3 +1,11 @@ +2012-01-24 Peter Breitenlohner <peb@mppmu.mpg.de> + + * opl2ofm.web, ovp2ovf.web: Interpret "--" as "+", not "-". + + * realnum.test, tests/realnum.opl, tests/realnum.out (new): + Shell script and data for a new test. + * am/omegaware.am: Add the new test. + 2012-01-22 Peter Breitenlohner <peb@mppmu.mpg.de> * ofm2opl.web, ovf2ovp.web: Add missing space in error message. diff --git a/Build/source/texk/web2c/omegaware/am/omegaware.am b/Build/source/texk/web2c/omegaware/am/omegaware.am index a264f5bf776..484b8446c86 100644 --- a/Build/source/texk/web2c/omegaware/am/omegaware.am +++ b/Build/source/texk/web2c/omegaware/am/omegaware.am @@ -1,6 +1,6 @@ ## texk/web2c/omegaware/am/omegaware.am: Makefile fragment for omegaware web programs. ## -## Copyright (C) 2009-2011 Peter Breitenlohner <tex-live@tug.org> +## Copyright (C) 2009-2012 Peter Breitenlohner <tex-live@tug.org> ## You may freely use, modify and/or distribute this file. omegaware_tools = odvicopy odvitype otangle @@ -101,7 +101,7 @@ DISTCLEANFILES += ovp2ovf.web OTANGLE_tests = omegaware/odvicopy.test omegaware/odvitype.test \ omegaware/otangle.test OMFONTS_tests = omegaware/level1.test omegaware/ofonts.test \ - omegaware/omfonts.test omegaware/repeat.test \ + omegaware/omfonts.test omegaware/realnum.test omegaware/repeat.test \ omegaware/selectfont.test omegaware/specialhex.test EXTRA_DIST += $(OTANGLE_tests) $(OMFONTS_tests) @@ -146,6 +146,9 @@ DISTCLEANFILES += omegaware/tests/Cherokee.tfm omegaware/tests/OCherokee.ofm \ omegaware/tests/xCherokee.* omegaware/tests/xOCherokee.* ## omegaware/otangle.test DISTCLEANFILES += cftest.p +## omegaware/realnum.test +EXTRA_DIST += omegaware/tests/realnum.opl omegaware/tests/realnum.out +DISTCLEANFILES += omegaware/tests/xrealnum.* ## omegaware/repeat.test EXTRA_DIST += omegaware/tests/repeat.opl omegaware/tests/repeated.opl DISTCLEANFILES += omegaware/tests/xrepeated.* diff --git a/Build/source/texk/web2c/omegaware/opl2ofm.web b/Build/source/texk/web2c/omegaware/opl2ofm.web index 89a591d8666..9d0dd6f93f4 100644 --- a/Build/source/texk/web2c/omegaware/opl2ofm.web +++ b/Build/source/texk/web2c/omegaware/opl2ofm.web @@ -1433,7 +1433,7 @@ end; @ @<Scan the blanks...@>= repeat get_next; if cur_char="-" then begin - cur_char:=" "; negative:=true; + cur_char:=" "; negative:=not negative; end else if cur_char="+" then cur_char:=" "; until cur_char<>" " diff --git a/Build/source/texk/web2c/omegaware/ovp2ovf.web b/Build/source/texk/web2c/omegaware/ovp2ovf.web index ad9def4bf73..63c2977fba2 100644 --- a/Build/source/texk/web2c/omegaware/ovp2ovf.web +++ b/Build/source/texk/web2c/omegaware/ovp2ovf.web @@ -1711,7 +1711,7 @@ end; @ @<Scan the blanks...@>= repeat get_next; if cur_char="-" then begin - cur_char:=" "; negative:=true; + cur_char:=" "; negative:=not negative; end else if cur_char="+" then cur_char:=" "; until cur_char<>" " diff --git a/Build/source/texk/web2c/omegaware/realnum.test b/Build/source/texk/web2c/omegaware/realnum.test new file mode 100755 index 00000000000..d0ea71e6e2d --- /dev/null +++ b/Build/source/texk/web2c/omegaware/realnum.test @@ -0,0 +1,19 @@ +#! /bin/sh + +# Copyright (C) 2012 Peter Breitenlohner <tex-live@tug.org> +# You may freely use, modify and/or distribute this file. + +tests=omegaware/tests + +test -d $tests || mkdir -p $tests + +TEXMFCNF=$srcdir/../kpathsea +OFMFONTS=./$tests +export TEXMFCNF OFMFONTS + +./opl2ofm -verbose $srcdir/$tests/realnum $tests/xrealnum || exit 1 + +./ofm2opl -verbose xrealnum $tests/xrealnum || exit 1 + +diff $srcdir/$tests/realnum.out $tests/xrealnum.opl || exit 1 + diff --git a/Build/source/texk/web2c/omegaware/tests/realnum.opl b/Build/source/texk/web2c/omegaware/tests/realnum.opl new file mode 100644 index 00000000000..fbe0975ece9 --- /dev/null +++ b/Build/source/texk/web2c/omegaware/tests/realnum.opl @@ -0,0 +1,14 @@ +(DESIGNSIZE R 10.0) +(CHARACTER C A + (COMMENT no space, tab, or sign required after R) + (CHARWD R) + (CHARHT R 1.0) + (CHARDP R 0.1) + (CHARIC R+1) + ) +(CHARACTER C B + (CHARWD R .) + (CHARHT R 1.) + (CHARDP R .1) + (CHARIC R--1) + ) diff --git a/Build/source/texk/web2c/omegaware/tests/realnum.out b/Build/source/texk/web2c/omegaware/tests/realnum.out new file mode 100644 index 00000000000..83fdc2bf093 --- /dev/null +++ b/Build/source/texk/web2c/omegaware/tests/realnum.out @@ -0,0 +1,20 @@ +(FAMILY UNSPECIFIED) +(FACE F MRR) +(CODINGSCHEME UNSPECIFIED) +(DESIGNSIZE R 10.0) +(COMMENT DESIGNSIZE IS IN POINTS) +(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE) +(CHECKSUM H 3996EA86) +(SEVENBITSAFEFLAG TRUE) +(CHARACTER H 41 + (CHARWD R 0.0) + (CHARHT R 1.0) + (CHARDP R 0.1) + (CHARIC R 1.0) + ) +(CHARACTER H 42 + (CHARWD R 0.0) + (CHARHT R 1.0) + (CHARDP R 0.1) + (CHARIC R 1.0) + ) diff --git a/Build/source/texk/web2c/pltotf.ch b/Build/source/texk/web2c/pltotf.ch index c75a73ddb97..100c74248b1 100644 --- a/Build/source/texk/web2c/pltotf.ch +++ b/Build/source/texk/web2c/pltotf.ch @@ -112,6 +112,12 @@ begin while loc=limit do fill_buffer; begin cur_char:=xord[buffer[loc+1]]; @z +@x [63] Interpret '--' as '+', not '-'. + begin cur_char:=" "; negative:=true; +@y + begin cur_char:=" "; negative:=not negative; +@z + @x [79] `index' might be a library routine. |k|th element of its list. @y diff --git a/Build/source/texk/web2c/vptovf.ch b/Build/source/texk/web2c/vptovf.ch index 2c859b76ee7..8c62af94142 100644 --- a/Build/source/texk/web2c/vptovf.ch +++ b/Build/source/texk/web2c/vptovf.ch @@ -106,6 +106,12 @@ begin while loc=limit do fill_buffer; begin cur_char:=xord[buffer[loc+1]]; @z +@x [73] Interpret '--' as '+', not '-'. + begin cur_char:=" "; negative:=true; +@y + begin cur_char:=" "; negative:=not negative; +@z + % [89] `index' is not a good choice for an identifier on Unix systems. % Neither is `class', on AIX. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |