Re: Zsh's and ksh's bang (!) expansion flags have different meanings

Philippe Altherr <[email protected]> Tue, 28 Jul 2026 16:01:49 +0200
Newsgroups gmane.comp.shells.zsh.devel
Message-ID <CAGdYchsV8MQdKz7ALh38WYwNDYOvGD++bK9BB1e5hvgBXUqSRQ@mail.gmail.com>
--00000000000076bf6c0657ac4885
Content-Type: multipart/alternative; boundary="00000000000076bf6a0657ac4883"

--00000000000076bf6a0657ac4883
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

>
> As I've mentioned in the past, if you see ksh-like behavior in zsh that
> doesn't quite match ksh, it's often because the ksh behavior was
> implemented based on reading examples from the ksh manual pages way back
> when ksh was proprietary software and unavailable for running a compariso=
n.


> Other times it's because the ksh behavior or syntax conflicted with
> something else zsh was already doing.


For the case ${!vname[subscript]}, I think that Zsh's ksh emulation is
actually closer to ksh's documentation than ksh itself. Here is ksh's
documentation about ${!vname[subscript]} from
https://manpages.debian.org/trixie/ksh93u+m/ksh93.1.en.html:

${!vname[subscript]}

*Expands to name of the subscript* unless subscript is *, @. or of the form
sub1 .. sub2. When subscript is *, the list of array subscripts for vname
is generated. For a variable that is not an array, the value is 0 if the
variable is set. Otherwise it is the empty string. When subscript is @,
same as above, except that when used in double quotes, each array subscript
yields a separate argument. When subscript is of the form sub1 .. sub2 it
expands to the list of subscripts between sub1 and sub2 inclusive using the
same quoting rules as @.


Also consider this (ksh code):

$ typeset arr=3D(aa bb cc)
$ echo ${!arr[@]}
0 1 2                  # Names of the subscripts
$ echo ${!arr[1..2]}
1 2                    # Names of the subscripts
$ echo ${!arr[1..1]}
1                      # Names of the subscript
$ echo ${!arr[1]}
arr[1]                 # What?!?

--- expected
> +++ actual
> @@ -1,3 +1,3 @@
> +characters
>  .k02.array
> -.k02.array
>  characters
> Test K02parameter.ztst failed: output differs from expected as shown abov=
e
> for:
>   () {
>     typeset -n .k02.ref=3D.k02.array
>     emulate -L ksh
>     print -l ${!.k02.ref} ${(!).k02.ref} ${.k02.ref}
>   }
> Was testing: namerefs with namespaces
> K02parameter.ztst: test failed.
>

Oops, I forgot to run the whole test suite. Here is an updated patch:

- Don't map ksh's ! to Zsh's (!k), map it to (k)
<https://github.com/zsh-users/zsh/compare/master...paltherr:zsh:dont-map-ks=
h-bang-to-zsh-bang>

> Below is a patch that changes Zsh's emulation of ksh to map ksh's ! to
> just (k) instead of (!k). Note that the flag combination (!k) is forbidde=
n,
> which I think is right.
>
> This doesn't look right to me?  The test is prefixed with
>
>   .k02.array=3D(characters in an array)
>
> ${!.k02.ref} should not return "characters" ...?  That makes '!' just
> a no-op for this case.
>

Let's forget about namespaces for a moment and consider the following
definitions:

typeset arr0=3D(abc def ghi)
typeset -n ref1=3Darr0
typeset -n ref2=3Dref1

It's true that with my patch (which maps ${!name=E2=80=A6} to ${(k)name=E2=
=80=A6}), the !
in "${!ref1}" becomes a no-op. But why only complain about the no-opity of
! in "${!ref1}" and not in "${!arr0}"? Ksh expands both to "arr0", not just
the former. In fact, ksh also expands "${!ref2}" to "arr0", while without
my patch Zsh expands it to "ref1". With my patch, Zsh uniformly handles !
as a no-op in ${!name} while currently it sometimes performs something and
sometimes that something happens to match what ksh does. That doesn't sound
very compelling to me.

Furthermore, the current behavior maps "${!arr0[1]}", "${!ref1[1]}", and
"${!ref2[1]}" to "1", "r", and "e", while my patch maps all of them to "1",
which is much closer to ksh's behavior of mapping all of them to "arr0[1]".

If we want to bring Zsh's emulation of ${!name=E2=80=A6} closer to ksh's be=
havior,
then instead of mapping ${!name=E2=80=A6} to ${(!k)name=E2=80=A6}, I would =
rather adopt my
patch to map it to ${(k)name=E2=80=A6} and extend (k) to plain variables in=
 ksh
emulation. The following patch does that:

- In ksh emulation, extend (k) expansion flag to plain variable names
<https://github.com/paltherr/zsh/compare/extend-k-flag-to-plain-vars-start.=
..paltherr:zsh:extend-k-flag-to-plain-vars>
(DO
NOT COMMIT - just a proof of concept)

With that patch, all of "${!arr0}", "${!ref1}", and "${!ref2}" expand to
"arr0", like in ksh. The comparison with ksh becomes much greener:


Zsh's ksh emulation

ksh

Zsh's ksh emulation

${!var} <=3D> ${(!k)var}

${!var} <=3D> ${(k)var}

+ extend (k) in ksh emulation

!str

!str[1]

!str[1,2]

!str[@]

!arr

!arr[1]

!arr[1,2]

!arr[@]

!hsh

!hsh[1]

!hsh[@]

abc - str0 - str1

b - t - t

bc - tr - tr

abc - str0 - str1

aa - arr0 - arr1

1 - r - r

<error> - rr - rr

aa bb cc - arr0 - arr1

aa - hsh0 - hsh1

1 - s - s

0 1 2 - hsh0 - hsh1

str0 - str0 - str0

str0[1] - str1[1] - str2[1]

str0[1,2] - str1[1,2] - str2[1,2]

0 - 0 - 0

arr0 - arr0 - arr0

arr0[1] - arr0[1] - arr0[1]

arr0[2] - arr0[2] - arr0[2]

0 1 2 - 0 1 2 - 0 1 2

