Return-Path: Delivered-To: apmail-jakarta-lucene-dev-archive@apache.org Received: (qmail 6802 invoked from network); 26 Feb 2002 19:35:19 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 26 Feb 2002 19:35:19 -0000 Received: (qmail 6035 invoked by uid 97); 26 Feb 2002 19:35:22 -0000 Delivered-To: qmlist-jakarta-archive-lucene-dev@jakarta.apache.org Received: (qmail 5995 invoked by uid 97); 26 Feb 2002 19:35:21 -0000 Mailing-List: contact lucene-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Lucene Developers List" Reply-To: "Lucene Developers List" Delivered-To: mailing list lucene-dev@jakarta.apache.org Received: (qmail 5981 invoked from network); 26 Feb 2002 19:35:20 -0000 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C1BEFC.8347A9B8" Subject: new version of IndexWriter.java X-MimeOLE: Produced By Microsoft Exchange V6.0.4418.65 Date: Tue, 26 Feb 2002 11:33:48 -0800 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: new version of IndexWriter.java Thread-Index: AcG+/Ke1gl6Wy3INT8i7NoIchMGy/A== From: "Ivaylo Zlatev" To: X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N ------_=_NextPart_001_01C1BEFC.8347A9B8 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Yesterday I was inspired by the conversation on the dev. list about indexing in memory, etc=20 and I wrote a new version of IndexWriter.java (it is named IndexWriter2.java). Find the attached file here. The code is stable and worth a try. The following is from the javaDocs for this file: /** * IndexWriter2 is a modification of the original IndexWriter, coming * with lucene. It benefits from a RAMDirectory, which IndexWriter has * as well. The original IndexWriter treats the segments in the RAMDirectory * no different from the segments in the target directory, where the index is * being built. For example, it ALWAYS merges RAMDirectory segments in the * target directory. Here, we optimize the usage of RAMDirectory in the * following way:
* * When a new Document is added, a new segment for it is created in * RAMDirectory. When the RAMDirectory collects 'maxDocsInRam' (this is a new * important setting, the default is 10000) 1-document * segments, IndexWriter2 will merge them into one 10000-documents segment into * RAMDirectory (here is a difference from IndexWriter). Then it moves this * segment from the RAMDirectory to the target directory (usually a file system * directory). This way, during indexing, IndexWriter2 will be writing segments * of equal size (equal to maxDocsInRam) to the target directory. In other * words, during indexing only one file-system segment is opened and dealt with, * which uses just a few file handles. No more "Too many open files" * exceptions.
* * After indexing is finished, it is good to call optimize() to merge all * created segments into one. The RAMDirectory is out of the picture here and * is not being used. Here is where we use the mergeFactor setting: * A total of mergeFactor+1 segments will be merged at once into one new * segment. This happens in a loop, until only 1 segment is left. * Here you can get to a "Too many open files" exception, if your mergeFactor * is large. If you set mergeFactor to 1, it will merge only 2 segments at a * time, which will preserve the file handles, but will be a bit slower than * a merge with mergeFactor=3D10, for example.
* * At the end of mergeSegments() originally there was a code, where, if a * segment file can't be deleted (because it's currently opened in Windows), * it stores it's name in a file, named 'deletable', so that it can try to * delete it later. I believe there was some bug with not closing the merged * segments properly, which was the reason for all of this. Anyway, now there * are no problems with deleting these files on Windows and therefore the code, * reading and writing to the 'deletable' file is commented out.
* * @author Ivaylo Zlatev (ivaylo_zlatev@yahoo.com) */ Two weeks ago I sent an improved PriorityQueue, fixing important memory issues and much more. I just wasted my time - no response at all. Hopefully this time my code will be more useful. Regards, Ivaylo <>=20 ------_=_NextPart_001_01C1BEFC.8347A9B8 Content-Type: application/octet-stream; name="IndexWriter2.java" Content-Transfer-Encoding: base64 Content-Description: IndexWriter2.java Content-Disposition: attachment; filename="IndexWriter2.java" cGFja2FnZSBvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleDsKCi8qID09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBB cGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAy MDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKICogcmVzZXJ2 ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y bXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVk aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln aHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu ZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRv Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAg ICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1 ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0 aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgogKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1 ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBG b3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCiAqICAgIEFsdGVybmF0ZWx5LCB0 aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKICog ICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1h bGx5IGFwcGVhci4KICoKICogNC4gVGhlIG5hbWVzICJBcGFjaGUiIGFuZCAiQXBhY2hlIFNvZnR3 YXJlIEZvdW5kYXRpb24iIGFuZAogKiAgICAiQXBhY2hlIEx1Y2VuZSIgbXVzdCBub3QgYmUgdXNl ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICogICAgZGVyaXZlZCBmcm9tIHRoaXMg c29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcgogKiAgICB3cml0 dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1 LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAi QXBhY2hlIiwKICogICAgIkFwYWNoZSBMdWNlbmUiLCBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBp biB0aGVpciBuYW1lLCB3aXRob3V0CiAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0 aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJP VklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElF UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMK ICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdB UkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJP Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0Us IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT RUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU LCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNP RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFN QUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVu dGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYg b2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKICogaW5mb3JtYXRp b24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCiAqIDxodHRw Oi8vd3d3LmFwYWNoZS5vcmcvPi4KICovCgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1w b3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CmltcG9ydCBqYXZh LnV0aWwuVmVjdG9yOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwu SXRlcmF0b3I7CgppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRGlyZWN0b3J5OwppbXBv cnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuUkFNRGlyZWN0b3J5OwppbXBvcnQgb3JnLmFwYWNo ZS5sdWNlbmUuc3RvcmUuRlNEaXJlY3Rvcnk7CmltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9y ZS5Mb2NrOwppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuSW5wdXRTdHJlYW07CmltcG9y dCBvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZS5PdXRwdXRTdHJlYW07CmltcG9ydCBvcmcuYXBhY2hl Lmx1Y2VuZS5kb2N1bWVudC5Eb2N1bWVudDsKaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5 c2lzLkFuYWx5emVyOwoKLyoqCiAqIEluZGV4V3JpdGVyMiBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0 aGUgb3JpZ2luYWwgSW5kZXhXcml0ZXIsIGNvbWluZwogKiB3aXRoIGx1Y2VuZS4gSXQgYmVuZWZp dHMgZnJvbSBhIFJBTURpcmVjdG9yeSwgd2hpY2ggSW5kZXhXcml0ZXIgaGFzCiAqIGFzIHdlbGwu IFRoZSBvcmlnaW5hbCBJbmRleFdyaXRlciB0cmVhdHMgdGhlIHNlZ21lbnRzIGluIHRoZSBSQU1E aXJlY3RvcnkKICogbm8gZGlmZmVyZW50IGZyb20gdGhlIHNlZ21lbnRzIGluIHRoZSB0YXJnZXQg ZGlyZWN0b3J5LCB3aGVyZSB0aGUgaW5kZXggaXMKICogYmVpbmcgYnVpbHQuIEZvciBleGFtcGxl LCBpdCBBTExXQVlTIG1lcmdlcyBSQU1EaXJlY3Rvcnkgc2VnbWVudHMgaW4gdGhlCiAqIHRhcmdl dCBkaXJlY3RvcnkuIEhlcmUsIHdlIG9wdGltaXplIHRoZSB1c2FnZSBvZiBSQU1EaXJlY3Rvcnkg aW4gdGhlCiAqIGZvbGxvd2luZyB3YXk6PGJyPgogKgogKiBXaGVuIGEgbmV3IERvY3VtZW50IGlz IGFkZGVkLCBhIG5ldyBzZWdtZW50IGZvciBpdCBpcyBjcmVhdGVkIGluCiAqIFJBTURpcmVjdG9y eS4gV2hlbiB0aGUgUkFNRGlyZWN0b3J5IGNvbGxlY3RzICdtYXhEb2NzSW5SYW0nICh0aGlzIGlz IGEgbmV3CiAqIGltcG9ydGFudCBzZXR0aW5nLCB0aGUgZGVmYXVsdCBpcyAxMDAwMCkgMS1kb2N1 bWVudAogKiBzZWdtZW50cywgSW5kZXhXcml0ZXIyIHdpbGwgbWVyZ2UgdGhlbSBpbnRvIG9uZSAx MDAwMC1kb2N1bWVudHMgc2VnbWVudCBpbnRvCiAqIFJBTURpcmVjdG9yeSAoaGVyZSBpcyBhIGRp ZmZlcmVuY2UgZnJvbSBJbmRleFdyaXRlcikuIFRoZW4gaXQgbW92ZXMgdGhpcwogKiBzZWdtZW50 IGZyb20gdGhlIFJBTURpcmVjdG9yeSB0byB0aGUgdGFyZ2V0IGRpcmVjdG9yeSAodXN1YWxseSBh IGZpbGUgc3lzdGVtCiAqIGRpcmVjdG9yeSkuIFRoaXMgd2F5LCBkdXJpbmcgaW5kZXhpbmcsIElu ZGV4V3JpdGVyMiB3aWxsIGJlIHdyaXRpbmcgc2VnbWVudHMKICogb2YgZXF1YWwgc2l6ZSAoZXF1 YWwgdG8gbWF4RG9jc0luUmFtKSB0byB0aGUgdGFyZ2V0IGRpcmVjdG9yeS4gSW4gb3RoZXIKICog d29yZHMsIGR1cmluZyBpbmRleGluZyBvbmx5IG9uZSBmaWxlLXN5c3RlbSBzZWdtZW50IGlzIG9w ZW5lZCBhbmQgZGVhbHQgd2l0aCwKICogd2hpY2ggdXNlcyBqdXN0IGEgZmV3IGZpbGUgaGFuZGxl cy4gTm8gbW9yZSAiVG9vIG1hbnkgb3BlbiBmaWxlcyIKICogZXhjZXB0aW9ucy48YnI+CiAqCiAq IEFmdGVyIGluZGV4aW5nIGlzIGZpbmlzaGVkLCBpdCBpcyBnb29kIHRvIGNhbGwgb3B0aW1pemUo KSB0byBtZXJnZSBhbGwKICogY3JlYXRlZCBzZWdtZW50cyBpbnRvIG9uZS4gVGhlIFJBTURpcmVj dG9yeSBpcyBvdXQgb2YgdGhlIHBpY3R1cmUgaGVyZSBhbmQKICogaXMgbm90IGJlaW5nIHVzZWQu IEhlcmUgaXMgd2hlcmUgd2UgdXNlIHRoZSBtZXJnZUZhY3RvciBzZXR0aW5nOgogKiBBIHRvdGFs IG9mIG1lcmdlRmFjdG9yKzEgc2VnbWVudHMgd2lsbCBiZSBtZXJnZWQgYXQgb25jZSBpbnRvIGEg b25lIG5ldwogKiBzZWdtZW50LiBUaGlzIGhhcHBlbnMgaW4gYSBsb29wLCB1bnRpbCBvbmx5IDEg c2VnbWVudCBpcyBsZWZ0LgogKiBIZXJlIHlvdSBjYW4gZ2V0ICB0byBhICJUb28gbWFueSBvcGVu IGZpbGVzIiBleGNlcHRpb24sIGlmIHlvdXIgbWVyZ2VGYWN0b3IKICogaXMgbGFyZ2UuIElmIHlv dSBzZXQgbWVyZ2VGYWN0b3IgdG8gMSwgaXQgd2lsbCBtZXJnZSBvbmx5IDIgc2VnbWVudHMgYXQg YQogKiB0aW1lLCB3aGljaCB3aWxsIHByZXNlcnZlIHRoZSBmaWxlIGhhbmRsZXMsIGJ1dCB3aWxs IGJlIGEgYml0IHNsb3dlciB0aGFuCiAqIGEgbWVyZ2Ugd2l0aCAgbWVyZ2VGYWN0b3I9MTAsIGZv ciBleGFtcGxlLjxicj4KICoKICogQXQgdGhlIGVuZCBvZiBtZXJnZVNlZ21lbnRzKCkgb3JpZ2lu YWxseSB0aGVyZSB3YXMgYSBjb2RlLCB3aGVyZSwgaWYgYQogKiBzZWdubWVudCBmaWxlIGNhbid0 IGJlIGRlbGV0ZWQgKGJlY2F1c2UgaXQncyBjdXJyZW50bHkgb3BlbmVkIGluIFdpbmRvd3MpLAog KiBpdCBzdG9yZXMgaXQncyBuYW1lIGluIGEgZmlsZSwgbmFtZWQgJ2RlbGV0YWJsZScsIHNvIHRo YXQgaXQgY2FuIHRyeSB0bwogKiBkZWxldGUgaXQgbGF0ZXIuIEkgYmVsaWV2ZSB0aGVyZSB3YXMg c29tZSBidWcgd2l0aCBub3QgY2xvc2luZyB0aGUgbWVyZ2VkCiAqIHNlZ21lbnRzIHByb3Blcmx5 LCB3aGljaCB3YXMgdGhlIHJlYXNvbiBmb3IgYWxsIG9mIHRoaXMuIEFueXdheSwgbm93IHRoZXJl CiAqIGFyZSBubyBwcm9ibGVtcyB3aXRoIGRlbGV0aW5nIHRoZXNlIGZpbGVzIG9uIFdpbmRvd3Mg YW5kIHRoZXJlZm9yZSB0aGUgY29kZSwKICogcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgJ2Rl bGV0YWJsZScgZmlsZSBpcyBjb21tZW50ZWQgb3V0Ljxicj4KICoKICogQGF1dGhvciBJdmF5bG8g WmxhdGV2IChpdmF5bG9femxhdGV2QHlhaG9vLmNvbSkKICovCgpwdWJsaWMgZmluYWwgY2xhc3Mg SW5kZXhXcml0ZXIyIHsKCiAgcHJpdmF0ZSAgICAgICBEaXJlY3RvcnkgZGlyZWN0b3J5OwkJCSAg Ly8gd2hlcmUgdGhpcyBpbmRleCB3aWxsIGZpbmFsbHkgYmUgYnVpbHQKICBwcml2YXRlIGZpbmFs IERpcmVjdG9yeSByYW1EaXJlY3RvcnkgPSBuZXcgUkFNRGlyZWN0b3J5KCk7IC8vIGZvciB0ZW1w b3Jhcnkgc3RvcmluZyBhbmQgbWVyZ2luZyBvZiBzZWdtZW50cwoKICBwcml2YXRlIFNlZ21lbnRJ bmZvcyBzZWdtZW50SW5mb3MgICAgPSBuZXcgU2VnbWVudEluZm9zKCk7IC8vIHRoZSB0YXJnZXQg aW5kZXggc2VnbWVudHMKICBwcml2YXRlIFNlZ21lbnRJbmZvcyByYW1TZWdtZW50SW5mb3MgPSBu ZXcgU2VnbWVudEluZm9zKCk7IC8vIHRoZSByYW0gc2VnbWVudHMKCiAgcHJpdmF0ZSBEb2N1bWVu dFdyaXRlciByYW1Eb2NXcml0ZXI7CiAgcHJpdmF0ZSBBbmFseXplciBhbmFseXplcjsJCQkgIC8v IGhvdyB0byBhbmFseXplIHRleHQKCiAgcHJpdmF0ZSBMb2NrIHdyaXRlTG9jazsKCiAgcHVibGlj IGludCBtYXhGaWVsZExlbmd0aCA9IDEwMDAwOwoKICAvKiogQ29uc3RydWN0cyBhbiBJbmRleFdy aXRlciBmb3IgdGhlIGluZGV4IGluIDxjb2RlPnBhdGg8L2NvZGU+LiAgVGV4dCB3aWxsCiAgICBi ZSBhbmFseXplZCB3aXRoIDxjb2RlPmE8L2NvZGU+LiAgSWYgPGNvZGU+Y3JlYXRlPC9jb2RlPiBp cyB0cnVlLCB0aGVuIGEKICAgIG5ldywgZW1wdHkgaW5kZXggd2lsbCBiZSBjcmVhdGVkIGluIDxj b2RlPnBhdGg8L2NvZGU+LCByZXBsYWNpbmcgdGhlIGluZGV4CiAgICBhbHJlYWR5IHRoZXJlLCBp ZiBhbnkuICovCiAgcHVibGljIEluZGV4V3JpdGVyMihTdHJpbmcgcGF0aCwgQW5hbHl6ZXIgYSwg Ym9vbGVhbiBjcmVhdGUpCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgdGhpcyhGU0Rp cmVjdG9yeS5nZXREaXJlY3RvcnkocGF0aCwgY3JlYXRlKSwgYSwgY3JlYXRlKTsKICB9CgogIC8q KiBDb25zdHJ1Y3RzIGFuIEluZGV4V3JpdGVyIGZvciB0aGUgaW5kZXggaW4gPGNvZGU+cGF0aDwv Y29kZT4uICBUZXh0IHdpbGwKICAgIGJlIGFuYWx5emVkIHdpdGggPGNvZGU+YTwvY29kZT4uICBJ ZiA8Y29kZT5jcmVhdGU8L2NvZGU+IGlzIHRydWUsIHRoZW4gYQogICAgbmV3LCBlbXB0eSBpbmRl eCB3aWxsIGJlIGNyZWF0ZWQgaW4gPGNvZGU+cGF0aDwvY29kZT4sIHJlcGxhY2luZyB0aGUgaW5k ZXgKICAgIGFscmVhZHkgdGhlcmUsIGlmIGFueS4gKi8KICBwdWJsaWMgSW5kZXhXcml0ZXIyKEZp bGUgcGF0aCwgQW5hbHl6ZXIgYSwgYm9vbGVhbiBjcmVhdGUpCiAgICAgICB0aHJvd3MgSU9FeGNl cHRpb24gewogICAgdGhpcyhGU0RpcmVjdG9yeS5nZXREaXJlY3RvcnkocGF0aCwgY3JlYXRlKSwg YSwgY3JlYXRlKTsKICB9CgogIC8qKiBDb25zdHJ1Y3RzIGFuIEluZGV4V3JpdGVyIGZvciB0aGUg aW5kZXggaW4gPGNvZGU+ZDwvY29kZT4uICBUZXh0IHdpbGwgYmUKICAgIGFuYWx5emVkIHdpdGgg PGNvZGU+YTwvY29kZT4uICBJZiA8Y29kZT5jcmVhdGU8L2NvZGU+IGlzIHRydWUsIHRoZW4gYSBu ZXcsCiAgICBlbXB0eSBpbmRleCB3aWxsIGJlIGNyZWF0ZWQgaW4gPGNvZGU+ZDwvY29kZT4sIHJl cGxhY2luZyB0aGUgaW5kZXggYWxyZWFkeQogICAgdGhlcmUsIGlmIGFueS4gKi8KICBwdWJsaWMg SW5kZXhXcml0ZXIyKERpcmVjdG9yeSBkLCBBbmFseXplciBhLCBmaW5hbCBib29sZWFuIGNyZWF0 ZSkKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICBkaXJlY3RvcnkgPSBkOwogICAgYW5h bHl6ZXIgPSBhOwogICAgcmFtRG9jV3JpdGVyID0gbmV3IERvY3VtZW50V3JpdGVyKHJhbURpcmVj dG9yeSwgYW5hbHl6ZXIsIG1heEZpZWxkTGVuZ3RoKTsKCiAgICBMb2NrIHdyaXRlTG9jayA9IGRp cmVjdG9yeS5tYWtlTG9jaygid3JpdGUubG9jayIpOwogICAgaWYgKCF3cml0ZUxvY2sub2J0YWlu KCkpICAgICAgICAgICAgICAgICAgICAgIC8vIG9idGFpbiB3cml0ZSBsb2NrCiAgICAgIHRocm93 IG5ldyBJT0V4Y2VwdGlvbigiSW5kZXggbG9ja2VkIGZvciB3cml0ZTogIiArIHdyaXRlTG9jayk7 CiAgICB0aGlzLndyaXRlTG9jayA9IHdyaXRlTG9jazsgICAgICAgICAgICAgICAgICAgLy8gc2F2 ZSBpdAoKICAgIHN5bmNocm9uaXplZCAoZGlyZWN0b3J5KSB7CQkJICAvLyBpbi0gJiBpbnRlci1w cm9jZXNzIHN5bmMKICAgICAgbmV3IExvY2suV2l0aChkaXJlY3RvcnkubWFrZUxvY2soImNvbW1p dC5sb2NrIikpIHsKICAgICAgcHVibGljIE9iamVjdCBkb0JvZHkoKSB0aHJvd3MgSU9FeGNlcHRp b24gewogICAgICAgIGlmIChjcmVhdGUpCiAgICAgICAgICBzZWdtZW50SW5mb3Mud3JpdGUoZGly ZWN0b3J5KTsKICAgICAgICBlbHNlCiAgICAgICAgICBzZWdtZW50SW5mb3MucmVhZChkaXJlY3Rv cnkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9LnJ1bigpOwogICAgfQogIH0K CiAgLyoqIEZsdXNoZXMgYWxsIGNoYW5nZXMgdG8gYW4gaW5kZXgsIGNsb3NlcyBhbGwgYXNzb2Np YXRlZCBmaWxlcywgYW5kIGNsb3NlcwogICAgdGhlIGRpcmVjdG9yeSB0aGF0IHRoZSBpbmRleCBp cyBzdG9yZWQgaW4uICovCiAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkg dGhyb3dzIElPRXhjZXB0aW9uIHsKICAgIGZsdXNoUmFtU2VnbWVudHMoKTsKICAgIHJhbURpcmVj dG9yeS5jbG9zZSgpOwogICAgd3JpdGVMb2NrLnJlbGVhc2UoKTsgICAgICAgICAgICAgICAgICAg ICAgICAgIC8vIHJlbGVhc2Ugd3JpdGUgbG9jawogICAgd3JpdGVMb2NrID0gbnVsbDsKICAgIGRp cmVjdG9yeS5jbG9zZSgpOwogIH0KCiAgLyoqIFJlbGVhc2UgdGhlIHdyaXRlIGxvY2ssIGlmIG5l ZWRlZC4gKi8KICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBJT0V4Y2Vw dGlvbiB7CiAgICBpZiAod3JpdGVMb2NrICE9IG51bGwpIHsKICAgICAgd3JpdGVMb2NrLnJlbGVh c2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlIHdyaXRlIGxvY2sKICAgICAg d3JpdGVMb2NrID0gbnVsbDsKICAgIH0KICB9CgogIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yg ZG9jdW1lbnRzIGN1cnJlbnRseSBpbiB0aGlzIGluZGV4LiAqLwogIHB1YmxpYyBmaW5hbCBzeW5j aHJvbml6ZWQgaW50IGRvY0NvdW50KCkgewogICAgaW50IGNvdW50ID0gMDsKICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgc2VnbWVudEluZm9zLnNpemUoKTsgaSsrKSB7CiAgICAgIFNlZ21lbnRJbmZv IHNpID0gc2VnbWVudEluZm9zLmluZm8oaSk7CiAgICAgIGNvdW50ICs9IHNpLmRvY0NvdW50Owog ICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFtU2VnbWVudEluZm9zLnNpemUoKTsgaSsr KSB7CiAgICAgIFNlZ21lbnRJbmZvIHNpID0gc2VnbWVudEluZm9zLmluZm8oaSk7CiAgICAgIGNv dW50ICs9IHNpLmRvY0NvdW50OwogICAgfQoKICAgIHJldHVybiBjb3VudDsKICB9CgogIHB1Ymxp YyBpbnQgbWF4RG9jc0luUmFtID0gMjAwMDsKCiAgLyoqIEFkZHMgYSBkb2N1bWVudCB0byB0aGlz IGluZGV4LiovCiAgcHVibGljIGZpbmFsIHZvaWQgYWRkRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB0 aHJvd3MgSU9FeGNlcHRpb24gewogICAgU3RyaW5nIHNlZ21lbnROYW1lID0gbmV3U2VnbWVudE5h bWUocmFtU2VnbWVudEluZm9zKTsKICAgIHJhbURvY1dyaXRlci5hZGREb2N1bWVudChzZWdtZW50 TmFtZSwgZG9jKTsKICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICByYW1TZWdtZW50SW5m b3MuYWRkRWxlbWVudChuZXcgU2VnbWVudEluZm8oc2VnbWVudE5hbWUsIDEsIHJhbURpcmVjdG9y eSkpOwogICAgICBpZihyYW1TZWdtZW50SW5mb3Muc2l6ZSgpPj1tYXhEb2NzSW5SYW0pCiAgICAg ICAgZmx1c2hSYW1TZWdtZW50cygpOwogICAgfQogIH0KCiAgcHJpdmF0ZSBmaW5hbCBzeW5jaHJv bml6ZWQgU3RyaW5nIG5ld1NlZ21lbnROYW1lKFNlZ21lbnRJbmZvcyBzaXMpIHsKICAgIHJldHVy biAiXyIgKyBJbnRlZ2VyLnRvU3RyaW5nKHNpcy5jb3VudGVyKyssIENoYXJhY3Rlci5NQVhfUkFE SVgpOwogIH0KCiAgLyoqIElmIG5vbi1udWxsLCBpbmZvcm1hdGlvbiBhYm91dCBtZXJnZXMgd2ls bCBiZSBwcmludGVkIHRvIHRoaXMuICovCiAgcHVibGljIFByaW50U3RyZWFtIGluZm9TdHJlYW0g PSBudWxsOwoKICBwdWJsaWMgaW50IG1lcmdlRmFjdG9yID0gMTA7CgogIC8qKiBNZXJnZXMgYWxs IHNlZ21lbnRzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgc2VnbWVudCwgb3B0aW1pemluZyBhbiBp bmRleAogICAgICBmb3Igc2VhcmNoLiAqLwogIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9p ZCBvcHRpbWl6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICBmbHVzaFJhbVNlZ21lbnRzKCk7 CgogICAgd2hpbGUgKHNlZ21lbnRJbmZvcy5zaXplKCkgPiAxIHx8IChzZWdtZW50SW5mb3Muc2l6 ZSgpID09IDEgJiYgKFNlZ21lbnRSZWFkZXIuaGFzRGVsZXRpb25zKHNlZ21lbnRJbmZvcy5pbmZv KDApKSB8fCBzZWdtZW50SW5mb3MuaW5mbygwKS5kaXIgIT0gZGlyZWN0b3J5KSkpIHsKICAgICAg aW50IG1pblNlZ21lbnQgPSBzZWdtZW50SW5mb3Muc2l6ZSgpIC0gbWVyZ2VGYWN0b3I7CiAgICAg IG1lcmdlU2VnbWVudHMoc2VnbWVudEluZm9zLCAobWluU2VnbWVudCA8IDAgPyAwIDogbWluU2Vn bWVudCksIHNlZ21lbnRJbmZvcywgZGlyZWN0b3J5KTsKICAgIH0KICB9CgogIC8qKiBNZXJnZXMg YWxsIHNlZ21lbnRzIGZyb20gYW4gYXJyYXkgb2YgaW5kZXhlcyBpbnRvIHRoaXMgaW5kZXguCiAg ICoKICAgKiA8cD5UaGlzIG1heSBiZSB1c2VkIHRvIHBhcmFsbGVsaXplIGJhdGNoIGluZGV4aW5n LiAgQSBsYXJnZSBkb2N1bWVudAogICAqIGNvbGxlY3Rpb24gY2FuIGJlIGJyb2tlbiBpbnRvIHN1 Yi1jb2xsZWN0aW9ucy4gIEVhY2ggc3ViLWNvbGxlY3Rpb24gY2FuIGJlCiAgICogaW5kZXhlZCBp biBwYXJhbGxlbCwgb24gYSBkaWZmZXJlbnQgdGhyZWFkLCBwcm9jZXNzIG9yIG1hY2hpbmUuICBU aGUKICAgKiBjb21wbGV0ZSBpbmRleCBjYW4gdGhlbiBiZSBjcmVhdGVkIGJ5IG1lcmdpbmcgc3Vi LWNvbGxlY3Rpb24gaW5kZXhlcwogICAqIHdpdGggdGhpcyBtZXRob2QuCiAgICoKICAgKiA8cD5B ZnRlciB0aGlzIGNvbXBsZXRlcywgdGhlIGluZGV4IGlzIG9wdGltaXplZC4gKi8KICBwdWJsaWMg ZmluYWwgc3luY2hyb25pemVkIHZvaWQgYWRkSW5kZXhlcyhEaXJlY3RvcnlbXSBkaXJzKSB0aHJv d3MgSU9FeGNlcHRpb24gewogICAgb3B0aW1pemUoKTsJCQkJCSAgLy8gc3RhcnQgd2l0aCB6ZXJv IG9yIDEgc2VnCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKICAg ICAgU2VnbWVudEluZm9zIHNpcyA9IG5ldyBTZWdtZW50SW5mb3MoKTsJICAvLyByZWFkIGluZm9z IGZyb20gZGlyCiAgICAgIHNpcy5yZWFkKGRpcnNbaV0pOwogICAgICBmb3IgKGludCBqID0gMDsg aiA8IHNpcy5zaXplKCk7IGorKykgewogICAgICAgIHNlZ21lbnRJbmZvcy5hZGRFbGVtZW50KHNp cy5pbmZvKGopKTsJICAvLyBhZGQgZWFjaCBpbmZvCiAgICAgIH0KICAgIH0KICAgIG9wdGltaXpl KCk7CQkJCQkgIC8vIGZpbmFsIGNsZWFudXAKICB9CgogIC8qKiBNZXJnZXMgYWxsIFJBTS1yZXNp ZGVudCBzZWdtZW50cyBpbnRvIG9uZSBSQU0gc2VnbWVudCBhbmQgdGhlbiB3cml0ZXMKICAgKiAg aXQgaW50byB0aGUgZGlyZWN0b3J5ICh3aGVyZSB0aGUgaW5kZXggaXMgYmVpbmcgYnVpbHQpLgog ICAqKi8KICBwcml2YXRlIGZpbmFsIHZvaWQgZmx1c2hSYW1TZWdtZW50cygpIHRocm93cyBJT0V4 Y2VwdGlvbiB7CiAgICBpZihyYW1TZWdtZW50SW5mb3Muc2l6ZSgpPT0wKQogICAgICAgIHJldHVy bjsgLy9ub3RoaW5nIHRvIGRvLgoKICAgIGlmKHJhbVNlZ21lbnRJbmZvcy5zaXplKCk+MSkgLy9t YWtlIG9uZSBzZWdtZW50IGluIHRoZSByYW1EaXJlY3RvcnkKICAgICAgICBtZXJnZVNlZ21lbnRz KHJhbVNlZ21lbnRJbmZvcywgMCwgcmFtU2VnbWVudEluZm9zLCByYW1EaXJlY3RvcnkpOwoKICAg IC8vbWVyZ2UgdGhlIG9uZSByYW0gc2VnbWVudCBpbnRvIHRoZSBkaXJlY3Rvcnk6CiAgICBtZXJn ZVNlZ21lbnRzKHJhbVNlZ21lbnRJbmZvcywgMCwgc2VnbWVudEluZm9zLCBkaXJlY3RvcnkpOwog IH0KCgogIC8qKiBQb3BzIHNlZ21lbnRzIG9mZiBvZiBzb3VyY2VTZWdtZW50SW5mb3Mgc3RhY2sg ZG93biB0byBtaW5TZWdtZW50LCBtZXJnZXMgdGhlbSwKICAgIGFuZCBwdXNoZXMgdGhlIG1lcmdl ZCBpbmRleCBvbnRvIHRoZSB0b3Agb2YgdGhlIHNlZ21lbnRJbmZvcyBzdGFjay4gKi8KICBwcml2 YXRlIGZpbmFsIHZvaWQgbWVyZ2VTZWdtZW50cyhTZWdtZW50SW5mb3Mgc291cmNlU2VnbWVudElu Zm9zLCBpbnQgbWluU2VnbWVudCwgZmluYWwgU2VnbWVudEluZm9zIHRhcmdldFNlZ21lbnRJbmZv cywgZmluYWwgRGlyZWN0b3J5IHRhcmdldERpcmVjdG9yeSkKICAgICAgdGhyb3dzIElPRXhjZXB0 aW9uIHsKICAgIFN0cmluZyBtZXJnZWROYW1lID0gbmV3U2VnbWVudE5hbWUodGFyZ2V0U2VnbWVu dEluZm9zKTsKICAgIGludCBtZXJnZWREb2NDb3VudCA9IDA7CiAgICBpZiAoaW5mb1N0cmVhbSAh PSBudWxsKSBpbmZvU3RyZWFtLnByaW50KCJtZXJnaW5nIHNlZ21lbnRzIik7CiAgICBTZWdtZW50 TWVyZ2VyIG1lcmdlciA9IG5ldyBTZWdtZW50TWVyZ2VyKHRhcmdldERpcmVjdG9yeSwgbWVyZ2Vk TmFtZSk7CgogICAgZmluYWwgSGFzaE1hcCBzZWdtZW50c1RvRGVsZXRlID0gbmV3IEhhc2hNYXAo KTsgLy9tYXBzIChTZWdtZW50SW5mbykgc2VnbWVudEluZm8gLT4gKFZlY3RvcikgbmFtZXMgb2Yg ZmlsZXMsIGNvbXByaXNpbmcgdGhpcyBzZWdtZW50CgogICAgZm9yIChpbnQgaSA9IG1pblNlZ21l bnQ7IGkgPCBzb3VyY2VTZWdtZW50SW5mb3Muc2l6ZSgpOyBpKyspIHsKICAgICAgU2VnbWVudElu Zm8gc2kgPSBzb3VyY2VTZWdtZW50SW5mb3MuaW5mbyhpKTsKICAgICAgaWYgKGluZm9TdHJlYW0g IT0gbnVsbCkKICAgICAgICBpbmZvU3RyZWFtLnByaW50KCIgIiArIHNpLm5hbWUgKyAiICgiICsg c2kuZG9jQ291bnQgKyAiIGRvY3MpIik7CiAgICAgIFNlZ21lbnRSZWFkZXIgcmVhZGVyID0gbmV3 IFNlZ21lbnRSZWFkZXIoc2kpOwogICAgICBtZXJnZXIuYWRkKHJlYWRlcik7CiAgICAgIHNlZ21l bnRzVG9EZWxldGUucHV0KHNpLCByZWFkZXIuZmlsZXMoKSk7CiAgICAgIG1lcmdlZERvY0NvdW50 ICs9IHNpLmRvY0NvdW50OwogICAgfQoKICAgIGlmIChpbmZvU3RyZWFtICE9IG51bGwpCiAgICAg IGluZm9TdHJlYW0ucHJpbnRsbigiXG4gaW50byAiK21lcmdlZE5hbWUrIiAoIittZXJnZWREb2ND b3VudCsiIGRvY3MpIik7CgogICAgbWVyZ2VyLm1lcmdlKCk7IC8vaXQgd2lsbCBjbG9zZSB0aGUg b3BlbmVkIFNlZ21lbnRSZWFkZXItcyBhdCB0aGUgZW5kLgoKICAgIHNvdXJjZVNlZ21lbnRJbmZv cy5zZXRTaXplKG1pblNlZ21lbnQpOwkJICAvLyBwb3Agb2xkIGluZm9zICYgYWRkIG5ldwogICAg dGFyZ2V0U2VnbWVudEluZm9zLmFkZEVsZW1lbnQobmV3IFNlZ21lbnRJbmZvKG1lcmdlZE5hbWUs IG1lcmdlZERvY0NvdW50LCB0YXJnZXREaXJlY3RvcnkpKTsKCiAgICBzeW5jaHJvbml6ZWQgKHRh cmdldERpcmVjdG9yeSkgewkJCSAgLy8gaW4tICYgaW50ZXItcHJvY2VzcyBzeW5jCiAgICAgIG5l dyBMb2NrLldpdGgoZGlyZWN0b3J5Lm1ha2VMb2NrKCJjb21taXQubG9jayIpKSB7CiAgICAgICAg cHVibGljIE9iamVjdCBkb0JvZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgdGFy Z2V0U2VnbWVudEluZm9zLndyaXRlKHRhcmdldERpcmVjdG9yeSk7CSAgLy8gY29tbWl0IGJlZm9y ZSBkZWxldGluZwoKICAgICAgICAgIFZlY3RvciBkZWxldGFibGUgPSBuZXcgVmVjdG9yKCk7IC8v ZmlsZXMsIHdoaWNoIGNhbid0IGJlIGRlbGV0ZWQgcmlnaHQgbm93IHdpbGwgYmUgc3RvcmVkIGhl cmUgYW5kIHNhdmVkIHRvIGEgZmlsZSwgbmFtZWQgJ2RlbGV0YWJsZScKCiAgICAgICAgICBmb3Io amF2YS51dGlsLkl0ZXJhdG9yIGl0ZXI9c2VnbWVudHNUb0RlbGV0ZS5rZXlTZXQoKS5pdGVyYXRv cigpOyBpdGVyLmhhc05leHQoKTsgKSB7CiAgICAgICAgICAgIFNlZ21lbnRJbmZvIHNpID0gKFNl Z21lbnRJbmZvKSBpdGVyLm5leHQoKTsKICAgICAgICAgICAgVmVjdG9yIGZpbGVzVG9EZWxldGUg PSAoVmVjdG9yKSBzZWdtZW50c1RvRGVsZXRlLmdldChzaSk7CiAgICAgICAgICAgIGRlbGV0ZUZp bGVzKGZpbGVzVG9EZWxldGUsIGRlbGV0YWJsZSwgc2kuZGlyKTsgLy8gZGVsZXRlIG5vdy11bnVz ZWQgc2VnbWVudHMKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaW5mb1N0cmVhbSAhPSBudWxs KQogICAgICAgICAgICBpbmZvU3RyZWFtLnByaW50bG4oIlRoZSBmb2xsb3dpbmcgZmlsZXMgY291 bGQgbm90IGJlIGRlbGV0ZWQgOiAiK2RlbGV0YWJsZSk7CiAgICAgICAgICAvL2RlbGV0ZUZpbGVz KHJlYWREZWxldGVhYmxlRmlsZXMoKSwgZGVsZXRhYmxlLCBkaXJlY3RvcnkpOyAvLyB0cnkgdG8g ZGVsZXRlIHRoZSBmaWxlcy4gbGlzdGVkIGluIGZpbGUgJ2RlbGV0ZWFibGUnCiAgICAgICAgICAv L3dyaXRlRGVsZXRlYWJsZUZpbGVzKGRlbGV0YWJsZSk7CQkgIC8vIG5vdGUgZmlsZXMgd2UgY2Fu J3QgZGVsZXRlCgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9LnJ1bigp OwogICAgfQoKICB9CgogIHByaXZhdGUgZmluYWwgdm9pZCBkZWxldGVGaWxlcyhWZWN0b3IgZmls ZXMsIFZlY3RvciBkZWxldGFibGUsIERpcmVjdG9yeSBkKQogICAgICAgdGhyb3dzIElPRXhjZXB0 aW9uIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAg U3RyaW5nIGZpbGUgPSAoU3RyaW5nKWZpbGVzLmVsZW1lbnRBdChpKTsKICAgICAgdHJ5IHsKICAg ICAgICBkLmRlbGV0ZUZpbGUoZmlsZSk7CQkgIC8vIHRyeSB0byBkZWxldGUgZWFjaCBmaWxlCiAg ICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsJCQkgIC8vIGlmIGRlbGV0ZSBmYWlscwogICAg ICAgIGlmIChkaXJlY3RvcnkuZmlsZUV4aXN0cyhmaWxlKSkgewogICAgICAgICAgZGVsZXRhYmxl LmFkZEVsZW1lbnQoZmlsZSk7CQkgIC8vIGFkZCB0byBkZWxldGFibGUKICAgICAgICB9CiAgICAg IH0KICAgIH0KICB9CgogIHByaXZhdGUgZmluYWwgVmVjdG9yIHJlYWREZWxldGVhYmxlRmlsZXMo KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsK ICAgIGlmICghZGlyZWN0b3J5LmZpbGVFeGlzdHMoImRlbGV0YWJsZSIpKQogICAgICByZXR1cm4g cmVzdWx0OwoKICAgIElucHV0U3RyZWFtIGlucHV0ID0gZGlyZWN0b3J5Lm9wZW5GaWxlKCJkZWxl dGFibGUiKTsKICAgIHRyeSB7CiAgICAgIGZvciAoaW50IGkgPSBpbnB1dC5yZWFkSW50KCk7IGkg PiAwOyBpLS0pCSAgLy8gcmVhZCBmaWxlIG5hbWVzCiAgICByZXN1bHQuYWRkRWxlbWVudChpbnB1 dC5yZWFkU3RyaW5nKCkpOwogICAgfSBmaW5hbGx5IHsKICAgICAgaW5wdXQuY2xvc2UoKTsKICAg IH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBwcml2YXRlIGZpbmFsIHZvaWQgd3JpdGVEZWxl dGVhYmxlRmlsZXMoVmVjdG9yIGZpbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgT3V0cHV0 U3RyZWFtIG91dHB1dCA9IGRpcmVjdG9yeS5jcmVhdGVGaWxlKCJkZWxldGVhYmxlLm5ldyIpOwog ICAgdHJ5IHsKICAgICAgb3V0cHV0LndyaXRlSW50KGZpbGVzLnNpemUoKSk7CiAgICAgIGZvciAo aW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspCiAgICBvdXRwdXQud3JpdGVTdHJpbmco KFN0cmluZylmaWxlcy5lbGVtZW50QXQoaSkpOwogICAgfSBmaW5hbGx5IHsKICAgICAgb3V0cHV0 LmNsb3NlKCk7CiAgICB9CiAgICBkaXJlY3RvcnkucmVuYW1lRmlsZSgiZGVsZXRlYWJsZS5uZXci LCAiZGVsZXRhYmxlIik7CiAgfQoKfQo= ------_=_NextPart_001_01C1BEFC.8347A9B8 Content-Type: text/plain; charset=us-ascii -- To unsubscribe, e-mail: For additional commands, e-mail: ------_=_NextPart_001_01C1BEFC.8347A9B8--