From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13402 invoked by alias); 25 Jan 2002 09:46:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 13347 invoked by uid 71); 25 Jan 2002 09:46:00 -0000 Resent-Date: 25 Jan 2002 09:46:00 -0000 Resent-Message-ID: <20020125094600.13346.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, java-prs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, jsantala@tml.hut.fi Received:(qmail 12966 invoked by uid 61); 25 Jan 2002 09:44:01 -0000 Message-Id:<20020125094401.12965.qmail@sources.redhat.com> Date: Fri, 25 Jan 2002 01:46:00 -0000 From: jsantala@tml.hut.fi Reply-To: jsantala@tml.hut.fi To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version:gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: java/5487: arm-linux-gcj cross-compiler generates bad assembler-code X-SW-Source: 2002-01/txt/msg00883.txt.bz2 List-Id: >Number: 5487 >Category: java >Synopsis: arm-linux-gcj cross-compiler generates bad assembler-code >Confidential: no >Severity: critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Jan 25 01:46:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Jukka Santala >Release: 3.1 20020122 (experimental) >Organization: >Environment: Using Red Hat 7.1, with GCC compiled as arm-linux cross-compiler. >Description: Compiling specific Java file of the Red Hat GCJ/rhug tree: arm-linux-gcj -fCLASSPATH=upstream/src:./upstream/src -O2 -save-temps -dp -v --encoding=8859_1 -fassume-compiled -O2 -c upstream/src/org/apache/xerces/validators/dtd/DTDGrammar.java -MT upstream/src/org/apache/xerces/validators/dtd/lib_org_apache_xerces_la-DTDGrammar.lo -MD -MP -MF upstream/src/org/apache/xerces/validators/dtd/.deps/lib_org_apache_xerces_la-DTDGrammar.TPlo -fPIC -o upstream/src/org/apache/xerces/validators/dtd/.libs/lib_org_apache_xerces_la-DTDGrammar.lo Using arm-linux-gcc cross-compiler, GCJ generates object-files with undefined symbol references. For example: /home/jsantala/rhug-clean/xerces/.libs/lib-org-apache-xerces.so: undefined reference to `.L153' /home/jsantala/rhug-clean/xerces/.libs/lib-org-apache-xerces.so: undefined reference to `.L156' nm output of affected source module: U .L153 U .L156 000000d8 d _CD_org_apache_xerces_validators_dtd_DTDGrammar ... >>From assembler source: ... .L164: bl _Jv_ThrowBadArrayIndex(PLT) @ 855 *call_value_symbol/1 [length = 4] .align 2 .L155: b .L156 b .L156 b .L156 b .L156 b .L156 b .L156 b .L153 .L166: ldr r3, .L169+20 @ 1003 pic_load_addr_arm [length = 4] ... If compiler is ran with -fverbose-asm, it crashes with segmentation fault ICE: gcc version 3.1 20020122 (experimental) /skiff/local/lib/gcc-lib/arm-linux/3.1/jc1 upstream/src/org/apache/xerces/validators/dtd/DTDGrammar.java -fuse-divide-subroutine -fuse-boehm-gc -fnon-call-exceptions -fkeep-inline-functions -quiet -dumpbase DTDGrammar.java -dp -O2 -O2 -version -fCLASSPATH=upstream/src:./upstream/src -fverbose-asm -fencoding=8859_1 -fassume-compiled -fPIC -MD -MT upstream/src/org/apache/xerces/validators/dtd/lib_org_apache_xerces_la-DTDGrammar.lo -MF upstream/src/org/apache/xerces/validators/dtd/.deps/lib_org_apache_xerces_la-DTDGrammar.TPlo -o DTDGrammar.s GNU Java version 3.1 20020122 (experimental) (arm-linux) compiled by GNU C version 3.0.3. Class path starts here: upstream/src/ ./upstream/src/ ./ /skiff/local/share/libgcj.jar/ (system) (zip) upstream/src/org/apache/xerces/validators/dtd/DTDGrammar.java:174: internal error: Segmentation fault (gdb) where #0 get_mem_expr_from_op (op=0x0, paddressp=0xbfffef98) at ../../gcc/gcc/final.c:3016 #1 0x08127f09 in output_asm_operand_names (operands=0xbffff1b0, oporder=0xbffff050, nops=1) at ../../gcc/gcc/final.c:3061 #2 0x08128053 in output_asm_insn ( template=0xbffff110 "ldm%?%d0fd\t%|sp!, {%|r4, %|r5, %|r6, %|r7, %|r8, %|r9, %|sl, %|pc}", operands=0xbffff1b0) at ../../gcc/gcc/final.c:3289 #3 0x0822130b in output_return_instruction (operand=0x0, really_return=1, reverse=0) at ../../gcc/gcc/config/arm/arm.c:7353 #4 0x0816eeed in output_259 (operands=0x83623c0, insn=0x4039a640) at insn-output.c:1325 #5 0x08126cc4 in get_insn_template (code=259, insn=0x4039a640) at ../../gcc/gcc/final.c:1809 #6 0x0812701c in final_scan_insn (insn=0x4039a640, file=0x8385d88, optimize=2, prescan=0, nopeepholes=0) at ../../gcc/gcc/final.c:2591 #7 0x08126c0a in final (first=0x40396580, file=0x8385d88, optimize=2, prescan=0) at ../../gcc/gcc/final.c:1787 #8 0x081f78b4 in rest_of_compilation (decl=0x401c1d98) at ../../gcc/gcc/toplev.c:3464 #9 0x08063d94 in source_end_java_method () at ../../gcc/gcc/java/parse.y:7457 #10 0x08065ab1 in java_expand_method_bodies (class=0x401ba6cc) at ../../gcc/gcc/java/parse.y:8133 ... File DTDGramma.java from Apache-XML Xerces-Java project attached. Linking passes with -O0, but not with -O1 or -O2 >How-To-Repeat: arm-linux-gcj -fCLASSPATH=upstream/src:./upstream/src -O2 -save-temps -dp -v --encoding=8859_1 -fassume-compiled -O2 -c upstream/src/org/apache/xerces/validators/dtd/DTDGrammar.java -MT upstream/src/org/apache/xerces/validators/dtd/lib_org_apache_xerces_la-DTDGrammar.lo -MD -MP -MF upstream/src/org/apache/xerces/validators/dtd/.deps/lib_org_apache_xerces_la-DTDGrammar.TPlo -fPIC -o upstream/src/org/apache/xerces/validators/dtd/.libs/lib_org_apache_xerces_la-DTDGrammar.lo Have not tried to minimize test-case yet. >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/x-java; name="DTDGrammar.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="DTDGrammar.java" LyoKICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKgogKiBD b3B5cmlnaHQgKGMpIDIwMDAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJp Z2h0cyAKICogcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBw ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1l dDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo ZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKICoKICogMi4gUmVkaXN0cmlidXRpb25zIGlu IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy IGluCiAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk ZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBUaGUgZW5kLXVzZXIgZG9j dW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKICogICAgaWYgYW55 LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogIAogKiAgICAgICAi VGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKICogICAgICAg IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCiAq ICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNv ZnR3YXJlIGl0c2VsZiwKICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNr bm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KICoKICogNC4gVGhlIG5hbWVzICJYZXJjZXMi IGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQg dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNv ZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKICog ICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAqCiAqIDUu IFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJB cGFjaGUiLAogKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRo b3V0IHByaW9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJl IEZvdW5kYXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFO RCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklM SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKICogRElTQ0xBSU1F RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgog KiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO Q0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT IChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7 IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBU SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ LAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg SU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25z IG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBj b3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKICogQnVzaW5lc3MgTWFjaGluZXMsIElu Yy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRo ZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5h cGFjaGUub3JnLz4uCiAqLwoKcGFja2FnZSBvcmcuYXBhY2hlLnhlcmNlcy52YWxpZGF0b3JzLmR0 ZDsKCmltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsOwppbXBvcnQgb3Jn LmFwYWNoZS54ZXJjZXMuZnJhbWV3b3JrLlhNTENvbnRlbnRTcGVjOwppbXBvcnQgb3JnLmFwYWNo ZS54ZXJjZXMuZnJhbWV3b3JrLlhNTERURFNjYW5uZXI7CmltcG9ydCBvcmcuYXBhY2hlLnhlcmNl cy5yZWFkZXJzLlhNTEVudGl0eUhhbmRsZXI7CmltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGls cy5RTmFtZTsKaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLlN0cmluZ1Bvb2w7CmltcG9y dCBvcmcuYXBhY2hlLnhlcmNlcy52YWxpZGF0b3JzLmNvbW1vbi5HcmFtbWFyOwppbXBvcnQgb3Jn LmFwYWNoZS54ZXJjZXMudmFsaWRhdG9ycy5jb21tb24uWE1MQXR0cmlidXRlRGVjbDsKaW1wb3J0 IG9yZy5hcGFjaGUueGVyY2VzLnZhbGlkYXRvcnMuY29tbW9uLlhNTEVsZW1lbnREZWNsOwppbXBv cnQgb3JnLmFwYWNoZS54ZXJjZXMudmFsaWRhdG9ycy5kYXRhdHlwZS5EYXRhdHlwZVZhbGlkYXRv ckZhY3RvcnlJbXBsOwppbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudmFsaWRhdG9ycy5zY2hlbWEu WFV0aWw7CgppbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CmltcG9ydCBvcmcudzNjLmRvbS5F bGVtZW50OwppbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwppbXBvcnQg b3JnLnczYy5kb20uVGV4dDsKCi8qKgogKiBBIERURCBncmFtbWFyLiBUaGlzIGNsYXNzIGlzIGFu IEV2ZW50SGFuZGxlciB0byByZWNlaXZlIGNhbGxiYWNrcyBmcm9tCiAqIHRoZSBYTUxEVERTY2Fu bmVyLiBXaGVuIHRoZSBjYWxsYmFja3MgYXJlIHJlY2VpdmVkLCB0aGUgZ3JhbW1hciBzdHJ1Y3R1 cmVzCiAqIGFyZSBkaXJlY3RseSBwb3B1bGF0ZWQgZnJvbSB0aGUgY2FsbGJhY2sgaW5mb3JtYXRp b24uCiAqIDxwPgogKiBJbiBhZGRpdGlvbiB0byBiZWluZyBhIHJlY2lwaWVudCBvZiBzY2FubmVy IGNhbGxiYWNrcywgdGhlIERURCBncmFtbWFyCiAqIGNsYXNzIGNhbiBhY3QgYXMgYSBwYXNzLXRo cm91Z2ggZmlsdGVyIGZvciB0aGUgRFREIGV2ZW50cy4gVGhpcyBpcyB1c2VmdWwKICogZm9yIHBh cnNlcnMgdGhhdCBtdXN0IGV4cG9zZSB0aGUgRFREIGluZm9ybWF0aW9uIHRvIHRoZSBhcHBsaWNh dGlvbi4gKGUuZy4KICogU0FYMiBEZWNsSGFuZGxlciBjYWxsYmFja3MuKQogKgogKiBAYXV0aG9y IEFuZHkgQ2xhcmsKICogQHZlcnNpb24gJElkOiBEVERHcmFtbWFyLmphdmEsdiAxLjEwIDIwMDEv MDcvMjAgMTc6Mjc6MzggbG1hcnRpbiBFeHAgJAogKi8KcHVibGljIGNsYXNzIERUREdyYW1tYXIK ICAgIGV4dGVuZHMgR3JhbW1hciAKICAgIGltcGxlbWVudHMgWE1MRFREU2Nhbm5lci5FdmVudEhh bmRsZXIgewoKICAgIC8vIFJFVklTSVQ6IFRoZSBncmFtbWFyIGFjY2VzcyBjdXJyZW50bHkgaW1w bGVtZW50ZWQgaW4gdGhpcyBncmFtbWFyCiAgICAvLyAgICAgICAgICBpbnN0YW5jZSBpcyBhIGRy YWZ0IGltcGxlbWVudGF0aW9uIGFuZCBzaG91bGQgYmUgcmV2aXNpdGVkCiAgICAvLyAgICAgICAg ICBpbiBvcmRlciB0byBkZXNpZ24gYSBwcm9wZXIgRFREIGZvciB0aGUgdGhpcyBncmFtbWFyCiAg ICAvLyAgICAgICAgICByZXByZXNlbnRhdGlvbi4gLUFjCgogICAgLy8KICAgIC8vIENvbnN0YW50 cwogICAgLy8KCiAgICAvKiogQ2h1bmsgc2hpZnQuICovCiAgICBwcml2YXRlIHN0YXRpYyBmaW5h bCBpbnQgQ0hVTktfU0hJRlQgPSA4OyAvLyAyXjggPSAyNTYKCiAgICAvKiogQ2h1bmsgc2l6ZS4g Ki8KICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSFVOS19TSVpFID0gKDEgPDwgQ0hVTktf U0hJRlQpOwoKICAgIC8qKiBDaHVuayBtYXNrLiAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwg aW50IENIVU5LX01BU0sgPSBDSFVOS19TSVpFIC0gMTsKCiAgICAvKiogSW5pdGlhbCBjaHVuayBj b3VudC4gKi8KICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0NIVU5LX0NPVU5U ID0gKDEgPDwgKDEwIC0gQ0hVTktfU0hJRlQpKTsgLy8gMl4xMCA9IDFrCgogICAgLy8KICAgIC8v IERhdGEKICAgIC8vCgogICAgLy8gc3RyaW5nIHBvb2wKCiAgICAvKiogU3RyaW5nIHBvb2wuICov CiAgICBwcml2YXRlIFN0cmluZ1Bvb2wgZlN0cmluZ1Bvb2w7CgogICAgLy8gImNvbXBpbGVkIiBp bmZvcm1hdGlvbiBzdHJ1Y3R1cmVzCgogICAgLyoqIEVsZW1lbnQgZGVjbGFyYXRpb24uICovCiAg ICBwcml2YXRlIFhNTEVsZW1lbnREZWNsIGZFbGVtZW50RGVjbCA9IG5ldyBYTUxFbGVtZW50RGVj bCgpOwoKICAgIC8qKiBBdHRyaWJ1dGUgZGVjbGFyYXRpb24uICovCiAgICBwcml2YXRlIFhNTEF0 dHJpYnV0ZURlY2wgZkF0dHJpYnV0ZURlY2wgPSBuZXcgWE1MQXR0cmlidXRlRGVjbCgpOwoKICAg IC8qKiBDb250ZW50IHNwZWMgbm9kZS4gKi8KICAgIHByaXZhdGUgWE1MQ29udGVudFNwZWMgZkNv bnRlbnRTcGVjID0gbmV3IFhNTENvbnRlbnRTcGVjKCk7CgogICAgLy8gZ3JhbW1hciBkb2N1bWVu dAoKICAgIC8qKiBHcmFtbWFyIGRvY3VtZW50LiAqLwogICAgcHJpdmF0ZSBEb2N1bWVudCBmR3Jh bW1hckRvY3VtZW50OwoKICAgIC8qKiBSb290IGVsZW1lbnQuICovCiAgICBwcml2YXRlIEVsZW1l bnQgZlJvb3RFbGVtZW50OwoKICAgIHByaXZhdGUgUU5hbWUgZlJvb3RFbGVtZW50UU5hbWUgPSBu ZXcgUU5hbWUoKTsKCiAgICAvKiogQ3VycmVudCBlbGVtZW50LiAqLwogICAgcHJpdmF0ZSBFbGVt ZW50IGZDdXJyZW50RWxlbWVudDsKCiAgICAvLyBwYXNzLXRocm91Z2gKCiAgICAvKiogZmxhZyBp ZiB0aGUgZWxlbWVudERlY2wgaXMgRXh0ZXJuYWwuICovCiAgICBwcml2YXRlIGludCBmRWxlbWVu dERlY2xJc0V4dGVybmFsW11bXSA9IG5ldyBpbnRbSU5JVElBTF9DSFVOS19DT1VOVF1bXTsKICAg IC8qKiBNYXBwaW5nIGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4gKi8KICAgIHByaXZhdGUgaW50 IGZFbGVtZW50RGVjbE1hcFtdW10gPSBuZXcgaW50W0lOSVRJQUxfQ0hVTktfQ09VTlRdW107Cgog ICAgLyoqIGZsYWcgaWYgdGhlIEF0dHJpYnV0ZURlY2wgaXMgRXh0ZXJuYWwuICovCiAgICBwcml2 YXRlIGludCBmQXR0cmlidXRlRGVjbElzRXh0ZXJuYWxbXVtdID0gbmV3IGludFtJTklUSUFMX0NI VU5LX0NPVU5UXVtdOwogICAgLyoqIE1hcHBpbmcgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMu ICovCiAgICBwcml2YXRlIGludCBmQXR0cmlidXRlRGVjbE1hcFtdW10gPSBuZXcgaW50W0lOSVRJ QUxfQ0hVTktfQ09VTlRdW107CgogICAgLyoqIE1hcHBpbmcgZm9yIGNvbnRlbnQgc3BlYyBub2Rl cy4gKi8KICAgIHByaXZhdGUgaW50IGZDb250ZW50U3BlY01hcFtdW10gPSBuZXcgaW50W0lOSVRJ QUxfQ0hVTktfQ09VTlRdW107CgogICAgLy8gdGVtcCB2YXJzCgogICAgcHJpdmF0ZSBRTmFtZSBm UU5hbWUgPSBuZXcgUU5hbWUoKTsKCiAgICAvLwogICAgLy8gQ29uc3RydWN0b3JzCiAgICAvLwoK ICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLwogICAgcHVibGljIERUREdyYW1tYXIoU3Ry aW5nUG9vbCBzdHJpbmdQb29sKSB7CiAgICAgICAgcmVzZXQoc3RyaW5nUG9vbCk7CiAgICB9Cgog ICAgLy8KICAgIC8vIFB1YmxpYyBtZXRob2RzCiAgICAvLwoKICAgIC8qKiBSZXNldHMgdGhlIERU RCBncmFtbWFyLiAqLwogICAgcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nUG9vbCBzdHJpbmdQb29s KSB7CiAgICAgICAgZlN0cmluZ1Bvb2wgPSBzdHJpbmdQb29sOwogICAgfQoKICAgIC8vCiAgICAv LyBYTUxEVERTY2FubmVyLkV2ZW50SGFuZGxlciBtZXRob2RzCiAgICAvLwoKICAgIC8qKiBTdGFy dCBvZiBEVEQuICovCiAgICBwdWJsaWMgdm9pZCBjYWxsU3RhcnREVEQoKSB0aHJvd3MgRXhjZXB0 aW9uIHsKICAgICAgICAKICAgICAgICAvLyBzZXR1cCBncmFtbWFyIGRvY3VtZW50CiAgICAgICAg c2V0R3JhbW1hckRvY3VtZW50KG51bGwpOwogICAgICAgIGZHcmFtbWFyRG9jdW1lbnQgPSBuZXcg RG9jdW1lbnRJbXBsKCk7CiAgICAgICAgZlJvb3RFbGVtZW50ID0gZkdyYW1tYXJEb2N1bWVudC5j cmVhdGVFbGVtZW50KCJkdGQiKTsKICAgICAgICBmQ3VycmVudEVsZW1lbnQgPSBmUm9vdEVsZW1l bnQ7CgogICAgfSAvLyBjYWxsU3RhcnREVEQoKQoKICAgIC8qKiBFbmQgb2YgRFRELiAqLwogICAg cHVibGljIHZvaWQgY2FsbEVuZERURCgpIHRocm93cyBFeGNlcHRpb24gewoKICAgICAgICAvLyBz ZXQgZ3JhbW1hciBkb2N1bWVudAogICAgICAgIHNldEdyYW1tYXJEb2N1bWVudChmR3JhbW1hckRv Y3VtZW50KTsKCiAgICB9IC8vIGNhbGxFbmREVEQoKQoKICAgIC8qKgogICAgICogU2lnbmFsIHRo ZSBUZXh0IGRlY2xhcmF0aW9uIG9mIGFuIGV4dGVybmFsIGVudGl0eS4KICAgICAqCiAgICAgKiBA cGFyYW0gdmVyc2lvbiB0aGUgaGFuZGxlIGluIHRoZSBzdHJpbmcgcG9vbCBmb3IgdGhlIHZlcnNp b24gbnVtYmVyCiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGhhbmRsZSBpbiB0aGUgc3RyaW5n IHBvb2wgZm9yIHRoZSBlbmNvZGluZwogICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0 aW9uCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIGNhbGxUZXh0RGVjbChpbnQgdmVyc2lvbiwgaW50 IGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKCiAgICAgICAgLy8gY3JlYXRlIHRleHQgZGVj bAogICAgICAgIEVsZW1lbnQgdGV4dERlY2wgPSBmR3JhbW1hckRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoInRleHREZWNsIik7CiAgICAgICAgdGV4dERlY2wuc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwg ZlN0cmluZ1Bvb2wudG9TdHJpbmcodmVyc2lvbikpOwogICAgICAgIHRleHREZWNsLnNldEF0dHJp YnV0ZSgiZW5jb2RpbmciLCBmU3RyaW5nUG9vbC50b1N0cmluZyhlbmNvZGluZykpOwogICAgICAg IGZDdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0RGVjbCk7CgogICAgfSAvLyBjYWxsVGV4 dERlY2woaW50LGludCkKCiAgICAvKioKICAgICAqIENhbGxlZCB3aGVuIHRoZSBkb2N0eXBlIGRl Y2wgaXMgc2Nhbm5lZAogICAgICoKICAgICAqIEBwYXJhbSByb290RWxlbWVudFR5cGUgaGFuZGxl IG9mIHRoZSByb290RWxlbWVudAogICAgICogQHBhcmFtIHB1YmxpY0lkIFN0cmluZ1Bvb2wgaGFu ZGxlIG9mIHRoZSBwdWJsaWMgaWQKICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBTdHJpbmdQb29sIGhh bmRsZSBvZiB0aGUgc3lzdGVtIGlkCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRp b24KICAgICAqLwogICAgcHVibGljIHZvaWQgZG9jdHlwZURlY2woUU5hbWUgcm9vdEVsZW1lbnQs IGludCBwdWJsaWNJZCwgaW50IHN5c3RlbUlkKSAKICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsK CiAgICAgICAgLy8gY3JlYXRlIGRvY3R5cGUgZGVjbAogICAgICAgIEVsZW1lbnQgZG9jdHlwZURl Y2wgPSBmR3JhbW1hckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRvY3R5cGVEZWNsIik7CiAgICAg ICAgZG9jdHlwZURlY2wuc2V0QXR0cmlidXRlKCJuYW1lIiwgZlN0cmluZ1Bvb2wudG9TdHJpbmco cm9vdEVsZW1lbnQucmF3bmFtZSkpOwogICAgICAgIGlmIChyb290RWxlbWVudC51cmkgIT0gU3Ry aW5nUG9vbC5FTVBUWV9TVFJJTkcpIHsKICAgICAgICAgICAgZG9jdHlwZURlY2wuc2V0QXR0cmli dXRlKCJ4bWxuczoiK2ZTdHJpbmdQb29sLnRvU3RyaW5nKHJvb3RFbGVtZW50LnByZWZpeCksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmU3RyaW5nUG9vbC50b1N0cmluZyhy b290RWxlbWVudC51cmkpKTsKICAgICAgICB9CiAgICAgICAgZG9jdHlwZURlY2wuc2V0QXR0cmli dXRlKCJwdWJsaWNJZCIsIGZTdHJpbmdQb29sLnRvU3RyaW5nKHB1YmxpY0lkKSk7CiAgICAgICAg ZG9jdHlwZURlY2wuc2V0QXR0cmlidXRlKCJzeXN0ZW1JZCIsIGZTdHJpbmdQb29sLnRvU3RyaW5n KHN5c3RlbUlkKSk7CiAgICAgICAgZkN1cnJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGRvY3R5cGVE ZWNsKTsKCiAgICAgICAgLy9mUm9vdEVsZW1lbnRRTmFtZS5zZXRWYWx1ZXMoLTEsIHJvb3RFbGVt ZW50LnJhd25hbWUsIC0xLCAtMSk7CiAgICAgICAgZlJvb3RFbGVtZW50UU5hbWUuc2V0VmFsdWVz KHJvb3RFbGVtZW50KTsKCiAgICB9IC8vIGRvY3R5cGVEZWNsKFFOYW1lLGludCxpbnQpOwoKICAg IC8qKgogICAgICogQ2FsbGVkIHdoZW4gdGhlIERURFNjYW5uZXIgc3RhcnRzIHJlYWRpbmcgZnJv bSB0aGUgZXh0ZXJuYWwgc3Vic2V0CiAgICAgKgogICAgICogQHBhcmFtIHB1YmxpY0lkIFN0cmlu Z1Bvb2wgaGFuZGxlIG9mIHRoZSBwdWJsaWMgaWQKICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBTdHJp bmdQb29sIGhhbmRsZSBvZiB0aGUgc3lzdGVtIGlkCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFu Zy5FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIHZvaWQgc3RhcnRSZWFkaW5nRnJvbUV4dGVy bmFsU3Vic2V0KGludCBwdWJsaWNJZCwgaW50IHN5c3RlbUlkKSAKICAgICAgICB0aHJvd3MgRXhj ZXB0aW9uIHsKCiAgICAgICAgLy8gY3JlYXRlIGV4dGVybmFsIHN1YnNldAogICAgICAgIEVsZW1l bnQgZXh0ZXJuYWxTdWJzZXQgPSBmR3JhbW1hckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImV4dGVy bmFsIik7CiAgICAgICAgZXh0ZXJuYWxTdWJzZXQuc2V0QXR0cmlidXRlKCJwdWJsaWNJZCIsIGZT dHJpbmdQb29sLnRvU3RyaW5nKHB1YmxpY0lkKSk7CiAgICAgICAgZXh0ZXJuYWxTdWJzZXQuc2V0 QXR0cmlidXRlKCJzeXN0ZW1JZCIsIGZTdHJpbmdQb29sLnRvU3RyaW5nKHN5c3RlbUlkKSk7CiAg ICAgICAgZkN1cnJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGV4dGVybmFsU3Vic2V0KTsKICAgICAg ICBmQ3VycmVudEVsZW1lbnQgPSBleHRlcm5hbFN1YnNldDsKCiAgICB9IC8vIHN0YXJ0UmVhZGlu Z0Zyb21FeHRlcm5hbFN1YnNldChpbnQsaW50KQoKICAgIC8qKgogICAgICogQ2FsbGVkIHdoZW4g dGhlIERURFNjYW5uZXIgc3RvcCByZWFkaW5nIGZyb20gdGhlIGV4dGVybmFsIHN1YnNldAogICAg ICoKICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgogICAgICovCiAgICBwdWJs aWMgdm9pZCBzdG9wUmVhZGluZ0Zyb21FeHRlcm5hbFN1YnNldCgpIHRocm93cyBFeGNlcHRpb24g ewoKICAgICAgICAvLyBnZXQgb3V0IG9mIGV4dGVybmFsIHN1YnNldAogICAgICAgIGZDdXJyZW50 RWxlbWVudCA9IChFbGVtZW50KWZDdXJyZW50RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7CgogICAg fSAvLyBzdG9wUmVhZGluZ0Zyb21FeHRlcm5hbFN1YnNldCgpCgogICAgLyoqCiAgICAgKiBBZGQg YW4gZWxlbWVudCBkZWNsYXJhdGlvbiAoZm9yd2FyZCByZWZlcmVuY2UpCiAgICAgKgogICAgICog QHBhcmFtIGhhbmRsZSB0byB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBkZWNsYXJlZAog ICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIGVsZW1lbnQgd2hvc2UgZGVjbGFyYXRpb24gd2Fz IGFkZGVkCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24KICAgICAqLwogICAg cHVibGljIGludCBhZGRFbGVtZW50RGVjbChRTmFtZSBlbGVtZW50RGVjbCkgdGhyb3dzIEV4Y2Vw dGlvbiB7CgogICAgICAgIC8vIGNyZWF0ZSBlbGVtZW50IGRlY2wgZWxlbWVudAogICAgICAgIEVs ZW1lbnQgZWxlbWVudERlY2xFbGVtZW50ID0gZkdyYW1tYXJEb2N1bWVudC5jcmVhdGVFbGVtZW50 KCJlbGVtZW50RGVjbCIpOwogICAgICAgIGVsZW1lbnREZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUo Im5hbWUiLCBmU3RyaW5nUG9vbC50b1N0cmluZyhlbGVtZW50RGVjbC5sb2NhbHBhcnQpKTsKICAg ICAgICBpZiAoZWxlbWVudERlY2wudXJpICE9IFN0cmluZ1Bvb2wuRU1QVFlfU1RSSU5HKSB7CiAg ICAgICAgICAgIGVsZW1lbnREZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIrZlN0cmlu Z1Bvb2wudG9TdHJpbmcoZWxlbWVudERlY2wucHJlZml4KSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBmU3RyaW5nUG9vbC50b1N0cmluZyhlbGVtZW50RGVjbC51 cmkpKTsKICAgICAgICB9CiAgICAgICAgZkN1cnJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1l bnREZWNsRWxlbWVudCk7CgogICAgICAgIC8vIGNyZWF0ZSBlbGVtZW50IGRlY2wKICAgICAgICBp bnQgZWxlbWVudERlY2xJbmRleCA9IGNyZWF0ZUVsZW1lbnREZWNsKCk7CgogICAgICAgIC8vIHNl dCBlbGVtZW50IGRlY2wgdmFsdWVzCiAgICAgICAgZkVsZW1lbnREZWNsLmNsZWFyKCk7CiAgICAg ICAgZkVsZW1lbnREZWNsLm5hbWUuc2V0VmFsdWVzKGVsZW1lbnREZWNsKTsKICAgICAgICBzZXRF bGVtZW50RGVjbChlbGVtZW50RGVjbEluZGV4LCBmRWxlbWVudERlY2wpOwoKICAgICAgICAvLyBy ZXR1cm4gaW5kZXgKICAgICAgICByZXR1cm4gZWxlbWVudERlY2xJbmRleDsKCiAgICB9IC8vIGFk ZEVsZW1lbnREZWNsKFFOYW1lKTppbnQKCiAgICAvKioKICAgICAqIEFkZCBhbiBlbGVtZW50IGRl Y2xhcmF0aW9uCiAgICAgKgogICAgICogQHBhcmFtIGhhbmRsZSB0byB0aGUgbmFtZSBvZiB0aGUg ZWxlbWVudCBiZWluZyBkZWNsYXJlZAogICAgICogQHBhcmFtIGNvbnRlbnRTcGVjVHlwZSBoYW5k bGUgdG8gdGhlIHR5cGUgbmFtZSBvZiB0aGUgY29udGVudCBzcGVjCiAgICAgKiBAcGFyYW0gQ29u dGVudFNwZWMgaGFuZGxlIHRvIHRoZSBjb250ZW50IHNwZWMgbm9kZSBmb3IgdGhlIGNvbnRlbnRT cGVjVHlwZQogICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24g dGhhdCB3YXMgYWRkZWQgCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24KICAg ICAqLwogICAgcHVibGljIGludCBhZGRFbGVtZW50RGVjbChRTmFtZSBlbGVtZW50RGVjbCwgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZW50U3BlY1R5cGUsIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudFNwZWMsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGJvb2xlYW4gaXNFeHRlcm5hbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgogICAg ICAgIC8vIGNyZWF0ZSBlbGVtZW50IGRlY2wgZWxlbWVudAogICAgICAgIEVsZW1lbnQgZWxlbWVu dERlY2xFbGVtZW50ID0gZkdyYW1tYXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJlbGVtZW50RGVj bCIpOwogICAgICAgIGVsZW1lbnREZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmU3Ry aW5nUG9vbC50b1N0cmluZyhlbGVtZW50RGVjbC5sb2NhbHBhcnQpKTsKICAgICAgICBpZiAoZWxl bWVudERlY2wudXJpICE9IFN0cmluZ1Bvb2wuRU1QVFlfU1RSSU5HKSB7CiAgICAgICAgICAgIGVs ZW1lbnREZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIrZlN0cmluZ1Bvb2wudG9TdHJp bmcoZWxlbWVudERlY2wucHJlZml4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBmU3RyaW5nUG9vbC50b1N0cmluZyhlbGVtZW50RGVjbC51cmkpKTsKICAgICAg ICB9CiAgICAgICAgZWxlbWVudERlY2xFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIGZTdHJp bmdQb29sLnRvU3RyaW5nKGNvbnRlbnRTcGVjVHlwZSkpOwogICAgICAgIC8vIFJFVklTSVQ6IFRy YXZlcnNlIGNvbnRlbnQgc3BlYyBzdHJ1Y3R1cmUsIGJ1aWxkaW5nIGNvbnRlbnQgbW9kZWwKICAg ICAgICAvLyAgICAgICAgICBkZXNjcmlwdGlvbiB0byBwdXQgaW50byBncmFtbWFyIGRvY3VtZW50 LgogICAgICAgIGZDdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50RGVjbEVsZW1lbnQp OwoKICAgICAgICAvLyBjcmVhdGUgZWxlbWVudCBkZWNsCiAgICAgICAgaW50IGVsZW1lbnREZWNs SW5kZXggPSBjcmVhdGVFbGVtZW50RGVjbCgpOwoKICAgICAgICAvLyBzZXQgZWxlbWVudCBkZWNs IHZhbHVlcwogICAgICAgIGZFbGVtZW50RGVjbC5jbGVhcigpOwogICAgICAgIGZFbGVtZW50RGVj bC5uYW1lLnNldFZhbHVlcyhlbGVtZW50RGVjbCk7CiAgICAgICAgZkVsZW1lbnREZWNsLnR5cGUg PSBjb250ZW50U3BlY1R5cGU7CiAgICAgICAgZkVsZW1lbnREZWNsLmNvbnRlbnRTcGVjSW5kZXgg PSBjb250ZW50U3BlYzsKICAgICAgICBzZXRFbGVtZW50RGVjbChlbGVtZW50RGVjbEluZGV4LCBm RWxlbWVudERlY2wpOwogICAgICAgIAogICAgICAgIGludCBjaHVuayA9IGVsZW1lbnREZWNsSW5k ZXggPj4gQ0hVTktfU0hJRlQ7CiAgICAgICAgaW50IGluZGV4ID0gZWxlbWVudERlY2xJbmRleCAm IENIVU5LX01BU0s7CiAgICAgICAgZW5zdXJlRWxlbWVudERlY2xDYXBhY2l0eShjaHVuayk7CiAg ICAgICAgZkVsZW1lbnREZWNsSXNFeHRlcm5hbFtjaHVua11baW5kZXhdID0gaXNFeHRlcm5hbD8g MSA6IDA7CgogICAgICAgIC8vIHJldHVybiBpbmRleAogICAgICAgIHJldHVybiBlbGVtZW50RGVj bEluZGV4OwoKICAgIH0gLy8gYWRkRWxlbWVudERlY2woUU5hbWUsaW50LGludCk6aW50CgogICAg cHJvdGVjdGVkIHZvaWQgcHV0RWxlbWVudE5hbWVNYXBwaW5nKFFOYW1lIG5hbWUsIGludCBzY29w ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxlbWVudERl Y2xJbmRleCkgewogICAgICAgIGZRTmFtZS51cmkgPSBTdHJpbmdQb29sLkVNUFRZX1NUUklORzsK ICAgICAgICBmUU5hbWUubG9jYWxwYXJ0ID0gbmFtZS5yYXduYW1lOwogICAgICAgIHN1cGVyLnB1 dEVsZW1lbnROYW1lTWFwcGluZyhmUU5hbWUsIHNjb3BlLCBlbGVtZW50RGVjbEluZGV4KTsKICAg IH0KCiAgICAvKioqCiAgICBwdWJsaWMgaW50IGdldEVsZW1lbnREZWNsSW5kZXgoaW50IGxvY2Fs cGFydEluZGV4LCBpbnQgc2NvcGVJbmRleCkgewogICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxu KCJnZXRFbGVtZW50RGVjbEluZGV4OiAiK2xvY2FscGFydEluZGV4KyIsICIrc2NvcGVJbmRleCk7 CiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnREZWNsSW5kZXgobG9jYWxwYXJ0SW5kZXgs IHNjb3BlSW5kZXgpOwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0RWxlbWVudERlY2xJbmRleChp bnQgdXJpSW5kZXgsIGludCBsb2NhbHBhcnRJbmRleCwgaW50IHNjb3BlSW5kZXgpIHsKICAgICAg ICAvL1N5c3RlbS5vdXQucHJpbnRsbigiISEhIGdldEVsZW1lbnREZWNsSW5kZXg6ICIrdXJpSW5k ZXgrIiwgIitsb2NhbHBhcnRJbmRleCsiLCAiK3Njb3BlSW5kZXgpOwogICAgICAgIHJldHVybiBz dXBlci5nZXRFbGVtZW50RGVjbEluZGV4KGxvY2FscGFydEluZGV4LCAtMSk7CiAgICB9CiAgICAv KioqLwogICAgCiAgICBwdWJsaWMgaW50IGdldEVsZW1lbnREZWNsSW5kZXgoUU5hbWUgZWxlbWVu dCwgaW50IHNjb3BlSW5kZXgpIHsKICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxl bWVudERlY2xJbmRleDogIitlbGVtZW50KyIsICIrc2NvcGVJbmRleCk7CiAgICAgICAgcmV0dXJu IHN1cGVyLmdldEVsZW1lbnREZWNsSW5kZXgoZWxlbWVudC5yYXduYW1lLCAtMSk7CiAgICB9Cgog ICAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xEVEQoaW50IGVsZW1lbnREZWNsSW5kZXgsIFhN TEVsZW1lbnREZWNsIGVsZW1lbnREZWNsKSB7CiAgICAgICAgc3VwZXIuc2V0RWxlbWVudERlY2wo ZWxlbWVudERlY2xJbmRleCwgZWxlbWVudERlY2wpOwogICAgfQoKICAgIHByaXZhdGUgWE1MQ29u dGVudFNwZWMgZlRlbXBDb250ZW50U3BlYyA9IG5ldyBYTUxDb250ZW50U3BlYygpOwoKICAgIC8q KioKICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRTcGVjTGVhZihpbnQgY29udGVudFNwZWNJbmRl eCwgUU5hbWUgZWxlbWVudE5hbWUpIHsKICAgICAgICBmVGVtcENvbnRlbnRTcGVjLnNldFZhbHVl cyhYTUxDb250ZW50U3BlYy5DT05URU5UU1BFQ05PREVfTEVBRiwgZWxlbWVudE5hbWUucmF3bmFt ZSwgLTEpOwogICAgICAgIHN1cGVyLnNldENvbnRlbnRTcGVjKGNvbnRlbnRTcGVjSW5kZXgsIGZU ZW1wQ29udGVudFNwZWMpOwogICAgfQogICAgLyoqKi8KCiAgICBwdWJsaWMgdm9pZCBzZXRFbGVt ZW50RGVjbElzRXh0ZXJuYWwoaW50IGVsZW1lbnREZWNsSW5kZXgsIGJvb2xlYW4gIGlzRXh0ZXJu YWwpIHsKICAgICAgICBpbnQgY2h1bmsgPSBlbGVtZW50RGVjbEluZGV4ID4+IENIVU5LX1NISUZU OwogICAgICAgIGludCBpbmRleCA9IGVsZW1lbnREZWNsSW5kZXggJiBDSFVOS19NQVNLOwogICAg ICAgIGVuc3VyZUVsZW1lbnREZWNsQ2FwYWNpdHkoY2h1bmspOwogICAgICAgIGZFbGVtZW50RGVj bElzRXh0ZXJuYWxbY2h1bmtdW2luZGV4XSA9IGlzRXh0ZXJuYWw/IDEgOiAwOwogICAgfQoKICAg IC8vIGdldHRlcnMgZm9yIGlzRXh0ZXJuYWxzIAogICAgcHVibGljIGJvb2xlYW4gZ2V0RWxlbWVu dERlY2xJc0V4dGVybmFsKGludCBlbGVtZW50RGVjbEluZGV4KSB7CiAgICAgICAgaWYgKGVsZW1l bnREZWNsSW5kZXggPCAwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAg ICAgICAgaW50IGNodW5rID0gZWxlbWVudERlY2xJbmRleCA+PiBDSFVOS19TSElGVDsKICAgICAg ICBpbnQgaW5kZXggPSBlbGVtZW50RGVjbEluZGV4ICYgQ0hVTktfTUFTSzsKICAgICAgICByZXR1 cm4gKGZFbGVtZW50RGVjbElzRXh0ZXJuYWxbY2h1bmtdW2luZGV4XSAhPSAwKTsKICAgIH0KCiAg ICBwdWJsaWMgYm9vbGVhbiBnZXRBdHRyaWJ1dGVEZWNsSXNFeHRlcm5hbChpbnQgYXR0cmlidXRl RGVjbEluZGV4KSB7CiAgICAgICAgaWYgKGF0dHJpYnV0ZURlY2xJbmRleCA8IDApIHsKICAgICAg ICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpbnQgY2h1bmsgPSBhdHRyaWJ1 dGVEZWNsSW5kZXggPj4gQ0hVTktfU0hJRlQ7CiAgICAgICAgaW50IGluZGV4ID0gYXR0cmlidXRl RGVjbEluZGV4ICYgQ0hVTktfTUFTSzsKICAgICAgICByZXR1cm4gKGZBdHRyaWJ1dGVEZWNsSXNF eHRlcm5hbFtjaHVua11baW5kZXhdICE9IDApOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIGdl dFJvb3RFbGVtZW50UU5hbWUoUU5hbWUgcm9vdCkgewogICAgICAgIGlmIChmUm9vdEVsZW1lbnRR TmFtZS5yYXduYW1lID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9 CiAgICAgICAgcm9vdC5zZXRWYWx1ZXMoZlJvb3RFbGVtZW50UU5hbWUpOwogICAgICAgIHJldHVy biB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9u CiAgICAgKgogICAgICogQHBhcmFtIGhhbmRsZSB0byB0aGUgZWxlbWVudCB3aG9zZSBhdHRyaWJ1 dGUgaXMgYmVpbmcgZGVjbGFyZWQKICAgICAqIEBwYXJhbSBhdHROYW1lIFN0cmluZ1Bvb2wgaGFu ZGxlIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZSBiZWluZyBkZWNsYXJlZAogICAgICogQHBhcmFtIGF0 dFR5cGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlCiAgICAgKiBAcGFyYW0gZW51bWVyYXRpb24gU3Ry aW5nUG9vbCBoYW5kbGUgb2YgdGhlIGF0dHJpYnV0ZSdzIGVudW1lcmF0aW9uIGxpc3QgKGlmIGFu eSkKICAgICAqIEBwYXJhbSBhdHREZWZhdWx0VHlwZSBhbiBpbnRlZ2VyIHZhbHVlIGRlbm90aW5n IHRoZSBEZWZhdWx0RGVjbCB2YWx1ZQogICAgICogQHBhcmFtIGF0dERlZmF1bHRWYWx1ZSBTdHJp bmdQb29sIGhhbmRsZSBvZiB0aGlzIGF0dHJpYnV0ZSdzIGRlZmF1bHQgdmFsdWUKICAgICAqIEBy ZXR1cm4gaGFuZGxlIHRvIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbgogICAgICogQGV4Y2VwdGlv biBqYXZhLmxhbmcuRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBpbnQgYWRkQXR0RGVmKFFO YW1lIGVsZW1lbnREZWNsLCBRTmFtZSBhdHRyaWJ1dGVEZWNsLCAKICAgICAgICAgICAgICAgICAg ICAgICAgIGludCBhdHRUeXBlLCBib29sZWFuIGF0dExpc3QsIGludCBlbnVtZXJhdGlvbiwgCiAg ICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0RGVmYXVsdFR5cGUsIGludCBhdHREZWZhdWx0 VmFsdWUsIGJvb2xlYW4gaXNFeHRlcm5hbCkgCiAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAg ICAgICAgLyoqKioKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLWFkZCBhdHRyLS0tICIr YXR0cmlidXRlRGVjbC5sb2NhbHBhcnQKICAgICAgICAgICAgICAgICAgKyIsIithdHRUeXBlICAg ICAgICAKICAgICAgICAgICAgICAgICAgKyIsIithdHREZWZhdWx0VHlwZSAgICAgICAgCiAgICAg ICAgICAgICAgICAgICsiLCIraXNFeHRlcm5hbCk7CiAgICAgICAgIC8qKioqLwoKICAgICAgICAv LyBjcmVhdGUgYXR0cmlidXRlIGRlY2wgZWxlbWVudAogICAgICAgIEVsZW1lbnQgYXR0cmlidXRl RGVjbEVsZW1lbnQgPSBmR3JhbW1hckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImF0dHJpYnV0ZURl Y2wiKTsKICAgICAgICBhdHRyaWJ1dGVEZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoImVsZW1lbnQi LCBmU3RyaW5nUG9vbC50b1N0cmluZyhlbGVtZW50RGVjbC5sb2NhbHBhcnQpKTsKICAgICAgICBh dHRyaWJ1dGVEZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmU3RyaW5nUG9vbC50b1N0 cmluZyhhdHRyaWJ1dGVEZWNsLmxvY2FscGFydCkpOwogICAgICAgIGlmIChhdHRyaWJ1dGVEZWNs LnVyaSAhPSBTdHJpbmdQb29sLkVNUFRZX1NUUklORykgewogICAgICAgICAgICBhdHRyaWJ1dGVE ZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIrZlN0cmluZ1Bvb2wudG9TdHJpbmcoYXR0 cmlidXRlRGVjbC5wcmVmaXgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZlN0cmluZ1Bvb2wudG9TdHJpbmcoYXR0cmlidXRlRGVjbC51cmkpKTsKICAgICAg ICB9CiAgICAgICAgYXR0cmlidXRlRGVjbEVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgZlN0 cmluZ1Bvb2wudG9TdHJpbmcoYXR0VHlwZSkpOwogICAgICAgIC8vIFJFVklTSVQ6IEFkZCBlbnVt ZXJhdGlvbiBpbmZvcm1hdGlvbiB0byBncmFtbWFyIGRvY3VtZW50LgogICAgICAgIC8vIFJFVklT SVQ6IERvIHRoZSBkZWZhdWx0IHR5cGUsIHZhbHVlIGJldHRlci4KICAgICAgICBhdHRyaWJ1dGVE ZWNsRWxlbWVudC5zZXRBdHRyaWJ1dGUoImRlZmF1bHRUeXBlIiwgZlN0cmluZ1Bvb2wudG9TdHJp bmcoYXR0RGVmYXVsdFR5cGUpKTsKICAgICAgICBhdHRyaWJ1dGVEZWNsRWxlbWVudC5zZXRBdHRy aWJ1dGUoImRlZmF1bHRWYWx1ZSIsIGZTdHJpbmdQb29sLnRvU3RyaW5nKGF0dERlZmF1bHRWYWx1 ZSkpOwogICAgICAgIGZDdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChhdHRyaWJ1dGVEZWNsRWxl bWVudCk7CgogICAgICAgIC8vIGNyZWF0ZSBhdHRyaWJ1dGUgZGVjbAogICAgICAgIGludCBhdHRy aWJ1dGVEZWNsSW5kZXggPSBjcmVhdGVBdHRyaWJ1dGVEZWNsKCk7CgogICAgICAgIC8vIGZpbmQg dGhlIGRhdGFUeXBlVmFsaWRhdG9yIGFzc29jaWNhdGVkIHdpdGggdGhpcyBhdHRUeXBlCiAgICAg ICAgU3RyaW5nIGF0dFR5cGVTdHJpbmcgPSAiIjsKICAgICAgICBzd2l0Y2ggKGF0dFR5cGUpIHsK ICAgICAgICBjYXNlIFhNTEF0dHJpYnV0ZURlY2wuVFlQRV9DREFUQToKICAgICAgICAgICAgYXR0 VHlwZVN0cmluZyA9ICJzdHJpbmciOwogICAgICAgIGNhc2UgWE1MQXR0cmlidXRlRGVjbC5UWVBF X0VOVElUWToKICAgICAgICAgICAgYXR0VHlwZVN0cmluZyA9ICJFTlRJVFkiOzsKICAgICAgICBj YXNlIFhNTEF0dHJpYnV0ZURlY2wuVFlQRV9FTlVNRVJBVElPTjoKICAgICAgICAgICAgYXR0VHlw ZVN0cmluZyA9ICJFTlVNRVJBVElPTiI7OwogICAgICAgIGNhc2UgWE1MQXR0cmlidXRlRGVjbC5U WVBFX0lEOgogICAgICAgICAgICBhdHRUeXBlU3RyaW5nID0gIklEIjs7CiAgICAgICAgY2FzZSBY TUxBdHRyaWJ1dGVEZWNsLlRZUEVfSURSRUY6CiAgICAgICAgICAgIGF0dFR5cGVTdHJpbmcgPSAi SURSRUYiOzsKICAgICAgICBjYXNlIFhNTEF0dHJpYnV0ZURlY2wuVFlQRV9OTVRPS0VOOgogICAg ICAgICAgICBhdHRUeXBlU3RyaW5nID0gIk5NVE9LRU4iOzsKICAgICAgICBjYXNlIFhNTEF0dHJp YnV0ZURlY2wuVFlQRV9OT1RBVElPTjoKICAgICAgICAgICAgYXR0VHlwZVN0cmluZyA9ICJOT1RB VElPTiI7OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIDsKICAgICAgICB9CgogICAgICAg IC8vIHNldCBhdHRyaWJ1dGUgZGVjbCB2YWx1ZXMKICAgICAgICBmQXR0cmlidXRlRGVjbC5jbGVh cigpOwogICAgICAgIGZBdHRyaWJ1dGVEZWNsLm5hbWUuc2V0VmFsdWVzKGF0dHJpYnV0ZURlY2wp OwogICAgICAgIGZBdHRyaWJ1dGVEZWNsLnR5cGUgPSBhdHRUeXBlOwogICAgICAgIGZBdHRyaWJ1 dGVEZWNsLmxpc3QgPSBhdHRMaXN0OwogICAgICAgIGZBdHRyaWJ1dGVEZWNsLmVudW1lcmF0aW9u ID0gZW51bWVyYXRpb247CiAgICAgICAgLyoqKgogICAgICAgIGZBdHRyaWJ1dGVEZWNsLmRhdGF0 eXBlVmFsaWRhdG9yID0gCiAgICAgICAgICAgIERhdGF0eXBlVmFsaWRhdG9yRmFjdG9yeUltcGwu Z2V0RGF0YXR5cGVSZWdpc3RyeSgpLmdldERhdGF0eXBlVmFsaWRhdG9yKGF0dFR5cGVTdHJpbmcp OwogICAgICAgICoqKiovCiAgICAgICAgZkF0dHJpYnV0ZURlY2wuZGVmYXVsdFR5cGUgPSBhdHRE ZWZhdWx0VHlwZTsKICAgICAgICBmQXR0cmlidXRlRGVjbC5kZWZhdWx0VmFsdWUgPSBmU3RyaW5n UG9vbC50b1N0cmluZyhhdHREZWZhdWx0VmFsdWUpOwoKICAgICAgICBpbnQgZWxlbWVudERlY2xJ bmRleCA9IGdldEVsZW1lbnREZWNsSW5kZXgoZWxlbWVudERlY2wsIC0xKTsKICAgICAgICBzZXRB dHRyaWJ1dGVEZWNsKGVsZW1lbnREZWNsSW5kZXgsIGF0dHJpYnV0ZURlY2xJbmRleCwgZkF0dHJp YnV0ZURlY2wpOwoKICAgICAgICBpbnQgY2h1bmsgPSBhdHRyaWJ1dGVEZWNsSW5kZXggPj4gQ0hV TktfU0hJRlQ7CiAgICAgICAgaW50IGluZGV4ID0gYXR0cmlidXRlRGVjbEluZGV4ICYgQ0hVTktf TUFTSzsKICAgICAgICBlbnN1cmVBdHRyaWJ1dGVEZWNsQ2FwYWNpdHkoY2h1bmspOwogICAgICAg IGZBdHRyaWJ1dGVEZWNsSXNFeHRlcm5hbFtjaHVua11baW5kZXhdID0gaXNFeHRlcm5hbCA/ICAx IDogMDsKCiAgICAgICAgLy8gcmV0dXJuIGluZGV4CiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZURl Y2xJbmRleDsKCiAgICB9IC8vIGFkZEF0dERlZihRTmFtZSxRTmFtZSxpbnQsaW50LGludCxpbnQp OmludAoKICAgIC8qKgogICAgICogY3JlYXRlIGFuIFhNTENvbnRlbnRTcGVjIGZvciBhIGxlYWYK ICAgICAqCiAgICAgKiBAcGFyYW0gbmFtZUluZGV4IFN0cmluZ1Bvb2wgaGFuZGxlIHRvIHRoZSBu YW1lIChFbGVtZW50KSBmb3IgdGhlIG5vZGUKICAgICAqIEByZXR1cm4gaGFuZGxlIHRvIHRoZSBu ZXdseSBjcmVhdGUgWE1MQ29udGVudFNwZWMKICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4 Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgaW50IGFkZFVuaXF1ZUxlYWZOb2RlKGludCBuYW1l SW5kZXgpIHRocm93cyBFeGNlcHRpb24gewoKICAgICAgICAvLyBjcmVhdGUgY29udGVudCBzcGVj IG5vZGUKICAgICAgICBpbnQgY29udGVudFNwZWNJbmRleCA9IGNyZWF0ZUNvbnRlbnRTcGVjKCk7 CgogICAgICAgIC8vIHNldCBjb250ZW50IHNwZWMgbm9kZSB2YWx1ZXMKICAgICAgICBmQ29udGVu dFNwZWMuc2V0VmFsdWVzKFhNTENvbnRlbnRTcGVjLkNPTlRFTlRTUEVDTk9ERV9MRUFGLCAKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCwgLTEpOwogICAgICAgIHNldENv bnRlbnRTcGVjKGNvbnRlbnRTcGVjSW5kZXgsIGZDb250ZW50U3BlYyk7CgogICAgICAgIC8vIHJl dHVybiBpbmRleCAKICAgICAgICByZXR1cm4gY29udGVudFNwZWNJbmRleDsKCiAgICB9IC8vIGFk ZFVuaXF1ZUxlYWZOb2RlKGludCk6aW50CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYW4gWE1MQ29u dGVudFNwZWMgZm9yIGEgc2luZ2xlIG5vbi1sZWFmCiAgICAgKiAKICAgICAqIEBwYXJhbSBub2Rl VHlwZSB0aGUgdHlwZSBvZiBYTUxDb250ZW50U3BlYyB0byBjcmVhdGUgLSBmcm9tIFhNTENvbnRl bnRTcGVjLkNPTlRFTlRTUEVDTk9ERV8qCiAgICAgKiBAcGFyYW0gbm9kZVZhbHVlIGhhbmRsZSB0 byBhbiBYTUxDb250ZW50U3BlYwogICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIG5ld2x5IGNy ZWF0ZSBYTUxDb250ZW50U3BlYwogICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9u CiAgICAgKi8KICAgIHB1YmxpYyBpbnQgYWRkQ29udGVudFNwZWNOb2RlKGludCBub2RlVHlwZSwg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9kZVZhbHVlKSB0aHJvd3Mg RXhjZXB0aW9uIHsKCiAgICAgICAgLy8gY3JlYXRlIGNvbnRlbnQgc3BlYyBub2RlCiAgICAgICAg aW50IGNvbnRlbnRTcGVjSW5kZXggPSBjcmVhdGVDb250ZW50U3BlYygpOwoKICAgICAgICAvLyBz ZXQgY29udGVudCBzcGVjIG5vZGUgdmFsdWVzCiAgICAgICAgZkNvbnRlbnRTcGVjLnNldFZhbHVl cyhub2RlVHlwZSwgbm9kZVZhbHVlLCAtMSk7CiAgICAgICAgc2V0Q29udGVudFNwZWMoY29udGVu dFNwZWNJbmRleCwgZkNvbnRlbnRTcGVjKTsKCiAgICAgICAgLy8gcmV0dXJuIGluZGV4IAogICAg ICAgIHJldHVybiBjb250ZW50U3BlY0luZGV4OwoKICAgIH0gLy8gYWRkQ29udGVudFNwZWNOb2Rl KGludCxpbnQpOmludAoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIFhNTENvbnRlbnRTcGVjIGZv ciBhIHR3byBjaGlsZCBsZWFmCiAgICAgKgogICAgICogQHBhcmFtIG5vZGVUeXBlIHRoZSB0eXBl IG9mIFhNTENvbnRlbnRTcGVjIHRvIGNyZWF0ZSAtIGZyb20gWE1MQ29udGVudFNwZWMuQ09OVEVO VFNQRUNOT0RFXyoKICAgICAqIEBwYXJhbSBsZWZ0Tm9kZUluZGV4IGhhbmRsZSB0byBhbiBYTUxD b250ZW50U3BlYwogICAgICogQHBhcmFtIHJpZ2h0Tm9kZUluZGV4IGhhbmRsZSB0byBhbiBYTUxD b250ZW50U3BlYwogICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIG5ld2x5IGNyZWF0ZSBYTUxD b250ZW50U3BlYwogICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9uCiAgICAgKi8K ICAgIHB1YmxpYyBpbnQgYWRkQ29udGVudFNwZWNOb2RlKGludCBub2RlVHlwZSwgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE5vZGVJbmRleCwgCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHROb2RlSW5kZXgpIHRocm93cyBFeGNlcHRp b24gewoKICAgICAgICAvLyBjcmVhdGUgY29udGVudCBzcGVjIG5vZGUKICAgICAgICBpbnQgY29u dGVudFNwZWNJbmRleCA9IGNyZWF0ZUNvbnRlbnRTcGVjKCk7CgogICAgICAgIC8vIHNldCBjb250 ZW50IHNwZWMgbm9kZSB2YWx1ZXMKICAgICAgICBmQ29udGVudFNwZWMuc2V0VmFsdWVzKG5vZGVU eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnROb2RlSW5kZXgsIHJpZ2h0 Tm9kZUluZGV4KTsKICAgICAgICBzZXRDb250ZW50U3BlYyhjb250ZW50U3BlY0luZGV4LCBmQ29u dGVudFNwZWMpOwoKICAgICAgICAvLyByZXR1cm4gaW5kZXggCiAgICAgICAgcmV0dXJuIGNvbnRl bnRTcGVjSW5kZXg7CgogICAgfSAvLyBhZGRDb250ZW50U3BlY05vZGUoaW50LGludCxpbnQpOmlu dAoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIFhN TENvbnRlbnRTcGVjIHRyZWUKICAgICAqIAogICAgICogQHBhcmFtIGhhbmRsZSB0byBhbiBYTUxD b250ZW50U3BlYwogICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNv bnRlbnQgc3BlYyB0cmVlCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24KICAg ICAqLwogICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50U3BlY05vZGVBc1N0cmluZyhpbnQgbm9k ZUluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICByZXR1cm4gWE1MQ29udGVudFNwZWMu dG9TdHJpbmcodGhpcywgZlN0cmluZ1Bvb2wsIG5vZGVJbmRleCk7CiAgICB9CgogICAgLyoqCiAg ICAgKiBTdGFydCB0aGUgc2NvcGUgb2YgYW4gZW50aXR5IGRlY2xhcmF0aW9uLgogICAgICoKICAg ICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gb24gc3VjY2Vzczsgb3RoZXJ3aXNlCiAgICAg KiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZW50aXR5IGRlY2xhcmF0aW9uIGlz IHJlY3Vyc2l2ZS4KICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgogICAgICov CiAgICBwdWJsaWMgYm9vbGVhbiBzdGFydEVudGl0eURlY2woYm9vbGVhbiBpc1BFLCBpbnQgZW50 aXR5TmFtZSkgCiAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CgogICAgICAgIC8vIGNyZWF0ZSBl bnRpdHkgZGVjbAogICAgICAgIEVsZW1lbnQgZW50aXR5RGVjbCA9IGZHcmFtbWFyRG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgiZW50aXR5RGVjbCIpOwogICAgICAgIGVudGl0eURlY2wuc2V0QXR0cmli dXRlKCJuYW1lIiwgZlN0cmluZ1Bvb2wudG9TdHJpbmcoZW50aXR5TmFtZSkpOwogICAgICAgIGVu dGl0eURlY2wuc2V0QXR0cmlidXRlKCJwYXJhbWV0ZXIiLCBpc1BFID8gInRydWUiIDogImZhbHNl Iik7CiAgICAgICAgZkN1cnJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVudGl0eURlY2wpOwogICAg ICAgIGZDdXJyZW50RWxlbWVudCA9IGVudGl0eURlY2w7CgogICAgICAgIC8vIHN1Y2Nlc3MKICAg ICAgICByZXR1cm4gdHJ1ZTsKCiAgICB9IC8vIHN0YXJ0RW50aXR5RGVjbChib29sZWFuLGludCk6 Ym9vbGVhbgoKICAgIC8qKgogICAgICogRW5kIHRoZSBzY29wZSBvZiBhbiBlbnRpdHkgZGVjbGFy YXRpb24uCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24KICAgICAqLwogICAg cHVibGljIHZvaWQgZW5kRW50aXR5RGVjbCgpIHRocm93cyBFeGNlcHRpb24gewoKICAgICAgICAv LyBnZXQgb3V0IG9mIGVudGl0eSBkZWNsCiAgICAgICAgZkN1cnJlbnRFbGVtZW50ID0gKEVsZW1l bnQpZkN1cnJlbnRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKCiAgICB9IC8vIGVuZEVudGl0eURl Y2woKQoKICAgIC8qKgogICAgICogQWRkIGEgZGVjbGFyYXRpb24gZm9yIGFuIGludGVybmFsIHBh cmFtZXRlciBlbnRpdHkKICAgICAqCiAgICAgKiBAcGFyYW0gbmFtZSBTdHJpbmdQb29sIGhhbmRs ZSBvZiB0aGUgcGFyYW1ldGVyIGVudGl0eSBuYW1lCiAgICAgKiBAcGFyYW0gdmFsdWUgU3RyaW5n UG9vbCBoYW5kbGUgb2YgdGhlIHBhcmFtZXRlciBlbnRpdHkgdmFsdWUKICAgICAqIEByZXR1cm4g aGFuZGxlIHRvIHRoZSBwYXJhbWV0ZXIgZW50aXR5IGRlY2xhcmF0aW9uCiAgICAgKiBAZXhjZXB0 aW9uIGphdmEubGFuZy5FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGludCBhZGRJbnRlcm5h bFBFRGVjbChpbnQgbmFtZSwgaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKCiAgICAgICAg Ly8gY3JlYXRlIGludGVybmFsIFBFIGRlY2wKICAgICAgICBFbGVtZW50IGludGVybmFsUEVEZWNs ID0gZkdyYW1tYXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnRlcm5hbFBFRGVjbCIpOwogICAg ICAgIGludGVybmFsUEVEZWNsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZTdHJpbmdQb29sLnRvU3Ry aW5nKG5hbWUpKTsKICAgICAgICBpbnRlcm5hbFBFRGVjbC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwg ZlN0cmluZ1Bvb2wudG9TdHJpbmcodmFsdWUpKTsKICAgICAgICBmQ3VycmVudEVsZW1lbnQuYXBw ZW5kQ2hpbGQoaW50ZXJuYWxQRURlY2wpOwoKICAgICAgICAvLyBSRVZJU0lUOiBXaGF0IGlzIG15 IHJlc3BvbnNpYmlsaXR5IGZvciBjcmVhdGluZyBhIGhhbmRsZT8KICAgICAgICBpbnQgcGVEZWNs SW5kZXggPSAtMTsKCiAgICAgICAgLy8gcmV0dXJuIGluZGV4CiAgICAgICAgcmV0dXJuIHBlRGVj bEluZGV4OwoKICAgIH0gLy8gYWRkSW50ZXJuYWxQRURlY2woaW50LGludCk6aW50CgogICAgLyoq CiAgICAgKiBBZGQgYSBkZWNsYXJhdGlvbiBmb3IgYW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0 eQogICAgICoKICAgICAqIEBwYXJhbSBuYW1lIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBwYXJh bWV0ZXIgZW50aXR5IG5hbWUKICAgICAqIEBwYXJhbSBwdWJsaWNJZCBTdHJpbmdQb29sIGhhbmRs ZSBvZiB0aGUgcHVibGljSWQKICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBTdHJpbmdQb29sIGhhbmRs ZSBvZiB0aGUgc3lzdGVtSWQKICAgICAqIEByZXR1cm4gaGFuZGxlIHRvIHRoZSBwYXJhbWV0ZXIg ZW50aXR5IGRlY2xhcmF0aW9uCiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24K ICAgICAqLwogICAgcHVibGljIGludCBhZGRFeHRlcm5hbFBFRGVjbChpbnQgbmFtZSwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdWJsaWNJZCwgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGludCBzeXN0ZW1JZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAg ICAgCiAgICAgICAgLy8gY3JlYXRlIGV4dGVybmFsIFBFIGRlY2wKICAgICAgICBFbGVtZW50IGV4 dGVybmFsUEVEZWNsID0gZkdyYW1tYXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJleHRlcm5hbFBF RGVjbCIpOwogICAgICAgIGV4dGVybmFsUEVEZWNsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZTdHJp bmdQb29sLnRvU3RyaW5nKG5hbWUpKTsKICAgICAgICBleHRlcm5hbFBFRGVjbC5zZXRBdHRyaWJ1 dGUoInB1YmxpY0lkIiwgZlN0cmluZ1Bvb2wudG9TdHJpbmcocHVibGljSWQpKTsKICAgICAgICBl eHRlcm5hbFBFRGVjbC5zZXRBdHRyaWJ1dGUoInN5c3RlbUlkIiwgZlN0cmluZ1Bvb2wudG9TdHJp bmcoc3lzdGVtSWQpKTsKICAgICAgICBmQ3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZXh0ZXJu YWxQRURlY2wpOwoKICAgICAgICAvLyBSRVZJU0lUOiBXaGF0IGlzIG15IHJlc3BvbnNpYmlsaXR5 IGZvciBjcmVhdGluZyBhIGhhbmRsZT8KICAgICAgICBpbnQgcGVEZWNsSW5kZXggPSAtMTsKCiAg ICAgICAgLy8gcmV0dXJuIGluZGV4CiAgICAgICAgcmV0dXJuIHBlRGVjbEluZGV4OwoKICAgIH0g Ly8gYWRkRXh0ZXJuYWxQRURlY2woaW50LGludCxpbnQpOmludAoKICAgIC8qKgogICAgICogQWRk IGEgZGVjbGFyYXRpb24gZm9yIGFuIGludGVybmFsIGVudGl0eQogICAgICoKICAgICAqIEBwYXJh bSBuYW1lIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBlbnRpdHkgbmFtZQogICAgICogQHBhcmFt IHZhbHVlIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBlbnRpdHkgdmFsdWUKICAgICAqIEByZXR1 cm4gaGFuZGxlIHRvIHRoZSBlbnRpdHkgZGVjbGFyYXRpb24KICAgICAqIEBleGNlcHRpb24gamF2 YS5sYW5nLkV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgaW50IGFkZEludGVybmFsRW50aXR5 RGVjbChpbnQgbmFtZSwgaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKCiAgICAgICAgLy8g Y3JlYXRlIGludGVybmFsIGVudGl0eSBkZWNsCiAgICAgICAgRWxlbWVudCBpbnRlcm5hbEVudGl0 eURlY2wgPSBmR3JhbW1hckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImludGVybmFsRW50aXR5RGVj bCIpOwogICAgICAgIGludGVybmFsRW50aXR5RGVjbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmU3Ry aW5nUG9vbC50b1N0cmluZyhuYW1lKSk7CiAgICAgICAgaW50ZXJuYWxFbnRpdHlEZWNsLnNldEF0 dHJpYnV0ZSgidmFsdWUiLCBmU3RyaW5nUG9vbC50b1N0cmluZyh2YWx1ZSkpOwogICAgICAgIGZD dXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChpbnRlcm5hbEVudGl0eURlY2wpOwogICAgICAgICAg ICAKICAgICAgICAvLyBSRVZJU0lUOiBXaGF0IGlzIG15IHJlc3BvbnNpYmlsaXR5IGZvciBjcmVh dGluZyBhIGhhbmRsZT8KICAgICAgICBpbnQgaW50ZXJuYWxFbnRpdHlEZWNsSW5kZXggPSAtMTsK CiAgICAgICAgLy8gcmV0dXJuIGluZGV4CiAgICAgICAgcmV0dXJuIGludGVybmFsRW50aXR5RGVj bEluZGV4OwoKICAgIH0gLy8gYWRkSW50ZXJuYWxFbnRpdHlEZWNsKGludCxpbnQpOmludAoKICAg IC8qKgogICAgICogQWRkIGEgZGVjbGFyYXRpb24gZm9yIGFuIGVudGl0eQogICAgICoKICAgICAq IEBwYXJhbSBuYW1lIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBlbnRpdHkgbmFtZQogICAgICog QHBhcmFtIHB1YmxpY0lkIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBwdWJsaWNJZAogICAgICog QHBhcmFtIHN5c3RlbUlkIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBzeXN0ZW1JZAogICAgICog QHJldHVybiBoYW5kbGUgdG8gdGhlIGVudGl0eSBkZWNsYXJhdGlvbgogICAgICogQGV4Y2VwdGlv biBqYXZhLmxhbmcuRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBpbnQgYWRkRXh0ZXJuYWxF bnRpdHlEZWNsKGludCBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGludCBwdWJsaWNJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg c3lzdGVtSWQpIHRocm93cyBFeGNlcHRpb24gewoKICAgICAgICAvLyBjcmVhdGUgZXh0ZXJuYWwg ZW50aXR5IGRlY2wKICAgICAgICBFbGVtZW50IGV4dGVybmFsRW50aXR5RGVjbCA9IGZHcmFtbWFy RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZXh0ZXJuYWxFbnRpdHlEZWNsIik7CiAgICAgICAgZXh0 ZXJuYWxFbnRpdHlEZWNsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZTdHJpbmdQb29sLnRvU3RyaW5n KG5hbWUpKTsKICAgICAgICBleHRlcm5hbEVudGl0eURlY2wuc2V0QXR0cmlidXRlKCJwdWJsaWNJ ZCIsIGZTdHJpbmdQb29sLnRvU3RyaW5nKHB1YmxpY0lkKSk7CiAgICAgICAgZXh0ZXJuYWxFbnRp dHlEZWNsLnNldEF0dHJpYnV0ZSgic3lzdGVtSWQiLCBmU3RyaW5nUG9vbC50b1N0cmluZyhzeXN0 ZW1JZCkpOwogICAgICAgIGZDdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChleHRlcm5hbEVudGl0 eURlY2wpOwogICAgICAgICAgICAKICAgICAgICAvLyBSRVZJU0lUOiBXaGF0IGlzIG15IHJlc3Bv bnNpYmlsaXR5IGZvciBjcmVhdGluZyBhIGhhbmRsZT8KICAgICAgICBpbnQgZXh0ZXJuYWxFbnRp dHlEZWNsSW5kZXggPSAtMTsKCiAgICAgICAgLy8gcmV0dXJuIGluZGV4CiAgICAgICAgcmV0dXJu IGV4dGVybmFsRW50aXR5RGVjbEluZGV4OwoKICAgIH0gLy8gYWRkRXh0ZXJuYWxFbnRpdHlEZWNs KGludCxpbnQsaW50KTppbnQKCiAgICAvKioKICAgICAqIEFkZCBhIGRlY2xhcmF0aW9uIGZvciBh biB1bnBhcnNlZCBlbnRpdHkKICAgICAqCiAgICAgKiBAcGFyYW0gbmFtZSBTdHJpbmdQb29sIGhh bmRsZSBvZiB0aGUgZW50aXR5IG5hbWUKICAgICAqIEBwYXJhbSBwdWJsaWNJZCBTdHJpbmdQb29s IGhhbmRsZSBvZiB0aGUgcHVibGljSWQKICAgICAqIEBwYXJhbSBzeXN0ZW1JZCBTdHJpbmdQb29s IGhhbmRsZSBvZiB0aGUgc3lzdGVtSWQKICAgICAqIEBwYXJhbSBub3RhdGlvbk5hbWUgU3RyaW5n UG9vbCBoYW5kbGUgb2YgdGhlIG5vdGF0aW9uTmFtZQogICAgICogQHJldHVybiBoYW5kbGUgdG8g dGhlIGVudGl0eSBkZWNsYXJhdGlvbgogICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0 aW9uCiAgICAgKi8KICAgIHB1YmxpYyBpbnQgYWRkVW5wYXJzZWRFbnRpdHlEZWNsKGludCBuYW1l LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdWJsaWNJZCwgaW50 IHN5c3RlbUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3Rh dGlvbk5hbWUpIHRocm93cyBFeGNlcHRpb24gewoKICAgICAgICAvLyBjcmVhdGUgZXh0ZXJuYWwg ZW50aXR5IGRlY2wKICAgICAgICBFbGVtZW50IHVucGFyc2VkRW50aXR5RGVjbCA9IGZHcmFtbWFy RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidW5wYXJzZWRFbnRpdHlEZWNsIik7CiAgICAgICAgdW5w YXJzZWRFbnRpdHlEZWNsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZTdHJpbmdQb29sLnRvU3RyaW5n KG5hbWUpKTsKICAgICAgICB1bnBhcnNlZEVudGl0eURlY2wuc2V0QXR0cmlidXRlKCJwdWJsaWNJ ZCIsIGZTdHJpbmdQb29sLnRvU3RyaW5nKHB1YmxpY0lkKSk7CiAgICAgICAgdW5wYXJzZWRFbnRp dHlEZWNsLnNldEF0dHJpYnV0ZSgic3lzdGVtSWQiLCBmU3RyaW5nUG9vbC50b1N0cmluZyhzeXN0 ZW1JZCkpOwogICAgICAgIHVucGFyc2VkRW50aXR5RGVjbC5zZXRBdHRyaWJ1dGUoIm5vdGF0aW9u IiwgZlN0cmluZ1Bvb2wudG9TdHJpbmcobm90YXRpb25OYW1lKSk7CiAgICAgICAgZkN1cnJlbnRF bGVtZW50LmFwcGVuZENoaWxkKHVucGFyc2VkRW50aXR5RGVjbCk7CiAgICAgICAgICAgIAogICAg ICAgIC8vIFJFVklTSVQ6IFdoYXQgaXMgbXkgcmVzcG9uc2liaWxpdHkgZm9yIGNyZWF0aW5nIGEg aGFuZGxlPwogICAgICAgIGludCB1bnBhcnNlZEVudGl0eURlY2xJbmRleCA9IC0xOwoKICAgICAg ICAvLyByZXR1cm4gaW5kZXgKICAgICAgICByZXR1cm4gdW5wYXJzZWRFbnRpdHlEZWNsSW5kZXg7 CgogICAgfSAvLyBhZGRVbnBhcnNlZEVudGl0eURlY2woaW50LGludCxpbnQsaW50KTppbnQKCiAg ICAvKioKICAgICAqIENhbGxlZCB3aGVuIHRoZSBzY2FubmVyIHN0YXJ0IHNjYW5uaW5nIGFuIGVu dW1lcmF0aW9uCiAgICAgKiBAcmV0dXJuIFN0cmluZ1Bvb2wgaGFuZGxlIHRvIGEgc3RyaW5nIGxp c3QgdGhhdCB3aWxsIGhvbGQgdGhlIGVudW1lcmF0aW9uIG5hbWVzCiAgICAgKiBAZXhjZXB0aW9u IGphdmEubGFuZy5FeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGludCBzdGFydEVudW1lcmF0 aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgIAogICAgICAgIC8vIGNyZWF0ZSBl bnVtZXJhdGlvbgogICAgICAgIEVsZW1lbnQgZW51bWVyYXRpb24gPSBmR3JhbW1hckRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImVudW1lcmF0aW9uIik7CiAgICAgICAgZkN1cnJlbnRFbGVtZW50LmFw cGVuZENoaWxkKGVudW1lcmF0aW9uKTsKICAgICAgICBmQ3VycmVudEVsZW1lbnQgPSBlbnVtZXJh dGlvbjsKCiAgICAgICAgLy8gUkVWSVNJVDogV2hhdCBpcyBteSByZXNwb25zaWJpbGl0eSBmb3Ig Y3JlYXRpbmcgYSBoYW5kbGU/CiAgICAgICAgLy9pbnQgZW51bUluZGV4ID0gLTE7ICAgIAogICAg ICAgIGludCBlbnVtSW5kZXggPSBmU3RyaW5nUG9vbC5zdGFydFN0cmluZ0xpc3QoKTsKCiAgICAg ICAgLy8gcmV0dXJuIGluZGV4CiAgICAgICAgcmV0dXJuIGVudW1JbmRleDsKCiAgICB9IC8vIHN0 YXJ0RW51bWVyYXRpb24oKTppbnQKCiAgICAvKioKICAgICAqIEFkZCBhIG5hbWUgdG8gYW4gZW51 bWVyYXRpb24KICAgICAqIEBwYXJhbSBlbnVtSW5kZXggU3RyaW5nUG9vbCBoYW5kbGUgdG8gdGhl IHN0cmluZyBsaXN0IGZvciB0aGUgZW51bWVyYXRpb24KICAgICAqIEBwYXJhbSBlbGVtZW50VHlw ZSBoYW5kbGUgdG8gdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUg ZW51bWVyYXRpb24KICAgICAqIEBwYXJhbSBhdHRyTmFtZSBTdHJpbmdQb29sIGhhbmRsZSB0byB0 aGUgbmFtZSBvZiB0aGUgYXR0cmlidXQgd2l0aCB0aGUgZW51bWVyYXRpb24KICAgICAqIEBwYXJh bSBuYW1lSW5kZXggU3RyaW5nUG9vbCBoYW5kbGUgdG8gdGhlIG5hbWUgdG8gYmUgYWRkZWQgdG8g dGhlIGVudW1lcmF0aW9uCiAgICAgKiBAcGFyYW0gaXNOb3RhdGlvblR5cGUgdHJ1ZSBpZiB0aGUg ZW51bWVyYXRpb24gaXMgYW4gZW51bWVyYXRpb24gb2YgTk9UQVRJT04gbmFtZXMKICAgICAqIEBl eGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgdm9pZCBhZGRO YW1lVG9FbnVtZXJhdGlvbihpbnQgZW51bUluZGV4LCAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGludCBlbGVtZW50VHlwZSwgaW50IGF0dHJOYW1lLCAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYW1lSW5kZXgsIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc05vdGF0aW9uVHlwZSkgdGhyb3dzIEV4Y2Vw dGlvbiB7CiAgICAgICAgCiAgICAgICAgLy8gY3JlYXRlIGVudW1lcmF0aW9uIGxpdGVyYWwKICAg ICAgICBFbGVtZW50IGxpdGVyYWwgPSBmR3JhbW1hckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxp dGVyYWwiKTsKICAgICAgICAvLyBSRVZJU0lUOiBIb3cgaXMgdGhpcyBsaXRlcmFsIChhbmQgaXRz IHBhcmVudCBlbnVtZXJhdGlvbikKICAgICAgICAvLyAgICAgICAgICBhc3NvY2lhdGVkIHRvIGFu IGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lPyBUaGlzCiAgICAgICAgLy8gICAgICAgICAgc2hv dWxkIGJlIGRvbmUgYmV0dGVyLgogICAgICAgIGxpdGVyYWwuc2V0QXR0cmlidXRlKCJlbGVtZW50 IiwgZlN0cmluZ1Bvb2wudG9TdHJpbmcoZWxlbWVudFR5cGUpKTsKICAgICAgICBsaXRlcmFsLnNl dEF0dHJpYnV0ZSgiYXR0cmlidXRlIiwgZlN0cmluZ1Bvb2wudG9TdHJpbmcoYXR0ck5hbWUpKTsK ICAgICAgICBsaXRlcmFsLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZTdHJpbmdQb29sLnRvU3RyaW5n KG5hbWVJbmRleCkpOwogICAgICAgIGxpdGVyYWwuc2V0QXR0cmlidXRlKCJub3RhdGlvbiIsIGlz Tm90YXRpb25UeXBlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgZkN1cnJlbnRFbGVtZW50 LmFwcGVuZENoaWxkKGxpdGVyYWwpOwoKICAgICAgICAvL2FkZCB0aGUgbmFtZSB0byB0aGUgc3Ry aW5nTGlzdCAKICAgICAgICBmU3RyaW5nUG9vbC5hZGRTdHJpbmdUb0xpc3QoZW51bUluZGV4LCBu YW1lSW5kZXgpOwoKICAgIH0gLy8gYWRkTmFtZVRvRW51bWVyYXRpb24oaW50LGludCxpbnQsaW50 LGJvb2xlYW4pCgogICAgLyoqCiAgICAgKiBGaW5pc2ggcHJvY2Vzc2luZyBhbiBlbnVtZXJhdGlv bgogICAgICoKICAgICAqIEBwYXJhbSBlbnVtSW5kZXggaGFuZGxlIHRvIHRoZSBzdHJpbmcgbGlz dCB3aGljaCBob2xkcyB0aGUgZW51bWVyYXRpb24gdG8gYmUgZmluc2hlZC4KICAgICAqIEBleGNl cHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgdm9pZCBlbmRFbnVt ZXJhdGlvbihpbnQgZW51bUluZGV4KSB0aHJvd3MgRXhjZXB0aW9uIHsKCiAgICAgICAgLy8gZ2V0 IG91dCBvZiBlbnVtZXJhdGlvbgogICAgICAgIGZDdXJyZW50RWxlbWVudCA9IChFbGVtZW50KWZD dXJyZW50RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7CiAgICAgICAgCiAgICAgICAgLy9maW5pc2gg dGhlIGVudW1lcmF0aW9uIHN0cmluZ2xpc3QgaW50IHRoZSBmU3RyaW5nUG9vbAogICAgICAgIGZT dHJpbmdQb29sLmZpbmlzaFN0cmluZ0xpc3QoZW51bUluZGV4KTsKCiAgICB9IC8vIGVuZEVudW1l cmF0aW9uKGludCkKCiAgICAvKioKICAgICAqIEFkZCBhIGRlY2xhcmF0aW9uIGZvciBhIG5vdGF0 aW9uCiAgICAgKgogICAgICogQHBhcmFtIG5vdGF0aW9uTmFtZQogICAgICogQHBhcmFtIHB1Ymxp Y0lkCiAgICAgKiBAcGFyYW0gc3lzdGVtSWQKICAgICAqIEByZXR1cm4gaGFuZGxlIHRvIHRoZSBu b3RhdGlvbiBkZWNsYXJhdGlvbgogICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuRXhjZXB0aW9u CiAgICAgKi8KICAgIHB1YmxpYyBpbnQgYWRkTm90YXRpb25EZWNsKGludCBub3RhdGlvbk5hbWUs IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB1YmxpY0lkLCBpbnQgc3lzdGVt SWQpIHRocm93cyBFeGNlcHRpb24gewoKICAgICAgICAvLyBjcmVhdGUgbm90YXRpb24gZGVjbAog ICAgICAgIEVsZW1lbnQgbm90YXRpb25EZWNsID0gZkdyYW1tYXJEb2N1bWVudC5jcmVhdGVFbGVt ZW50KCJub3RhdGlvbkRlY2wiKTsKICAgICAgICBub3RhdGlvbkRlY2wuc2V0QXR0cmlidXRlKCJu YW1lIiwgZlN0cmluZ1Bvb2wudG9TdHJpbmcobm90YXRpb25OYW1lKSk7CiAgICAgICAgbm90YXRp b25EZWNsLnNldEF0dHJpYnV0ZSgicHVibGljSWQiLCBmU3RyaW5nUG9vbC50b1N0cmluZyhwdWJs aWNJZCkpOwogICAgICAgIG5vdGF0aW9uRGVjbC5zZXRBdHRyaWJ1dGUoInN5c3RlbUlkIiwgZlN0 cmluZ1Bvb2wudG9TdHJpbmcoc3lzdGVtSWQpKTsKICAgICAgICBmQ3VycmVudEVsZW1lbnQuYXBw ZW5kQ2hpbGQobm90YXRpb25EZWNsKTsKCiAgICAgICAgLy8gUkVWSVNJVDogV2hhdCBpcyBteSBy ZXNwb25zaWJpbGl0eSBmb3IgY3JlYXRpbmcgYSBoYW5kbGU/CiAgICAgICAgaW50IG5vdGF0aW9u RGVjbEluZGV4ID0gLTE7CgogICAgICAgIC8vIHJldHVybiBpbmRleAogICAgICAgIHJldHVybiBu b3RhdGlvbkRlY2xJbmRleDsKCiAgICB9IC8vIGFkZE5vdGF0aW9uZGVjbChpbnQsaW50LGludCk6 aW50CgogICAgLyoqCiAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbW1lbnQgaGFzIGJlZW4gc2Nhbm5l ZAogICAgICoKICAgICAqIEBwYXJhbSBkYXRhIFN0cmluZ1Bvb2wgaGFuZGxlIG9mIHRoZSBjb21t ZW50IHRleHQKICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgogICAgICovCiAg ICBwdWJsaWMgdm9pZCBjYWxsQ29tbWVudChpbnQgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAg ICB9CgogICAgLyoqCiAgICAgKiBDYWxsZWQgd2hlbiBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24g aGFzIGJlZW4gc2Nhbm5lZAogICAgICogQHBhcmFtIHBpVGFyZ2V0IFN0cmluZ1Bvb2wgaGFuZGxl IG9mIHRoZSBQSSB0YXJnZXQKICAgICAqIEBwYXJhbSBwaURhdGEgU3RyaW5nUG9vbCBoYW5kbGUg b2YgdGhlIFBJIGRhdGEKICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgogICAg ICovCiAgICBwdWJsaWMgdm9pZCBjYWxsUHJvY2Vzc2luZ0luc3RydWN0aW9uKGludCBwaVRhcmdl dCwgaW50IHBpRGF0YSkgCiAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CgogICAgICAgIC8vIGNy ZWF0ZSBwaQogICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IAogICAgICAgICAgICBm R3JhbW1hckRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihmU3RyaW5nUG9vbC50 b1N0cmluZyhwaVRhcmdldCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGZTdHJpbmdQb29sLnRvU3RyaW5nKHBpRGF0YSkpOwogICAgICAg IGZDdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChwaSk7CgogICAgfSAvLyBjYWxsUHJvY2Vzc2lu Z0luc3RydWN0aW9uKGludCxpbnQpCgogICAgLy8gZGVwcmVjYXRlZCAtLSByZW1vdmVkIGZyb20g RE9NIExldmVsIDIKCiAgICAvKioKICAgICAqIFN1cHBvcnRzIERPTSBMZXZlbCAyIGludGVybmFs U3Vic2V0IGFkZGl0aW9ucy4KICAgICAqIENhbGxlZCB3aGVuIHRoZSBpbnRlcm5hbCBzdWJzZXQg aXMgY29tcGxldGVseSBzY2FubmVkLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbFN1 YnNldChpbnQgaW50ZXJuYWxTdWJzZXQpIHRocm93cyBFeGNlcHRpb24gewogICAgfQoKICAgIHBy b3RlY3RlZCBib29sZWFuIGlzRFREKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAg IC8vCiAgICAvLyBQcml2YXRlIG1ldGhvZHMKICAgIC8vCgogICAgLy8gZW5zdXJlIGNhcGFjaXR5 CgogICAgLyoqIEVuc3VyZXMgc3RvcmFnZSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBtYXBwaW5n cy4gKi8KICAgIHByaXZhdGUgdm9pZCBlbnN1cmVFbGVtZW50RGVjbENhcGFjaXR5KGludCBjaHVu aykgewogICAgICAgIGlmIChjaHVuayA+PSBmRWxlbWVudERlY2xNYXAubGVuZ3RoKSB7CiAgICAg ICAgICAgIGZFbGVtZW50RGVjbE1hcCA9IHJlc2l6ZShmRWxlbWVudERlY2xNYXAsIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkVsZW1lbnREZWNsTWFwLmxlbmd0aCAqIDIp OwogICAgICAgICAgICBmRWxlbWVudERlY2xJc0V4dGVybmFsID0gcmVzaXplKGZFbGVtZW50RGVj bElzRXh0ZXJuYWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkVsZW1l bnREZWNsSXNFeHRlcm5hbC5sZW5ndGggKiAyKTsKICAgICAgICB9IGVsc2UgaWYgKGZFbGVtZW50 RGVjbE1hcFtjaHVua10gIT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQog ICAgICAgIGZFbGVtZW50RGVjbE1hcFtjaHVua10gPSBuZXcgaW50W0NIVU5LX1NJWkVdOwogICAg ICAgIGZFbGVtZW50RGVjbElzRXh0ZXJuYWxbY2h1bmtdID0gbmV3IGludFtDSFVOS19TSVpFXTsK ICAgIH0KCiAgICAvKiogRW5zdXJlcyBzdG9yYWdlIGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24g bWFwcGluZ3MuICovCiAgICBwcml2YXRlIHZvaWQgZW5zdXJlQXR0cmlidXRlRGVjbENhcGFjaXR5 KGludCBjaHVuaykgewogICAgICAgIGlmIChjaHVuayA+PSBmQXR0cmlidXRlRGVjbE1hcC5sZW5n dGgpIHsKICAgICAgICAgICAgZkF0dHJpYnV0ZURlY2xNYXAgPSByZXNpemUoZkF0dHJpYnV0ZURl Y2xNYXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQXR0cmlidXRl RGVjbE1hcC5sZW5ndGggKiAyKTsKICAgICAgICAgICAgZkF0dHJpYnV0ZURlY2xJc0V4dGVybmFs ID0gcmVzaXplKGZBdHRyaWJ1dGVEZWNsSXNFeHRlcm5hbCwgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGZBdHRyaWJ1dGVEZWNsSXNFeHRlcm5hbC5sZW5ndGggKiAyKTsK ICAgICAgICB9IGVsc2UgaWYgKGZBdHRyaWJ1dGVEZWNsTWFwW2NodW5rXSAhPSBudWxsKSB7CiAg ICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZkF0dHJpYnV0ZURlY2xNYXBbY2h1 bmtdID0gbmV3IGludFtDSFVOS19TSVpFXTsKICAgICAgICBmQXR0cmlidXRlRGVjbElzRXh0ZXJu YWxbY2h1bmtdID0gbmV3IGludFtDSFVOS19TSVpFXTsKICAgIH0KCiAgICAvKiogRW5zdXJlcyBz dG9yYWdlIGZvciBjb250ZW50IHNwZWMgbWFwcGluZ3MuICovCiAgICBwcml2YXRlIHZvaWQgZW5z dXJlQ29udGVudFNwZWNDYXBhY2l0eShpbnQgY2h1bmspIHsKICAgICAgICBpZiAoY2h1bmsgPj0g ZkNvbnRlbnRTcGVjTWFwLmxlbmd0aCkgewogICAgICAgICAgICBmQ29udGVudFNwZWNNYXAgPSBy ZXNpemUoZkNvbnRlbnRTcGVjTWFwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZDb250ZW50U3BlY01hcC5sZW5ndGggKiAyKTsKICAgICAgICB9IGVsc2UgaWYgKGZDb250 ZW50U3BlY01hcFtjaHVua10gIT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAg fQogICAgICAgIGZDb250ZW50U3BlY01hcFtjaHVua10gPSBuZXcgaW50W0NIVU5LX1NJWkVdOwog ICAgfQoKICAgIC8vIHJlc2l6ZSBpbml0aWFsIGNodW5rCgogICAgLyoqIFJlc2l6ZXMgY2h1bmtl ZCBpbnRlZ2VyIGFycmF5cy4gKi8KICAgIHByaXZhdGUgaW50W11bXSByZXNpemUoaW50IGFycmF5 W11bXSwgaW50IG5ld3NpemUpIHsKICAgICAgICBpbnQgbmV3YXJyYXlbXVtdID0gbmV3IGludFtu ZXdzaXplXVtdOwogICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld2FycmF5LCAw LCBhcnJheS5sZW5ndGgpOwogICAgICAgIHJldHVybiBuZXdhcnJheTsKICAgIH0KCn0gLy8gY2xh c3MgRFRER3JhbW1hcgo=