hsh0 - hsh0 - hsh0

hsh0[1] - hsh0[1] - hsh0[1]

0 1 2 - 0 1 2 - 0 1 2

str0 - str0 - str0

b - b - b

bc - bc - bc

abc - abc - abc

arr0 - arr0 - arr0

1 - 1 - 1

<error> - <error> - <error>

aa bb cc - aa bb cc - aa bb cc

hsh0 - hsh0 - hsh0

1 - 1 - 1

0 1 2 - 0 1 2 - 0 1 2

For the time being, I would revert ${!name=E2=80=A6} to ${(k)name=E2=80=A6}=
 (as it used to
be before named references) and later discuss whether we want to extend (k)
to plain variables in ksh emulation.

Note that (k) can only be extended to plain variables in ksh emulation
because in Zsh ${hash} expands to all values of hash, so ${(k)hash} has to
expand to all keys of hash, it can't expand to "hash".

Philippe

--00000000000076bf6a0657ac4883
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><blockquote class=3D"gma=
il_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,2=
04,204);padding-left:1ex">As I&#39;ve mentioned in the past, if you see ksh=
-like behavior in zsh that doesn&#39;t quite match ksh, it&#39;s often beca=
use the ksh behavior was implemented based on reading examples from the ksh=
 manual pages way back when ksh was proprietary software and unavailable fo=
r running a comparison.</blockquote><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><br>Other times it&#39;s because the ksh behavior or syntax conf=
licted with something else zsh was already doing.</blockquote><div><br></di=
v><div>For the case ${!vname[subscript]}, I think that Zsh&#39;s ksh emulat=
ion is actually closer to ksh&#39;s=C2=A0documentation than ksh itself. Her=
e is ksh&#39;s documentation about=C2=A0${!vname[subscript]} from=C2=A0<a h=
ref=3D"https://manpages.debian.org/trixie/ksh93u+m/ksh93.1.en.html" target=
=3D"_blank">https://manpages.debian.org/trixie/ksh93u+m/ksh93.1.en.html</a>=
:</div><div><br></div><div>${!vname[subscript]}<br></div></div><blockquote =
style=3D"margin:0 0 0 40px;border:none;padding:0px"><div dir=3D"ltr"><div><=
b>Expands to name of the subscript</b> unless subscript is *, @. or of the =
form sub1 .. sub2. When subscript is *, the list of array subscripts for vn=
ame is generated. For a variable that is not an array, the value is 0 if th=
e variable is set. Otherwise it is the empty string. When subscript is @, s=
ame as above, except that when used in double quotes, each array subscript =
yields a separate argument. When subscript is of the form sub1 .. sub2 it e=
xpands to the list of subscripts between sub1 and sub2 inclusive using the =
same quoting rules as @.</div></div></blockquote><div dir=3D"ltr"><div><br>=
</div><div>Also consider this (ksh code):</div><div><br></div><div><font fa=
ce=3D"monospace">$ typeset arr=3D(aa bb cc)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0<br>$ echo ${!arr[@]}<br>0 1 2=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 </font><font fa=
ce=3D"arial, sans-serif"># Names of the subscripts</font><br><font face=3D"=
monospace">$ echo ${!arr[1..2]}</font><br><font face=3D"monospace">1 2=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</f=
ont><font face=3D"arial, sans-serif"># Names of the subscripts</font><font =
face=3D"monospace"><br>$ echo ${!arr[1..1]}<br>1=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</font><font face=3D=
"arial, sans-serif"># Names of the subscript</font><font face=3D"monospace"=
><br>$ echo ${!arr[1]} =C2=A0 <br>arr[1]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0</font><font face=3D"arial, sans-serif"># What?!=
?</font></div><div><br></div><div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex">--- expected<br>+++ actual<br>@@ -1,3 +1,3 @@<br>+characters<br>=
=C2=A0.k02.array<br>-.k02.array<br>=C2=A0characters<br>Test K02parameter.zt=
st failed: output differs from expected as shown above for:<br>=C2=A0 () {<=
br>=C2=A0 =C2=A0 typeset -n .k02.ref=3D.k02.array<br>=C2=A0 =C2=A0 emulate =
-L ksh<br>=C2=A0 =C2=A0 print -l ${!.k02.ref} ${(!).k02.ref} ${.k02.ref}<br=
>=C2=A0 }<br>Was testing: namerefs with namespaces<br>K02parameter.ztst: te=
st failed.<br></blockquote><div><br></div></div><div>Oops, I forgot to run =
the whole test suite. Here is an updated patch:</div><div><br></div><div>-=
=C2=A0<a href=3D"https://github.com/zsh-users/zsh/compare/master...paltherr=
:zsh:dont-map-ksh-bang-to-zsh-bang" target=3D"_blank">Don&#39;t map ksh&#39=
;s ! to Zsh&#39;s (!k), map it to (k)</a></div><div><br></div></div><div cl=
ass=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt; Below is a patch that changes Zsh&#39;s emulation of ksh to map ksh&#3=
9;s ! to just (k) instead of (!k). Note that the flag combination (!k) is f=
orbidden, which I think is right.<br>
<br>
This doesn&#39;t look right to me?=C2=A0 The test is prefixed with<br>
<br>
=C2=A0 .k02.array=3D(characters in an array)<br>
<br>
${!.k02.ref} should not return &quot;characters&quot; ...?=C2=A0 That makes=
 &#39;!&#39; just<br>
a no-op for this case.<br></blockquote><div><br></div><div>Let&#39;s forget=
 about namespaces for a moment and consider the following definitions:</div=
><div><br></div><font face=3D"monospace">typeset arr0=3D(abc def ghi)<br>ty=
peset -n ref1=3Darr0<br>typeset -n ref2=3Dref1</font><br><div><br></div><di=
v>It&#39;s true that with my patch (which maps ${!name=E2=80=A6} to ${(k)na=
me=E2=80=A6}), the ! in &quot;${!ref1}&quot; becomes a no-op. But why only =
complain about the no-opity of ! in=C2=A0<span style=3D"background-color:tr=
ansparent">&quot;${!ref1}&quot; and not in &quot;${!arr0}&quot;? Ksh expand=
s both to &quot;arr0&quot;, not just the former. In fact, ksh also expands =
&quot;${!ref2}&quot; to &quot;arr0&quot;, while without my patch Zsh expand=
s it to &quot;ref1&quot;. With my patch, Zsh uniformly handles ! as a no-op=
 in ${!name} while currently it sometimes performs=C2=A0something and somet=
