From 20c4037f15e32fe45d05807514f75249d7d416e8 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 4 Jan 2010 19:48:00 +0100 Subject: beta 2010.01.04 19:48 --- metapost/context/base/mp-chem.mp | 7 +++-- tex/context/base/bibl-bib.lua | 13 ++++++++- tex/context/base/bibl-bib.mkiv | 6 +++-- tex/context/base/bibl-tst.lua | 2 +- tex/context/base/chem-str.mkiv | 3 +++ tex/context/base/context.mkiv | 1 + tex/context/base/font-mis.lua | 2 +- tex/context/base/font-otf.lua | 7 +++-- tex/context/base/font-tfm.lua | 2 +- tex/context/base/lxml-sor.lua | 26 +++++++++++++++--- tex/context/base/lxml-sor.mkiv | 4 ++- tex/context/base/lxml-tex.lua | 10 +++++++ tex/context/base/m-chemic.mkiv | 5 ++-- tex/context/base/pack-rul.mkiv | 26 +++++++++++++----- tex/context/base/spac-ver.mkiv | 41 ++++++++++++++++++++++------- tex/context/base/strc-ref.lua | 36 ++++++++++++++++++++----- tex/context/base/strc-ref.mkiv | 9 ++++--- tex/generic/context/luatex-fonts-merged.lua | 11 +++++--- 18 files changed, 166 insertions(+), 45 deletions(-) diff --git a/metapost/context/base/mp-chem.mp b/metapost/context/base/mp-chem.mp index 1537b84cd..e04fcd350 100644 --- a/metapost/context/base/mp-chem.mp +++ b/metapost/context/base/mp-chem.mp @@ -73,6 +73,7 @@ chem_radical_max := 1.50 ; chem_text_min := 0.75 ; chem_text_max := 1.75 ; chem_circle_radius := 0.80 ; +chem_circle_radius := 1.10 ; chem_rotation := 1 ; chem_adjacent := 0 ; chem_substituent := 0 ; @@ -652,8 +653,10 @@ def chem_init_some(expr n, ratio, angle, start, initialrot, initialmov) = chem_msr_path [n] := chem_sr_path[n] rotatedaround(chem_b_zero[n], (180-angle)/2) ; chem_psr_path [n] := chem_sr_path[n] rotatedaround(chem_b_zero[n],-(180-angle)/2) ; % not yet ok: - chem_c_path [n] := subpath (30/45, -30/45) of (fullcircle scaled (1.25*chem_circle_radius*chem_width[n])); - chem_cc_path [n] := subpath (30/45,8-30/45) of (fullcircle rotated 90 scaled (1.25*chem_circle_radius*chem_width[n])); +% chem_c_path [n] := subpath (30/45, -30/45) of (fullcircle scaled (1.25*chem_circle_radius*chem_width[n])); +% chem_cc_path [n] := subpath (30/45,8-30/45) of (fullcircle rotated 90 scaled (1.25*chem_circle_radius*chem_width[n])); + chem_c_path [n] := subpath (30/45, -30/45) of (fullcircle scaled (chem_width[n])); + chem_cc_path [n] := subpath (30/45,8-30/45) of (fullcircle rotated 90 scaled (chem_width[n])); enddef ; def chem_init_three = chem_init_some(3,30/52 ,120,-60,1,2) ; enddef ; % 60 diff --git a/tex/context/base/bibl-bib.lua b/tex/context/base/bibl-bib.lua index 4172e2408..2df2f9507 100644 --- a/tex/context/base/bibl-bib.lua +++ b/tex/context/base/bibl-bib.lua @@ -12,7 +12,7 @@ bibtex files and converts them to xml so that the we access the content in a convenient way. Actually handling the data takes place elsewhere.

