gcj/198: gcj crashes when trying to compile this code!

mdejong@cygnus.com mdejong@cygnus.com
Sun Apr 9 05:16:00 GMT 2000


>Number:         198
>Category:       gcj
>Synopsis:       gcj crashes when trying to compile this code!
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    apbianco
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Apr 09 05:16:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     Mo
>Release:        egcs from CVS Sun Apr  9
>Organization:
>Environment:
Red Hat 5.2 system.
>Description:
Here is some code that does not compile with javac.

% javac Regexp.java
Regexp.java:553: Method nextMatch() not found in class java.lang.Object.
        if (rs.nextMatch()) {
                        ^
Regexp.java:554: Method skipped() not found in class java.lang.Object.
            StringBuffer sb = new StringBuffer(rs.skipped());
                                                         ^
Regexp.java:556: Method rest() not found in class java.lang.Object.
            sb.append(rs.rest());
                             ^
Regexp.java:613: Method matched() not found in class java.lang.Object.
                        sb.append(rs.matched());
                                            ^
Regexp.java:620: Method submatch(int) not found in class java.lang.Object.
                            String match = rs.submatch(ch - '0');
                                                      ^
Regexp.java:645: Method nextMatch() not found in class java.lang.Object.
        if (rs.nextMatch() == false) {
                        ^
Regexp.java:651: Method skipped() not found in class java.lang.Object.
            sb.append(rs.skipped());
                                ^
Regexp.java:655: Method nextMatch() not found in class java.lang.Object.
        } while (rs.nextMatch());
                             ^
Regexp.java:656: Method rest() not found in class java.lang.Object.
        sb.append(rs.rest());
                         ^
9 errors


If I try to compile it with gcj, I get a SIGSEGV.


lookup_do (searched_class=0x8272ba8, searched_interface=0x82d2994, 
    method_name=0x82b4ddc, signature=0x8295d98, 
    signature_builder=0x8079fac <build_java_argument_signature>)
    at ../../../egcs/gcc/java/typeck.c:784
784              tree iclass = BINFO_TYPE (child);

(gdb) list
779
780           for (i = interface_len; i > 0; i--)
781            {
782              tree child = 
783                TREE_VEC_ELT (TYPE_BINFO_BASETYPES (searched_interface), i);
784              tree iclass = BINFO_TYPE (child);
785
786              /* If the superinterface hasn't been loaded yet, do so now.  */
787              if (CLASS_FROM_SOURCE_P (iclass))
788                safe_layout_class (iclass);

(gdb) print child
$1 = (union tree_node *) 0x0

So child is getting set to NULL and BINFO_TYPE() is crashing out because of it.
>How-To-Repeat:
Just compile with gcj.
>Fix:
Do we need to do an extra check for NULL before calling
BINFO_TYPE?
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="Regexp.java"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Regexp.java"

LyoKICogUmVnZXhwLmphdmEKICoKICogQ29weXJpZ2h0IChjKSAxOTk5IFN1biBNaWNyb3N5c3Rl
bXMsIEluYy4KICoKICogU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRp
b24gb24gdXNhZ2UgYW5kCiAqIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBh
IERJU0NMQUlNRVIgT0YgQUxMCiAqIFdBUlJBTlRJRVMuCiAqIAogKiBTQ0NTOiAlWiUgJU0lICVJ
JSAlRSUgJVUlCiAqLwoKcGFja2FnZSBzdW5sYWJzLmJyYXppbC51dGlsLnJlZ2V4cDsKCmltcG9y
dCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEuaW8uKjsKCi8qKgogKiBUaGUgPGNvZGU+UmVnZXhw
PC9jb2RlPiBjbGFzcyBjYW4gYmUgdXNlZCB0byBtYXRjaCBhIHBhdHRlcm4gYWdhaW5zdCBhCiAq
IHN0cmluZyBhbmQgb3B0aW9uYWxseSByZXBsYWNlIHRoZSBtYXRjaGVkIHBhcnRzIHdpdGggbmV3
IHN0cmluZ3MuCiAqIDxwPgogKiBSZWd1bGFyIGV4cHJlc3Npb25zIHdlcmUgaW1wbGVtZW50ZWQg
YnkgdHJhbnNsYXRpbmcgSGVucnkgU3BlbmNlcidzCiAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYWNr
YWdlIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LnNjcmlwdGljcy5jb20iPnRjbDguMDwvYT4uCiAq
IE11Y2ggb2YgdGhlIGRlc2NyaXB0aW9uIGJlbG93IGlzIGNvcGllZCB2ZXJiYXRpbSBmcm9tIHRo
ZSB0Y2w4LjAgcmVnc3ViCiAqIG1hbnVhbCBlbnRyeS4KICogPGhyPgogKiBSRUdVTEFSIEVYUFJF
U1NJT05TCiAqIDxwPgogKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyB6ZXJvIG9yIG1vcmUgPGNv
ZGU+YnJhbmNoZXM8L2NvZGU+LCBzZXBhcmF0ZWQgYnkKICogInwiLiAgSXQgbWF0Y2hlcyBhbnl0
aGluZyB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZSBicmFuY2hlcy4KICogPHA+CiAqIEEgYnJhbmNo
IGlzIHplcm8gb3IgbW9yZSA8Y29kZT5waWVjZXM8L2NvZGU+LCBjb25jYXRlbmF0ZWQuCiAqIEl0
IG1hdGNoZXMgYSBtYXRjaCBmb3IgdGhlIGZpcnN0IHBpZWNlLCBmb2xsb3dlZCBieSBhIG1hdGNo
IGZvciB0aGUKICogc2Vjb25kIHBpZWNlLCBldGMuCiAqIDxwPgogKiBBIHBpZWNlIGlzIGFuIDxj
b2RlPmF0b208L2NvZGU+LCBwb3NzaWJseSBmb2xsb3dlZCBieSAiKiIsICIrIiwgb3IKICogIj8i
LiA8dWw+CiAqIDxsaT4gQW4gYXRvbSBmb2xsb3dlZCBieSAiKiIgbWF0Y2hlcyBhIHNlcXVlbmNl
IG9mIDAgb3IgbW9yZSBtYXRjaGVzIG9mCiAqIHRoZSBhdG9tLgogKiA8bGk+IEFuIGF0b20gZm9s
bG93ZWQgYnkgIisiIG1hdGNoZXMgYSBzZXF1ZW5jZSBvZiAxIG9yIG1vcmUgbWF0Y2hlcyBvZgog
KiB0aGUgYXRvbS4KICogPGxpPiBBbiBhdG9tIGZvbGxvd2VkIGJ5ICI/IiBtYXRjaGVzIGVpdGhl
ciAwIG9yIDEgbWF0Y2hlcyBvZiB0aGUgYXRvbS4KICogPC91bD4KICogPHA+CiAqIEFuIGF0b20g
aXMgPHVsPgogKiA8bGk+IGEgcmVndWxhciBleHByZXNzaW9uIGluIHBhcmVudGhlc2VzIChtYXRj
aGluZyBhIG1hdGNoIGZvciB0aGUKICogcmVndWxhciBleHByZXNzaW9uKQogKiA8bGk+IGEgPGNv
ZGU+cmFuZ2U8L2NvZGU+IChzZWUgYmVsb3cpCiAqIDxsaT4gIi4iIChtYXRjaGluZyBhbnkgc2lu
Z2xlIGNoYXJhY3RlcikKICogPGxpPiAiXiIgKG1hdGNoaW5nIHRoZSBudWxsIHN0cmluZyBhdCB0
aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcpCiAqIDxsaT4gIiQiIChtYXRjaGluZyB0
aGUgbnVsbCBzdHJpbmcgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nKQogKiA8bGk+IGEg
IlwiIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIGNoYXJhY3RlciAobWF0Y2hpbmcgdGhhdCBjaGFyYWN0
ZXIpCiAqIDxsaT4gYSBzaW5nbGUgY2hhcmFjdGVyIHdpdGggbm8gb3RoZXIgc2lnbmlmaWNhbmNl
IChtYXRjaGluZyB0aGF0CiAqIGNoYXJhY3RlcikuCiAqIDwvdWw+CiAqIDxwPgogKiBBIDxjb2Rl
PnJhbmdlPC9jb2RlPiBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgZW5jbG9zZWQgaW4gIltd
Ii4KICogVGhlIHJhbmdlIG5vcm1hbGx5IG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgZnJv
bSB0aGUgc2VxdWVuY2UuCiAqIElmIHRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCAiXiIsIHRoZSBy
YW5nZSBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyCiAqIDxiPm5vdDwvYj4gZnJvbSB0aGUg
cmVzdCBvZiB0aGUgc2VxdWVuY2UuCiAqIElmIHR3byBjaGFyYWN0ZXJzIGluIHRoZSBzZXF1ZW5j
ZSBhcmUgc2VwYXJhdGVkIGJ5ICItIiwgdGhpcyBpcyBzaG9ydGhhbmQKICogZm9yIHRoZSBmdWxs
IGxpc3Qgb2YgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZW0gKGUuZy4gIlswLTldIiBtYXRjaGVzIGFu
eQogKiBkZWNpbWFsIGRpZ2l0KS4gIFRvIGluY2x1ZGUgYSBsaXRlcmFsICJdIiBpbiB0aGUgc2Vx
dWVuY2UsIG1ha2UgaXQgdGhlCiAqIGZpcnN0IGNoYXJhY3RlciAoZm9sbG93aW5nIGEgcG9zc2li
bGUgIl4iKS4gIFRvIGluY2x1ZGUgYSBsaXRlcmFsICItIiwKICogbWFrZSBpdCB0aGUgZmlyc3Qg
b3IgbGFzdCBjaGFyYWN0ZXIuCiAqIDxwPgogKiBJbiBnZW5lcmFsIHRoZXJlIG1heSBiZSBtb3Jl
IHRoYW4gb25lIHdheSB0byBtYXRjaCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgogKiB0byBhbiBpbnB1
dCBzdHJpbmcuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGNvbW1hbmQKICogPHByZT4KICog
U3RyaW5nW10gbWF0Y2ggPSBuZXcgU3RyaW5nWzJdOwogKiBSZWdleHAubWF0Y2goIihhKiliKiIs
ICJhYWJhYWFiYiIsIG1hdGNoKTsKICogPC9wcmU+CiAqIENvbnNpZGVyaW5nIG9ubHkgdGhlIHJ1
bGVzIGdpdmVuIHNvIGZhciwgPGNvZGU+bWF0Y2hbMF08L2NvZGU+IGFuZAogKiA8Y29kZT5tYXRj
aFsxXTwvY29kZT4gY291bGQgZW5kIHVwIHdpdGggdGhlIHZhbHVlcyA8dWw+CiAqIDxsaT4gImFh
YmIiIGFuZCAiYWEiCiAqIDxsaT4gImFhYWIiIGFuZCAiYWFhIgogKiA8bGk+ICJhYiIgYW5kICJh
IgogKiA8L3VsPgogKiBvciBhbnkgb2Ygc2V2ZXJhbCBvdGhlciBjb21iaW5hdGlvbnMuICBUbyBy
ZXNvbHZlIHRoaXMgcG90ZW50aWFsIGFtYmlndWl0eSwKICogUmVnZXhwIGNob29zZXMgYW1vbmcg
YWx0ZXJuYXRpdmVzIHVzaW5nIHRoZSBydWxlICJmaXJzdCB0aGVuIGxvbmdlc3QiLgogKiBJbiBv
dGhlciB3b3JkcywgaXQgY29uc2lkZXJzIHRoZSBwb3NzaWJsZSBtYXRjaGVzIGluIG9yZGVyIHdv
cmtpbmcKICogZnJvbSBsZWZ0IHRvIHJpZ2h0IGFjcm9zcyB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0
aGUgcGF0dGVybiwgYW5kIGl0CiAqIGF0dGVtcHRzIHRvIG1hdGNoIGxvbmdlciBwaWVjZXMgb2Yg
dGhlIGlucHV0IHN0cmluZyBiZWZvcmUgc2hvcnRlcgogKiBvbmVzLiAgTW9yZSBzcGVjaWZpY2Fs
bHksIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgaW4gZGVjcmVhc2luZwogKiBvcmRlciBvZiBw
cmlvcml0eTogPG9sPgogKiA8bGk+IElmIGEgcmVndWxhciBleHByZXNzaW9uIGNvdWxkIG1hdGNo
IHR3byBkaWZmZXJlbnQgcGFydHMgb2YgYW4gaW5wdXQKICogc3RyaW5nIHRoZW4gaXQgd2lsbCBt
YXRjaCB0aGUgb25lIHRoYXQgYmVnaW5zIGVhcmxpZXN0LgogKiA8bGk+IElmIGEgcmVndWxhciBl
eHByZXNzaW9uIGNvbnRhaW5zICJ8IiBvcGVyYXRvcnMgdGhlbiB0aGUKICogbGVmdG1vc3QgbWF0
Y2hpbmcgc3ViLWV4cHJlc3Npb24gaXMgY2hvc2VuLgogKiA8bGk+IEluICIqIiwgIisiLCBhbmQg
Ij8iIGNvbnN0cnVjdHMsIGxvbmdlciBtYXRjaGVzIGFyZSBjaG9zZW4gaW4KICogcHJlZmVyZW5j
ZSB0byBzaG9ydGVyIG9uZXMuCiAqIDxsaT4KICogSW4gc2VxdWVuY2VzIG9mIGV4cHJlc3Npb24g
Y29tcG9uZW50cyB0aGUgY29tcG9uZW50cyBhcmUgY29uc2lkZXJlZAogKiBmcm9tIGxlZnQgdG8g
cmlnaHQuCiAqIDwvb2w+CiAqIDxwPgogKiBJbiB0aGUgZXhhbXBsZSBmcm9tIGFib3ZlLCAiKGEq
KWIqIiB0aGVyZWZvcmUgbWF0Y2hlcyBleGFjdGx5ICJhYWIiOyB0aGUKICogIihhKikiIHBvcnRp
b24gb2YgdGhlIHBhdHRlcm4gaXMgbWF0Y2hlZCBmaXJzdCBhbmQgaXQgY29uc3VtZXMgdGhlIGxl
YWRpbmcKICogImFhIiwgdGhlbiB0aGUgImIqIiBwb3J0aW9uIG9mIHRoZSBwYXR0ZXJuIGNvbnN1
bWVzIHRoZSBuZXh0ICJiIi4gIE9yLAogKiBjb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6
CiAqIDxwcmU+CiAqIFN0cmluZyBtYXRjaCA9IG5ldyBTdHJpbmdbM107CiAqIFJlZ2V4cC5tYXRj
aCgiKGFifGEpKGIqKWMiLCAiYWJjIiwgbWF0Y2gpOwogKiA8L3ByZT4KICogQWZ0ZXIgdGhpcyBj
b21tYW5kLCA8Y29kZT5tYXRjaFswXTwvY29kZT4gd2lsbCBiZSAiYWJjIiwKICogPGNvZGU+bWF0
Y2hbMV08L2NvZGU+IHdpbGwgYmUgImFiIiwgYW5kIDxjb2RlPm1hdGNoWzJdPC9jb2RlPiB3aWxs
IGJlIGFuCiAqIGVtcHR5IHN0cmluZy4KICogUnVsZSA0IHNwZWNpZmllcyB0aGF0IHRoZSAiKGFi
fGEpIiBjb21wb25lbnQgZ2V0cyBmaXJzdCBzaG90IGF0IHRoZSBpbnB1dAogKiBzdHJpbmcgYW5k
IFJ1bGUgMiBzcGVjaWZpZXMgdGhhdCB0aGUgImFiIiBzdWItZXhwcmVzc2lvbgogKiBpcyBjaGVj
a2VkIGJlZm9yZSB0aGUgImEiIHN1Yi1leHByZXNzaW9uLgogKiBUaHVzIHRoZSAiYiIgaGFzIGFs
cmVhZHkgYmVlbiBjbGFpbWVkIGJlZm9yZSB0aGUgIihiKikiCiAqIGNvbXBvbmVudCBpcyBjaGVj
a2VkIGFuZCB0aGVyZWZvcmUgIihiKikiIG11c3QgbWF0Y2ggYW4gZW1wdHkgc3RyaW5nLgogKiA8
aHI+CiAqIDxhIG5hbWU9cmVnc3ViPjwvYT4KICogUkVHVUxBUiBFWFBSRVNTSU9OIFNVQlNUSVRV
VElPTgogKiA8cD4KICogUmVndWxhciBleHByZXNzaW9uIHN1YnN0aXR1dGlvbiBtYXRjaGVzIGEg
c3RyaW5nIGFnYWluc3QgYSByZWd1bGFyCiAqIGV4cHJlc3Npb24sIHRyYW5zZm9ybWluZyB0aGUg
c3RyaW5nIGJ5IHJlcGxhY2luZyB0aGUgbWF0Y2hlZCByZWdpb24ocykKICogd2l0aCBuZXcgc3Vi
c3RyaW5nKHMpLgogKiA8cD4KICogV2hhdCBnZXRzIHN1YnN0aXR1dGVkIGludG8gdGhlIHJlc3Vs
dCBpcyBjb250cm9sbGVkIGJ5IGEKICogPGNvZGU+c3Vic3BlYzwvY29kZT4uICBUaGUgc3Vic3Bl
YyBpcyBhIGZvcm1hdHRpbmcgc3RyaW5nIHRoYXQgc3BlY2lmaWVzCiAqIHdoYXQgcG9ydGlvbnMg
b2YgdGhlIG1hdGNoZWQgcmVnaW9uIHNob3VsZCBiZSBzdWJzdGl0dXRlZCBpbnRvIHRoZQogKiBy
ZXN1bHQuCiAqIDx1bD4KICogPGxpPiAiJiIgb3IgIlwwIiBpcyByZXBsYWNlZCB3aXRoIGEgY29w
eSBvZiB0aGUgZW50aXJlIG1hdGNoZWQgcmVnaW9uLgogKiA8bGk+ICJcPGNvZGU+bjwvY29kZT4i
LCB3aGVyZSA8Y29kZT5uPC9jb2RlPiBpcyBhIGRpZ2l0IGZyb20gMSB0byA5LAogKiBpcyByZXBs
YWNlZCB3aXRoIGEgY29weSBvZiB0aGUgPGNvZGU+bjwvY29kZT48aT50aDwvaT4gc3ViZXhwcmVz
c2lvbi4KICogPGxpPiAiXCYiIG9yICJcXCIgYXJlIHJlcGxhY2VkIHdpdGgganVzdCAiJiIgb3Ig
IlwiIHRvIGVzY2FwZSB0aGVpcgogKiBzcGVjaWFsIG1lYW5pbmcuCiAqIDxsaT4gYW55IG90aGVy
IGNoYXJhY3RlciBpcyBwYXNzZWQgdGhyb3VnaC4KICogPC91bD4KICogSW4gdGhlIGFib3ZlLCBz
dHJpbmdzIGxpa2UgIlwyIiByZXByZXNlbnRzIHRoZSB0d28gY2hhcmFjdGVycwogKiA8Y29kZT5i
YWNrc2xhc2g8L2NvZGU+IGFuZCAiMiIsIG5vdCB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgMDAwMi4K
ICogPGhyPgogKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBSZWdleHAKICogPHBy
ZT4KICoKICogICAgcHVibGljIHN0YXRpYyB2b2lkCiAqICAgIG1haW4oU3RyaW5nW10gYXJncykK
ICoJdGhyb3dzIEV4Y2VwdGlvbgogKiAgICB7CiAqCVJlZ2V4cCByZTsKICoJU3RyaW5nW10gbWF0
Y2hlczsKICoJU3RyaW5nIHM7CiAqCiAqCSYjNDc7KgogKgkgKiBBIHJlZ3VsYXIgZXhwcmVzc2lv
biB0byBtYXRjaCB0aGUgZmlyc3QgbGluZSBvZiBhIEhUVFAgcmVxdWVzdC4KICoJICoKICoJICog
MS4gXiAgICAgICAgICAgICAgIC0gc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlu
ZQogKgkgKiAyLiAoW0EtWl0rKSAgICAgICAgLSBtYXRjaCBhbmQgcmVtZW1iZXIgc29tZSB1cHBl
ciBjYXNlIGNoYXJhY3RlcnMKICoJICogMy4gWyBcdF0rICAgICAgICAgIC0gc2tpcCBibGFuayBz
cGFjZQogKgkgKiA0LiAoW14gXHRdKikgICAgICAgLSBtYXRjaCBhbmQgcmVtZW1iZXIgdXAgdG8g
dGhlIG5leHQgYmxhbmsgc3BhY2UKICoJICogNS4gWyBcdF0rICAgICAgICAgIC0gc2tpcCBtb3Jl
IGJsYW5rIHNwYWNlCiAqCSAqIDYuIChIVFRQLzFcXC5bMDFdKSAtIG1hdGNoIGFuZCByZW1lbWJl
ciBIVFRQLzEuMCBvciBIVFRQLzEuMQogKgkgKiA3LiAkCQkgICAgICAtIGVuZCBvZiBzdHJpbmcg
LSBubyBjaGFycyBsZWZ0LgogKgkgKiYjNDc7CiAqCiAqCXMgPSAiR0VUIGh0dHA6Ly9hLmIuY29t
OjEyMzQvaW5kZXguaHRtbCBIVFRQLzEuMSI7CiAqCiAqCXJlID0gbmV3IFJlZ2V4cCgiXihbQS1a
XSspWyBcdF0rKFteIFx0XSspWyBcdF0rKEhUVFAvMVxcLlswMV0pJCIpOwogKgltYXRjaGVzID0g
bmV3IFN0cmluZ1s0XTsKICoJaWYgKHJlLm1hdGNoKHMsIG1hdGNoZXMpKSB7CiAqCSAgICBTeXN0
ZW0ub3V0LnByaW50bG4oIk1FVEhPRCAgIiArIG1hdGNoZXNbMV0pOwogKgkgICAgU3lzdGVtLm91
dC5wcmludGxuKCJVUkwgICAgICIgKyBtYXRjaGVzWzJdKTsKICoJICAgIFN5c3RlbS5vdXQucHJp
bnRsbigiVkVSU0lPTiAiICsgbWF0Y2hlc1szXSk7CiAqCX0KICoKICoJJiM0NzsqCiAqCSAqIEEg
cmVndWxhciBleHByZXNzaW9uIHRvIGV4dHJhY3Qgc29tZSBzaW1wbGUgY29tbWEtc2VwYXJhdGVk
IGRhdGEsCiAqCSAqIHJlb3JkZXIgc29tZSBvZiB0aGUgY29sdW1ucywgYW5kIGRpc2NhcmQgY29s
dW1uIDIuCiAqCSAqJiM0NzsKICoKICoJcyA9ICJhYmMsZGVmLGdoaSxrbG0sbm9wLHBxciI7CiAq
CiAqCXJlID0gbmV3IFJlZ2V4cCgiXihbXixdKyksKFteLF0rKSwoW14sXSspLCguKikiKTsKICoJ
U3lzdGVtLm91dC5wcmludGxuKHJlLnN1YihzLCAiXFwzLFxcMSxcXDQiKSk7CiAqICAgIH0KICog
PC9wcmU+CiAqCiAqIEBhdXRob3IJQ29saW4gU3RldmVucyAoY29saW4uc3RldmVuc0BzdW4uY29t
KQogKiBAdmVyc2lvbgkxLjcsIDk5LzEwLzE0CiAqIEBzZWUJCVJlZ3N1YgogKi8KCnB1YmxpYyBj
bGFzcyBSZWdleHAKewogICAgcHVibGljIHN0YXRpYyB2b2lkCiAgICBtYWluKFN0cmluZ1tdIGFy
Z3MpCgl0aHJvd3MgRXhjZXB0aW9uCiAgICB7CglpZiAoKGFyZ3MubGVuZ3RoID09IDIpICYmIChh
cmdzWzBdLmVxdWFscygiY29tcGlsZSIpKSkgewoJICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcg
UmVnZXhwKGFyZ3NbMV0pKTsKCX0gZWxzZSBpZiAoKGFyZ3MubGVuZ3RoID09IDMpICYmIChhcmdz
WzBdLmVxdWFscygibWF0Y2giKSkpIHsKCSAgICBSZWdleHAgciA9IG5ldyBSZWdleHAoYXJnc1sx
XSk7CgkgICAgU3RyaW5nW10gc3Vic3RycyA9IG5ldyBTdHJpbmdbci5zdWJzcGVjcygpXTsKCSAg
ICBib29sZWFuIG1hdGNoID0gci5tYXRjaChhcmdzWzJdLCBzdWJzdHJzKTsKCSAgICBTeXN0ZW0u
b3V0LnByaW50bG4oIm1hdGNoOlx0IiArIG1hdGNoKTsKCSAgICBmb3IgKGludCBpID0gMDsgaSA8
IHN1YnN0cnMubGVuZ3RoOyBpKyspIHsKCQlTeXN0ZW0ub3V0LnByaW50bG4oKGkgKyAxKSArICI6
XHQiICsgc3Vic3Ryc1tpXSk7CgkgICAgfQoJfSBlbHNlIGlmICgoYXJncy5sZW5ndGggPT0gNCkg
JiYgKGFyZ3NbMF0uZXF1YWxzKCJzdWIiKSkpIHsKCSAgICBSZWdleHAgciA9IG5ldyBSZWdleHAo
YXJnc1sxXSk7CgkgICAgU3lzdGVtLm91dC5wcmludGxuKHIuc3ViQWxsKGFyZ3NbMl0sIGFyZ3Nb
M10pKTsKCX0gZWxzZSB7CgkgICAgU3lzdGVtLm91dC5wcmludGxuKCJ1c2FnZToiKTsKCSAgICBT
eXN0ZW0ub3V0LnByaW50bG4oIlx0UmVnZXhwIG1hdGNoIDxwYXR0ZXJuPiA8c3RyaW5nPiIpOwoJ
ICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRSZWdleHAgc3ViIDxwYXR0ZXJuPiA8c3RyaW5nPiA8
c3Vic3BlYz4iKTsKCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0UmVnZXhwIGNvbXBpbGUgPHBh
dHRlcm4+Iik7Cgl9CiAgICB9CgogICAgLyoKICAgICAqIFN0cnVjdHVyZSBmb3IgcmVnZXhwICJw
cm9ncmFtIi4gIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBsaW5lYXIgZW5jb2RpbmcKICAgICAqIG9m
IGEgbm9uZGV0ZXJtaW5pc3RpYyBmaW5pdGUtc3RhdGUgbWFjaGluZSAoYWthIHN5bnRheCBjaGFy
dHMgb3IKICAgICAqICJyYWlscm9hZCBub3JtYWwgZm9ybSIgaW4gcGFyc2luZyB0ZWNobm9sb2d5
KS4gIEVhY2ggbm9kZSBpcyBhbiBvcGNvZGUKICAgICAqIHBsdXMgYSAibmV4dCIgcG9pbnRlciwg
cG9zc2libHkgcGx1cyBhbiBvcGVyYW5kLiAgIk5leHQiIHBvaW50ZXJzIG9mCiAgICAgKiBhbGwg
bm9kZXMgZXhjZXB0IEJSQU5DSCBpbXBsZW1lbnQgY29uY2F0ZW5hdGlvbjsgYSAibmV4dCIgcG9p
bnRlciB3aXRoCiAgICAgKiBhIEJSQU5DSCBvbiBib3RoIGVuZHMgb2YgaXQgaXMgY29ubmVjdGlu
ZyB0d28gYWx0ZXJuYXRpdmVzLiAgKEhlcmUgd2UKICAgICAqIGhhdmUgb25lIG9mIHRoZSBzdWJ0
bGUgc3ludGF4IGRlcGVuZGVuY2llczogIGFuIGluZGl2aWR1YWwgQlJBTkNIIChhcwogICAgICog
b3Bwb3NlZCB0byBhIGNvbGxlY3Rpb24gb2YgdGhlbSkgaXMgbmV2ZXIgY29uY2F0ZW5hdGVkIHdp
dGggYW55dGhpbmcKICAgICAqIGJlY2F1c2Ugb2Ygb3BlcmF0b3IgcHJlY2VkZW5jZS4pICBUaGUg
b3BlcmFuZCBvZiBzb21lIHR5cGVzIG9mIG5vZGUgaXMKICAgICAqIGEgbGl0ZXJhbCBzdHJpbmc7
IGZvciBvdGhlcnMsIGl0IGlzIGEgbm9kZSBsZWFkaW5nIGludG8gYSBzdWItRlNNLiAgSW4KICAg
ICAqIHBhcnRpY3VsYXIsIHRoZSBvcGVyYW5kIG9mIGEgQlJBTkNIIG5vZGUgaXMgdGhlIGZpcnN0
IG5vZGUgb2YgdGhlIGJyYW5jaC4KICAgICAqIChOQiB0aGlzIGlzICpub3QqIGEgdHJlZSBzdHJ1
Y3R1cmU6ICB0aGUgdGFpbCBvZiB0aGUgYnJhbmNoIGNvbm5lY3RzCiAgICAgKiB0byB0aGUgdGhp
bmcgZm9sbG93aW5nIHRoZSBzZXQgb2YgQlJBTkNIZXMuKSAgVGhlIG9wY29kZXMgYXJlOgogICAg
ICovCgogICAgc3RhdGljIGZpbmFsIGludCBOU1VCRVhQID0gMTAwOwoKCQkvKiBkZWZpbml0aW9u
CW51bWJlcglvcG5kPwltZWFuaW5nICovCgogICAgc3RhdGljIGZpbmFsIGNoYXIgRU5EIAk9IDA7
CS8qIG5vCUVuZCBvZiBwcm9ncmFtLiAqLwogICAgc3RhdGljIGZpbmFsIGNoYXIgQk9MCT0gMTsJ
Lyogbm8JTWF0Y2ggIiIgYXQgYmVnaW5uaW5nIG9mIGxpbmUuICovCiAgICBzdGF0aWMgZmluYWwg
Y2hhciBFT0wJPSAyOwkvKiBubwlNYXRjaCAiIiBhdCBlbmQgb2YgbGluZS4gKi8KICAgIHN0YXRp
YyBmaW5hbCBjaGFyIEFOWQk9IDM7CS8qIG5vCU1hdGNoIGFueSBvbmUgY2hhcmFjdGVyLiAqLwog
ICAgc3RhdGljIGZpbmFsIGNoYXIgQU5ZT0YJPSA0OwkvKiBzdHIJTWF0Y2ggYW55IGNoYXJhY3Rl
ciBpbiB0aGlzIHN0cmluZy4gKi8KICAgIHN0YXRpYyBmaW5hbCBjaGFyIEFOWUJVVAk9IDU7CS8q
IHN0cglNYXRjaCBhbnkgY2hhcmFjdGVyIG5vdCBpbiB0aGlzIHN0cmluZy4gKi8KICAgIHN0YXRp
YyBmaW5hbCBjaGFyIEJSQU5DSAk9IDY7CS8qIG5vZGUJTWF0Y2ggdGhpcyBhbHRlcm5hdGl2ZSwg
b3IgdGhlIG5leHQuLi4gKi8KICAgIHN0YXRpYyBmaW5hbCBjaGFyIEJBQ0sJPSA3OwkvKiBubwlN
YXRjaCAiIiwgIm5leHQiIHB0ciBwb2ludHMgYmFja3dhcmQuICovCiAgICBzdGF0aWMgZmluYWwg
Y2hhciBFWEFDVExZCT0gODsJLyogc3RyCU1hdGNoIHRoaXMgc3RyaW5nLiAqLwogICAgc3RhdGlj
IGZpbmFsIGNoYXIgTk9USElORwk9IDk7CS8qIG5vCU1hdGNoIGVtcHR5IHN0cmluZy4gKi8KICAg
IHN0YXRpYyBmaW5hbCBjaGFyIFNUQVIJPSAxMDsJLyogbm9kZQlNYXRjaCB0aGlzIChzaW1wbGUp
IHRoaW5nIDAgb3IgbW9yZSB0aW1lcy4gKi8KICAgIHN0YXRpYyBmaW5hbCBjaGFyIFBMVVMJPSAx
MTsJLyogbm9kZQlNYXRjaCB0aGlzIChzaW1wbGUpIHRoaW5nIDEgb3IgbW9yZSB0aW1lcy4gKi8K
ICAgIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU4JPSAyMDsJLyogbm8JTWFyayB0aGlzIHBvaW50IGlu
IGlucHV0IGFzIHN0YXJ0IG9mICNuLiAqLwoJCQkJCS8qCU9QRU4rMSBpcyBudW1iZXIgMSwgZXRj
LiAqLwogICAgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0UJPSAoY2hhcikgKE9QRU4rTlNVQkVYUCk7
CgkJCQkJLyogbm8JQW5hbG9nb3VzIHRvIE9QRU4uICovCiAgICBzdGF0aWMgZmluYWwgU3RyaW5n
W10gb3BuYW1lcyA9IHsKCSJFTkQiLAkgICAiQk9MIiwgICAgICJFT0wiLCAgICAgIkFOWSIsICAg
ICAiQU5ZT0YiLCAgIkFOWUJVVCIsCgkiQlJBTkNIIiwgICJCQUNLIiwgICAgIkVYQUNUTFkiLCAi
Tk9USElORyIsICJTVEFSIiwgICAiUExVUyIKICAgIH07CgogICAgLyoKICAgICAqIEEgbm9kZSBp
cyBvbmUgY2hhciBvZiBvcGNvZGUgZm9sbG93ZWQgYnkgb25lIGNoYXIgb2YgIm5leHQiIHBvaW50
ZXIuCiAgICAgKiBUaGUgdmFsdWUgaXMgYSBwb3NpdGl2ZSBvZmZzZXQgZnJvbSB0aGUgb3Bjb2Rl
IG9mIHRoZSBub2RlIGNvbnRhaW5pbmcKICAgICAqIGl0LiAgQW4gb3BlcmFuZCwgaWYgYW55LCBz
aW1wbHkgZm9sbG93cyB0aGUgbm9kZS4gIChOb3RlIHRoYXQgbXVjaCBvZgogICAgICogdGhlIGNv
ZGUgZ2VuZXJhdGlvbiBrbm93cyBhYm91dCB0aGlzIGltcGxpY2l0IHJlbGF0aW9uc2hpcC4pCiAg
ICAgKgogICAgICogT3Bjb2RlIG5vdGVzOgogICAgICoKICAgICAqIEJSQU5DSAlUaGUgc2V0IG9m
IGJyYW5jaGVzIGNvbnN0aXR1dGluZyBhIHNpbmdsZSBjaG9pY2UgYXJlIGhvb2tlZAogICAgICoJ
CXRvZ2V0aGVyIHdpdGggdGhlaXIgIm5leHQiIHBvaW50ZXJzLCBzaW5jZSBwcmVjZWRlbmNlIHBy
ZXZlbnRzCiAgICAgKgkJYW55dGhpbmcgYmVpbmcgY29uY2F0ZW5hdGVkIHRvIGFueSBpbmRpdmlk
dWFsIGJyYW5jaC4gIFRoZQogICAgICoJCSJuZXh0IiBwb2ludGVyIG9mIHRoZSBsYXN0IEJSQU5D
SCBpbiBhIGNob2ljZSBwb2ludHMgdG8gdGhlCiAgICAgKgkJdGhpbmcgZm9sbG93aW5nIHRoZSB3
aG9sZSBjaG9pY2UuICBUaGlzIGlzIGFsc28gd2hlcmUgdGhlCiAgICAgKgkJZmluYWwgIm5leHQi
IHBvaW50ZXIgb2YgZWFjaCBpbmRpdmlkdWFsIGJyYW5jaCBwb2ludHM7IGVhY2gKICAgICAqCQli
cmFuY2ggc3RhcnRzIHdpdGggdGhlIG9wZXJhbmQgbm9kZSBvZiBhIEJSQU5DSCBub2RlLgogICAg
ICoKICAgICAqIEFOWU9GLCBBTllCVVQsIEVYQUNUTFkKICAgICAqCQlUaGUgZm9ybWF0IG9mIGEg
c3RyaW5nIG9wZXJhbmQgaXMgb25lIGNoYXIgb2YgbGVuZ3RoCiAgICAgKgkJZm9sbG93ZWQgYnkg
dGhlIGNoYXJhY3RlcnMgbWFraW5nIHVwIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogQkFDSwlO
b3JtYWwgIm5leHQiIHBvaW50ZXJzIGFsbCBpbXBsaWNpdGx5IHBvaW50IGZvcndhcmQ7IEJBQ0sK
ICAgICAqCQlleGlzdHMgdG8gbWFrZSBsb29wIHN0cnVjdHVyZXMgcG9zc2libGUuCiAgICAgKgog
ICAgICogU1RBUiwgUExVUwogICAgICogCQknPycsIGFuZCBjb21wbGV4ICcqJyBhbmQgJysnIGFy
ZSBpbXBsZW1lbnRlZCBhcyBjaXJjdWxhcgogICAgICoJCUJSQU5DSCBzdHJ1Y3R1cmVzIHVzaW5n
IEJBQ0suICBTaW1wbGUgY2FzZXMgKG9uZSBjaGFyYWN0ZXIKICAgICAqCQlwZXIgbWF0Y2gpIGFy
ZSBpbXBsZW1lbnRlZCB3aXRoIFNUQVIgYW5kIFBMVVMgZm9yIHNwZWVkCiAgICAgKgkJYW5kIHRv
IG1pbmltaXplIHJlY3Vyc2l2ZSBwbHVuZ2VzLgogICAgICoKICAgICAqIE9QRU5uLCBDTE9TRW4K
ICAgICAqCQlhcmUgbnVtYmVyZWQgYXQgY29tcGlsZSB0aW1lLgogICAgICovCgoKICAgIC8qKgog
ICAgICogVGhlIGJ5dGVjb2RlcyBtYWtpbmcgdXAgdGhlIHJlZ2V4cCBwcm9ncmFtLgogICAgICov
CiAgICBjaGFyW10gcHJvZ3JhbTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHJlZ2V4cCBt
YXRjaGluZyBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZS4KICAgICAqLwogICAgYm9vbGVhbiBp
Z25vcmVDYXNlOwoKICAgIC8qKgogICAgICogVGhlIG51bWJlciBvZiBwYXJlbnRoZXNpemVkIHN1
YmV4cHJlc3Npb25zIGluIHRoZSByZWdleHAgcGF0dGVybiwKICAgICAqIHBsdXMgMSBmb3IgdGhl
IG1hdGNoIG9mIHRoZSB3aG9sZSBwYXR0ZXJuIGl0c2VsZi4KICAgICAqLwogICAgaW50IG5wYXI7
CgogICAgLyoqCiAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGF0dGVybiBtdXN0IG1h
dGNoIHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAgICAgKiBzdHJpbmcsIHNvIHdlIGRvbid0IGhhdmUg
dG8gd2FzdGUgdGltZSBtYXRjaGluZyBhZ2FpbnN0IGFsbCBwb3NzaWJsZQogICAgICogc3RhcnRp
bmcgbG9jYXRpb25zIGluIHRoZSBzdHJpbmcuCiAgICAgKi8KICAgIGJvb2xlYW4gYW5jaG9yZWQ7
CiAgICAKICAgIGludCBzdGFydENoYXI7CiAgICBTdHJpbmcgbXVzdDsKCiAgICAvKioKICAgICAq
IENvbXBpbGVzIGEgbmV3IFJlZ2V4cCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcmVndWxhciBleHBy
ZXNzaW9uCiAgICAgKiBwYXR0ZXJuLgogICAgICogPHA+CiAgICAgKiBJdCB0YWtlcyBhIGNlcnRh
aW4gYW1vdW50IG9mIHRpbWUgdG8gcGFyc2UgYW5kIHZhbGlkYXRlIGEgcmVndWxhcgogICAgICog
ZXhwcmVzc2lvbiBwYXR0ZXJuIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIG1hdGNo
ZXMKICAgICAqIG9yIHN1YnN0aXR1dGlvbnMuICBJZiB0aGUgY2FsbGVyIGNhY2hlcyB0aGUgbmV3
IFJlZ2V4cCBvYmplY3QsIHRoYXQKICAgICAqIHBhcnNpbmcgdGltZSB3aWxsIGJlIHNhdmVkIGJl
Y2F1c2UgdGhlIHNhbWUgUmVnZXhwIGNhbiBiZSB1c2VkIHdpdGgKICAgICAqIHJlc3BlY3QgdG8g
bWFueSBkaWZmZXJlbnQgc3RyaW5ncy4KICAgICAqCiAgICAgKiBAcGFyYW0JcGF0CiAgICAgKiAg
ICAgICAgICBUaGUgc3RyaW5nIGhvbGRpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJu
LgogICAgICoKICAgICAqIEB0aHJvd3MJSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBw
YXR0ZXJuIGlzIG1hbGZvcm1lZC4KICAgICAqCQlUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoZSBl
eGNlcHRpb24gd2lsbCBiZSBzZXQgdG8gYQogICAgICoJCXN0cmluZyBpbmRpY2F0aW5nIGhvdyB0
aGUgcGF0dGVybiB3YXMgbWFsZm9ybWVkLgogICAgICovCiAgICBwdWJsaWMKICAgIFJlZ2V4cChT
dHJpbmcgcGF0KQoJdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgewoJY29tcGls
ZShwYXQpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZXMgYSBuZXcgUmVnZXhwIG9iamVj
dCBmcm9tIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24KICAgICAqIHBhdHRlcm4uCiAgICAg
KgogICAgICogQHBhcmFtCXBhdAogICAgICogICAgICAgICAgVGhlIHN0cmluZyBob2xkaW5nIHRo
ZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KICAgICAqCiAgICAgKiBAcGFyYW0JaWdub3Jl
Q2FzZQogICAgICoJCUlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhpcyByZWd1bGFyIGV4cHJl
c3Npb24gd2lsbAogICAgICoJCWRvIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcuICBJZiA8Y29k
ZT5mYWxzZTwvY29kZT4sIHRoZW4KICAgICAqCQl0aGUgbWF0Y2hlcyBhcmUgY2FzZS1zZW5zaXRp
dmUuICBSZWd1bGFyIGV4cHJlc3Npb25zCiAgICAgKgkJZ2VuZXJhdGVkIGJ5IDxjb2RlPlJlZ2V4
cChTdHJpbmcpPC9jb2RlPiBhcmUgY2FzZS1zZW5zaXRpdmUuCiAgICAgKgogICAgICogQHRocm93
cwlJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhdHRlcm4gaXMgbWFsZm9ybWVkLgog
ICAgICoJCVRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHNldCB0
byBhCiAgICAgKgkJc3RyaW5nIGluZGljYXRpbmcgaG93IHRoZSBwYXR0ZXJuIHdhcyBtYWxmb3Jt
ZWQuCiAgICAgKi8KICAgIHB1YmxpYwogICAgUmVnZXhwKFN0cmluZyBwYXQsIGJvb2xlYW4gaWdu
b3JlQ2FzZSkKCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgIHsKICAgICAgICB0
aGlzLmlnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOwoJaWYgKGlnbm9yZUNhc2UpIHsKCSAgICBwYXQg
PSBwYXQudG9Mb3dlckNhc2UoKTsKCX0KCWNvbXBpbGUocGF0KTsKICAgIH0KCiAgICAvKioKICAg
ICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zIGlu
IHRoaXMgcmVndWxhcgogICAgICogZXhwcmVzc2lvbiwgcGx1cyBvbmUgbW9yZSBmb3IgdGhpcyBl
eHByZXNzaW9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuCVRoZSBudW1iZXIuCiAgICAg
Ki8KICAgIHB1YmxpYyBpbnQKICAgIHN1YnNwZWNzKCkKICAgIHsKCXJldHVybiBucGFyOwogICAg
fQoKICAgIC8qKgogICAgICogTWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFnYWluc3QgdGhpcyBy
ZWd1bGFyIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogQHBhcmFtCXN0cgogICAgICoJCVRoZSBz
dHJpbmcgdG8gbWF0Y2guCiAgICAgKgogICAgICogQHJldHVybglUaGUgc3Vic3RyaW5nIG9mIDxj
b2RlPnN0cjwvY29kZT4gdGhhdCBtYXRjaGVkIHRoZSBlbnRpcmUKICAgICAqCQlyZWd1bGFyIGV4
cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdHJpbmcgZGlkIG5vdAogICAg
ICoJCW1hdGNoIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgogICAgICovCiAgICBwdWJsaWMgU3Ry
aW5nCiAgICBtYXRjaChTdHJpbmcgc3RyKQogICAgewoJTWF0Y2ggbSA9IGV4ZWMoc3RyLCAwLCAw
KTsKCglpZiAobSA9PSBudWxsKSB7CgkgICAgcmV0dXJuIG51bGw7Cgl9CglyZXR1cm4gc3RyLnN1
YnN0cmluZyhtLmluZGljZXNbMF0sIG0uaW5kaWNlc1sxXSk7CiAgICB9CgogICAgLyoqCiAgICAg
KiBNYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcgYWdhaW5zdCB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lv
biwgYW5kIGNvbXB1dGVzCiAgICAgKiB0aGUgc2V0IG9mIHN1YnN0cmluZ3MgdGhhdCBtYXRjaGVk
IHRoZSBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zLgogICAgICogPHA+CiAgICAgKiA8Y29k
ZT5zdWJzdHJzWzBdPC9jb2RlPiBpcyBzZXQgdG8gdGhlIHJhbmdlIG9mIDxjb2RlPnN0cjwvY29k
ZT4KICAgICAqIHRoYXQgbWF0Y2hlZCB0aGUgZW50aXJlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAg
ICAqIDxwPgogICAgICogPGNvZGU+c3Vic3Ryc1sxXTwvY29kZT4gaXMgc2V0IHRvIHRoZSByYW5n
ZSBvZiA8Y29kZT5zdHI8L2NvZGU+CiAgICAgKiB0aGF0IG1hdGNoZWQgdGhlIGZpcnN0IChsZWZ0
bW9zdCkgcGFyZW50aGVzaXplZCBzdWJleHByZXNzaW9uLgogICAgICogPGNvZGU+c3Vic3Ryc1tu
XTwvY29kZT4gaXMgc2V0IHRvIHRoZSByYW5nZSB0aGF0IG1hdGNoZWQgdGhlCiAgICAgKiA8Y29k
ZT5uPC9jb2RlPjxpPnRoPC9pPiBzdWJleHByZXNzaW9uLCBhbmQgc28gb24uCiAgICAgKiA8cD4K
ICAgICAqIElmIHN1YmV4cHJlc3Npb24gPGNvZGU+bjwvY29kZT4gZGlkIG5vdCBtYXRjaCwgdGhl
bgogICAgICogPGNvZGU+c3Vic3Ryc1tuXTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPm51bGw8L2Nv
ZGU+LiAgTm90IHRvCiAgICAgKiBiZSBjb25mdXNlZCB3aXRoICIiLCB3aGljaCBpcyBhIHZhbGlk
IHZhbHVlIGZvciBhCiAgICAgKiBzdWJleHByZXNzaW9uIHRoYXQgbWF0Y2hlZCAwIGNoYXJhY3Rl
cnMuCiAgICAgKiA8cD4KICAgICAqIFRoZSBsZW5ndGggdGhhdCB0aGUgY2FsbGVyIHNob3VsZCB1
c2Ugd2hlbiBhbGxvY2F0aW5nIHRoZQogICAgICogPGNvZGU+c3Vic3RyPC9jb2RlPiBhcnJheSBp
cyB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgICAgKiA8Y29kZT5SZWdleHAuc3Vic3BlY3M8L2NvZGU+
LiAgVGhlIGFycmF5CiAgICAgKiBjYW4gYmUgc2hvcnRlciAoaW4gd2hpY2ggY2FzZSBub3QgYWxs
IHRoZSBpbmZvcm1hdGlvbiB3aWxsCiAgICAgKiBiZSByZXR1cm5lZCksIG9yIGxvbmdlciAoaW4g
d2hpY2ggY2FzZSB0aGUgcmVtYWluZGVyIG9mIHRoZQogICAgICogZWxlbWVudHMgYXJlIGluaXRp
YWxpemVkIHRvIDxjb2RlPm51bGw8L2NvZGU+KSwgb3IKICAgICAqIDxjb2RlPm51bGw8L2NvZGU+
ICh0byBpZ25vcmUgdGhlIHN1YmV4cHJlc3Npb25zKS4KICAgICAqCiAgICAgKiBAcGFyYW0Jc3Ry
CiAgICAgKgkJVGhlIHN0cmluZyB0byBtYXRjaC4KICAgICAqCiAgICAgKiBAcGFyYW0Jc3Vic3Ry
cwogICAgICogCQlBbiBhcnJheSBvZiBzdHJpbmdzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLCBh
bmQgZmlsbGVkIGluCiAgICAgKgkJd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydGlvbnMg
b2YgPGNvZGU+c3RyPC9jb2RlPiB0aGF0CiAgICAgKgkJbWF0Y2hlZCB0aGUgcmVndWxhciBleHBy
ZXNzaW9uLiAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICoKICAgICAqIEByZXR1cm4J
PGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+c3RyPC9jb2RlPiB0aGF0IG1hdGNoZWQgdGhpcwog
ICAgICoJCXJlZ3VsYXIgZXhwcmVzc2lvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4K
ICAgICAqCQlJZiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQsIHRoZW4gdGhlIGNvbnRl
bnRzIG9mCiAgICAgKgkJPGNvZGU+c3Vic3RyczwvY29kZT4gYXJlIHVuY2hhbmdlZC4KICAgICAq
CiAgICAgKiBAc2VlCSNzdWJzcGVjcwogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbgogICAgbWF0
Y2goU3RyaW5nIHN0ciwgU3RyaW5nW10gc3Vic3RycykKICAgIHsKCU1hdGNoIG0gPSBleGVjKHN0
ciwgMCwgMCk7CgoJaWYgKG0gPT0gbnVsbCkgewoJICAgIHJldHVybiBmYWxzZTsKCX0KCWlmIChz
dWJzdHJzICE9IG51bGwpIHsKCSAgICBpbnQgbWF4ID0gTWF0aC5taW4oc3Vic3Rycy5sZW5ndGgs
IG5wYXIpOwoJICAgIGludCBpOwoJICAgIGludCBqID0gMDsKCSAgICBmb3IgKGkgPSAwOyBpIDwg
bWF4OyBpKyspIHsKCQlpbnQgc3RhcnQgPSBtLmluZGljZXNbaisrXTsKCQlpbnQgZW5kID0gbS5p
bmRpY2VzW2orK107CgkJaWYgKHN0YXJ0IDwgMCkgewoJCSAgICBzdWJzdHJzW2ldID0gbnVsbDsK
CQl9IGVsc2UgewoJCSAgICBzdWJzdHJzW2ldID0gc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKTsK
CQl9CgkgICAgfQoJICAgIGZvciAoIDsgaSA8IHN1YnN0cnMubGVuZ3RoOyBpKyspIHsKCQlzdWJz
dHJzW2ldID0gbnVsbDsKCSAgICB9Cgl9CglyZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAg
ICAqIE1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZyBhZ2FpbnN0IHRoaXMgcmVndWxhciBleHByZXNz
aW9uLCBhbmQgY29tcHV0ZXMKICAgICAqIHRoZSBzZXQgb2Ygc3Vic3RyaW5ncyB0aGF0IG1hdGNo
ZWQgdGhlIHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbnMuCiAgICAgKiA8cD4KICAgICAqIEZv
ciB0aGUgaW5kaWNlcyBzcGVjaWZpZWQgYmVsb3csIHRoZSByYW5nZSBleHRlbmRzIGZyb20gdGhl
IGNoYXJhY3RlcgogICAgICogYXQgdGhlIHN0YXJ0aW5nIGluZGV4IHVwIHRvLCBidXQgbm90IGlu
Y2x1ZGluZywgdGhlIGNoYXJhY3RlciBhdCB0aGUKICAgICAqIGVuZGluZyBpbmRleC4KICAgICAq
IDxwPgogICAgICogPGNvZGU+aW5kaWNlc1swXTwvY29kZT4gYW5kIDxjb2RlPmluZGljZXNbMV08
L2NvZGU+IGFyZSBzZXQgdG8KICAgICAqIHN0YXJ0aW5nIGFuZCBlbmRpbmcgaW5kaWNlcyBvZiB0
aGUgcmFuZ2Ugb2YgPGNvZGU+c3RyPC9jb2RlPgogICAgICogdGhhdCBtYXRjaGVkIHRoZSBlbnRp
cmUgcmVndWxhciBleHByZXNzaW9uLgogICAgICogPHA+CiAgICAgKiA8Y29kZT5pbmRpY2VzWzJd
PC9jb2RlPiBhbmQgPGNvZGU+aW5kaWNlc1szXTwvY29kZT4gYXJlIHNldCB0byB0aGUKICAgICAq
IHN0YXJ0aW5nIGFuZCBlbmRpbmcgaW5kaWNlcyBvZiB0aGUgcmFuZ2Ugb2YgPGNvZGU+c3RyPC9j
b2RlPiB0aGF0CiAgICAgKiBtYXRjaGVkIHRoZSBmaXJzdCAobGVmdG1vc3QpIHBhcmVudGhlc2l6
ZWQgc3ViZXhwcmVzc2lvbi4KICAgICAqIDxjb2RlPmluZGljZXNbbiAqIDJdPC9jb2RlPiBhbmQg
PGNvZGU+aW5kaWNlc1tuICogMiArIDFdPC9jb2RlPgogICAgICogYXJlIHNldCB0byB0aGUgcmFu
Z2UgdGhhdCBtYXRjaGVkIHRoZSA8Y29kZT5uPC9jb2RlPjxpPnRoPC9pPgogICAgICogc3ViZXhw
cmVzc2lvbiwgYW5kIHNvIG9uLgogICAgICogPHA+CiAgICAgKiBJZiBzdWJleHByZXNzaW9uIDxj
b2RlPm48L2NvZGU+IGRpZCBub3QgbWF0Y2gsIHRoZW4KICAgICAqIDxjb2RlPmluZGljZXNbbiAq
IDJdPC9jb2RlPiBhbmQgPGNvZGU+aW5kaWNlc1tuICogMiArIDFdPC9jb2RlPgogICAgICogYXJl
IGJvdGggc2V0IHRvIDxjb2RlPi0xPC9jb2RlPi4KICAgICAqIDxwPgogICAgICogVGhlIGxlbmd0
aCB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIHVzZSB3aGVuIGFsbG9jYXRpbmcgdGhlCiAgICAgKiA8
Y29kZT5pbmRpY2VzPC9jb2RlPiBhcnJheSBpcyB0d2ljZSB0aGUgcmV0dXJuIHZhbHVlIG9mCiAg
ICAgKiA8Y29kZT5SZWdleHAuc3Vic3BlY3M8L2NvZGU+LiAgVGhlIGFycmF5CiAgICAgKiBjYW4g
YmUgc2hvcnRlciAoaW4gd2hpY2ggY2FzZSBub3QgYWxsIHRoZSBpbmZvcm1hdGlvbiB3aWxsCiAg
ICAgKiBiZSByZXR1cm5lZCksIG9yIGxvbmdlciAoaW4gd2hpY2ggY2FzZSB0aGUgcmVtYWluZGVy
IG9mIHRoZQogICAgICogZWxlbWVudHMgYXJlIGluaXRpYWxpemVkIHRvIDxjb2RlPi0xPC9jb2Rl
PiksIG9yCiAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiAodG8gaWdub3JlIHRoZSBzdWJleHByZXNz
aW9ucykuCiAgICAgKgogICAgICogQHBhcmFtCXN0cgogICAgICoJCVRoZSBzdHJpbmcgdG8gbWF0
Y2guCiAgICAgKgogICAgICogQHBhcmFtCWluZGljZXMKICAgICAqIAkJQW4gYXJyYXkgb2YgaW50
ZWdlcnMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBmaWxsZWQgaW4KICAgICAqCQl3aXRo
IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3J0aW9ucyBvZiA8Y29kZT5zdHI8L2NvZGU+IHRoYXQK
ICAgICAqCQltYXRjaGVkIGFsbCB0aGUgcGFydHMgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4K
ICAgICAqCQlNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgKgogICAgICogQHJldHVybgk8
Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RyaW5nIG1hdGNoZWQgdGhlIHJlZ3VsYXIgZXhwcmVz
c2lvbiwKICAgICAqCQk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiAgSWYgPGNvZGU+ZmFs
c2U8L2NvZGU+IGlzCiAgICAgKgkJcmV0dXJuZWQsIHRoZW4gdGhlIGNvbnRlbnRzIG9mIDxjb2Rl
PmluZGljZXM8L2NvZGU+IGFyZQogICAgICoJCXVuY2hhbmdlZC4KICAgICAqCiAgICAgKiBAc2Vl
CSNzdWJzcGVjcwogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbgogICAgbWF0Y2goU3RyaW5nIHN0
ciwgaW50W10gaW5kaWNlcykKICAgIHsKCU1hdGNoIG0gPSBleGVjKHN0ciwgMCwgMCk7CgoJaWYg
KG0gPT0gbnVsbCkgewoJICAgIHJldHVybiBmYWxzZTsKCX0KCWlmIChpbmRpY2VzICE9IG51bGwp
IHsKCSAgICBpbnQgbWF4ID0gTWF0aC5taW4oaW5kaWNlcy5sZW5ndGgsIG5wYXIgKiAyKTsKCSAg
ICBTeXN0ZW0uYXJyYXljb3B5KG0uaW5kaWNlcywgMCwgaW5kaWNlcywgMCwgbWF4KTsKCgkgICAg
Zm9yIChpbnQgaSA9IG1heDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHsKCQlpbmRpY2VzW2ld
ID0gLTE7CgkgICAgfQoJfQoJcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYXRj
aGVzIGEgc3RyaW5nIGFnYWluc3QgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIHJlcGxhY2VzIHRo
ZSBmaXJzdAogICAgICogbWF0Y2ggd2l0aCB0aGUgc3RyaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBz
dWJzdGl0dXRpb24gcGFyYW1ldGVyLgogICAgICoKICAgICAqIEBwYXJhbQlzdHIKICAgICAqCQlU
aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCiAgICAg
KgogICAgICogQHBhcmFtCXN1YnNwZWMKICAgICAqIAkJVGhlIHN1YnN0aXR1dGlvbiBwYXJhbWV0
ZXIsIGRlc2NyaWJlZCBpbiA8YSBocmVmPSNyZWdzdWI+CiAgICAgKgkJUkVHVUxBUiBFWFBSRVNT
SU9OIFNVQlNUSVRVVElPTjwvYT4uCiAgICAgKgogICAgICogQHJldHVybglUaGUgc3RyaW5nIGZv
cm1lZCBieSByZXBsYWNpbmcgdGhlIGZpcnN0IG1hdGNoIGluCiAgICAgKgkJPGNvZGU+c3RyPC9j
b2RlPiB3aXRoIHRoZSBzdHJpbmcgZ2VuZXJhdGVkIGZyb20KICAgICAqCQk8Y29kZT5zdWJzcGVj
PC9jb2RlPi4gIElmIG5vIG1hdGNoZXMgd2VyZSBmb3VuZCwgdGhlbgogICAgICoJCXRoZSByZXR1
cm4gdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcK
ICAgIHN1YihTdHJpbmcgc3RyLCBTdHJpbmcgc3Vic3BlYykKICAgIHsKCU9iamVjdCBycyA9IG51
bGw7CglpZiAocnMubmV4dE1hdGNoKCkpIHsKCSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3Ry
aW5nQnVmZmVyKHJzLnNraXBwZWQoKSk7CgkgICAgYXBwbHlTdWJzcGVjKHJzLCBzdWJzcGVjLCBz
Yik7CgkgICAgc2IuYXBwZW5kKHJzLnJlc3QoKSk7CgoJICAgIHJldHVybiBzYi50b1N0cmluZygp
OwoJfSBlbHNlIHsKCSAgICByZXR1cm4gbnVsbDsKCX0KICAgIH0KCiAgICAvKioKICAgICAqIE1h
dGNoZXMgYSBzdHJpbmcgYWdhaW5zdCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgcmVwbGFjZXMg
YWxsCiAgICAgKiBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgc3Vi
c3RpdHV0aW9uIHBhcmFtZXRlci4KICAgICAqIEFmdGVyIGVhY2ggc3Vic3R1dGl0aW9uIGlzIGRv
bmUsIHRoZSBwb3J0aW9ucyBvZiB0aGUgc3RyaW5nIGFscmVhZHkKICAgICAqIGV4YW1pbmVkLCBp
bmNsdWRpbmcgdGhlIG5ld2x5IHN1YnN0aXR1dGVkIHJlZ2lvbiwgYXJlIDxiPm5vdDwvYj4gY2hl
Y2tlZAogICAgICogYWdhaW4gZm9yIG5ldyBtYXRjaGVzIC0tIG9ubHkgdGhlIHJlc3Qgb2YgdGhl
IHN0cmluZyBpcyBleGFtaW5lZC4KICAgICAqCiAgICAgKiBAcGFyYW0Jc3RyCiAgICAgKgkJVGhl
IHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0IHRoaXMgcmVndWxhciBleHByZXNzaW9uLgogICAgICoK
ICAgICAqIEBwYXJhbQlzdWJzcGVjCiAgICAgKiAJCVRoZSBzdWJzdGl0dXRpb24gcGFyYW1ldGVy
LCBkZXNjcmliZWQgaW4gPGEgaHJlZj0jcmVnc3ViPgogICAgICoJCVJFR1VMQVIgRVhQUkVTU0lP
TiBTVUJTVElUVVRJT048L2E+LgogICAgICoKICAgICAqIEByZXR1cm4JVGhlIHN0cmluZyBmb3Jt
ZWQgYnkgcmVwbGFjaW5nIGFsbCB0aGUgbWF0Y2hlcyBpbgogICAgICoJCTxjb2RlPnN0cjwvY29k
ZT4gd2l0aCB0aGUgc3RyaW5ncyBnZW5lcmF0ZWQgZnJvbQogICAgICoJCTxjb2RlPnN1YnNwZWM8
L2NvZGU+LiAgSWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kLCB0aGVuCiAgICAgKgkJdGhlIHJldHVy
biB2YWx1ZSBpcyBhIGNvcHkgb2YgPGNvZGU+c3RyPC9jb2RlPi4KICAgICAqLwogICAgcHVibGlj
IFN0cmluZwogICAgc3ViQWxsKFN0cmluZyBzdHIsIFN0cmluZyBzdWJzcGVjKQogICAgewoJcmV0
dXJuIHN1YihzdHIsIG5ldyBTdWJzcGVjRmlsdGVyKHN1YnNwZWMsIHRydWUpKTsKICAgIH0KCiAg
ICAvKioKICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdpdmUgYWNjZXNzIHRvIHRoZSBzdGFuZGFy
ZCBzdWJzdGl0dXRpb24gYWxnb3JpdGhtCiAgICAgKiB1c2VkIGJ5IDxjb2RlPnN1YjwvY29kZT4g
YW5kIDxjb2RlPnN1YkFsbDwvY29kZT4uICBBcHBlbmRzIHRvIHRoZQogICAgICogc3RyaW5nIGJ1
ZmZlciB0aGUgc3RyaW5nIGdlbmVyYXRlZCBieSBhcHBseWluZyB0aGUgc3Vic3RpdHV0aW9uCiAg
ICAgKiBwYXJhbWV0ZXIgdG8gdGhlIG1hdGNoZWQgcmVnaW9uLgogICAgICoKICAgICAqIEBwYXJh
bQlycwogICAgICoJCUluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXRjaGVkIHJlZ2lvbi4KICAgICAq
CiAgICAgKiBAcGFyYW0Jc3Vic3BlYwogICAgICoJCVRoZSBzdWJzdGl0dXRpb24gcGFyYW1ldGVy
LgogICAgICoKICAgICAqIEBwYXJhbQlzYgogICAgICoJCVN0cmluZ0J1ZmZlciB0byB3aGljaCB0
aGUgZ2VuZXJhdGVkIHN0cmluZyBpcyBhcHBlbmRlZC4KICAgICAqLwogICAgcHVibGljIHN0YXRp
YyB2b2lkCiAgICBhcHBseVN1YnNwZWMoT2JqZWN0IHJzLCBTdHJpbmcgc3Vic3BlYywgU3RyaW5n
QnVmZmVyIHNiKQogICAgewoJdHJ5IHsKCSAgICBpbnQgbGVuID0gc3Vic3BlYy5sZW5ndGgoKTsK
CSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJY2hhciBjaCA9IHN1YnNwZWMu
Y2hhckF0KGkpOwoJCXN3aXRjaCAoY2gpIHsKCQkgICAgY2FzZSAnJic6IHsKCQkJc2IuYXBwZW5k
KHJzLm1hdGNoZWQoKSk7CgkJCWJyZWFrOwoJCSAgICB9CgkJICAgIGNhc2UgJ1xcJzogewoJCQlp
Kys7CgkJCWNoID0gc3Vic3BlYy5jaGFyQXQoaSk7CgkJCWlmICgoY2ggPj0gJzAnKSAmJiAoY2gg
PD0gJzknKSkgewoJCQkgICAgU3RyaW5nIG1hdGNoID0gcnMuc3VibWF0Y2goY2ggLSAnMCcpOwoJ
CQkgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKCQkJCXNiLmFwcGVuZChtYXRjaCk7CgkJCSAgICB9
CgkJCSAgICBicmVhazsKCQkJfQoJCQkvLyBmYWxsIHRocm91Z2guCgkJICAgIH0KCQkgICAgZGVm
YXVsdDogewoJCQlzYi5hcHBlbmQoY2gpOwoJCSAgICB9CgkJfQoJICAgIH0KCX0gY2F0Y2ggKElu
ZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewoJICAgIC8qCgkgICAgICogSWdub3JlIG1hbGZv
cm1lZCBzdWJzdGl0dXRpb24gcGF0dGVybi4KCSAgICAgKiBSZXR1cm4gc3RyaW5nIG1hdGNoZWQg
c28gZmFyLgoJICAgICAqLwoJfQogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcKICAgIHN1YihTdHJp
bmcgc3RyLCBGaWx0ZXIgcmYpCiAgICB7CglPYmplY3QgcnMgPSBudWxsOwoJaWYgKHJzLm5leHRN
YXRjaCgpID09IGZhbHNlKSB7CgkgICAgcmV0dXJuIHN0cjsKCX0KCglTdHJpbmdCdWZmZXIgc2Ig
PSBuZXcgU3RyaW5nQnVmZmVyKCk7CglkbyB7CgkgICAgc2IuYXBwZW5kKHJzLnNraXBwZWQoKSk7
CgkgICAgaWYgKHJmLmZpbHRlcihycywgc2IpID09IGZhbHNlKSB7CgkJYnJlYWs7CgkgICAgfQoJ
fSB3aGlsZSAocnMubmV4dE1hdGNoKCkpOwoJc2IuYXBwZW5kKHJzLnJlc3QoKSk7CglyZXR1cm4g
c2IudG9TdHJpbmcoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVz
ZWQgYnkgdGhlIDxjb2RlPlJlZ2V4cDwvY29kZT4gY2xhc3MgdG8gZ2VuZXJhdGUKICAgICAqIHRo
ZSByZXBsYWNlbWVudCBzdHJpbmcgZm9yIGVhY2ggcGF0dGVybiBtYXRjaCBmb3VuZCBpbiB0aGUg
c291cmNlCiAgICAgKiBzdHJpbmcuCiAgICAgKgogICAgICogQGF1dGhvcglDb2xpbiBTdGV2ZW5z
IChjb2xpbi5zdGV2ZW5zQHN1bi5jb20pCiAgICAgKiBAdmVyc2lvbgkxLjcsIDk5LzEwLzE0CiAg
ICAgKi8KICAgIHB1YmxpYyBpbnRlcmZhY2UgRmlsdGVyCiAgICB7CgkvKioKCSAqIEdpdmVuIHRo
ZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtYXRjaCwgZ2VuZXJhdGUgdGhlIHJlcGxhY2VtZW50Cgkg
KiBzdHJpbmcuICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBtYXRjaCBmb3Vu
ZCBpbgoJICogdGhlIHNvdXJjZSBzdHJpbmcsIHVubGVzcyB0aGlzIGZpbHRlciBkZWNpZGVzIG5v
dCB0byBoYW5kbGUgYW55CgkgKiBtb3JlIG1hdGNoZXMuCgkgKiA8cD4KCSAqIFRoZSBpbXBsZW1l
bnRhdGlvbiBjYW4gdXNlIHdoYXRldmVyIHJ1bGVzIGl0IGNob29zZXMKCSAqIHRvIGdlbmVyYXRl
IHRoZSByZXBsYWNlbWVudCBzdHJpbmcuICBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhbgoJICogZXhh
bXBsZSBvZiBhIGZpbHRlciB0aGF0IHJlcGxhY2VzIHRoZSBmaXJzdCA8Yj41PC9iPgoJICogb2Nj
dXJyZW5jZXMgb2YgIiVYWCIgaW4gYSBzdHJpbmcgd2l0aCB0aGUgQVNDSUkgY2hhcmFjdGVyCgkg
KiByZXByZXNlbnRlZCBieSB0aGUgaGV4IGRpZ2l0cyAiWFgiOgoJICogPHByZT4KCSAqIFN0cmlu
ZyBzdHIgPSAuLi47CgkgKgoJICogUmVnZXhwIHJlID0gbmV3IFJlZ2V4cCgiJVthLWZBLUYwLTld
W2EtZkEtRjAtOV0iKTsKCSAqCgkgKiBSZWdleHAuRmlsdGVyIHJmID0gbmV3IFJlZ2V4cC5GaWx0
ZXIoKSB7CgkgKiAgICAgaW50IGNvdW50ID0gNTsKCSAqICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0
ZXIoUmVnc3ViIHJzLCBTdHJpbmdCdWZmZXIgc2IpIHsKCSAqICAgICAgICAgU3RyaW5nIG1hdGNo
ID0gcnMubWF0Y2hlZCgpOwoJICogICAgICAgICBpbnQgaGkgPSBDaGFyYWN0ZXIuZGlnaXQobWF0
Y2guY2hhckF0KDEpLCAxNik7CgkgKiAgICAgICAgIGludCBsbyA9IENoYXJhY3Rlci5kaWdpdCht
YXRjaC5jaGFyQXQoMiksIDE2KTsKCSAqICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSAoKGhpICZs
dDsmbHQ7IDQpIHwgbG8pKTsKCSAqICAgICAgICAgcmV0dXJuICgtLWNvdW50ID4gMCk7CgkgKiAg
ICAgfQoJICogfQoJICoKCSAqIFN0cmluZyByZXN1bHQgPSByZS5zdWIoc3RyLCByZik7CgkgKiA8
L3ByZT4KCSAqCgkgKiBAcGFyYW0gICBycwoJICoJICAgIDxjb2RlPlJlZ3N1YjwvY29kZT4gY29u
dGFpbmluZyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQKCSAqCSAgICBtYXRjaC4KCSAqCgkgKiBA
cGFyYW0gICBzYgoJICoJICAgIFRoZSBzdHJpbmcgYnVmZmVyIHRoYXQgdGhpcyBmaWx0ZXIgc2hv
dWxkIGFwcGVuZCB0aGUKCSAqCSAgICBnZW5lcmF0ZWQgc3RyaW5nIHRvLiAgVGhpcyBzdHJpbmcg
YnVmZmVyIGFjdHVhbGx5CgkgKgkgICAgY29udGFpbnMgdGhlIHJlc3VsdHMgdGhlIGNhbGxpbmcg
PGNvZGU+UmVnZXhwPC9jb2RlPiBoYXMKCSAqCSAgICBnZW5lcmF0ZWQgdXAgdG8gdGhpcyBwb2lu
dC4KCSAqCgkgKiBAcmV0dXJuICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm8gZnVydGhlciBtYXRj
aGVzIHNob3VsZCBiZQoJICoJICAgIGNvbnNpZGVyZWQgaW4gdGhpcyBzdHJpbmcsIDxjb2RlPnRy
dWU8L2NvZGU+IHRvIGFsbG93CgkgKgkgICAgPGNvZGU+UmVnZXhwPC9jb2RlPiB0byBjb250aW51
ZSBsb29raW5nIGZvciBmdXJ0aGVyCgkgKgkgICAgbWF0Y2hlcy4KCSAqLwoJcHVibGljIGJvb2xl
YW4gZmlsdGVyKE9iamVjdCBycywgU3RyaW5nQnVmZmVyIHNiKTsKICAgIH0KCiAgICBwcml2YXRl
IHN0YXRpYyBjbGFzcyBTdWJzcGVjRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCiAgICB7CglTdHJp
bmcgc3Vic3BlYzsKCWJvb2xlYW4gYWxsOwoKCXB1YmxpYwoJU3Vic3BlY0ZpbHRlcihTdHJpbmcg
c3Vic3BlYywgYm9vbGVhbiBhbGwpCgl7CgkgICAgdGhpcy5zdWJzcGVjID0gc3Vic3BlYzsKCSAg
ICB0aGlzLmFsbCA9IGFsbDsKCX0KCglwdWJsaWMgYm9vbGVhbgoJZmlsdGVyKE9iamVjdCBycywg
U3RyaW5nQnVmZmVyIHNiKQoJewoJICAgIGFwcGx5U3Vic3BlYyhycywgc3Vic3BlYywgc2IpOwoJ
ICAgIHJldHVybiBhbGw7Cgl9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyaW5n
IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcGlsZWQgcmVndWxhcgogICAgICogZXhwcmVzc2lv
bi4gIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyBhCiAgICAgKiBz
eW1ib2xpYyBkdW1wIG9mIHRoZSBieXRlY29kZXMuCiAgICAgKgogICAgICogQHJldHVybglBIHN0
cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAqLwog
ICAgcHVibGljIFN0cmluZwogICAgdG9TdHJpbmcoKQogICAgewoJU3RyaW5nQnVmZmVyIHNiID0g
bmV3IFN0cmluZ0J1ZmZlcigpOwoKCXNiLmFwcGVuZCgiIyBzdWJzOiAgIiArIG5wYXIgKyAiXG4i
KTsKCXNiLmFwcGVuZCgiYW5jaG9yOiAgIiArIGFuY2hvcmVkICsgIlxuIik7CglzYi5hcHBlbmQo
InN0YXJ0OiAgICIgKyAoY2hhcikgc3RhcnRDaGFyICsgIlxuIik7CglzYi5hcHBlbmQoIm11c3Q6
ICAgICIgKyBtdXN0ICsgIlxuIik7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ncmFtLmxlbmd0
aDsgKSB7CgkgICAgc2IuYXBwZW5kKGkgKyAiOlx0Iik7CgkgICAgaW50IG9wID0gcHJvZ3JhbVtp
XTsKCSAgICBpZiAob3AgPj0gQ0xPU0UpIHsKCQlzYi5hcHBlbmQoIkNMT1NFIiArIChvcCAtIENM
T1NFKSk7CgkgICAgfSBlbHNlIGlmIChvcCA+PSBPUEVOKSB7CgkJc2IuYXBwZW5kKCJPUEVOIiAr
IChvcCAtIE9QRU4pKTsKCSAgICB9IGVsc2UgewoJCXNiLmFwcGVuZChvcG5hbWVzW29wXSk7Cgkg
ICAgfQoJICAgIGludCBsaW5lOwoJICAgIGludCBvZmZzZXQgPSAoaW50KSBwcm9ncmFtW2kgKyAx
XTsKCSAgICBpZiAob2Zmc2V0ID09IDApIHsKCQlzYi5hcHBlbmQoJ1x0Jyk7CgkgICAgfSBlbHNl
IGlmIChvcCA9PSBCQUNLKSB7CgkJc2IuYXBwZW5kKCJcdC0iICsgb2Zmc2V0ICsgIiwiICsgKGkg
LSBvZmZzZXQpKTsKCSAgICB9IGVsc2UgewoJCXNiLmFwcGVuZCgiXHQrIiArIG9mZnNldCArICIs
IiArIChpICsgb2Zmc2V0KSk7CgkgICAgfQoKCSAgICBpZiAoKG9wID09IEFOWU9GKSB8fCAob3Ag
PT0gQU5ZQlVUKSB8fCAob3AgPT0gRVhBQ1RMWSkpIHsKCQlzYi5hcHBlbmQoIlx0JyIpOwoJCXNi
LmFwcGVuZChwcm9ncmFtLCBpICsgMywgcHJvZ3JhbVtpICsgMl0pOwoJCXNiLmFwcGVuZCgiJyIp
OwoJCWkgKz0gMyArIHByb2dyYW1baSArIDJdOwoJICAgIH0gZWxzZSB7CgkJaSArPSAyOwoJICAg
IH0KCSAgICBzYi5hcHBlbmQoJ1xuJyk7Cgl9CglyZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgIH0K
CgogICAgcHJpdmF0ZSB2b2lkCiAgICBjb21waWxlKFN0cmluZyBleHApCgl0aHJvd3MgSWxsZWdh
bEFyZ3VtZW50RXhjZXB0aW9uCiAgICB7CglDb21waWxlciByY3N0YXRlID0gbmV3IENvbXBpbGVy
KCk7CglyY3N0YXRlLnBhcnNlID0gZXhwLnRvQ2hhckFycmF5KCk7CglyY3N0YXRlLm9mZiA9IDA7
CglyY3N0YXRlLm5wYXIgPSAxOwoJcmNzdGF0ZS5jb2RlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoK
CXJjc3RhdGUucmVnKGZhbHNlKTsKCglwcm9ncmFtID0gcmNzdGF0ZS5jb2RlLnRvU3RyaW5nKCku
dG9DaGFyQXJyYXkoKTsKCW5wYXIgPSByY3N0YXRlLm5wYXI7CglzdGFydENoYXIgPSAtMTsKCgkv
KiBvcHRpbWl6ZSAqLwoJaWYgKHByb2dyYW1bcmNzdGF0ZS5yZWduZXh0KDApXSA9PSBFTkQpIHsK
CSAgICBpZiAocHJvZ3JhbVsyXSA9PSBCT0wpIHsKCQlhbmNob3JlZCA9IHRydWU7CgkgICAgfSBl
bHNlIGlmIChwcm9ncmFtWzJdID09IEVYQUNUTFkpIHsKCQlzdGFydENoYXIgPSAoaW50KSBwcm9n
cmFtWzVdOwoJICAgIH0KCX0KCgkvKgoJICogSWYgdGhlcmUncyBzb21ldGhpbmcgZXhwZW5zaXZl
IGluIHRoZSByLmUuLCBmaW5kIHRoZQoJICogbG9uZ2VzdCBsaXRlcmFsIHN0cmluZyB0aGF0IG11
c3QgYXBwZWFyIGFuZCBtYWtlIGl0IHRoZQoJICogcmVnbXVzdC4gIFJlc29sdmUgdGllcyBpbiBm
YXZvciBvZiBsYXRlciBzdHJpbmdzLCBzaW5jZQoJICogdGhlIHJlZ3N0YXJ0IGNoZWNrIHdvcmtz
IHdpdGggdGhlIGJlZ2lubmluZyBvZiB0aGUgci5lLgoJICogYW5kIGF2b2lkaW5nIGR1cGxpY2F0
aW9uIHN0cmVuZ3RoZW5zIGNoZWNraW5nLiAgTm90IGEKCSAqIHN0cm9uZyByZWFzb24sIGJ1dCBz
dWZmaWNpZW50IGluIHRoZSBhYnNlbmNlIG9mIG90aGVycy4KCSAqLwovKgoJaWYgKChyY3N0YXRl
LmZsYWdwICYgQ29tcGlsZXIuU1BTVEFSVCkgIT0gMCkgewoJICAgIGludCBpbmRleCA9IC0xOwoJ
ICAgIGludCBsb25nZXN0ID0gMDsKCgkgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IHByb2dyYW0u
bGVuZ3RoOyApIHsKCQlzd2l0Y2ggKHByb2dyYW1bc2Nhbl0pIHsKCQkgICAgY2FzZSBFWEFDVExZ
OgoJCQlpbnQgbGVuZ3RoID0gcHJvZ3JhbVtzY2FuICsgMl07CgkJCWlmIChsZW5ndGggPiBsb25n
ZXN0KSB7CgkJCSAgICBpbmRleCA9IHNjYW47CgkJCSAgICBsb25nZXN0ID0gbGVuZ3RoOwoJCQl9
CgkJCS8vIGZhbGwgdGhyb3VnaDsKCgkJICAgIGNhc2UgQU5ZT0Y6CgkJICAgIGNhc2UgQU5ZQlVU
OgoJCQlzY2FuICs9IDMgKyBwcm9ncmFtW3NjYW4gKyAyXTsKCQkJYnJlYWs7CgoJCSAgICBkZWZh
dWx0OgoJCQlzY2FuICs9IDI7CgkJCWJyZWFrOwoJCX0KCSAgICB9CgkgICAgaWYgKGxvbmdlc3Qg
PiAwKSB7CgkJbXVzdCA9IG5ldyBTdHJpbmcocHJvZ3JhbSwgaW5kZXggKyAzLCBsb25nZXN0KTsK
CSAgICB9Cgl9CiovCgogICAgfQoKICAgIE1hdGNoCiAgICBleGVjKFN0cmluZyBzdHIsIGludCBz
dGFydCwgaW50IG9mZikKICAgIHsKCWlmIChpZ25vcmVDYXNlKSB7CgkgICAgc3RyID0gc3RyLnRv
TG93ZXJDYXNlKCk7Cgl9CgkKCU1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKCk7CgoJbWF0Y2gucHJv
Z3JhbSA9IHByb2dyYW07CgoJLyogTWFyayBiZWdpbm5pbmcgb2YgbGluZSBmb3IgXiAuICovCglt
YXRjaC5zdHIgPSBzdHI7CgltYXRjaC5ib2wgPSBzdGFydDsKCW1hdGNoLmxlbmd0aCA9IHN0ci5s
ZW5ndGgoKTsKCgltYXRjaC5pbmRpY2VzID0gbmV3IGludFtucGFyICogMl07CgoJaWYgKGFuY2hv
cmVkKSB7CgkgICAgLyogU2ltcGxlc3QgY2FzZTogIGFuY2hvcmVkIG1hdGNoIG5lZWQgYmUgdHJp
ZWQgb25seSBvbmNlLiAqLwoJICAgIGlmIChtYXRjaC5yZWd0cnkob2ZmKSkgewoJCXJldHVybiBt
YXRjaDsKCSAgICB9Cgl9IGVsc2UgaWYgKHN0YXJ0Q2hhciA+PSAwKSB7CgkgICAgLyogV2Uga25v
dyB3aGF0IGNoYXIgaXQgbXVzdCBzdGFydCB3aXRoLiAqLwoJICAgIHdoaWxlIChvZmYgPCBtYXRj
aC5sZW5ndGgpIHsKCQlvZmYgPSBzdHIuaW5kZXhPZihzdGFydENoYXIsIG9mZik7CgkJaWYgKG9m
ZiA8IDApIHsKCQkgICAgYnJlYWs7CgkJfQoJCWlmIChtYXRjaC5yZWd0cnkob2ZmKSkgewoJCSAg
ICByZXR1cm4gbWF0Y2g7CgkJfQoJCW9mZisrOwoJICAgIH0KCX0gZWxzZSB7CgkgICAgLyogTWVz
c3kgY2FzZXM6ICB1bmFuY2hvcmVkIG1hdGNoLiAqLwoJICAgIGRvIHsKCQlpZiAobWF0Y2gucmVn
dHJ5KG9mZikpIHsKCQkgICAgcmV0dXJuIG1hdGNoOwoJCX0KCSAgICB9IHdoaWxlIChvZmYrKyA8
IG1hdGNoLmxlbmd0aCk7Cgl9CglyZXR1cm4gbnVsbDsKICAgIH0KCiAgICBzdGF0aWMgY2xhc3Mg
Q29tcGlsZXIKICAgIHsKCWNoYXJbXSBwYXJzZTsKCWludCBvZmY7CglpbnQgbnBhcjsKCVN0cmlu
Z0J1ZmZlciBjb2RlOwoJaW50IGZsYWdwOwoKCglzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSAi
XiQuWygpfD8rKlxcIjsKCXN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVCA9ICIqKz8iOwoKCXN0YXRp
YyBmaW5hbCBpbnQgV09SU1QJCT0gMDA7CS8qIFdvcnN0IGNhc2UuICovCglzdGF0aWMgZmluYWwg
aW50IEhBU1dJRFRIIAk9IDAxOwkvKiBLbm93biBuZXZlciB0byBtYXRjaCBudWxsIHN0cmluZy4g
Ki8KCXN0YXRpYyBmaW5hbCBpbnQgU0lNUExFCQk9IDAyOwkvKiBTaW1wbGUgZW5vdWdoIHRvIGJl
IFNUQVIvUExVUyBvcGVyYW5kLiAqLwoJc3RhdGljIGZpbmFsIGludCBTUFNUQVJUCT0gMDQ7CS8q
IFN0YXJ0cyB3aXRoICogb3IgKy4gKi8KCgkvKgoJIC0gcmVnIC0gcmVndWxhciBleHByZXNzaW9u
LCBpLmUuIG1haW4gYm9keSBvciBwYXJlbnRoZXNpemVkIHRoaW5nCgkgKgoJICogQ2FsbGVyIG11
c3QgYWJzb3JiIG9wZW5pbmcgcGFyZW50aGVzaXMuCgkgKgoJICogQ29tYmluaW5nIHBhcmVudGhl
c2lzIGhhbmRsaW5nIHdpdGggdGhlIGJhc2UgbGV2ZWwgb2YgcmVndWxhciBleHByZXNzaW9uCgkg
KiBpcyBhIHRyaWZsZSBmb3JjZWQsIGJ1dCB0aGUgbmVlZCB0byB0aWUgdGhlIHRhaWxzIG9mIHRo
ZSBicmFuY2hlcyB0byB3aGF0CgkgKiBmb2xsb3dzIG1ha2VzIGl0IGhhcmQgdG8gYXZvaWQuCgkg
Ki8KCWludCByZWcoYm9vbGVhbiBwYXJlbikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlv
bgoJewoJICAgIGludCBuZXRGbGFncyA9IEhBU1dJRFRIOwoJICAgIGludCBwYXJubyA9IDA7CgoJ
ICAgIGludCByZXQgPSAtMTsKCSAgICBpZiAocGFyZW4pIHsKCQlwYXJubyA9IG5wYXIrKzsKCQlp
ZiAobnBhciA+PSBOU1VCRVhQKSB7CgkJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNl
cHRpb24oInRvbyBtYW55ICgpIik7CgkJfQoJCXJldCA9IHJlZ25vZGUoKGNoYXIpIChPUEVOICsg
cGFybm8pKTsKCSAgICB9CgoJICAgIC8qIFBpY2sgdXAgdGhlIGJyYW5jaGVzLCBsaW5raW5nIHRo
ZW0gdG9nZXRoZXIuICovCgkgICAgaW50IGJyID0gcmVnYnJhbmNoKCk7CgkgICAgaWYgKHJldCA+
PSAwKSB7CgkJcmVndGFpbChyZXQsIGJyKTsKCSAgICB9IGVsc2UgewoJCXJldCA9IGJyOwoJICAg
IH0KCgkgICAgaWYgKChmbGFncCAmIEhBU1dJRFRIKSA9PSAwKSB7CgkJbmV0RmxhZ3MgJj0gfkhB
U1dJRFRIOwoJICAgIH0KCSAgICBuZXRGbGFncyB8PSAoZmxhZ3AgJiBTUFNUQVJUKTsKCSAgICB3
aGlsZSAoKG9mZiA8IHBhcnNlLmxlbmd0aCkgJiYgKHBhcnNlW29mZl0gPT0gJ3wnKSkgewoJCW9m
ZisrOwoJCWJyID0gcmVnYnJhbmNoKCk7CgkJcmVndGFpbChyZXQsIGJyKTsKCQlpZiAoKGZsYWdw
ICYgSEFTV0lEVEgpID09IDApIHsKCQkgICAgbmV0RmxhZ3MgJj0gfkhBU1dJRFRIOwoJCX0KCQlu
ZXRGbGFncyB8PSAoZmxhZ3AgJiBTUFNUQVJUKTsKCSAgICB9CgoJICAgIC8qIE1ha2UgYSBjbG9z
aW5nIG5vZGUsIGFuZCBob29rIGl0IG9uIHRoZSBlbmQuICovCgkgICAgaW50IGVuZGVyID0gcmVn
bm9kZSgocGFyZW4pID8gKGNoYXIpIChDTE9TRSArIHBhcm5vKSA6IEVORCk7CgkgICAgcmVndGFp
bChyZXQsIGVuZGVyKTsKCgkgICAgLyogSG9vayB0aGUgdGFpbHMgb2YgdGhlIGJyYW5jaGVzIHRv
IHRoZSBjbG9zaW5nIG5vZGUuICovCgkgICAgZm9yIChiciA9IHJldDsgYnIgPj0gMDsgYnIgPSBy
ZWduZXh0KGJyKSkgewoJCXJlZ29wdGFpbChiciwgZW5kZXIpOwoJICAgIH0KCgkgICAgLyogQ2hl
Y2sgZm9yIHByb3BlciB0ZXJtaW5hdGlvbi4gKi8KCSAgICBpZiAocGFyZW4gJiYgKChvZmYgPj0g
cGFyc2UubGVuZ3RoKSB8fCAocGFyc2Vbb2ZmKytdICE9ICcpJykpKSB7CgkJdGhyb3cgbmV3IEls
bGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWlzc2luZyApIik7CgkgICAgfSBlbHNlIGlmICgocGFy
ZW4gPT0gZmFsc2UpICYmIChvZmYgPCBwYXJzZS5sZW5ndGgpKSB7CgkJdGhyb3cgbmV3IElsbGVn
YWxBcmd1bWVudEV4Y2VwdGlvbigidW5leHBlY3RlZCApIik7CgkgICAgfQoKCSAgICBmbGFncCA9
IG5ldEZsYWdzOwoJICAgIHJldHVybiByZXQ7Cgl9CgoJLyoKCSAtIHJlZ2JyYW5jaCAtIG9uZSBh
bHRlcm5hdGl2ZSBvZiBhbiB8IG9wZXJhdG9yCgkgKgoJICogSW1wbGVtZW50cyB0aGUgY29uY2F0
ZW5hdGlvbiBvcGVyYXRvci4KCSAqLwoJaW50IHJlZ2JyYW5jaCgpIHRocm93cyBJbGxlZ2FsQXJn
dW1lbnRFeGNlcHRpb24KCXsKCSAgICBpbnQgbmV0RmxhZ3MgPSBXT1JTVDsJLyogVGVudGF0aXZl
bHkuICovCgoJICAgIGludCByZXQgPSByZWdub2RlKEJSQU5DSCk7CgkgICAgaW50IGNoYWluID0g
LTE7CgkgICAgd2hpbGUgKChvZmYgPCBwYXJzZS5sZW5ndGgpICYmIChwYXJzZVtvZmZdICE9ICd8
JykKCQkJJiYgKHBhcnNlW29mZl0gIT0gJyknKSkgewoJCWludCBsYXRlc3QgPSByZWdwaWVjZSgp
OwoJCW5ldEZsYWdzIHw9IGZsYWdwICYgSEFTV0lEVEg7CgkJaWYgKGNoYWluIDwgMCkgewkvKiBG
aXJzdCBwaWVjZS4gKi8KCQkgICAgbmV0RmxhZ3MgfD0gKGZsYWdwICYgU1BTVEFSVCk7CgkJfSBl
bHNlIHsKCQkgICAgcmVndGFpbChjaGFpbiwgbGF0ZXN0KTsKCQl9CgkJY2hhaW4gPSBsYXRlc3Q7
CgkgICAgfQoJICAgIGlmIChjaGFpbiA8IDApIHsJLyogTG9vcCByYW4gemVybyB0aW1lcy4gKi8K
CQlyZWdub2RlKE5PVEhJTkcpOwoJICAgIH0KCgkgICAgZmxhZ3AgPSBuZXRGbGFnczsKCSAgICBy
ZXR1cm4gcmV0OwoJfQoKCS8qCgkgLSByZWdwaWVjZSAtIHNvbWV0aGluZyBmb2xsb3dlZCBieSBw
b3NzaWJsZSBbKis/XQoJICoKCSAqIE5vdGUgdGhhdCB0aGUgYnJhbmNoaW5nIGNvZGUgc2VxdWVu
Y2VzIHVzZWQgZm9yID8gYW5kIHRoZSBnZW5lcmFsIGNhc2VzCgkgKiBvZiAqIGFuZCArIGFyZSBz
b21ld2hhdCBvcHRpbWl6ZWQ6ICB0aGV5IHVzZSB0aGUgc2FtZSBOT1RISU5HIG5vZGUgYXMKCSAq
IGJvdGggdGhlIGVuZG1hcmtlciBmb3IgdGhlaXIgYnJhbmNoIGxpc3QgYW5kIHRoZSBib2R5IG9m
IHRoZSBsYXN0IGJyYW5jaC4KCSAqIEl0IG1pZ2h0IHNlZW0gdGhhdCB0aGlzIG5vZGUgY291bGQg
YmUgZGlzcGVuc2VkIHdpdGggZW50aXJlbHksIGJ1dCB0aGUKCSAqIGVuZG1hcmtlciByb2xlIGlz
IG5vdCByZWR1bmRhbnQuCgkgKi8KCWludCByZWdwaWVjZSgpIHRocm93cyBJbGxlZ2FsQXJndW1l
bnRFeGNlcHRpb24KCXsKCSAgICBpbnQgbmV0RmxhZ3M7CgoJICAgIGludCByZXQgPSByZWdhdG9t
KCk7CgoJICAgIGlmICgob2ZmID49IHBhcnNlLmxlbmd0aCkgfHwgKGlzTXVsdChwYXJzZVtvZmZd
KSA9PSBmYWxzZSkpIHsKCQlyZXR1cm4gcmV0OwoJICAgIH0KCSAgICBjaGFyIG9wID0gcGFyc2Vb
b2ZmXTsKCgkgICAgaWYgKCgoZmxhZ3AgJiBIQVNXSURUSCkgPT0gMCkgJiYgKG9wICE9ICc/Jykp
IHsKCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIqKyBvcGVyYW5kIGNvdWxk
IGJlIGVtcHR5Iik7CgkgICAgfQoJICAgIG5ldEZsYWdzID0gKG9wICE9ICcrJykgPyAoV09SU1Qg
fCBTUFNUQVJUKSA6IChXT1JTVCB8IEhBU1dJRFRIKTsKCgkgICAgaWYgKChvcCA9PSAnKicpICYm
ICgoZmxhZ3AgJiBTSU1QTEUpICE9IDApKSB7CgkJcmVnaW5zZXJ0KFNUQVIsIHJldCk7CgkgICAg
fSBlbHNlIGlmIChvcCA9PSAnKicpIHsKCQkvKiBFbWl0IHgqIGFzICh4JnwpLCB3aGVyZSAmIG1l
YW5zICJzZWxmIi4gKi8KCQlyZWdpbnNlcnQoQlJBTkNILCByZXQpOwkJCS8qIEVpdGhlciB4ICov
CgkJcmVnb3B0YWlsKHJldCwgcmVnbm9kZShCQUNLKSk7CQkvKiBhbmQgbG9vcCAqLwoJCXJlZ29w
dGFpbChyZXQsIHJldCk7CQkJLyogYmFjayAqLwoJCXJlZ3RhaWwocmV0LCByZWdub2RlKEJSQU5D
SCkpOwkJLyogb3IgKi8KCQlyZWd0YWlsKHJldCwgcmVnbm9kZShOT1RISU5HKSk7CQkvKiBudWxs
LiAqLwoJICAgIH0gZWxzZSBpZiAoKG9wID09ICcrJykgJiYgKChmbGFncCAmIFNJTVBMRSkgIT0g
MCkpIHsKCQlyZWdpbnNlcnQoUExVUywgcmV0KTsKCSAgICB9IGVsc2UgaWYgKG9wID09ICcrJykg
ewoJCS8qIEVtaXQgeCsgYXMgeCgmfCksIHdoZXJlICYgbWVhbnMgInNlbGYiLiAqLwoJCWludCBu
ZXh0ID0gcmVnbm9kZShCUkFOQ0gpOwkJLyogRWl0aGVyICovCgkJcmVndGFpbChyZXQsIG5leHQp
OwoJCXJlZ3RhaWwocmVnbm9kZShCQUNLKSwgcmV0KTsJCS8qIGxvb3AgYmFjayAqLwoJCXJlZ3Rh
aWwobmV4dCwgcmVnbm9kZShCUkFOQ0gpKTsJCS8qIG9yICovCgkJcmVndGFpbChyZXQsIHJlZ25v
ZGUoTk9USElORykpOwkJLyogbnVsbC4gKi8KCSAgICB9IGVsc2UgaWYgKG9wID09ICc/JykgewoJ
CS8qIEVtaXQgeD8gYXMgKHh8KSAqLwoJCXJlZ2luc2VydChCUkFOQ0gsIHJldCk7CQkJLyogRWl0
aGVyIHggKi8KCQlyZWd0YWlsKHJldCwgcmVnbm9kZShCUkFOQ0gpKTsJCS8qIG9yICovCgkJaW50
IG5leHQgPSByZWdub2RlKE5PVEhJTkcpOwkJLyogbnVsbC4gKi8KCQlyZWd0YWlsKHJldCwgbmV4
dCk7CgkJcmVnb3B0YWlsKHJldCwgbmV4dCk7CgkgICAgfQoJICAgIG9mZisrOwoJICAgIGlmICgo
b2ZmIDwgcGFyc2UubGVuZ3RoKSAmJiBpc011bHQocGFyc2Vbb2ZmXSkpIHsKCQl0aHJvdyBuZXcg
SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZXN0ZWQgKj8rIik7CgkgICAgfQoKCSAgICBmbGFn
cCA9IG5ldEZsYWdzOwoJICAgIHJldHVybiByZXQ7Cgl9CgoJLyoKCSAtIHJlZ2F0b20gLSB0aGUg
bG93ZXN0IGxldmVsCgkgKgoJICogT3B0aW1pemF0aW9uOiAgZ29iYmxlcyBhbiBlbnRpcmUgc2Vx
dWVuY2Ugb2Ygb3JkaW5hcnkgY2hhcmFjdGVycyBzbyB0aGF0CgkgKiBpdCBjYW4gdHVybiB0aGVt
IGludG8gYSBzaW5nbGUgbm9kZSwgd2hpY2ggaXMgc21hbGxlciB0byBzdG9yZSBhbmQKCSAqIGZh
c3RlciB0byBydW4uICBCYWNrc2xhc2hlZCBjaGFyYWN0ZXJzIGFyZSBleGNlcHRpb25zLCBlYWNo
IGJlY29taW5nIGEKCSAqIHNlcGFyYXRlIG5vZGU7IHRoZSBjb2RlIGlzIHNpbXBsZXIgdGhhdCB3
YXkgYW5kIGl0J3Mgbm90IHdvcnRoIGZpeGluZy4KCSAqLwoJaW50IHJlZ2F0b20oKSB0aHJvd3Mg
SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCgl7CgkgICAgaW50IG5ldEZsYWdzID0gV09SU1Q7CQkv
KiBUZW50YXRpdmVseS4gKi8KCSAgICBpbnQgcmV0OwoKCSAgICBzd2l0Y2ggKHBhcnNlW29mZisr
XSkgewoJCWNhc2UgJ14nOgoJCSAgICByZXQgPSByZWdub2RlKEJPTCk7CgkJICAgIGJyZWFrOwoJ
CWNhc2UgJyQnOgoJCSAgICByZXQgPSByZWdub2RlKEVPTCk7CgkJICAgIGJyZWFrOwoJCWNhc2Ug
Jy4nOgoJCSAgICByZXQgPSByZWdub2RlKEFOWSk7CgkJICAgIG5ldEZsYWdzIHw9IChIQVNXSURU
SCB8IFNJTVBMRSk7CgkJICAgIGJyZWFrOwoJCWNhc2UgJ1snOiB7CgkJICAgIHRyeSB7CgkJCWlm
IChwYXJzZVtvZmZdID09ICdeJykgewoJCQkgICAgcmV0ID0gcmVnbm9kZShBTllCVVQpOwoJCQkg
ICAgb2ZmKys7CgkJCX0gZWxzZSB7CgkJCSAgICByZXQgPSByZWdub2RlKEFOWU9GKTsKCQkJfQoK
CQkJaW50IHBvcyA9IHJlZ2xlbigpOwoJCQlyZWdjKCdcMCcpOwoKCQkJaWYgKChwYXJzZVtvZmZd
ID09ICddJykgfHwgKHBhcnNlW29mZl0gPT0gJy0nKSkgewoJCQkgICAgcmVnYyhwYXJzZVtvZmYr
K10pOwoJCQl9CgkJCXdoaWxlIChwYXJzZVtvZmZdICE9ICddJykgewoJCQkgICAgaWYgKHBhcnNl
W29mZl0gPT0gJy0nKSB7CgkJCQlvZmYrKzsKCQkJCWlmIChwYXJzZVtvZmZdID09ICddJykgewoJ
CQkJICAgIHJlZ2MoJy0nKTsKCQkJCX0gZWxzZSB7CgkJCQkgICAgaW50IHN0YXJ0ID0gcGFyc2Vb
b2ZmIC0gMl07CgkJCQkgICAgaW50IGVuZCA9IHBhcnNlW29mZisrXTsKCQkJCSAgICBpZiAoc3Rh
cnQgPiBlbmQpIHsKCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAoJCQkJ
CQkiaW52YWxpZCBbXSByYW5nZSIpOwoJCQkJICAgIH0KCQkJCSAgICBmb3IgKGludCBpID0gc3Rh
cnQgKyAxOyBpIDw9IGVuZDsgaSsrKSB7CgkJCQkJcmVnYygoY2hhcikgaSk7CgkJCQkgICAgfQoJ
CQkJfQoJCQkgICAgfSBlbHNlIHsKCQkJCXJlZ2MocGFyc2Vbb2ZmKytdKTsKCQkJICAgIH0KCQkJ
fQoJCQlyZWdzZXQocG9zLCAoY2hhcikgKHJlZ2xlbigpIC0gcG9zIC0gMSkpOwoJCQlvZmYrKzsK
CQkJbmV0RmxhZ3MgfD0gSEFTV0lEVEggfCBTSU1QTEU7CgkJICAgIH0gY2F0Y2ggKEFycmF5SW5k
ZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRF
eGNlcHRpb24oIm1pc3NpbmcgXSIpOwoJCSAgICB9CgkJICAgIGJyZWFrOwoJCX0KCQljYXNlICco
JzoKCQkgICAgcmV0ID0gcmVnKHRydWUpOwoJCSAgICBuZXRGbGFncyB8PSAoZmxhZ3AgJiAoSEFT
V0lEVEggfCBTUFNUQVJUKSk7CgkJICAgIGJyZWFrOwoJCWNhc2UgJ3wnOgoJCWNhc2UgJyknOgoJ
CSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlcm5hbCB1cnAiKTsK
CQljYXNlICc/JzoKCQljYXNlICcrJzoKCQljYXNlICcqJzoKCQkgICAgdGhyb3cgbmV3IElsbGVn
YWxBcmd1bWVudEV4Y2VwdGlvbigiPysqIGZvbGxvd3Mgbm90aGluZyIpOwoJCWNhc2UgJ1xcJzoK
CQkgICAgaWYgKG9mZiA+PSBwYXJzZS5sZW5ndGgpIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1
bWVudEV4Y2VwdGlvbigidHJhaWxpbmcgXFwiKTsKCQkgICAgfQoJCSAgICByZXQgPSByZWdub2Rl
KEVYQUNUTFkpOwoJCSAgICByZWdjKChjaGFyKSAxKTsKCQkgICAgcmVnYyhwYXJzZVtvZmYrK10p
OwoJCSAgICBuZXRGbGFncyB8PSBIQVNXSURUSCB8IFNJTVBMRTsKCQkgICAgYnJlYWs7CgkJZGVm
YXVsdDogewoJCSAgICBvZmYtLTsKCQkgICAgaW50IGVuZDsKCQkgICAgZm9yIChlbmQgPSBvZmY7
IGVuZCA8IHBhcnNlLmxlbmd0aDsgZW5kKyspIHsKCQkJaWYgKE1FVEEuaW5kZXhPZihwYXJzZVtl
bmRdKSA+PSAwKSB7CgkJCSAgICBicmVhazsKCQkJfQoJCSAgICB9CgkJICAgIGlmICgoZW5kID4g
b2ZmICsgMSkgJiYgKGVuZCA8IHBhcnNlLmxlbmd0aCkKCQkJCSYmIGlzTXVsdChwYXJzZVtlbmRd
KSkgewoJCQllbmQtLTsJCS8qIEJhY2sgb2ZmIGNsZWFyIG9mID8rKiBvcGVyYW5kLiAqLwoJCSAg
ICB9CgkJICAgIG5ldEZsYWdzIHw9IEhBU1dJRFRIOwoJCSAgICBpZiAoZW5kID09IG9mZiArIDEp
IHsKCQkJbmV0RmxhZ3MgfD0gU0lNUExFOwoJCSAgICB9CgkJICAgIHJldCA9IHJlZ25vZGUoRVhB
Q1RMWSk7CgkJICAgIHJlZ2MoKGNoYXIpIChlbmQgLSBvZmYpKTsKCQkgICAgZm9yICggOyBvZmYg
PCBlbmQ7IG9mZisrKSB7CgkJCXJlZ2MocGFyc2Vbb2ZmXSk7CgkJICAgIH0KCQl9CgkJYnJlYWs7
CgkgICAgfQoKCSAgICBmbGFncCA9IG5ldEZsYWdzOwoJICAgIHJldHVybiByZXQ7Cgl9CgoJLyoK
CSAtIHJlZ25vZGUgLSBlbWl0IGEgbm9kZQoJICovCglpbnQgcmVnbm9kZShjaGFyIG9wKQoJewoJ
ICAgIGludCByZXQgPSBjb2RlLmxlbmd0aCgpOwoJICAgIGNvZGUuYXBwZW5kKG9wKTsKCSAgICBj
b2RlLmFwcGVuZCgnXDAnKTsKCgkgICAgcmV0dXJuIHJldDsKCX0KCgkvKgoJIC0gcmVnYyAtIGVt
aXQgKGlmIGFwcHJvcHJpYXRlKSBhIGJ5dGUgb2YgY29kZQoJICovCgl2b2lkIHJlZ2MoY2hhciBi
KQoJewoJICAgIGNvZGUuYXBwZW5kKGIpOwoJfQoKCWludCByZWdsZW4oKQoJewoJICAgIHJldHVy
biBjb2RlLmxlbmd0aCgpOwoJfQoKCXZvaWQgcmVnc2V0KGludCBwb3MsIGNoYXIgY2gpCgl7Cgkg
ICAgY29kZS5zZXRDaGFyQXQocG9zLCBjaCk7Cgl9CgoKCS8qCgkgLSByZWdpbnNlcnQgLSBpbnNl
cnQgYW4gb3BlcmF0b3IgaW4gZnJvbnQgb2YgYWxyZWFkeS1lbWl0dGVkIG9wZXJhbmQKCSAqCgkg
KiBNZWFucyByZWxvY2F0aW5nIHRoZSBvcGVyYW5kLgoJICovCgl2b2lkIHJlZ2luc2VydChjaGFy
IG9wLCBpbnQgcG9zKQoJewoJICAgIGNoYXJbXSB0bXAgPSBuZXcgY2hhcltdIHtvcCwgJ1wwJ307
CgkgICAgY29kZS5pbnNlcnQocG9zLCB0bXApOwoJfQoKCS8qCgkgLSByZWd0YWlsIC0gc2V0IHRo
ZSBuZXh0LXBvaW50ZXIgYXQgdGhlIGVuZCBvZiBhIG5vZGUgY2hhaW4KCSAqLwoJdm9pZCByZWd0
YWlsKGludCBwb3MsIGludCB2YWwpCgl7CgkgICAgLyogRmluZCBsYXN0IG5vZGUuICovCgoJICAg
IGludCBzY2FuID0gcG9zOwoJICAgIHdoaWxlICh0cnVlKSB7CgkJaW50IHRtcCA9IHJlZ25leHQo
c2Nhbik7CgkJaWYgKHRtcCA8IDApIHsKCQkgICAgYnJlYWs7CgkJfQoJCXNjYW4gPSB0bXA7Cgkg
ICAgfQoKCSAgICBpbnQgb2Zmc2V0ID0gKGNvZGUuY2hhckF0KHNjYW4pID09IEJBQ0spID8gc2Nh
biAtIHZhbCA6IHZhbCAtIHNjYW47CgkgICAgY29kZS5zZXRDaGFyQXQoc2NhbiArIDEsIChjaGFy
KSBvZmZzZXQpOwoJfQoKCS8qCgkgLSByZWdvcHRhaWwgLSByZWd0YWlsIG9uIG9wZXJhbmQgb2Yg
Zmlyc3QgYXJndW1lbnQ7IG5vcCBpZiBvcGVyYW5kbGVzcwoJICovCgl2b2lkIHJlZ29wdGFpbChp
bnQgcG9zLCBpbnQgdmFsKQoJewoJICAgIGlmICgocG9zIDwgMCkgfHwgKGNvZGUuY2hhckF0KHBv
cykgIT0gQlJBTkNIKSkgewoJCXJldHVybjsKCSAgICB9CgkgICAgcmVndGFpbChwb3MgKyAyLCB2
YWwpOwoJfQoKCgkvKgoJIC0gcmVnbmV4dCAtIGRpZyB0aGUgIm5leHQiIHBvaW50ZXIgb3V0IG9m
IGEgbm9kZQoJICovCglpbnQgcmVnbmV4dChpbnQgcG9zKQoJewoJICAgIGludCBvZmZzZXQgPSBj
b2RlLmNoYXJBdChwb3MgKyAxKTsKCSAgICBpZiAob2Zmc2V0ID09IDApIHsKCQlyZXR1cm4gLTE7
CgkgICAgfQoJICAgIGlmIChjb2RlLmNoYXJBdChwb3MpID09IEJBQ0spIHsKCQlyZXR1cm4gcG9z
IC0gb2Zmc2V0OwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHBvcyArIG9mZnNldDsKCSAgICB9Cgl9
CgoJc3RhdGljIGJvb2xlYW4gaXNNdWx0KGNoYXIgY2gpCgl7CgkgICAgcmV0dXJuIChjaCA9PSAn
KicpIHx8IChjaCA9PSAnKycpIHx8IChjaCA9PSAnPycpOwoJfQoKICAgIH0KCiAgICBzdGF0aWMg
Y2xhc3MgTWF0Y2ggewoJY2hhcltdIHByb2dyYW07CgoJU3RyaW5nIHN0cjsKCWludCBib2w7Cglp
bnQgaW5wdXQ7CglpbnQgbGVuZ3RoOwoKCWludFtdIGluZGljZXM7CgoJYm9vbGVhbiByZWd0cnko
aW50IG9mZikKCXsKCSAgICB0aGlzLmlucHV0ID0gb2ZmOwoKCSAgICBmb3IgKGludCBpID0gMDsg
aSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHsKCQlpbmRpY2VzW2ldID0gLTE7CgkgICAgfQoKCSAg
ICBpZiAocmVnbWF0Y2goMCkpIHsKCQlpbmRpY2VzWzBdID0gb2ZmOwoJCWluZGljZXNbMV0gPSBp
bnB1dDsKCQlyZXR1cm4gdHJ1ZTsKCSAgICB9IGVsc2UgewoJCXJldHVybiBmYWxzZTsKCSAgICB9
Cgl9CgoJLyoKCSAtIHJlZ21hdGNoIC0gbWFpbiBtYXRjaGluZyByb3V0aW5lCgkgKgoJICogQ29u
Y2VwdHVhbGx5IHRoZSBzdHJhdGVneSBpcyBzaW1wbGU6ICBjaGVjayB0byBzZWUgd2hldGhlciB0
aGUgY3VycmVudAoJICogbm9kZSBtYXRjaGVzLCBjYWxsIHNlbGYgcmVjdXJzaXZlbHkgdG8gc2Vl
IHdoZXRoZXIgdGhlIHJlc3QgbWF0Y2hlcywKCSAqIGFuZCB0aGVuIGFjdCBhY2NvcmRpbmdseS4g
IEluIHByYWN0aWNlIHdlIG1ha2Ugc29tZSBlZmZvcnQgdG8gYXZvaWQKCSAqIHJlY3Vyc2lvbiwg
aW4gcGFydGljdWxhciBieSBnb2luZyB0aHJvdWdoICJvcmRpbmFyeSIgbm9kZXMgKHRoYXQgZG9u
J3QKCSAqIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoZSByZXN0IG9mIHRoZSBtYXRjaCBmYWlsZWQp
IGJ5IGEgbG9vcCBpbnN0ZWFkIG9mCgkgKiBieSByZWN1cnNpb24uCgkgKi8KCWJvb2xlYW4gcmVn
bWF0Y2goaW50IHNjYW4pCgl7CgkgICAgd2hpbGUgKHRydWUpIHsKCQlpbnQgbmV4dCA9IHJlZ25l
eHQoc2Nhbik7CgkJaW50IG9wID0gcHJvZ3JhbVtzY2FuXTsKCQlzd2l0Y2ggKG9wKSB7CgkJICAg
IGNhc2UgQk9MOgoJCQlpZiAoaW5wdXQgIT0gYm9sKSB7CgkJCSAgICByZXR1cm4gZmFsc2U7CgkJ
CX0KCQkJYnJlYWs7CgoJCSAgICBjYXNlIEVPTDoKCQkJaWYgKGlucHV0ICE9IGxlbmd0aCkgewoJ
CQkgICAgcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWJyZWFrOwoKCQkgICAgY2FzZSBBTlk6CgkJCWlm
IChpbnB1dCA+PSBsZW5ndGgpIHsKCQkJICAgIHJldHVybiBmYWxzZTsKCQkJfQoJCQlpbnB1dCsr
OwoJCQlicmVhazsKCgkJICAgIGNhc2UgRVhBQ1RMWTogewoJCQlpZiAoY29tcGFyZShzY2FuKSA9
PSBmYWxzZSkgewoJCQkgICAgcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWJyZWFrOwoJCSAgICB9CgoJ
CSAgICBjYXNlIEFOWU9GOgoJCQlpZiAoaW5wdXQgPj0gbGVuZ3RoKSB7CgkJCSAgICByZXR1cm4g
ZmFsc2U7CgkJCX0KCQkJaWYgKHByZXNlbnQoc2NhbikgPT0gZmFsc2UpIHsKCQkJICAgIHJldHVy
biBmYWxzZTsKCQkJfQoJCQlpbnB1dCsrOwoJCQlicmVhazsKCgkJICAgIGNhc2UgQU5ZQlVUOgoJ
CQlpZiAoaW5wdXQgPj0gbGVuZ3RoKSB7CgkJCSAgICByZXR1cm4gZmFsc2U7CgkJCX0KCQkJaWYg
KHByZXNlbnQoc2NhbikpIHsKCQkJICAgIHJldHVybiBmYWxzZTsKCQkJfQoJCQlpbnB1dCsrOwoJ
CQlicmVhazsKCgkJICAgIGNhc2UgTk9USElORzoKCQkgICAgY2FzZSBCQUNLOgoJCQlicmVhazsK
CgkJICAgIGNhc2UgQlJBTkNIOiB7CgkJCWlmIChwcm9ncmFtW25leHRdICE9IEJSQU5DSCkgewoJ
CQkgICAgbmV4dCA9IHNjYW4gKyAyOwoJCQl9IGVsc2UgewoJCQkgICAgZG8gewoJCQkJaW50IHNh
dmUgPSBpbnB1dDsKCQkJCWlmIChyZWdtYXRjaChzY2FuICsgMikpIHsKCQkJCSAgICByZXR1cm4g
dHJ1ZTsKCQkJCX0KCQkJCWlucHV0ID0gc2F2ZTsKCQkJCXNjYW4gPSByZWduZXh0KHNjYW4pOwoJ
CQkgICAgfSB3aGlsZSAoKHNjYW4gPj0gMCkgJiYgKHByb2dyYW1bc2Nhbl0gPT0gQlJBTkNIKSk7
CgkJCSAgICByZXR1cm4gZmFsc2U7CgkJCX0KCQkJYnJlYWs7CgkJICAgIH0KCgkJICAgIGNhc2Ug
U1RBUjoKCQkgICAgY2FzZSBQTFVTOiB7CgkJCS8qCgkJCSAqIExvb2thaGVhZCB0byBhdm9pZCB1
c2VsZXNzIG1hdGNoIGF0dGVtcHRzCgkJCSAqIHdoZW4gd2Uga25vdyB3aGF0IGNoYXJhY3RlciBj
b21lcyBuZXh0LgoJCQkgKi8KCgkJCWludCBjaCA9IC0xOwoJCQlpZiAocHJvZ3JhbVtuZXh0XSA9
PSBFWEFDVExZKSB7CgkJCSAgICBjaCA9IHByb2dyYW1bbmV4dCArIDNdOwoJCQl9CgoJCQlpbnQg
bWluID0gKG9wID09IFNUQVIpID8gMCA6IDE7CgkJCWludCBzYXZlID0gaW5wdXQ7CgkJCWludCBu
byA9IHJlZ3JlcGVhdChzY2FuICsgMik7CgoJCQl3aGlsZSAobm8gPj0gbWluKSB7CgkJCSAgICAv
KiBJZiBpdCBjb3VsZCB3b3JrLCB0cnkgaXQuICovCgkJCSAgICBpZiAoKGNoIDwgMCkgfHwgKChp
bnB1dCA8IGxlbmd0aCkKCQkJICAgICAgICAgICAgJiYgKHN0ci5jaGFyQXQoaW5wdXQpID09IGNo
KSkpIHsKCQkJCWlmIChyZWdtYXRjaChuZXh0KSkgewoJCQkJICAgIHJldHVybiB0cnVlOwoJCQkJ
fQoJCQkgICAgfQoJCQkgICAgLyogQ291bGRuJ3Qgb3IgZGlkbid0IC0tIGJhY2sgdXAuICovCgkJ
CSAgICBuby0tOwoJCQkgICAgaW5wdXQgPSBzYXZlICsgbm87CgkJCX0KCQkJcmV0dXJuIGZhbHNl
OwoJCSAgICB9CgoJCSAgICBjYXNlIEVORDoKCQkJcmV0dXJuIHRydWU7CgoJCSAgICBkZWZhdWx0
OgoJCQlpZiAob3AgPj0gQ0xPU0UpIHsKCQkJICAgIGludCBubyA9IG9wIC0gQ0xPU0U7CgkJCSAg
ICBpbnQgc2F2ZSA9IGlucHV0OwoKCQkJICAgIGlmIChyZWdtYXRjaChuZXh0KSkgewoJCQkJLyoK
CQkJCSAqIERvbid0IHNldCBlbmRwIGlmIHNvbWUgbGF0ZXIKCQkJCSAqIGludm9jYXRpb24gb2Yg
dGhlIHNhbWUgcGFyZW50aGVzZXMKCQkJCSAqIGFscmVhZHkgaGFzLgoJCQkJICovCgkJCQlpZiAo
aW5kaWNlc1tubyAqIDIgKyAxXSA8PSAwKSB7CgkJCQkgICAgaW5kaWNlc1tubyAqIDIgKyAxXSA9
IHNhdmU7CgkJCQl9CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJICAgIH0KCQkJfSBlbHNlIGlmIChvcCA+
PSBPUEVOKSB7CgkJCSAgICBpbnQgbm8gPSBvcCAtIE9QRU47CgkJCSAgICBpbnQgc2F2ZSA9IGlu
cHV0OwoKCQkJICAgIGlmIChyZWdtYXRjaChuZXh0KSkgewoJCQkJLyoKCQkJCSAqIERvbid0IHNl
dCBzdGFydHAgaWYgc29tZSBsYXRlciBpbnZvY2F0aW9uIG9mIHRoZQoJCQkJICogc2FtZSBwYXJl
bnRoZXNlcyBhbHJlYWR5IGhhcy4KCQkJCSAqLwoJCQkJaWYgKGluZGljZXNbbm8gKiAyXSA8PSAw
KSB7CgkJCQkgICAgaW5kaWNlc1tubyAqIDJdID0gc2F2ZTsKCQkJCX0KCQkJCXJldHVybiB0cnVl
OwoJCQkgICAgfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJc2NhbiA9IG5leHQ7CgkgICAg
fQoJfQoKCWJvb2xlYW4gY29tcGFyZShpbnQgc2NhbikKCXsKCSAgICBpbnQgY291bnQgPSBwcm9n
cmFtW3NjYW4gKyAyXTsKCSAgICBpZiAoaW5wdXQgKyBjb3VudCA+IGxlbmd0aCkgewoJCXJldHVy
biBmYWxzZTsKCSAgICB9CgkgICAgaW50IHN0YXJ0ID0gc2NhbiArIDM7CgkgICAgaW50IGVuZCA9
IHN0YXJ0ICsgY291bnQ7CgkgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsK
CQlpZiAoc3RyLmNoYXJBdChpbnB1dCsrKSAhPSBwcm9ncmFtW2ldKSB7CgkJICAgIHJldHVybiBm
YWxzZTsKCQl9CgkgICAgfQoJICAgIHJldHVybiB0cnVlOwoJfQoKCWJvb2xlYW4gcHJlc2VudChp
bnQgc2NhbikKCXsKCSAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpbnB1dCk7CgoJICAgIGludCBj
b3VudCA9IHByb2dyYW1bc2NhbiArIDJdOwoJICAgIGludCBzdGFydCA9IHNjYW4gKyAzOwoJICAg
IGludCBlbmQgPSBzdGFydCArIGNvdW50OwoKCSAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBl
bmQ7IGkrKykgewoJCWlmIChwcm9ncmFtW2ldID09IGNoKSB7CgkJICAgIHJldHVybiB0cnVlOwoJ
CX0KCSAgICB9CgkgICAgcmV0dXJuIGZhbHNlOwoJfQoKCgkvKgoJIC0gcmVncmVwZWF0IC0gcmVw
ZWF0ZWRseSBtYXRjaCBzb21ldGhpbmcgc2ltcGxlLCByZXBvcnQgaG93IG1hbnkKCSAqLwoJaW50
IHJlZ3JlcGVhdChpbnQgc2NhbikKCXsKCSAgICBpbnQgb3AgPSBwcm9ncmFtW3NjYW5dOwoJICAg
IGludCBjb3VudCA9IDA7CgoJICAgIHN3aXRjaCAob3ApIHsKCQljYXNlIEFOWToKCQkgICAgLy8g
Jy4qJyBtYXRjaGVzIGFsbCB0aGUgd2F5IHRvIHRoZSBlbmQuCgoJCSAgICBjb3VudCA9IGxlbmd0
aCAtIGlucHV0OwoJCSAgICBpbnB1dCA9IGxlbmd0aDsKCQkgICAgYnJlYWs7CgoJCWNhc2UgRVhB
Q1RMWTogewoJCSAgICAvLyAnZyonIG1hdGNoZXMgYWxsIHRoZSBmb2xsb3dpbmcgJ2cnIGNoYXJh
Y3RlcnMuCgoJCSAgICBjaGFyIGNoID0gcHJvZ3JhbVtzY2FuICsgM107CgkJICAgIHdoaWxlICgo
aW5wdXQgPCBsZW5ndGgpICYmIChzdHIuY2hhckF0KGlucHV0KSA9PSBjaCkpIHsKCQkJaW5wdXQr
KzsKCQkJY291bnQrKzsKCQkgICAgfQoJCSAgICBicmVhazsKCQl9CgoJCWNhc2UgQU5ZT0Y6CgkJ
ICAgIC8vIFthYmNdKgoKCQkgICAgd2hpbGUgKChpbnB1dCA8IGxlbmd0aCkgJiYgcHJlc2VudChz
Y2FuKSkgewoJCQlpbnB1dCsrOwoJCQljb3VudCsrOwoJCSAgICB9CgkJICAgIGJyZWFrOwoKCgkJ
Y2FzZSBBTllCVVQ6CgkJICAgIHdoaWxlICgoaW5wdXQgPCBsZW5ndGgpICYmICFwcmVzZW50KHNj
YW4pKSB7CgkJCWlucHV0Kys7CgkJCWNvdW50Kys7CgkJICAgIH0KCQkgICAgYnJlYWs7CgoJICAg
IH0KCSAgICByZXR1cm4gY291bnQ7Cgl9CgoJLyoKCSAtIHJlZ25leHQgLSBkaWcgdGhlICJuZXh0
IiBwb2ludGVyIG91dCBvZiBhIG5vZGUKCSAqLwoJaW50IHJlZ25leHQoaW50IHNjYW4pCgl7Cgkg
ICAgaW50IG9mZnNldCA9IHByb2dyYW1bc2NhbiArIDFdOwoJICAgIGlmIChwcm9ncmFtW3NjYW5d
ID09IEJBQ0spIHsKCQlyZXR1cm4gc2NhbiAtIG9mZnNldDsKCSAgICB9IGVsc2UgewoJCXJldHVy
biBzY2FuICsgb2Zmc2V0OwoJICAgIH0KCX0KICAgIH0KfQoK


More information about the Java-prs mailing list