imes that something happens to match what ksh does. That doesn&#39;t sound =
very compelling to me.</span></div><div><span style=3D"background-color:tra=
nsparent"><br></span></div><div><span style=3D"background-color:transparent=
">Furthermore, the current behavior maps=C2=A0</span><span style=3D"backgro=
und-color:transparent">&quot;${!arr0[1]}&quot;, &quot;${!ref1[1]}&quot;, an=
d &quot;${!ref2[1]}&quot; to &quot;1&quot;, &quot;r&quot;, and &quot;e&quot=
;, while my patch maps all of them to &quot;1&quot;, which is much closer t=
o ksh&#39;s=C2=A0behavior of mapping all of them to &quot;arr0[1]&quot;.</s=
pan></div><div><span style=3D"background-color:transparent"><br></span></di=
v><div><span style=3D"background-color:transparent">If we want to bring=C2=
=A0Zsh&#39;s=C2=A0emulation of=C2=A0</span><span style=3D"background-color:=
transparent">${!name=E2=80=A6} closer to ksh&#39;s=C2=A0behavior, then inst=
ead of mapping=C2=A0</span><span style=3D"background-color:transparent">${!=
name=E2=80=A6} to=C2=A0</span><span style=3D"background-color:transparent">=
${(!k)name=E2=80=A6}, I would rather adopt my patch to map it to=C2=A0</spa=
n><span style=3D"background-color:transparent">${(k)name=E2=80=A6} and exte=
nd (k) to plain variables in ksh emulation. The following patch does that:<=
/span></div><div><span style=3D"background-color:transparent"><br></span></=
div><div>- <a href=3D"https://github.com/paltherr/zsh/compare/extend-k-flag=
-to-plain-vars-start...paltherr:zsh:extend-k-flag-to-plain-vars">In ksh emu=
lation, extend (k) expansion flag to plain variable names</a>=C2=A0(DO NOT =
COMMIT - just a proof of concept)<span style=3D"background-color:transparen=
t"></span></div><div>=C2=A0</div><div>With that patch, all of=C2=A0&quot;${=
!arr0}&quot;, &quot;${!ref1}&quot;, and &quot;${!ref2}&quot; expand to &quo=
t;arr0&quot;, like in ksh. The comparison with ksh becomes much greener:</d=
iv><div><br></div><div><span id=3D"gmail-docs-internal-guid-3ad454d0-7fff-7=
a85-6c77-89bc4408c5a1"><div dir=3D"ltr" style=3D"margin-left:0pt" align=3D"=
left"><table style=3D"border-width:medium;border-style:none;border-color:cu=
rrentcolor;border-collapse:collapse"><colgroup><col width=3D"82"><col width=
=3D"269"><col width=3D"269"><col width=3D"269"></colgroup><tbody><tr style=
=3D"height:0pt"><td style=3D"border-width:1pt;border-style:solid;border-col=
or:rgb(0,0,0);vertical-align:top;background-color:rgb(204,204,204);padding:=
5pt;overflow:hidden"><br></td><td style=3D"border-width:1pt;border-style:so=
lid;border-color:rgb(0,0,0);vertical-align:top;background-color:rgb(204,204=
,204);padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;=
margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family=
:Arial,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight=
:700;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">Zsh&=
#39;s ksh emulation</span></p></td><td style=3D"border-width:1pt;border-sty=
le:solid;border-color:rgb(0,0,0);vertical-align:top;background-color:rgb(20=
4,204,204);padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height=
:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-f=
amily:Arial,sans-serif;color:rgb(0,0,0);background-color:transparent;font-w=
eight:700;font-variant:normal;vertical-align:baseline;white-space:pre-wrap"=
>ksh</span></p></td><td style=3D"border-width:1pt;border-style:solid;border=
-color:rgb(0,0,0);vertical-align:top;background-color:rgb(204,204,204);padd=
ing:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top=
:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Arial,san=
s-serif;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-=
variant:normal;vertical-align:baseline;white-space:pre-wrap">Zsh&#39;s ksh =
emulation</span></p></td></tr><tr style=3D"height:0pt"><td style=3D"border-=
width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-align:top;bac=
kground-color:rgb(239,239,239);padding:5pt;overflow:hidden"><br></td><td st=
yle=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical=
-align:top;background-color:rgb(239,239,239);padding:5pt;overflow:hidden"><=
p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><s=
pan style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0=
);background-color:transparent;font-variant:normal;vertical-align:baseline;=
white-space:pre-wrap">${!var} &lt;=3D&gt; ${(!k)var}</span></p></td><td sty=
le=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertical-=
align:top;background-color:rgb(239,239,239);padding:5pt;overflow:hidden"><b=
r></td><td style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,=
0,0);vertical-align:top;background-color:rgb(239,239,239);padding:5pt;overf=
low:hidden"><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-b=
ottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;co=
lor:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-al=
ign:baseline;white-space:pre-wrap">${!var} &lt;=3D&gt; ${(k)var}</span></p>=
<p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><=
span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,=
0);background-color:transparent;font-variant:normal;vertical-align:baseline=
;white-space:pre-wrap">+ extend (k) in ksh emulation</span></p></td></tr><t=
r style=3D"height:0pt"><td style=3D"border-width:1pt;border-style:solid;bor=
der-color:rgb(0,0,0);vertical-align:top;padding:5pt;overflow:hidden"><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">!str</span></p><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap">!str[1]</span></p><p=
 dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><sp=