--ldx]]-- -local lower, format = string.lower, string.format +local lower, format, gsub = string.lower, string.format, string.gsub local next = next local lpegmatch = lpeg.match @@ -125,6 +125,16 @@ end local escaped_pattern = xml.escaped_pattern +local ihatethis = { + f = "\\f", + n = "\\n", + r = "\\r", + s = "\\s", + t = "\\t", + v = "\\v", + z = "\\z", +} + function bibtex.toxml(session) -- we can always speed this up if needed -- format slows down things a bit but who cares @@ -139,6 +149,7 @@ function bibtex.toxml(session) if not entries or entries[name] then result[#result+1] = format(" ",name) for key, value in next, entry do + value = gsub(value,"\\(.)",ihatethis) value = lpegmatch(escaped_pattern,value) if value ~= "" then result[#result+1] = format(" %s",key,value) diff --git a/tex/context/base/bibl-bib.mkiv b/tex/context/base/bibl-bib.mkiv index e0476c473..36ba61d9d 100644 --- a/tex/context/base/bibl-bib.mkiv +++ b/tex/context/base/bibl-bib.mkiv @@ -19,11 +19,13 @@ \def\definebibtexsession [#1]{\ctxlua{commands.definebibtexsession("#1")}} \def\preparebibtexsession [#1]{\ctxlua{commands.preparebibtexsession("#1")}} + \def\registerbibtexfile {\dodoubleargument\doregisterbibtexfile} -\def\doregisterbibtexfile [#1][#2]{\ctxlua{commands.registerbibtexfile("#1","#2")}} % also the fast one \def\registerbibtexentry {\dodoubleargument\doregisterbibtexentry} -\def\doregisterbibtexentry [#1][#2]{\ctxlua{commands.registerbibtexentry("#1","#2")}} % also the fast one \def\applytobibtexsession {\dodoubleargument\doapplytobibtexsession} + +\def\doregisterbibtexfile [#1][#2]{\ctxlua{commands.registerbibtexfile("#1","#2")}} % also the fast one +\def\doregisterbibtexentry [#1][#2]{\ctxlua{commands.registerbibtexentry("#1","#2")}} % also the fast one \def\doapplytobibtexsession[#1][#2]{\xmlprocessregistered{bibtex:#1}{#2}{#2}} \protect \endinput diff --git a/tex/context/base/bibl-tst.lua b/tex/context/base/bibl-tst.lua index a1b85b0f7..5ff8f4570 100644 --- a/tex/context/base/bibl-tst.lua +++ b/tex/context/base/bibl-tst.lua @@ -11,8 +11,8 @@ bibtex.load(session,"texgraph.bib") bibtex.load(session,"texjourn.bib") bibtex.load(session,"texnique.bib") bibtex.load(session,"tugboat.bib") +print(bibtex.size,statistics.elapsedtime(bibtex)) bibtex.toxml(session) - print(bibtex.size,statistics.elapsedtime(bibtex)) --~ print(table.serialize(session.data)) diff --git a/tex/context/base/chem-str.mkiv b/tex/context/base/chem-str.mkiv index 29c6fe939..ea8c8827f 100644 --- a/tex/context/base/chem-str.mkiv +++ b/tex/context/base/chem-str.mkiv @@ -100,6 +100,9 @@ \def\dochemicaltext#1% in ppchtex we had a more clever alignment {\dosetchemicaltext\strut#1} % maybe also \setstrut +\def\dochemicaltext#1% + {\mathematics{\dosetchemicaltext\strut\ifcase\currentxfontsize\or\scriptstyle\or\scriptscriptstyle\fi#1}} + \newconditional\indisplaychemical \unexpanded\def\startchemical diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 36f4f375d..f6c578db3 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -151,6 +151,7 @@ \loadmarkfile{pack-rul} \loadmarkfile{lxml-ini} +\loadmarkfile{lxml-sor} \loadmarkfile{strc-ini} \loadmarkfile{strc-doc} diff --git a/tex/context/base/font-mis.lua b/tex/context/base/font-mis.lua index 043560565..c2a733ebb 100644 --- a/tex/context/base/font-mis.lua +++ b/tex/context/base/font-mis.lua @@ -11,7 +11,7 @@ local lower, strip = string.lower, string.strip fonts.otf = fonts.otf or { } -fonts.otf.version = fonts.otf.version or 2.642 +fonts.otf.version = fonts.otf.version or 2.643 fonts.otf.pack = true fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true) diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 1cf514804..d01c5d7e9 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -84,7 +84,7 @@ otf.features.default = otf.features.default or { } otf.enhancers = otf.enhancers or { } otf.glists = { "gsub", "gpos" } -otf.version = 2.642 -- beware: also sync font-mis.lua +otf.version = 2.643 -- beware: also sync font-mis.lua otf.pack = true -- beware: also sync font-mis.lua otf.syncspace = true otf.notdef = false @@ -530,6 +530,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end local cidinfo, cidnames, cidcodes = data.cidinfo local usedmap = cidinfo and cidinfo.usedname + usedmap = usedmap and lower(usedmap) usedmap = usedmap and fonts.cid.map[usedmap] if usedmap then oparser = usedmap and fonts.map.make_name_parser(cidinfo.ordering) @@ -551,7 +552,9 @@ otf.enhancers["analyse unicodes"] = function(data,filename) local foundindex = lpegmatch(oparser,name) if foundindex then unicode = cidcodes[foundindex] -- name to number - if not unicode then + if unicode then + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + else local reference = cidnames[foundindex] -- number to name if reference then local foundindex = lpegmatch(oparser,reference) diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua index 4bb47cf04..c5140ff7c 100644 --- a/tex/context/base/font-tfm.lua +++ b/tex/context/base/font-tfm.lua @@ -487,7 +487,7 @@ t.colorscheme = tfmtable.colorscheme --~ end local s = sharedkerns[vk] if not s then - local s = {} + s = { } for k,v in next, vk do s[k] = v*hdelta end sharedkerns[vk] = s end diff --git a/tex/context/base/lxml-sor.lua b/tex/context/base/lxml-sor.lua index daeb9ec7b..7aebef79d 100644 --- a/tex/context/base/lxml-sor.lua +++ b/tex/context/base/lxml-sor.lua @@ -60,12 +60,32 @@ function lxml.sorters.show(name) local entries = list and list.entries local NC, NR, bold = context.NC, context.NR, context.bold -- somehow bold is not working if entries then - context.starttabulate { "|Tr|Tr|Tl|" } - NC() bold("n") NC() bold("id") NC() bold("entry") NR() context.HL() + local maxn = 1 + for i=1,#entries do + if #entries[i][2] > maxn then maxn = #entries[i][2] end + end + context.starttabulate { "|Tr|Tr|" .. string.rep("Tlp|",maxn) } + NC() bold("n") + NC() bold("id") + if maxn > 1 then + for i=1,maxn do + NC() bold("entry " .. i) + end + else + NC() bold("entry") + end + NC() NR() + context.HL() for i=1,#entries do local entry = entries[i] local document, node = lxml.splitid(entry[1]) - NC() context(i) NC() context(node) NC() context(concat(entry[2]," ")) NR() + NC() context(i) + NC() context(node) + local e = entry[2] + for i=1,#e do + NC() context.detokenize(e[i]) + end + NC() NR() end context.stoptabulate() end diff --git a/tex/context/base/lxml-sor.mkiv b/tex/context/base/lxml-sor.mkiv index 06ef5b6ab..14425967b 100644 --- a/tex/context/base/lxml-sor.mkiv +++ b/tex/context/base/lxml-sor.mkiv @@ -11,6 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D THIS IS VERY EXPERIMENTAL! + \writestatus{loading}{ConTeXt XML Support / Sorting} \registerctxluafile{lxml-sor}{1.001} @@ -18,7 +20,7 @@ \unprotect \def\xmlresetsorter #1{\ctxlua{lxml.sorters.reset("#1")}} -\def\xmladdsortentry#1#2#3{\ctxlua{lxml.sorters.add("#1","#2","#3")}} +\def\xmladdsortentry#1#2#3{\ctxlua{lxml.sorters.add("#1","#2",\!!bs#3\!!es)}} \def\xmlshowsorter #1{\ctxlua{lxml.sorters.show("#1")}} \def\xmlflushsorter #1#2{\ctxlua{lxml.sorters.flush("#1","#2")}} \def\xmlsortentries #1{\ctxlua{lxml.sorters.sort("#1")}} diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua index 9726a5661..a2a295614 100644 --- a/tex/context/base/lxml-tex.lua +++ b/tex/context/base/lxml-tex.lua @@ -985,6 +985,14 @@ local function text(collected) end end +local function ctxtext(collected) + if collected then + for c=1,#collected do + texsprint(ctxcatcodes,collected[1].dt) + end + end +end + local function number(collected) if collected then local n = 0 @@ -1031,6 +1039,8 @@ finalizers.count = count finalizers.command = command finalizers.attribute = attribute finalizers.text = text +finalizers.ctxtext = ctxtext +finalizers.context = ctxtext finalizers.position = position finalizers.match = match finalizers.index = index diff --git a/tex/context/base/m-chemic.mkiv b/tex/context/base/m-chemic.mkiv index 4cc1e3bd8..bd4cb093e 100644 --- a/tex/context/base/m-chemic.mkiv +++ b/tex/context/base/m-chemic.mkiv @@ -12,8 +12,9 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\usemodule[pictex] % we will get rid of this +\writestatus{ppchtex}{not loaded as support for chemistry in now built in} -\input ppchtex.mkiv \relax +% \usemodule[pictex] % we will get rid of this +% \input ppchtex.mkiv \relax \endinput diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index bd3a127e3..b0b2592b5 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -770,24 +770,38 @@ %D Because it is used so often the he next macro is (and %D looks) rather optimized. +% \def\s!root{root} % maybe configurable + \let\postprocessframebox\relax \let\@@framed\s!unknown -\def\framedparameter #1{\csname\doframedparameter\@@framed#1\endcsname} +% \def\framedparameter #1{\csname\doframedparameter\@@framed#1\endcsname} +% \def\framedparameterhash#1{\doframedparameterhash \@@framed#1} +% +% \def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname#2\fi} +% \def\doframedparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doframedparentparameterhash\csname#1\s!parent\endcsname#2\fi} +% +% \def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1#2\fi} +% \def\doframedparentparameterhash#1#2{\ifx#1\relax \else\doframedparameterhash#1#2\fi} +% +% \def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1#2\fi} +% \def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi} + +\def\framedparameter #1{\csname\doframedparameter\@@framed{#1}\endcsname} \def\framedparameterhash#1{\doframedparameterhash \@@framed#1} -\def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname#2\fi} +\def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname{#2}\fi} \def\doframedparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doframedparentparameterhash\csname#1\s!parent\endcsname#2\fi} -\def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1#2\fi} +\def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1{#2}\fi} \def\doframedparentparameterhash#1#2{\ifx#1\relax \else\doframedparameterhash#1#2\fi} -% \def\s!root{root} % maybe configurable - -\def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1#2\fi} +\def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1{#2}\fi} \def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi} +\def\frameddimension#1{\the\dimexpr\framedparameter{#1}\relax} + \def\dosetframedattributes#1#2% style color {\edef\fontattributehash {\framedparameterhash#1}% \edef\colorattributehash{\framedparameterhash#2}% diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv index b6594476a..b0e2603f3 100644 --- a/tex/context/base/spac-ver.mkiv +++ b/tex/context/base/spac-ver.mkiv @@ -113,17 +113,38 @@ \let\currentrelativeinterlinespace\empty +% \def\setuprelativeinterlinespace[#1]% +% {\processallactionsinset +% [#1] +% [ \v!on=>\oninterlineskip, +% \v!off=>\offinterlineskip, +% \v!reset=>\let\currentrelativeinterlinespace\empty +% \let\setrelativeinterlinespace\relax +% \setfontparameters, +% \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace, +% \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}% +% \spacing\currentrelativeinterlinespace]} + +\setvalue{\??it::\v!on }{\oninterlineskip} +\setvalue{\??it::\v!off }{\offinterlineskip} +\setvalue{\??it::\v!reset}{\let\currentrelativeinterlinespace\empty + \let\setrelativeinterlinespace\relax + \setfontparameters} +\setvalue{\??it::\v!auto }{\let\setrelativeinterlinespace\dosetrelativeinterlinespace} + +\def\dosetspecifiedrelativeinterlinespace#1% + {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}% + \spacing\currentrelativeinterlinespace} + \def\setuprelativeinterlinespace[#1]% - {\processallactionsinset - [#1] - [ \v!on=>\oninterlineskip, - \v!off=>\offinterlineskip, - \v!reset=>\let\currentrelativeinterlinespace\empty - \let\setrelativeinterlinespace\relax - \setfontparameters, - \v!auto=>\let\setrelativeinterlinespace\dosetrelativeinterlinespace, - \s!unknown=>\assignvalue\commalistelement\currentrelativeinterlinespace{1.00}{1.25}{1.50}% - \spacing\currentrelativeinterlinespace]} + {\processcommalist[#1]\dosetuprelativeinterlinespace} + +\def\dosetuprelativeinterlinespace#1% + {\ifcsname\??it::#1\endcsname + \csname\??it::#1\endcsname + \else + \dosetspecifiedrelativeinterlinespace{#1}% + \fi} \def\dosetrelativeinterlinespace {\ifx\currentrelativeinterlinespace\empty\else diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 001a52a75..7c4efe5ba 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -290,28 +290,52 @@ function jobreferences.whatfrom(name) texsprint(ctxcatcodes,(urls[name] and variables.url) or (files[name] and variables.file) or variables.unknown) end +--~ function jobreferences.from(name) +--~ local u = urls[name] +--~ if u then +--~ local url, file, description = u[1], u[2], u[3] +--~ if description ~= "" then +--~ texsprint(ctxcatcodes,format("\\dofromurldescription{%s}",description)) +--~ -- ok +--~ elseif file and file ~= "" then +--~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url .. "/" .. file)) +--~ else +--~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url)) +--~ end +--~ else +--~ local f = files[name] +--~ if f then +--~ local description, file = f[1], f[2] +--~ if description ~= "" then +--~ texsprint(ctxcatcodes,format("\\dofromfiledescription{%s}",description)) +--~ else +--~ texsprint(ctxcatcodes,format("\\dofromfileliteral{%s}",file)) +--~ end +--~ end +--~ end +--~ end + function jobreferences.from(name) local u = urls[name] if u then local url, file, description = u[1], u[2], u[3] if description ~= "" then + context.dofromurldescription(description) -- ok elseif file and file ~= "" then - description = url .. "/" .. file + context.dofromurlliteral(url .. "/" .. file) else - description = url + context.dofromurlliteral(url) end - texsprint(ctxcatcodes,format("\\dofromurl{%s}",description)) else local f = files[name] if f then local description, file = f[1], f[2] if description ~= "" then - -- + context.dofromfiledescription(description) else - description = file + context.dofromfileliteral(file) end - texsprint(ctxcatcodes,format("\\dofromfile{%s}",description)) end end end diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index 91643fc72..71dd8f6b8 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -1281,13 +1281,16 @@ {\dontleavehmode \goto{\ctxlua{jobreferences.from("#1")}}[fileorurl(#1)]} -\def\dofromurl#1% +\def\dofromurldescription#1% + {#1} + +\def\dofromurlliteral#1% {\dosetfontattribute \??ur\c!style \dosetcolorattribute\??ur\c!color \hyphenatedurl{#1}} -\def\dofromfile#1% - {\hyphenatedurl{#1}} +\let\dofromfiledescription\dofromurldescription +\let\dofromfileliteral \dofromurlliteral % maybe some day setupfile that inherits from url %D We also support: %D diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index 6449817db..e6da53fad 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua --- merge date : 01/03/10 13:02:01 +-- merge date : 01/04/10 19:52:31 do -- begin closure to overcome local limits and interference @@ -3810,7 +3810,7 @@ t.colorscheme = tfmtable.colorscheme --~ end local s = sharedkerns[vk] if not s then - local s = {} + s = { } for k,v in next, vk do s[k] = v*hdelta end sharedkerns[vk] = s end @@ -5380,7 +5380,7 @@ otf.features.default = otf.features.default or { } otf.enhancers = otf.enhancers or { } otf.glists = { "gsub", "gpos" } -otf.version = 2.642 -- beware: also sync font-mis.lua +otf.version = 2.643 -- beware: also sync font-mis.lua otf.pack = true -- beware: also sync font-mis.lua otf.syncspace = true otf.notdef = false @@ -5826,6 +5826,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end local cidinfo, cidnames, cidcodes = data.cidinfo local usedmap = cidinfo and cidinfo.usedname + usedmap = usedmap and lower(usedmap) usedmap = usedmap and fonts.cid.map[usedmap] if usedmap then oparser = usedmap and fonts.map.make_name_parser(cidinfo.ordering) @@ -5847,7 +5848,9 @@ otf.enhancers["analyse unicodes"] = function(data,filename) local foundindex = lpegmatch(oparser,name) if foundindex then unicode = cidcodes[foundindex] -- name to number - if not unicode then + if unicode then + originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 + else local reference = cidnames[foundindex] -- number to name if reference then local foundindex = lpegmatch(oparser,reference) -- cgit v1.2.3