<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="" markdown-here-wrapper-content-modified="true">
<p style="margin: 0px 0px 1.2em !important;">On 28/05/2024 18:20,
Stephan Herrmann wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:89c6e982-5129-47bf-950d-27b5ebe51eb6@berlin.de">*
§8.1.3: "An instance of an anonymous class whose declaration
occurs in a pre-construction context (8.8.7.1) has no
immediately enclosing instance."
</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">Late to the party.
I’m kind of questioning that rule a little bit, to be honest.
More specifically, the text that says that a local/anon class in
a static context has no enclosing instance seems to cast too
wide of a net. If that’s the case, then we can’t really prove
(following the rules in the spec) how references to members in
enclosing instances are resolved. Consider the following
example:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span> </span>{
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Inner</span> </span>{
Inner() {
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Local</span> </span>{
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">test</span><span class="hljs-params">()</span> </span>{ m(); }
}
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Local().test();
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span>();
}
}
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">m</span><span class="hljs-params">()</span> </span>{ }
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">public</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">main</span><span class="hljs-params">(String[] args)</span> </span>{
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Outer().<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span> Inner();
}
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Here, <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Local</code>
occurs in an early context (used to be pre-constructor, or
static). So it has no enclosing instance. But then, how can it
refer to <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Outer::m</code>
?</p>
<p style="margin: 0px 0px 1.2em !important;">In 15.12.1 we say:</p>
<blockquote style="margin: 1.2em 0px;border-left: 4px solid rgb(221, 221, 221); padding: 0px 1em; color: rgb(119, 119, 119); quotes: none;">
<p style="margin: 0px 0px 1.2em !important;"> If there is an
enclosing class or interface declaration of which that method
is a member, let E be the innermost such class or interface
declaration. The type to search is the type of E.this
(§15.8.4). </p>
</blockquote>
<p style="margin: 0px 0px 1.2em !important;">Ok, so the above
program is valid if <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Outer.this</code>
makes sense. But, as per 15.8.4:</p>
<blockquote style="margin: 1.2em 0px;border-left: 4px solid rgb(221, 221, 221); padding: 0px 1em; color: rgb(119, 119, 119); quotes: none;">
<p style="margin: 0px 0px 1.2em !important;"> The value of a
qualified this expression TypeName.this is the n’th lexically
enclosing instance of this. </p>
</blockquote>
<p style="margin: 0px 0px 1.2em !important;">But there’s no
enclosing instance for <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Local</code>,
so what does <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Outer.this</code>
evaluates to?</p>
<p style="margin: 0px 0px 1.2em !important;">I think this has
always been a bit of an issue - we always treated anonymous
classes occurring in super calls as “static”, but that doesn’t
explain how such classes seem to have access to members of
enclosing classes. Under the hood, this works, because javac
captures the enclosing instance reference of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Inner</code>
and passes that to <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Local</code>.
In other words, it’s as if, from a translation perspective, the
enclosing instance of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Local</code>
was <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Outer</code>.
In fact, if we look at the generated class for <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Local</code>
we see this:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;"><span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Outer</span>$<span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Inner</span>$1<span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Local</span> </span>{
<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">final</span> Outer val$<span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">this</span>$<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>;
Outer$Inner$<span class="hljs-number" style="color: rgb(0, 128, 128);">1</span>Local(Outer);
<span class="hljs-function"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">test</span><span class="hljs-params">()</span></span>;
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">Note that there’s no
<code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">this$0</code>
field, but <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">val$this$0</code>
instead. In other words, it’s as if the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">this$0</code>
reference in the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Inner</code>
constructor has been captured by the local class. While this
works out in practice, it does seem a very roundabout way to say
that <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Local</code>
indeed has an enclosing instance (<code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Outer</code>)
- and javac’s backend trickery of course doesn’t even explain
why the above program is accepted in the first place. It seems
like this area needs a bit of an overhaul? Or am I missing
something?</p>
<p style="margin: 0px 0px 1.2em !important;">Cheers<br>
Maurizio</p>
<div title="MDH:PHA+PGJyPjwvcD48ZGl2IGNsYXNzPSJtb3otY2l0ZS1wcmVmaXgiPk9uIDI4LzA1LzIwMjQgMTg6
MjAsIFN0ZXBoYW4gSGVycm1hbm4gd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIHR5cGU9ImNp
dGUiIGNpdGU9Im1pZDo4OWM2ZTk4Mi01MTI5LTQ3YmYtOTUwZC0yN2I1ZWJlNTFlYjZAYmVybGlu
LmRlIj4qIMKnOC4xLjM6ICJBbiBpbnN0YW5jZSBvZiBhbiBhbm9ueW1vdXMgY2xhc3Mgd2hvc2Ug
ZGVjbGFyYXRpb24gb2NjdXJzIGluIGEgCnByZS1jb25zdHJ1Y3Rpb24gY29udGV4dCAoOC44Ljcu
MSkgaGFzIG5vIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBpbnN0YW5jZS4iCjwvYmxvY2txdW90ZT48
cCBzdHlsZT0ibWFyZ2luOiAwcHggMHB4IDEuMmVtICFpbXBvcnRhbnQ7Ij5MYXRlIHRvIHRoZSBw
YXJ0eS4gSeKAmW0ga2luZCBvZiBxdWVzdGlvbmluZyB0aGF0IHJ1bGUgYSBsaXR0bGUgYml0LCB0
byBiZSBob25lc3QuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgdGV4dCB0aGF0IHNheXMgdGhhdCBh
IGxvY2FsL2Fub24gCmNsYXNzIGluIGEgc3RhdGljIGNvbnRleHQgaGFzIDxlbT5ubzwvZW0+IGVu
Y2xvc2luZyBpbnN0YW5jZSBzZWVtcyB0byBjYXN0IHRvbyB3aWRlIG9mIGEgbmV0LiBJZiB0aGF0
4oCZcyB0aGUgY2FzZSwgdGhlbiB3ZSBjYW7igJl0IApyZWFsbHkgcHJvdmUgKGZvbGxvd2luZyB0
aGUgcnVsZXMgaW4gdGhlIHNwZWMpIGhvdyByZWZlcmVuY2VzIHRvIG1lbWJlcnMKIGluIGVuY2xv
c2luZyBpbnN0YW5jZXMgYXJlIHJlc29sdmVkLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1w
bGU6PC9wPjxwPmBgYGphdmE8YnI+Y2xhc3MgT3V0ZXIgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsg
Y2xhc3MgSW5uZXIgezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgSW5u
ZXIoKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
OyZuYnNwOyBjbGFzcyBMb2NhbCB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB2b2lkIHRlc3QoKSB7IG0o
KTsgfTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsgfTxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
cDsmbmJzcDsgbmV3IExvY2FsKCkudGVzdCgpOzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3VwZXIoKTs8YnI+Jm5ic3A7Jm5ic3A7Jm5i
c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+PGJyPiZu
YnNwOyZuYnNwOyZuYnNwOyB2b2lkIG0oKSB7IH08YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBw
dWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7PGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBuZXcgT3V0ZXIoKS5uZXcgSW5uZXIoKTs8YnI+Jm5ic3A7
Jm5ic3A7Jm5ic3A7IH08YnI+fTxicj48L3A+PHA+YGBgPGJyPjwvcD48cD5IZXJlLCBgTG9jYWxg
IG9jY3VycyBpbiBhbiBlYXJseSBjb250ZXh0ICh1c2VkIHRvIGJlIHByZS1jb25zdHJ1Y3Rvciwg
b3Igc3RhdGljKS4gU28gaXQgaGFzIG5vIGVuY2xvc2luZyBpbnN0YW5jZS4gQnV0IHRoZW4sIGhv
dyBjYW4gaXQgcmVmZXIgdG8gYE91dGVyOjptYCA/PC9wPjxwPkluIDE1LjEyLjEgd2Ugc2F5Ojwv
cD48cD4mZ3Q7Jm5ic3A7IElmIHRoZXJlIGlzIGFuIGVuY2xvc2luZyBjbGFzcyBvciBpbnRlcmZh
Y2UgZGVjbGFyYXRpb24gb2Ygd2hpY2ggdGhhdCBtZXRob2QgaXMgYSBtZW1iZXIsIGxldCBFIGJl
IHRoZSBpbm5lcm1vc3Qgc3VjaCBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIFRoZSB0
eXBlIHRvIHNlYXJjaCBpcyB0aGUgdHlwZSBvZiBFLnRoaXMgKMKnMTUuOC40KS4gPGJyPjwvcD48
cD5Paywgc28gdGhlIGFib3ZlIHByb2dyYW0gaXMgdmFsaWQgaWYgYE91dGVyLnRoaXNgIG1ha2Vz
IHNlbnNlLiBCdXQsIGFzIHBlciAxNS44LjQ6PC9wPjxwPiZndDsgJm5ic3A7VGhlIHZhbHVlIG9m
IGEgcXVhbGlmaWVkIHRoaXMgZXhwcmVzc2lvbiBUeXBlTmFtZS50aGlzIGlzIHRoZSBuJ3RoIGxl
eGljYWxseSBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdGhpcy4gPGJyPjwvcD48cD5CdXQgdGhlcmUn
cyBubyBlbmNsb3NpbmcgaW5zdGFuY2UgZm9yIGBMb2NhbGAsIHNvIHdoYXQgZG9lcyBgT3V0ZXIu
dGhpc2AgZXZhbHVhdGVzIHRvPzxicj48L3A+PHA+SSB0aGluayB0aGlzIGhhcyBhbHdheXMgYmVl
biBhIGJpdCBvZiBhbiBpc3N1ZSAtIHdlIGFsd2F5cyB0cmVhdGVkIGFub255bW91cyBjbGFzc2Vz
IG9jY3VycmluZyBpbiBzdXBlciBjYWxscyBhcyAic3RhdGljIiwgYnV0IHRoYXQgZG9lc24ndCBl
eHBsYWluIGhvdyBzdWNoIGNsYXNzZXMgc2VlbSB0byBoYXZlIGFjY2VzcyB0byBtZW1iZXJzIG9m
IGVuY2xvc2luZyBjbGFzc2VzLiBVbmRlciB0aGUgaG9vZCwgdGhpcyB3b3JrcywgYmVjYXVzZSBq
YXZhYyBjYXB0dXJlcyB0aGUgZW5jbG9zaW5nIGluc3RhbmNlIHJlZmVyZW5jZSBvZiBgSW5uZXJg
IGFuZCBwYXNzZXMgdGhhdCB0byBgTG9jYWxgLiBJbiBvdGhlciB3b3JkcywgaXQncyBhcyBpZiwg
ZnJvbSBhIHRyYW5zbGF0aW9uIHBlcnNwZWN0aXZlLCB0aGUgZW5jbG9zaW5nIGluc3RhbmNlIG9m
IGBMb2NhbGAgd2FzIGBPdXRlcmAuIEluIGZhY3QsIGlmIHdlIGxvb2sgYXQgdGhlIGdlbmVyYXRl
ZCBjbGFzcyBmb3IgYExvY2FsYCB3ZSBzZWUgdGhpczo8L3A+PHA+YGBgamF2YTxicj5jbGFzcyBP
dXRlciRJbm5lciQxTG9jYWwgezxicj4mbmJzcDsgZmluYWwgT3V0ZXIgdmFsJHRoaXMkMDs8YnI+
Jm5ic3A7IE91dGVyJElubmVyJDFMb2NhbCgpOzxicj4mbmJzcDsgdm9pZCB0ZXN0KCk7PGJyPn08
YnI+YGBgPC9wPjxwPk5vdGUgdGhhdCB0aGVyZSdzIG5vIGB0aGlzJDBgIGZpZWxkLCBidXQgYHZh
bCR0aGlzJDBgIGluc3RlYWQuIEluIG90aGVyIHdvcmRzLCBpdCdzIGFzIGlmIHRoZSBgdGhpcyQw
YCByZWZlcmVuY2UgaW4gdGhlIGBJbm5lcmAgY29uc3RydWN0b3IgaGFzIGJlZW4gY2FwdHVyZWQg
YnkgdGhlIGxvY2FsIGNsYXNzLiBXaGlsZSB0aGlzIHdvcmtzIG91dCBpbiBwcmFjdGljZSwgaXQg
ZG9lcyBzZWVtIGEgdmVyeSByb3VuZGFib3V0IHdheSB0byBzYXkgdGhhdCBgTG9jYWxgIGluZGVl
ZCBoYXMgYW4gZW5jbG9zaW5nIGluc3RhbmNlIChgT3V0ZXJgKSAtIGFuZCBqYXZhYydzIGJhY2tl
bmQgdHJpY2tlcnkgb2YgY291cnNlIGRvZXNuJ3QgZXZlbiBleHBsYWluIHdoeSB0aGUgYWJvdmUg
cHJvZ3JhbSBpcyBhY2NlcHRlZCBpbiB0aGUgZmlyc3QgcGxhY2UuIEl0IHNlZW1zIGxpa2UgdGhp
cyBhcmVhIG5lZWRzIGEgYml0IG9mIGFuIG92ZXJoYXVsPyBPciBhbSBJIG1pc3Npbmcgc29tZXRo
aW5nPzxicj48L3A+PHA+Q2hlZXJzPGJyPk1hdXJpemlvPGJyPjwvcD48cD48YnI+PC9wPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>