an style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0)=
;background-color:transparent;font-variant:normal;vertical-align:baseline;w=
hite-space:pre-wrap">!str[1,2]</span></p><p dir=3D"ltr" style=3D"line-heigh=
t:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-=
family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;fo=
nt-variant:normal;vertical-align:baseline;white-space:pre-wrap">!str[@]</sp=
an></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bo=
ttom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;col=
or:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-ali=
gn:baseline;white-space:pre-wrap">!arr</span></p><p dir=3D"ltr" style=3D"li=
ne-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10=
pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transp=
arent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">!ar=
r[1]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margi=
n-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif=
;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical=
-align:baseline;white-space:pre-wrap">!arr[1,2]</span></p><p dir=3D"ltr" st=
yle=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"fon=
t-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-col=
or:transparent;font-variant:normal;vertical-align:baseline;white-space:pre-=
wrap">!arr[@]</span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-=
top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consol=
as,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:no=
rmal;vertical-align:baseline;white-space:pre-wrap">!hsh</span></p><p dir=3D=
"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span styl=
e=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);backgr=
ound-color:transparent;font-variant:normal;vertical-align:baseline;white-sp=
ace:pre-wrap">!hsh[1]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap">!hsh[@]</span></p></=
td><td style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0)=
;vertical-align:top;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"li=
ne-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10=
pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transp=
arent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">abc=
 - </span><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;col=
or:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:normal;vertical-al=
ign:baseline;white-space:pre-wrap">str0</span><span style=3D"font-size:10pt=
;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transpar=
ent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap"> - st=
r1</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-=
bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;c=
olor:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-a=
lign:baseline;white-space:pre-wrap">b - t - t</span></p><p dir=3D"ltr" styl=
e=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-=
size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color=
:transparent;font-variant:normal;vertical-align:baseline;white-space:pre-wr=
ap">bc - tr - tr</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-t=
op:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consola=
s,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:nor=
mal;vertical-align:baseline;white-space:pre-wrap">abc - str0 - str1</span><=
/p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom=
:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:r=
gb(0,0,0);background-color:transparent;font-variant:normal;vertical-align:b=
aseline;white-space:pre-wrap">aa - </span><span style=3D"font-size:10pt;fon=
t-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0)=
;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">arr0</sp=
an><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(=
0,0,0);background-color:transparent;font-variant:normal;vertical-align:base=
line;white-space:pre-wrap"> - arr1</span></p><p dir=3D"ltr" style=3D"line-h=
eight:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;f=
ont-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(255,15=
3,0);font-variant:normal;vertical-align:baseline;white-space:pre-wrap">1</s=
pan><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb=
(0,0,0);background-color:transparent;font-variant:normal;vertical-align:bas=
eline;white-space:pre-wrap"> - r - r</span></p><p dir=3D"ltr" style=3D"line=
-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt=
;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transpar=
ent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">&lt;e=
rror&gt; - rr - rr</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin=
-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Conso=
las,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:n=
ormal;vertical-align:baseline;white-space:pre-wrap">aa bb cc - arr0 - arr1<=
/span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin=
-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;=
color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-=
align:baseline;white-space:pre-wrap">aa - </span><span style=3D"font-size:1=
0pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0=
,255,0);font-variant:normal;vertical-align:baseline;white-space:pre-wrap">h=
sh0</span><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;col=
or:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-ali=
gn:baseline;white-space:pre-wrap"> - hsh1</span></p><p dir=3D"ltr" style=3D=
"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size=
:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb=
(255,153,0);font-variant:normal;vertical-align:baseline;white-space:pre-wra=
p">1</span><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;co=
lor:rgb(0,0,0);background-color:transparent;font-variant:normal;vertical-al=
ign:baseline;white-space:pre-wrap"> - s - s</span></p><p dir=3D"ltr" style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-s=
ize:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:=
rgb(0,255,0);font-variant:normal;vertical-align:baseline;white-space:pre-wr=
ap">0 1 2</span><span style=3D"font-size:10pt;font-family:Consolas,sans-ser=
if;color:rgb(0,0,0);background-color:transparent;font-variant:normal;vertic=
al-align:baseline;white-space:pre-wrap"> - hsh0 - hsh1</span></p></td><td s=
tyle=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0);vertica=
l-align:top;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"line-heigh=
t:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-=
family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;fo=
nt-variant:normal;vertical-align:baseline;white-space:pre-wrap">str0 - str0=
 - str0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;ma=
rgin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-se=
rif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;verti=
cal-align:baseline;white-space:pre-wrap">str0[1] - str1[1] - str2[1]</span>=
</p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0p=
t"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(=
0,0,0);background-color:transparent;font-variant:normal;vertical-align:base=
line;white-space:pre-wrap">str0[1,2] - str1[1,2] - str2[1,2]</span></p><p d=
ir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span=
 style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);b=
ackground-color:transparent;font-variant:normal;vertical-align:baseline;whi=
te-space:pre-wrap">0 - 0 - 0</span></p><br><p dir=3D"ltr" style=3D"line-hei=
ght:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;fon=
t-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;=
font-variant:normal;vertical-align:baseline;white-space:pre-wrap">arr0 - ar=
r0 - arr0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;=
margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-=
serif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;ver=
tical-align:baseline;white-space:pre-wrap">arr0[1] - arr0[1] - arr0[1]</spa=
n></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:=
0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rg=
b(0,0,0);background-color:transparent;font-variant:normal;vertical-align:ba=
seline;white-space:pre-wrap">arr0[2] - arr0[2] - arr0[2]</span></p><p dir=
=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span s=
tyle=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);bac=
kground-color:transparent;font-variant:normal;vertical-align:baseline;white=
-space:pre-wrap">0 1 2 - 0 1 2 - 0 1 2</span></p><br><p dir=3D"ltr" style=
=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-s=
ize:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:=
transparent;font-variant:normal;vertical-align:baseline;white-space:pre-wra=
p">hsh0 - hsh0 - hsh0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;mar=
gin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Co=
nsolas,sans-serif;color:rgb(0,0,0);background-color:transparent;font-varian=
t:normal;vertical-align:baseline;white-space:pre-wrap">hsh0[1] - hsh0[1] - =
hsh0[1]</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;ma=
rgin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-se=
rif;color:rgb(0,0,0);background-color:transparent;font-variant:normal;verti=
cal-align:baseline;white-space:pre-wrap">0 1 2 - 0 1 2 - 0 1 2</span></p></=
td><td style=3D"border-width:1pt;border-style:solid;border-color:rgb(0,0,0)=
;vertical-align:top;padding:5pt;overflow:hidden"><p dir=3D"ltr" style=3D"li=
ne-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10=
pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,=
255,0);font-variant:normal;vertical-align:baseline;white-space:pre-wrap">st=
r0 - str0 - str0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-t=
op:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consola=
s,sans-serif;color:rgb(0,0,0);background-color:transparent;font-variant:nor=
mal;vertical-align:baseline;white-space:pre-wrap">b - b - b</span></p><p di=
r=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span =
style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);ba=
ckground-color:transparent;font-variant:normal;vertical-align:baseline;whit=
e-space:pre-wrap">bc - bc - bc</span></p><p dir=3D"ltr" style=3D"line-heigh=
t:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-=
family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;fo=
nt-variant:normal;vertical-align:baseline;white-space:pre-wrap">abc - abc -=
 abc</span></p><br><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;m=
argin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-s=
erif;color:rgb(0,0,0);background-color:rgb(0,255,0);font-variant:normal;ver=
tical-align:baseline;white-space:pre-wrap">arr0 - arr0 - arr0</span></p><p =
dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><spa=
n style=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);=
background-color:rgb(255,153,0);font-variant:normal;vertical-align:baseline=
;white-space:pre-wrap">1 - 1 - 1</span></p><p dir=3D"ltr" style=3D"line-hei=
ght:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;fon=
t-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transparent;=
font-variant:normal;vertical-align:baseline;white-space:pre-wrap">&lt;error=
&gt; - &lt;error&gt; - &lt;error&gt;</span></p><p dir=3D"ltr" style=3D"line=
-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt=
;font-family:Consolas,sans-serif;color:rgb(0,0,0);background-color:transpar=
ent;font-variant:normal;vertical-align:baseline;white-space:pre-wrap">aa bb=
 cc - aa bb cc - aa bb cc</span></p><br><p dir=3D"ltr" style=3D"line-height=
:1.2;margin-top:0pt;margin-bottom:0pt"><span style=3D"font-size:10pt;font-f=
amily:Consolas,sans-serif;color:rgb(0,0,0);background-color:rgb(0,255,0);fo=
nt-variant:normal;vertical-align:baseline;white-space:pre-wrap">hsh0 - hsh0=
 - hsh0</span></p><p dir=3D"ltr" style=3D"line-height:1.2;margin-top:0pt;ma=
rgin-bottom:0pt"><span style=3D"font-size:10pt;font-family:Consolas,sans-se=
rif;color:rgb(0,0,0);background-color:rgb(255,153,0);font-variant:normal;ve=
rtical-align:baseline;white-space:pre-wrap">1 - 1 - 1</span></p><p dir=3D"l=
tr" style=3D"line-height:1.2;margin-top:0pt;margin-bottom:0pt"><span style=
=3D"font-size:10pt;font-family:Consolas,sans-serif;color:rgb(0,0,0);backgro=
und-color:rgb(0,255,0);font-variant:normal;vertical-align:baseline;white-sp=
ace:pre-wrap">0 1 2 - 0 1 2 - 0 1 2</span></p></td></tr></tbody></table></d=
iv></span></div><div><br></div><div>For the time being, I would revert=C2=
=A0${!name=E2=80=A6} to ${(k)name=E2=80=A6} (as it used to be before named =
references) and later discuss whether we want to extend (k) to plain variab=
les in ksh emulation.</div><div><br></div><div>Note that (k) can only be ex=
tended to plain variables in ksh emulation because in Zsh ${hash} expands t=
o all values of hash, so ${(k)hash} has to expand to all keys of hash, it c=
an&#39;t expand to &quot;hash&quot;.</div><div><br></div><div>Philippe</div=
><div><br></div></div></div>
</div>

--00000000000076bf6a0657ac4883--
--00000000000076bf6c0657ac4885
Content-Type: text/plain; charset="US-ASCII"; name="dont-map-ksh-bang-to-zsh-bang.txt"
Content-Disposition: attachment; 
	filename="dont-map-ksh-bang-to-zsh-bang.txt"
Content-Transfer-Encoding: base64
Content-ID: <f_ms4oab6i0>
X-Attachment-Id: f_ms4oab6i0

ZGlmZiAtLWdpdCBhL1NyYy9zdWJzdC5jIGIvU3JjL3N1YnN0LmMKaW5kZXggMWI3NWMwMzVhLi5l
ZmJkODExMDUgMTAwNjQ0Ci0tLSBhL1NyYy9zdWJzdC5jCisrKyBiL1NyYy9zdWJzdC5jCkBAIC0y
MTE4LDcgKzIxMTgsNyBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIg
KipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAogCSAqIGhhbmRsZSB0aGlzIHdpdGggdGhlIF4s
ID0sIH4gc3R1ZmYsIGJlbG93LgogCSAqLwogCWlmICgoYyA9ICpzKSA9PSAnIScgJiYgc1sxXSAh
PSBPdXRicmFjZSAmJiBFTVVMQVRJT04oRU1VTEFURV9LU0gpKSB7Ci0JICAgIGhrZXlzID0gU0NB
TlBNX1dBTlRLRVlTfFNDQU5QTV9OT05BTUVSRUY7CisJICAgIGhrZXlzID0gU0NBTlBNX1dBTlRL
RVlTOwogCSAgICBzKys7CiAJICAgIC8qIFRoZXJlJ3MgYSBzbGV3IG9mIG90aGVyIHNwZWNpYWwg
YmFzaCBtZWFuaW5ncyBvZiBwYXJhbWV0ZXIKIAkgICAgICogcmVmZXJlbmNlcyB0aGF0IHN0YXJ0
IHdpdGggIiEiOgpkaWZmIC0tZ2l0IGEvVGVzdC9LMDFuYW1lcmVmLnp0c3QgYi9UZXN0L0swMW5h
bWVyZWYuenRzdAppbmRleCAwZTFjYzllNGUuLmJmYzhlZTUwOCAxMDA2NDQKLS0tIGEvVGVzdC9L
MDFuYW1lcmVmLnp0c3QKKysrIGIvVGVzdC9LMDFuYW1lcmVmLnp0c3QKQEAgLTIzNjMsNCArMjM2
Myw1OSBAQCBGOmNvbnZlcnRpbmcgZnJvbSBhc3NvY2lhdGlvbi9hcnJheSB0byBzdHJpbmcgc2hv
dWxkIHdvcmsgaGVyZSB0b28KICB0eXBlc2V0IC1IbiByZWZfSAogMDp1bnN1c3VhbCBidXQgbGVn
YWwgb3B0aW9uIGNvbWJpbmF0aW9ucwogCisgdHlwZXNldCBzdHIwPWFiYworIHR5cGVzZXQgLWEg
YXJyMD0oYWEgYmIgY2MpCisgdHlwZXNldCAtQSBoc2gwPShbMF09YWEgWzFdPWJiIFsyXT1jYykK
KyB0eXBlc2V0IC1uIHN0cjE9c3RyMCBhcnIxPWFycjAgaHNoMT1oc2gwCisgdHlwZXNldCAtbiBz
dHIyPXN0cjEgYXJyMj1hcnIxIGhzaDI9aHNoMQorIGVtdWxhdGUga3NoIC1jICcKKyAgIGVjaG8g
IiR7c3RyMH0gLSAke3N0cjF9IC0gJHtzdHIyfSIKKyAgIGVjaG8gIiR7c3RyMFsxXX0gLSAke3N0
cjFbMV19IC0gJHtzdHIyWzFdfSIKKyAgIGVjaG8gIiR7c3RyMFsxLDJdfSAtICR7c3RyMVsxLDJd
fSAtICR7c3RyMlsxLDJdfSIKKyAgIGVjaG8gIiR7c3RyMFtAXX0gLSAke3N0cjFbQF19IC0gJHtz
dHIyW0BdfSIKKyAgIGVjaG8gIiR7YXJyMH0gLSAke2FycjF9IC0gJHthcnIyfSIKKyAgIGVjaG8g
IiR7YXJyMFsxXX0gLSAke2FycjFbMV19IC0gJHthcnIyWzFdfSIKKyAgIGVjaG8gIiR7YXJyMFsx
LDJdfSAtICR7YXJyMVsxLDJdfSAtICR7YXJyMlsxLDJdfSIKKyAgIGVjaG8gIiR7YXJyMFtAXX0g
LSAke2FycjFbQF19IC0gJHthcnIyW0BdfSIKKyAgIGVjaG8gIiR7aHNoMH0gLSAke2hzaDF9IC0g
JHtoc2gyfSIKKyAgIGVjaG8gIiR7aHNoMFsxXX0gLSAke2hzaDFbMV19IC0gJHtoc2gyWzFdfSIK
KyAgIGVjaG8gIiR7aHNoMFtAXX0gLSAke2hzaDFbQF19IC0gJHtoc2gyW0BdfSIKKyAgIGVjaG8K
KyAgIGVjaG8gIiR7IXN0cjB9IC0gJHshc3RyMX0gLSAkeyFzdHIyfSIKKyAgIGVjaG8gIiR7IXN0
cjBbMV19IC0gJHshc3RyMVsxXX0gLSAkeyFzdHIyWzFdfSIKKyAgIGVjaG8gIiR7IXN0cjBbMSwy
XX0gLSAkeyFzdHIxWzEsMl19IC0gJHshc3RyMlsxLDJdfSIKKyAgIGVjaG8gIiR7IXN0cjBbQF19
IC0gJHshc3RyMVtAXX0gLSAkeyFzdHIyW0BdfSIKKyAgIGVjaG8gIiR7IWFycjB9IC0gJHshYXJy
MX0gLSAkeyFhcnIyfSIKKyAgIGVjaG8gIiR7IWFycjBbMV19IC0gJHshYXJyMVsxXX0gLSAkeyFh
cnIyWzFdfSIKKyAgIGVjaG8gIiQoZXhlYyAyPiYxOyBlY2hvICR7IWFycjBbMSwyXX0pIC0gJChl
eGVjIDI+JjE7IGVjaG8gJHshYXJyMVsxLDJdfSkgLSAkKGV4ZWMgMj4mMTsgZWNobyAkeyFhcnIy
WzEsMl19KSIKKyAgIGVjaG8gIiR7IWFycjBbQF19IC0gJHshYXJyMVtAXX0gLSAkeyFhcnIyW0Bd
fSIKKyAgIGVjaG8gIiR7IWhzaDB9IC0gJHshaHNoMX0gLSAkeyFoc2gyfSIKKyAgIGVjaG8gIiR7
IWhzaDBbMV19IC0gJHshaHNoMVsxXX0gLSAkeyFoc2gyWzFdfSIKKyAgIGVjaG8gIiR7IWhzaDBb
QF19IC0gJHshaHNoMVtAXX0gLSAkeyFoc2gyW0BdfSIKKyAnCiswOmVtdWxhdGlvbiBvZiBrc2gn
cyBiYW5nIGFsd2F5cyBkZXJlZmVyZW5jZXMgdGhlIGV4cGFuZGVkIHBhcmFtZXRlcgorPmFiYyAt
IGFiYyAtIGFiYworPmIgLSBiIC0gYgorPmJjIC0gYmMgLSBiYworPmFiYyAtIGFiYyAtIGFiYwor
PmFhIC0gYWEgLSBhYQorPmJiIC0gYmIgLSBiYgorPmJiIGNjIC0gYmIgY2MgLSBiYiBjYworPmFh
IGJiIGNjIC0gYWEgYmIgY2MgLSBhYSBiYiBjYworPmFhIC0gYWEgLSBhYQorPmJiIC0gYmIgLSBi
YgorPmFhIGJiIGNjIC0gYWEgYmIgY2MgLSBhYSBiYiBjYworPgorPmFiYyAtIGFiYyAtIGFiYwor
PmIgLSBiIC0gYgorPmJjIC0gYmMgLSBiYworPmFiYyAtIGFiYyAtIGFiYworPmFhIC0gYWEgLSBh
YQorPjEgLSAxIC0gMQorPihldmFsKTo2OiBpbnZhbGlkIHN1YnNjcmlwdCAtIChldmFsKTo2OiBp
bnZhbGlkIHN1YnNjcmlwdCAtIChldmFsKTo2OiBpbnZhbGlkIHN1YnNjcmlwdAorPmFhIGJiIGNj
IC0gYWEgYmIgY2MgLSBhYSBiYiBjYworPmFhIC0gYWEgLSBhYQorPjEgLSAxIC0gMQorPjAgMSAy
IC0gMCAxIDIgLSAwIDEgMgorCiAlY2xlYW4KZGlmZiAtLWdpdCBhL1Rlc3QvSzAycGFyYW1ldGVy
Lnp0c3QgYi9UZXN0L0swMnBhcmFtZXRlci56dHN0CmluZGV4IGY5ZjQzNGIzNi4uMmFlNzExZTc2
IDEwMDY0NAotLS0gYS9UZXN0L0swMnBhcmFtZXRlci56dHN0CisrKyBiL1Rlc3QvSzAycGFyYW1l
dGVyLnp0c3QKQEAgLTkzLDEyICs5MywyNSBAQCBGOkJyYWNlcyBhcmUgcmVxdWlyZWQKICAgKCkg
ewogICAgIHR5cGVzZXQgLW4gLmswMi5yZWY9LmswMi5hcnJheQogICAgIGVtdWxhdGUgLUwga3No
Ci0gICAgcHJpbnQgLWwgJHshLmswMi5yZWZ9ICR7KCEpLmswMi5yZWZ9ICR7LmswMi5yZWZ9Cisg
ICAgcHJpbnQgLWwgJHshLmswMi5yZWZ9ICR7KGspLmswMi5yZWZ9ICR7KCEpLmswMi5yZWZ9ICR7
LmswMi5yZWZ9CisgICAgcHJpbnQgLWwgJHshLmswMi5yZWZbMl19ICR7KGspLmswMi5yZWZbMl19
ICR7KCEpLmswMi5yZWZbMl19ICR7LmswMi5yZWZbMl19CiAgIH0KIDA6bmFtZXJlZnMgd2l0aCBu
YW1lc3BhY2VzCitGOmtzaCBleHBhbmRzICIkeyEuazAyLnJlZn0iIHRvICIuazAyLnJlZiIgYnV0
ICgiJHshcmVmfSIgd2hlbiBpbiBuYW1lc3BhY2UgImswMiIpIHRvICJhcnJheSIKK0Y6dGhlIGZv
cm1lciBsb29rcyBib2d1czsgZXhwYW5kaW5nIHRvICIuazAyLmFycmF5IiBsb29rcyBtb3JlIGxv
Z2ljYWwvY29uc2lzdGVudAorPmNoYXJhY3RlcnMKKz5jaGFyYWN0ZXJzCiA+LmswMi5hcnJheQot
Pi5rMDIuYXJyYXkKK0Y6a3NoIGV4cGFuZHMgIiR7LmswMi5yZWZ9IiB0byAiLmswMi5hcnJheSIg
YnV0ICgiJHtyZWZ9IiB3aGVuIGluIG5hbWVzcGFjZSAiazAyIikgdG8gImNoYXJhY3RlcnMiCitG
OnRoZSBmb3JtZXIgbG9va3MgYm9ndXM7IGV4cGFuZGluZyB0byAiY2hhcmFjdGVycyIgbG9va3Mg
bW9yZSBsb2dpY2FsL2NvbnNpc3RlbnQKID5jaGFyYWN0ZXJzCitGOmtzaCBleHBhbmRzICIkeyEu
azAyLnJlZlsyXX0iIGFuZCAoIiR7IXJlZlsyXX0iIHdoZW4gaW4gbmFtZXNwYWNlICJrMDIiKSB0
byAiYXJyYXlbMl0iCis+MgorPjIKK0Y6IiR7KCEpLmswMi5yZWZbMl19IiAtPiAiJHskezotLmsw
Mi5hcnJheX1bMl19IiAtPiAiMCIKKz4wCitGOmtzaCBleHBhbmRzICIkey5rMDIucmVmWzJdfSIg
YW5kICgiJHtyZWZbMl19IiB3aGVuIGluIG5hbWVzcGFjZSAiazAyIikgdG8gImFuIgorPmFuCiAK
ICAgay49ZW1wdHkKICAgay4yPXRlc3QK
--00000000000076bf6c0657ac4885
Content-Type: text/plain; charset="US-ASCII"; 
	name="DO-NOT-COMMIT-extend-k-flag-to-plain-vars.txt"
Content-Disposition: attachment; 
	filename="DO-NOT-COMMIT-extend-k-flag-to-plain-vars.txt"
Content-Transfer-Encoding: base64
Content-ID: <f_ms4pq3301>
X-Attachment-Id: f_ms4pq3301

ZGlmZiAtLWdpdCBhL1NyYy9zdWJzdC5jIGIvU3JjL3N1YnN0LmMKaW5kZXggZWZiZDgxMTA1Li5m
ODVlZWI3NzggMTAwNjQ0Ci0tLSBhL1NyYy9zdWJzdC5jCisrKyBiL1NyYy9zdWJzdC5jCkBAIC0y
NzYzLDYgKzI3NjMsOCBAQCBwYXJhbXN1YnN0KExpbmtMaXN0IGwsIExpbmtOb2RlIG4sIGNoYXIg
KipzdHIsIGludCBxdCwgaW50IHBmX2ZsYWdzLAogICAgICAqLwogICAgIGlmICghc3ViZXhwIHx8
IGFzcGFyKSB7CiAJY2hhciAqb3YgPSB2YWw7CisJY2hhciAqaWUgPSBpdHlwZV9lbmQoc3ViZXhw
ID8gb3YgOiBzLCBpbmJyYWNlID8gSU5BTUVTUEMgOiBJSURFTlQsIDApOworCWludCBub2JyYWNr
cyA9ICppZSAhPSAnWycgJiYgKmllICE9IEluYnJhY2s7CiAJaW50IHNjYW5mbGFncyA9IGhrZXlz
IHwgaHZhbHM7CiAJaWYgKGFycmFzZykKIAkgICAgc2NhbmZsYWdzIHw9IFNDQU5QTV9BU1NJR05J
Tkc7CkBAIC0yODU5LDYgKzI4NjEsMTQgQEAgcGFyYW1zdWJzdChMaW5rTGlzdCBsLCBMaW5rTm9k
ZSBuLCBjaGFyICoqc3RyLCBpbnQgcXQsIGludCBwZl9mbGFncywKIAkgICAgdiA9IE5VTEw7CiAJ
ICAgIGlzYXJyID0gMDsKIAl9CisJaWYgKEVNVUxBVElPTihFTVVMQVRFX0tTSCkgJiYgKGhrZXlz
ICYgU0NBTlBNX1dBTlRLRVlTKSAmJiBub2JyYWNrcyAmJgorCSAgICB2ICYmIHYtPnBtICYmICgo
di0+cG0tPm5vZGUuZmxhZ3MgJiBQTV9ERUNMQVJFRCkgfHwKKwkJCSAgICEodi0+cG0tPm5vZGUu
ZmxhZ3MgJiBQTV9VTlNFVCkpICkgeworCSAgICB2YWwgPSBkdXBzdHJpbmcodi0+cG0tPm5vZGUu
bmFtKTsKKwkgICAgdnVuc2V0ID0gMDsKKwkgICAgdiA9IE5VTEw7CisJICAgIGlzYXJyID0gMDsK
Kwl9CiAgICAgfQogICAgIC8qCiAgICAgICogV2UgZ2V0IGluIGhlcmUgdHdvIHdheXM7IGVpdGhl
ciB3ZSBuZWVkIHRvIGNvbnZlcnQgdiBpbnRvCmRpZmYgLS1naXQgYS9UZXN0L0swMW5hbWVyZWYu
enRzdCBiL1Rlc3QvSzAxbmFtZXJlZi56dHN0CmluZGV4IGJmYzhlZTUwOC4uNjg0MGU2OTc0IDEw
MDY0NAotLS0gYS9UZXN0L0swMW5hbWVyZWYuenRzdAorKysgYi9UZXN0L0swMW5hbWVyZWYuenRz
dApAQCAtMjQwNiwxNSArMjQwNiwxNSBAQCBGOmNvbnZlcnRpbmcgZnJvbSBhc3NvY2lhdGlvbi9h
cnJheSB0byBzdHJpbmcgc2hvdWxkIHdvcmsgaGVyZSB0b28KID5iYiAtIGJiIC0gYmIKID5hYSBi
YiBjYyAtIGFhIGJiIGNjIC0gYWEgYmIgY2MKID4KLT5hYmMgLSBhYmMgLSBhYmMKKz5zdHIwIC0g
c3RyMCAtIHN0cjAKID5iIC0gYiAtIGIKID5iYyAtIGJjIC0gYmMKID5hYmMgLSBhYmMgLSBhYmMK
LT5hYSAtIGFhIC0gYWEKKz5hcnIwIC0gYXJyMCAtIGFycjAKID4xIC0gMSAtIDEKID4oZXZhbCk6
NjogaW52YWxpZCBzdWJzY3JpcHQgLSAoZXZhbCk6NjogaW52YWxpZCBzdWJzY3JpcHQgLSAoZXZh
bCk6NjogaW52YWxpZCBzdWJzY3JpcHQKID5hYSBiYiBjYyAtIGFhIGJiIGNjIC0gYWEgYmIgY2MK
LT5hYSAtIGFhIC0gYWEKKz5oc2gwIC0gaHNoMCAtIGhzaDAKID4xIC0gMSAtIDEKID4wIDEgMiAt
IDAgMSAyIC0gMCAxIDIKIApkaWZmIC0tZ2l0IGEvVGVzdC9LMDJwYXJhbWV0ZXIuenRzdCBiL1Rl
c3QvSzAycGFyYW1ldGVyLnp0c3QKaW5kZXggMmFlNzExZTc2Li45MWNlMjUyMGYgMTAwNjQ0Ci0t
LSBhL1Rlc3QvSzAycGFyYW1ldGVyLnp0c3QKKysrIGIvVGVzdC9LMDJwYXJhbWV0ZXIuenRzdApA
QCAtOTksOCArOTksOCBAQCBGOkJyYWNlcyBhcmUgcmVxdWlyZWQKIDA6bmFtZXJlZnMgd2l0aCBu
YW1lc3BhY2VzCiBGOmtzaCBleHBhbmRzICIkeyEuazAyLnJlZn0iIHRvICIuazAyLnJlZiIgYnV0
ICgiJHshcmVmfSIgd2hlbiBpbiBuYW1lc3BhY2UgImswMiIpIHRvICJhcnJheSIKIEY6dGhlIGZv
cm1lciBsb29rcyBib2d1czsgZXhwYW5kaW5nIHRvICIuazAyLmFycmF5IiBsb29rcyBtb3JlIGxv
Z2ljYWwvY29uc2lzdGVudAotPmNoYXJhY3RlcnMKLT5jaGFyYWN0ZXJzCis+LmswMi5hcnJheQor
Pi5rMDIuYXJyYXkKID4uazAyLmFycmF5CiBGOmtzaCBleHBhbmRzICIkey5rMDIucmVmfSIgdG8g
Ii5rMDIuYXJyYXkiIGJ1dCAoIiR7cmVmfSIgd2hlbiBpbiBuYW1lc3BhY2UgImswMiIpIHRvICJj
aGFyYWN0ZXJzIgogRjp0aGUgZm9ybWVyIGxvb2tzIGJvZ3VzOyBleHBhbmRpbmcgdG8gImNoYXJh
Y3RlcnMiIGxvb2tzIG1vcmUgbG9naWNhbC9jb25zaXN0ZW50Cg==
--00000000000076bf6c0657ac4885--