LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2ludmVyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgImNydGRsbC5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChzdHJpbmcpOwpERUNMQVJFX0RFQlVHX0NIQU5ORUwod2luMzIpOwoKc3RydWN0IE5MU19sYW5nbG9jYWxlIHsKCWNvbnN0IGludCBsYW5nOwoJc3RydWN0IE5MU19sb2NhbGV2YXIgewoJCWNvbnN0IGludAl0eXBlOwoJCWNvbnN0IGNoYXIJKnZhbDsKCX0gbG9jdmFyc1sxMjBdOwp9OwoKI2RlZmluZSBMQU5HX0JFR0lOKGwscykJewlNQUtFTEFOR0lEKGwscyksIHsKCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpCQkJCQl7dHlwZSx2YWx1ZX0sCgojZGVmaW5lIExBTkdfRU5ECQkJCQkgfX0sCgpzdGF0aWMgY29uc3Qgc3RydWN0IE5MU19sYW5nbG9jYWxlIGxhbmdsb2NhbGVzW10gPSB7Ci8qIGFkZCBsYW5ndWFnZXMgaW4gbnVtZXJpY2FsIG9yZGVyIG9mIG1haW4gbGFuZ3VhZ2UgKGxhc3QgdHdvIGRpZ2l0cykKICogaXQgaXMgbXVjaCBlYXNpZXIgdG8gZmluZCB0aGUgbWlzc2luZyBob2xlcyB0aGF0IHdheSAqLwoKTEFOR19CRUdJTiAoTEFOR19DQVRBTEFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDAzKi8KI2luY2x1ZGUgIm5scy9jYXQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DWkVDSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNSovCiNpbmNsdWRlICJubHMvY3plLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDA2Ki8KI2luY2x1ZGUgIm5scy9kYW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOKQkJLyoweDA0MDcqLwojaW5jbHVkZSAibmxzL2RldS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9TV0lTUykJCS8qMHgwODA3Ki8KI2luY2x1ZGUgIm5scy9kZXMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU4pCS8qMHgwQzA3Ki8KI2luY2x1ZGUgIm5scy9kZWEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRykJLyoweDEwMDcqLwojaW5jbHVkZSAibmxzL2RlbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOKQkvKjB4MTQwNyovCiNpbmNsdWRlICJubHMvZGVjLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKQkJLyoweDA0MDkqLwojaW5jbHVkZSAibmxzL2VudS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VLKQkJLyoweDA4MDkqLwojaW5jbHVkZSAibmxzL2VuZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0FVUykJCS8qMHgwQzA5Ki8KI2luY2x1ZGUgIm5scy9lbmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQU4pCQkvKjB4MTAwOSovCiNpbmNsdWRlICJubHMvZW5jLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfTlopCQkvKjB4MTQwOSovCiNpbmNsdWRlICJubHMvZW56Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfRUlSRSkJCS8qMHgxODA5Ki8KI2luY2x1ZGUgIm5scy9lbmkubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9TQUZSSUNBKQkvKjB4MUMwOSovCiNpbmNsdWRlICJubHMvZW5zLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSkJLyoweDIwMDkqLwojaW5jbHVkZSAibmxzL2Vuai5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0NBUlJJQkVBTikJLyoweDI0MDkqLwojaW5jbHVkZSAibmxzL2VuYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0JFTElaRSkJLyoweDI4MDkqLwojaW5jbHVkZSAibmxzL2VubC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEKSAgICAJLyoweDJDMDkqLwojaW5jbHVkZSAibmxzL2VudC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSCkJCS8qMHgwNDBhKi8KI2luY2x1ZGUgIm5scy9lc3AubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOKQkvKjB4MDgwYSovCiNpbmNsdWRlICJubHMvZXNtLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOKQkvKjB4MEMwYSovCiNpbmNsdWRlICJubHMvZXNuLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBKQkvKjB4MTAwYSovCiNpbmNsdWRlICJubHMvZXNnLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09TVEFSSUNBKQkvKjB4MTQwYSovCiNpbmNsdWRlICJubHMvZXNjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BKQkvKjB4MTgwYSovCiNpbmNsdWRlICJubHMvZXNhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOKQkvKjB4MUMwQSovCiNpbmNsdWRlICJubHMvZXNkLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBKQkvKjB4MjAwYSovCiNpbmNsdWRlICJubHMvZXN2Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEpCS8qMHgyNDBhKi8KI2luY2x1ZGUgIm5scy9lc28ubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QRVJVKQkJLyoweDI4MGEqLwojaW5jbHVkZSAibmxzL2Vzci5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSkJLyoweDJjMGEqLwojaW5jbHVkZSAibmxzL2Vzcy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IpCS8qMHgzMDBhKi8KI2luY2x1ZGUgIm5scy9lc2YubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9DSElMRSkJLyoweDM0MGEqLwojaW5jbHVkZSAibmxzL2VzbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkpCS8qMHgzODBhKi8KI2luY2x1ZGUgIm5scy9lc3kubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSkJLyoweDNjMGEqLwojaW5jbHVkZSAibmxzL2Vzei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEpCS8qMHg0MDBhKi8KI2luY2x1ZGUgIm5scy9lc2IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUikJLyoweDQ0MGEqLwojaW5jbHVkZSAibmxzL2VzZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTKQkvKjB4NDgwYSovCiNpbmNsdWRlICJubHMvZXNoLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBKQkvKjB4NGMwYSovCiNpbmNsdWRlICJubHMvZXNpLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08pCS8qMHg1MDBhKi8KI2luY2x1ZGUgIm5scy9lc3UubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GSU5OSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBCKi8KI2luY2x1ZGUgIm5scy9maW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIKQkJLyoweDA0MEMqLwojaW5jbHVkZSAibmxzL2ZyYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOKQkvKjB4MDgwQyovCiNpbmNsdWRlICJubHMvZnJiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOKQkvKjB4MEMwQyovCiNpbmNsdWRlICJubHMvZnJjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX1NXSVNTKQkJLyoweDEwMEMqLwojaW5jbHVkZSAibmxzL2Zycy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHKQkvKjB4MTQwQyovCiNpbmNsdWRlICJubHMvZnJsLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSFVOR0FSSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBlKi8KI2luY2x1ZGUgIm5scy9odW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU4pCQkvKjB4MDQxMCovCiNpbmNsdWRlICJubHMvaXRhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU5fU1dJU1MpCS8qMHgwODEwKi8KI2luY2x1ZGUgIm5scy9pdHMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19KQVBBTkVTRSwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxMSovCiNpbmNsdWRlICJubHMvanBuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfS09SRUFOLCBTVUJMQU5HX0tPUkVBTikJLyoweDA0MTIqLwojaW5jbHVkZSAibmxzL2tvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIKQkJLyoweDA0MTMqLwojaW5jbHVkZSAibmxzL25sZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTikJLyoweDA4MTMqLwojaW5jbHVkZSAibmxzL25sYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfU1VSSU5BTSkJLyoweDBDMTMqLwojaW5jbHVkZSAibmxzL25scy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMKQkvKjB4MDQxNCovCiNpbmNsdWRlICJubHMvbm9yLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0spCS8qMHgwODE0Ki8KI2luY2x1ZGUgIm5scy9ub24ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTUqLwojaW5jbHVkZSAibmxzL3Bsay5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4pCS8qMHgwNDE2Ki8KI2luY2x1ZGUgIm5scy9wdGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRSkJCS8qMHgwODE2Ki8KI2luY2x1ZGUgIm5scy9wdGcubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MTkqLwojaW5jbHVkZSAibmxzL3J1cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NMT1ZBSywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxYiovCiNpbmNsdWRlICJubHMvc2t5Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIKQkJLyoweDA0MWQqLwojaW5jbHVkZSAibmxzL3N2ZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQpCS8qMHgwODFkKi8KI2luY2x1ZGUgIm5scy9zdmYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19USEFJLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MWUqLwojaW5jbHVkZSAibmxzL3RoYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0FFTElDLCBTVUJMQU5HX0RFRkFVTFQpIC8qIDB4MDQzYyAqLwojaW5jbHVkZSAibmxzL2dhZS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19HQUVMSUNfU0NPVFRJU0gpCiNpbmNsdWRlICJubHMvZ2RoLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfR0FFTElDLCBTVUJMQU5HX0dBRUxJQ19NQU5YKQojaW5jbHVkZSAibmxzL2dkdi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VTUEVSQU5UTywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQ4ZiovCiNpbmNsdWRlICJubHMvZXNwZXJhbnRvLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfV0FMT04sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OTAqLwojaW5jbHVkZSAibmxzL3dhbC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0NPUk5JU0gsIFNVQkxBTkdfREVGQVVMVCkgLyogMHgwNDkxICAqLwojaW5jbHVkZSAibmxzL2Nvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1dFTFNILCBTVUJMQU5HX0RFRkFVTFQpIC8qIDB4MDQ5MiAqLwojaW5jbHVkZSAibmxzL2N5bS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0JSRVRPTiwgU1VCTEFOR19ERUZBVUxUKSAvKiAweDB4OTMgICovCiNpbmNsdWRlICJubHMvYnJmLm5scyIKTEFOR19FTkQKCgkgICAgfTsKCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsZUluZm9BIAogKiBNVVNUIGNvbnRhaW4gYWxsICNkZWZpbmVzIGZyb20gd2lubmxzLmgKICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgogKi8gCiNkZWZpbmUgTE9DQUxFX0VOVFJZKHgpCXsjeCxMT0NBTEVfIyN4fQpzdGF0aWMgY29uc3Qgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKICAgIGNvbnN0IGNoYXIJKm5hbWU7CglEV09SRAlpZDsKfSBsb2NhbGVfbmFtZTJpZFtdPSB7CglMT0NBTEVfRU5UUlkoSUxBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNFTkdMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKElDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0VOR0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVExBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQU5TSUNPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVE1BQ0NPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShTTElTVCksCglMT0NBTEVfRU5UUlkoSU1FQVNVUkUpLAoJTE9DQUxFX0VOVFJZKFNERUNJTUFMKSwKCUxPQ0FMRV9FTlRSWShTVEhPVVNBTkQpLAoJTE9DQUxFX0VOVFJZKFNHUk9VUElORyksCglMT0NBTEVfRU5UUlkoSURJR0lUUyksCglMT0NBTEVfRU5UUlkoSUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTkVHTlVNQkVSKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShTQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKFNJTlRMU1lNQk9MKSwKCUxPQ0FMRV9FTlRSWShTTU9OREVDSU1BTFNFUCksCglMT0NBTEVfRU5UUlkoU01PTlRIT1VTQU5EU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJSU5UTENVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoSU5FR0NVUlIpLAoJTE9DQUxFX0VOVFJZKFNEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRSksCglMT0NBTEVfRU5UUlkoU1NIT1JUREFURSksCglMT0NBTEVfRU5UUlkoU0xPTkdEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRUZPUk1BVCksCglMT0NBTEVfRU5UUlkoSURBVEUpLAoJTE9DQUxFX0VOVFJZKElMREFURSksCglMT0NBTEVfRU5UUlkoSVRJTUUpLAoJTE9DQUxFX0VOVFJZKElUSU1FTUFSS1BPU04pLAoJTE9DQUxFX0VOVFJZKElDRU5UVVJZKSwKCUxPQ0FMRV9FTlRSWShJVExaRVJPKSwKCUxPQ0FMRV9FTlRSWShJREFZTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElNT05MWkVSTyksCglMT0NBTEVfRU5UUlkoUzExNTkpLAoJTE9DQUxFX0VOVFJZKFMyMzU5KSwKCUxPQ0FMRV9FTlRSWShJQ0FMRU5EQVJUWVBFKSwKCUxPQ0FMRV9FTlRSWShJT1BUSU9OQUxDQUxFTkRBUiksCglMT0NBTEVfRU5UUlkoSUZJUlNUREFZT0ZXRUVLKSwKCUxPQ0FMRV9FTlRSWShJRklSU1RXRUVLT0ZZRUFSKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNQT1NJVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKFNORUdBVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKElQT1NTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSU5FR1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElQT1NTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShJTkVHU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElORUdTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShGT05UU0lHTkFUVVJFKSwKCUxPQ0FMRV9FTlRSWShTSVNPNjM5TEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNJU08zMTY2Q1RSWU5BTUUpLAoJe05VTEwsMH0sCn07Cgpjb25zdCBzdHJ1Y3QgbWFwX2xjaWQyc3RyIHsKCUxDSUQJCWxhbmdpZDsKCWNvbnN0IGNoYXIJKmxhbmduYW1lOwp9IGxhbmd1YWdlc1tdPXsKCXsweDA0MDEsIkFyYWJpYyAoU2F1ZGkgQXJhYmlhKSJ9LAoJezB4MDgwMSwiQXJhYmljIChJcmFxKSJ9LAoJezB4MGMwMSwiQXJhYmljIChFZ3lwdCkifSwKCXsweDEwMDEsIkFyYWJpYyAoTGlieWEpIn0sCgl7MHgxNDAxLCJBcmFiaWMgKEFsZ2VyaWEpIn0sCgl7MHgxODAxLCJBcmFiaWMgKE1vcm9jY28pIn0sCgl7MHgxYzAxLCJBcmFiaWMgKFR1bmlzaWEpIn0sCgl7MHgyMDAxLCJBcmFiaWMgKE9tYW4pIn0sCgl7MHgyNDAxLCJBcmFiaWMgKFllbWVuKSJ9LAoJezB4MjgwMSwiQXJhYmljIChTeXJpYSkifSwKCXsweDJjMDEsIkFyYWJpYyAoSm9yZGFuKSJ9LAoJezB4MzAwMSwiQXJhYmljIChMZWJhbm9uKSJ9LAoJezB4MzQwMSwiQXJhYmljIChLdXdhaXQpIn0sCgl7MHgzODAxLCJBcmFiaWMgKFVuaXRlZCBBcmFiIEVtaXJhdGVzKSJ9LAoJezB4M2MwMSwiQXJhYmljIChCYWhyYWluKSJ9LAoJezB4NDAwMSwiQXJhYmljIChRYXRhcikifSwKCXsweDA0MDIsIkJ1bGdhcmlhbiJ9LAoJezB4MDQwMywiQ2F0YWxhbiJ9LAoJezB4MDQwNCwiQ2hpbmVzZSAoVGFpd2FuKSJ9LAoJezB4MDgwNCwiQ2hpbmVzZSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YgQ2hpbmEpIn0sCgl7MHgwYzA0LCJDaGluZXNlIChIb25nIEtvbmcpIn0sCgl7MHgxMDA0LCJDaGluZXNlIChTaW5nYXBvcmUpIn0sCgl7MHgxNDA0LCJDaGluZXNlIChNYWNhdSkifSwKCXsweDA0MDUsIkN6ZWNoIn0sCgl7MHgwNDA2LCJEYW5pc2gifSwKCXsweDA0MDcsIkdlcm1hbiAoR2VybWFueSkifSwKCXsweDA4MDcsIkdlcm1hbiAoU3dpdHplcmxhbmQpIn0sCgl7MHgwYzA3LCJHZXJtYW4gKEF1c3RyaWEpIn0sCgl7MHgxMDA3LCJHZXJtYW4gKEx1eGVtYm91cmcpIn0sCgl7MHgxNDA3LCJHZXJtYW4gKExpZWNodGVuc3RlaW4pIn0sCgl7MHgwNDA4LCJHcmVlayJ9LAoJezB4MDQwOSwiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykifSwKCXsweDA4MDksIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKSJ9LAoJezB4MGMwOSwiRW5nbGlzaCAoQXVzdHJhbGlhbikifSwKCXsweDEwMDksIkVuZ2xpc2ggKENhbmFkaWFuKSJ9LAoJezB4MTQwOSwiRW5nbGlzaCAoTmV3IFplYWxhbmQpIn0sCgl7MHgxODA5LCJFbmdsaXNoIChJcmVsYW5kKSJ9LAoJezB4MWMwOSwiRW5nbGlzaCAoU291dGggQWZyaWNhKSJ9LAoJezB4MjAwOSwiRW5nbGlzaCAoSmFtYWljYSkifSwKCXsweDI0MDksIkVuZ2xpc2ggKENhcmliYmVhbikifSwKCXsweDI4MDksIkVuZ2xpc2ggKEJlbGl6ZSkifSwKCXsweDJjMDksIkVuZ2xpc2ggKFRyaW5pZGFkICYgVG9iYWdvKSJ9LAoJezB4MzAwOSwiRW5nbGlzaCAoWmltYmFid2UpIn0sCgl7MHgzNDA5LCJFbmdsaXNoIChQaGlsaXBwaW5lcykifSwKCXsweDA0MGEsIlNwYW5pc2ggKFNwYWluLCB0cmFkaXRpb25hbCBzb3J0aW5nKSJ9LAoJezB4MDgwYSwiU3BhbmlzaCAoTWV4aWNvKSJ9LAoJezB4MGMwYSwiU3BhbmlzaCAoU3BhaW4sIGludGVybmF0aW9uYWwgc29ydGluZykifSwKCXsweDEwMGEsIlNwYW5pc2ggKEd1YXRlbWFsYSkifSwKCXsweDE0MGEsIlNwYW5pc2ggKENvc3RhIFJpY2EpIn0sCgl7MHgxODBhLCJTcGFuaXNoIChQYW5hbWEpIn0sCgl7MHgxYzBhLCJTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpIn0sCgl7MHgyMDBhLCJTcGFuaXNoIChWZW5lenVlbGEpIn0sCgl7MHgyNDBhLCJTcGFuaXNoIChDb2xvbWJpYSkifSwKCXsweDI4MGEsIlNwYW5pc2ggKFBlcnUpIn0sCgl7MHgyYzBhLCJTcGFuaXNoIChBcmdlbnRpbmEpIn0sCgl7MHgzMDBhLCJTcGFuaXNoIChFY3VhZG9yKSJ9LAoJezB4MzQwYSwiU3BhbmlzaCAoQ2hpbGUpIn0sCgl7MHgzODBhLCJTcGFuaXNoIChVcnVndWF5KSJ9LAoJezB4M2MwYSwiU3BhbmlzaCAoUGFyYWd1YXkpIn0sCgl7MHg0MDBhLCJTcGFuaXNoIChCb2xpdmlhKSJ9LAoJezB4NDQwYSwiU3BhbmlzaCAoRWwgU2FsdmFkb3IpIn0sCgl7MHg0ODBhLCJTcGFuaXNoIChIb25kdXJhcykifSwKCXsweDRjMGEsIlNwYW5pc2ggKE5pY2FyYWd1YSkifSwKCXsweDUwMGEsIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKSJ9LAoJezB4MDQwYiwiRmlubmlzaCJ9LAoJezB4MDQwYywiRnJlbmNoIChGcmFuY2UpIn0sCgl7MHgwODBjLCJGcmVuY2ggKEJlbGdpdW0pIn0sCgl7MHgwYzBjLCJGcmVuY2ggKENhbmFkYSkifSwKCXsweDEwMGMsIkZyZW5jaCAoU3dpdHplcmxhbmQpIn0sCgl7MHgxNDBjLCJGcmVuY2ggKEx1eGVtYm91cmcpIn0sCgl7MHgxODBjLCJGcmVuY2ggKE1vbmFjbykifSwKCXsweDA0MGQsIkhlYnJldyJ9LAoJezB4MDQwZSwiSHVuZ2FyaWFuIn0sCgl7MHgwNDBmLCJJY2VsYW5kaWMifSwKCXsweDA0MTAsIkl0YWxpYW4gKEl0YWx5KSJ9LAoJezB4MDgxMCwiSXRhbGlhbiAoU3dpdHplcmxhbmQpIn0sCgl7MHgwNDExLCJKYXBhbmVzZSJ9LAoJezB4MDQxMiwiS29yZWFuIChXYW5zdW5nKSJ9LAoJezB4MDgxMiwiS29yZWFuIChKb2hhYikifSwKCXsweDA0MTMsIkR1dGNoIChOZXRoZXJsYW5kcykifSwKCXsweDA4MTMsIkR1dGNoIChCZWxnaXVtKSJ9LAoJezB4MDQxNCwiTm9yd2VnaWFuIChCb2ttYWwpIn0sCgl7MHgwODE0LCJOb3J3ZWdpYW4gKE55bm9yc2spIn0sCgl7MHgwNDE1LCJQb2xpc2gifSwKCXsweDA0MTYsIlBvcnR1Z3Vlc2UgKEJyYXppbCkifSwKCXsweDA4MTYsIlBvcnR1Z3Vlc2UgKFBvcnR1Z2FsKSJ9LAoJezB4MDQxNywiUmhhZXRvIFJvbWFuaWMifSwKCXsweDA0MTgsIlJvbWFuaWFuIn0sCgl7MHgwODE4LCJNb2xkYXZpYW4ifSwKCXsweDA0MTksIlJ1c3NpYW4gKFJ1c3NpYSkifSwKCXsweDA4MTksIlJ1c3NpYW4gKE1vbGRhdmlhKSJ9LAoJezB4MDQxYSwiQ3JvYXRpYW4ifSwKCXsweDA4MWEsIlNlcmJpYW4gKGxhdGluKSJ9LAoJezB4MGMxYSwiU2VyYmlhbiAoY3lyaWxsaWMpIn0sCgl7MHgwNDFiLCJTbG92YWsifSwKCXsweDA0MWMsIkFsYmFuaWFuIn0sCgl7MHgwNDFkLCJTd2VkaXNoIChTd2VkZW4pIn0sCgl7MHgwODFkLCJTd2VkaXNoIChGaW5sYW5kKSJ9LAoJezB4MDQxZSwiVGhhaSJ9LAoJezB4MDQxZiwiVHVya2lzaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiSW5kb25lc2lhbiJ9LAoJezB4MDQyMiwiVWtyYWluaWFuIn0sCgl7MHgwNDIzLCJCZWxhcnVzaWFuIn0sCgl7MHgwNDI0LCJTbG92ZW5lIn0sCgl7MHgwNDI1LCJFc3RvbmlhbiJ9LAoJezB4MDQyNiwiTGF0dmlhbiJ9LAoJezB4MDQyNywiTGl0aHVhbmlhbiAobW9kZXJuKSJ9LAoJezB4MDgyNywiTGl0aHVhbmlhbiAoY2xhc3NpYykifSwKCXsweDA0MjgsIk1hb3JpIn0sCgl7MHgwNDI5LCJGYXJzaSJ9LAoJezB4MDQyYSwiVmlldG5hbWVzZSJ9LAoJezB4MDQyYiwiQXJtZW5pYW4ifSwKCXsweDA0MmMsIkF6ZXJpIChsYXRpbikifSwKCXsweDA4MmMsIkF6ZXJpIChjeXJpbGxpYykifSwKCXsweDA0MmQsIkJhc3F1ZSJ9LAoJezB4MDQyZSwiU29yYmlhbiJ9LAoJezB4MDQyZiwiTWFjZWRvbmlhbiJ9LAoJezB4MDQzMCwiU3V0dSJ9LAoJezB4MDQzMSwiVHNvbmdhIn0sCgl7MHgwNDMyLCJUc3dhbmEifSwKCXsweDA0MzMsIlZlbmRhIn0sCgl7MHgwNDM0LCJYaG9zYSJ9LAoJezB4MDQzNSwiWnVsdSJ9LAoJezB4MDQzNiwiQWZyaWthYW5zIn0sCgl7MHgwNDM3LCJHZW9yZ2lhbiJ9LAoJezB4MDQzOCwiRmFlcm9lc2UifSwKCXsweDA0MzksIkhpbmRpIn0sCgl7MHgwNDNhLCJNYWx0ZXNlIn0sCgl7MHgwNDNiLCJTYWFtaSJ9LAoJezB4MDQzYywiSXJpc2ggZ2FlbGljIn0sCgl7MHgwODNjLCJTY290dGlzaCBnYWVsaWMifSwKCXsweDBjM2MsIk1hbnggR2FlbGljIn0sCgl7MHgwNDNlLCJNYWxheSAoTWFsYXlzaWEpIn0sCgl7MHgwODNlLCJNYWxheSAoQnJ1bmVpIERhcnVzc2FsYW0pIn0sCgl7MHgwNDNmLCJLYXphayJ9LAoJezB4MDQ0MSwiU3dhaGlsaSJ9LAoJezB4MDQ0MywiVXpiZWsgKGxhdGluKSJ9LAoJezB4MDg0MywiVXpiZWsgKGN5cmlsbGljKSJ9LAoJezB4MDQ0NCwiVGF0YXIifSwKCXsweDA0NDUsIkJlbmdhbGkifSwKCXsweDA0NDYsIlB1bmphYmkifSwKCXsweDA0NDcsIkd1amFyYXRpIn0sCgl7MHgwNDQ4LCJPcml5YSJ9LAoJezB4MDQ0OSwiVGFtaWwifSwKCXsweDA0NGEsIlRlbHVndSJ9LAoJezB4MDQ0YiwiS2FubmFkYSJ9LAoJezB4MDQ0YywiTWFsYXlhbGFtIn0sCgl7MHgwNDRkLCJBc3NhbWVzZSJ9LAoJezB4MDQ0ZSwiTWFyYXRoaSJ9LAoJezB4MDQ0ZiwiU2Fuc2tyaXQifSwKCXsweDA0NTcsIktvbmthbmkifSwKCXsweDA0OGYsIkVzcGVyYW50byJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDA0OTAsIldhbG9uIn0sIC8qIE5vbiBvZmZpY2lhbCAqLwoJezB4MDQ5MSwiQ29ybmlzaCJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDA0OTIsIldlbHNoIn0sCS8qIE5vdCBvZmZpY2lhbCAqLwoJezB4MDQ5MywiQnJldG9uIn0sCS8qIE5vdCBvZmZpY2lhbCAqLwoJezB4MDAwMCwiVW5rbm93biJ9CiAgICB9LCBsYW5ndWFnZXNfZGVbXT17Cgl7MHgwNDAxLCJBcmFiaWMifSwKCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCgl7MHgwNDA0LCJUcmFkaXRpb25hbGVzIENoaW5lc2lzY2gifSwKCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKCXsweDA0MDYsIkTkbmlzY2gifSwKCXsweDA0MDcsIkRldXRzY2gifSwKCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKCXsweDA0MDksIkFtZXJpa2FuaXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwNDBBLCJLYXN0aWxpc2NoZXMgU3BhbmlzY2gifSwKCXsweDA0MEIsIkZpbm5pc2NoIn0sCgl7MHgwNDBDLCJGcmFuenZzaXNjaCJ9LAoJezB4MDQwRCwiSGVicmRpc2NoIn0sCgl7MHgwNDBFLCJVbmdhcmlzY2gifSwKCXsweDA0MEYsIklzbGRuZGlzY2gifSwKCXsweDA0MTAsIkl0YWxpZW5pc2NoIn0sCgl7MHgwNDExLCJKYXBhbmlzY2gifSwKCXsweDA0MTIsIktvcmVhbmlzY2gifSwKCXsweDA0MTMsIk5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAoJezB4MDQxNSwiUG9sbmlzY2gifSwKCXsweDA0MTYsIkJyYXNpbGlhbmlzY2hlcyBQb3J0dWdpZXNpc2NoIn0sCgl7MHgwNDE3LCJSZHRvcm9tYW5pc2NoIn0sCgl7MHgwNDE4LCJSdW1kbmlzY2gifSwKCXsweDA0MTksIlJ1c3Npc2NoIn0sCgl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKCXsweDA0MUIsIlNsb3dlbmlzY2gifSwKCXsweDA0MUMsIkFsYmFuaXNjaCJ9LAoJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAoJezB4MDQxRSwiVGhhaSJ9LAoJezB4MDQxRiwiVPxya2lzY2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkJhaGFzYSJ9LAoJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCgl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCgl7MHgwODA5LCJCcml0aXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwODBBLCJNZXhpa2FuaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwODEwLCJTY2h3ZWl6ZXJpc2NoZXMgSXRhbGllbmlzY2gifSwKCXsweDA4MTMsIkJlbGdpc2NoZXMgTmllZGVybGRuZGlzY2gifSwKCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKCXsweDA4MTYsIlBvcnR1Z2llc2lzY2gifSwKCXsweDA4MUEsIlNlcmJva3JhdGlzY2ggKGt5cmlsbGlzY2gpIn0sCgl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MTAwQywiU2Nod2VpemVyaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwMDAwLCJVbmJla2FubnQifSwKfTsKCnN0YXRpYyBjaGFyICpHZXRMb2NhbGVTdWJrZXlOYW1lKCBEV09SRCBsY3R5cGUgKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0VXNlckRlZmF1bHRMQ0lEICAgICAgIFtLRVJORUwzMi40MjVdIFtPTEUyTkxTLjFdCiAqLwpMQ0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gTUFLRUxDSUQoIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkgLCBTT1JUX0RFRkFVTFQgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgW0tFUk5FTDMyLjQwMF0gW09MRTJOTFMuMl0KICovCkxDSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRVc2VyRGVmYXVsdExhbmdJRCAgICAgICBbS0VSTkVMMzIuNDI2XSBbT0xFMk5MUy4zXQogKi8KTEFOR0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExhbmdJRCgpCnsKCS8qIGNhY2hpbmcgcmVzdWx0LCBpZiBkZWZpbmVkIGZyb20gZW52aXJvbm1lbnQsIHdoaWNoIHNob3VsZCAoPykgbm90IGNoYW5nZSBkdXJpbmcgYSBXSU5FIHNlc3Npb24gKi8KCXN0YXRpYwlMQU5HSUQJdXNlckxDSUQgPSAwOwoJaWYgKE9wdGlvbnMubGFuZ3VhZ2UpIHsKCQlyZXR1cm4gTGFuZ3VhZ2VzW09wdGlvbnMubGFuZ3VhZ2VdLmxhbmdpZDsKCX0KCglpZiAodXNlckxDSUQgPT0gMCkgewoJCWNoYXIgKmJ1Zj1OVUxMOwoJCWNoYXIgKmxhbmcsKmNvdW50cnksKmNoYXJzZXQsKmRpYWxlY3QsKm5leHQ7CgkJaW50IAlyZXQ9MDsKCQkKCQlidWY9Z2V0ZW52KCJMQU5HVUFHRSIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQU5HIik7CgkJaWYgKCFidWYpIGJ1Zj1nZXRlbnYoIkxDX0FMTCIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19NRVNTQUdFUyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19DVFlQRSIpOwoJCWlmICghYnVmKSByZXR1cm4gdXNlckxDSUQgPSBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwoJCQoJCWlmICghc3RyY21wKGJ1ZiwiUE9TSVgiKSB8fCAhc3RyY21wKGJ1ZiwiQyIpKSB7CgkJCXJldHVybiBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwoJCX0KCQkKCQlsYW5nPWJ1ZjsKCQkKCQlkbyB7CgkJCW5leHQ9c3RyY2hyKGxhbmcsJzonKTsgaWYgKG5leHQpICpuZXh0Kys9J1wwJzsKCQkJZGlhbGVjdD1zdHJjaHIobGFuZywnQCcpOyBpZiAoZGlhbGVjdCkgKmRpYWxlY3QrKz0nXDAnOwoJCQljaGFyc2V0PXN0cmNocihsYW5nLCcuJyk7IGlmIChjaGFyc2V0KSAqY2hhcnNldCsrPSdcMCc7CgkJCWNvdW50cnk9c3RyY2hyKGxhbmcsJ18nKTsgaWYgKGNvdW50cnkpICpjb3VudHJ5Kys9J1wwJzsKCQkJCgkJCXJldD1NQUlOX0dldExhbmd1YWdlSUQobGFuZywgY291bnRyeSwgY2hhcnNldCwgZGlhbGVjdCk7CgkJCQoJCQlsYW5nPW5leHQ7CgkJCQoJCX0gd2hpbGUgKGxhbmcgJiYgIXJldCk7CgkJCgkJLyogRklYTUUgOiBhcmUgc3RyaW5ncyByZXR1cm5lZCBieSBnZXRlbnYoKSB0byBiZSBmcmVlKCknZWQgPyAqLwoJCXVzZXJMQ0lEID0gKExBTkdJRClyZXQ7Cgl9CglyZXR1cm4gdXNlckxDSUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMYW5nSUQgICAgIFtLRVJORUwzMi40MDFdIFtPTEUyTkxTLjRdCiAqLwpMQU5HSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMYW5nSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMYW5nSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIFtLRVJORUwzMi4xNDddCiAqLwpMQ0lEIFdJTkFQSSBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIChMQ0lEIGxjaWQpCnsJc3dpdGNoIChsY2lkKQoJeyAgY2FzZSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICAgY2FzZSBMT0NBTEVfVVNFUl9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIDA6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldExvY2FsZUluZm9BIFtLRVJORUwzMi4zNDJdCiAqCiAqIE5PVEVTIAogKiAgTEFOR19ORVVUUkFMIGlzIGVxdWFsIHRvIExPQ0FMRV9TWVNURU1fREVGQVVMVAogKgogKiAgTVMgb25saW5lIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhlIHN0cmluZyByZXR1cm5lZCBpcyBOVUxMIHRlcm1pbmF0ZWQKICogIGV4Y2VwdCBmb3IgTE9DQUxFX0ZPTlRTSUdOQVRVUkUgIHdoaWNoICJ3aWxsIHJldHVybiBhIG5vbi1OVUxMCiAqICB0ZXJtaW5hdGVkIHN0cmluZyIuCiAqLwpJTlQgV0lOQVBJIEdldExvY2FsZUluZm9BKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQgbGVuKQp7CiAgTFBDU1RSICByZXRTdHJpbmc7CglpbnQJZm91bmQsaTsKCWludAlsYW5nPTA7CiAgICBjaGFyICAgICpwYWNLZXk7CiAgICBjaGFyICAgIGFjQnVmZmVyWzEyOF07CiAgICBEV09SRCAgIGR3QnVmZmVyU2l6ZT0xMjg7CgogIFRSQUNFKCIobGNpZD0weCVseCxsY3R5cGU9MHglbHgsJXAsJXgpXG4iLGxjaWQsTENUeXBlLGJ1ZixsZW4pOwoKICBpZiAobGVuICYmICghIGJ1ZikgKSB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKGxjaWQgPT0wIHx8IGxjaWQgPT0gTEFOR19TWVNURU1fREVGQVVMVCB8fCAoTENUeXBlICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSApCS8qIDB4MDAsIDB4NDAwICovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxjaWQgPT0gTEFOR19VU0VSX0RFRkFVTFQpIC8qMHg4MDAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CglMQ1R5cGUgJj0gfihMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKCS8qIEFzIGFuIG9wdGlvbiwgd2UgY291bGQgb2J0YWluIHRoZSB2YWx1ZSBmcm9tIHdpbi5pbmkuCgkgICBUaGlzIHdvdWxkIG5vdCBtYXRjaCB0aGUgV2luZSBjb21waWxlLXRpbWUgb3B0aW9uLgoJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwoJcmV0U3RyaW5nPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCglpPTA7Cgl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgewoJCWlmIChMQ1R5cGUgPT0gbG9jYWxlX25hbWUyaWRbaV0uaWQpIHsKCQkJcmV0U3RyaW5nID0gbG9jYWxlX25hbWUyaWRbaV0ubmFtZTsKCQkJYnJlYWs7CgkJfQoJCWkrKzsKCX0KCWlmICghcmV0U3RyaW5nKSB7CiAgICAgIEZJWE1FKCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsTENUeXBlKTsKCQlyZXR1cm4gMDsKCX0KCiAgICBmb3VuZD0wOwoKICAgIC8qIEZpcnN0LCBjaGVjayBpZiBpdCdzIGluIHRoZSByZWdpc3RyeS4gKi8KCiAgICBpZiAoIChwYWNLZXkgPSBHZXRMb2NhbGVTdWJrZXlOYW1lKExDVHlwZSkpICkKICAgIHsKICAgICAgICBjaGFyICAgIGFjUmVhbEtleVsxMjhdOwogICAgICAgIEhLRVkgICAgaEtleTsKCiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKCiAgICAgICAgaWYgKCBSZWdPcGVuS2V5RXhBKCBIS0VZX0NVUlJFTlRfVVNFUiwgYWNSZWFsS2V5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEtFWV9SRUFELCAmaEtleSkgPT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIFJlZ1F1ZXJ5VmFsdWVFeEEoIGhLZXksIE5VTEwsIE5VTEwsIE5VTEwsIChMUEJZVEUpYWNCdWZmZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0J1ZmZlclNpemUgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gYWNCdWZmZXI7CiAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIElmIG5vdCBpbiB0aGUgcmVnaXN0cnksIGdldCBpdCBmcm9tIHRoZSBOTFMgZW50cmllcy4gKi8KCiAgICBsYW5nPWxjaWQ7CiAgICBmb3IgKGk9MDsoaTwzICYmICFmb3VuZCk7aSsrKSB7CiAgICAgIGludCBqOwoKICAgICAgZm9yIChqPTA7ajxzaXplb2YobGFuZ2xvY2FsZXMpL3NpemVvZihsYW5nbG9jYWxlc1swXSk7aisrKSB7CglpZiAobGFuZ2xvY2FsZXNbal0ubGFuZyA9PSBsYW5nKSB7CgkgIGludCBrOwoKCSAgZm9yIChrPTA7azxzaXplb2YobGFuZ2xvY2FsZXNbal0ubG9jdmFycykvc2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnNbMF0pICYmIChsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnR5cGUpO2srKykgewoJICAgIGlmIChsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnR5cGUgPT0gTENUeXBlKSB7CgkgICAgICBmb3VuZCA9IDE7CgkgICAgICByZXRTdHJpbmcgPSBsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnZhbDsKCSAgYnJlYWs7CgkgICAgfQoJICB9CiAgICAgICAgICBpZiAoZm91bmQpCgkgICAgYnJlYWs7Cgl9CiAgICAgIH0KCSAgLyogbGFuZ3VhZ2Ugbm90IGZvdW5kLCB0cnkgd2l0aG91dCBhIHN1Ymxhbmd1YWdlKi8KCSAgaWYgKGk9PTEpIGxhbmc9TUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsYW5nKSwgU1VCTEFOR19ERUZBVUxUKTsKCSAgLyogbWFzayB0aGUgTEMgVmFsdWUgKi8KCSAgaWYgKGk9PTIpIExDVHlwZSAmPSAweGZmZjsKICAgIH0KCiAgICBpZighZm91bmQpIHsKICAgICAgRVJSKCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UgKCUwNFgpLlxuIiwKCQkJcmV0U3RyaW5nLChXT1JEKWxjaWQpOwoJCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkJcmV0dXJuIDA7CQkJCgl9CiAgICAvKiBhIEZPTlRTSUdOQVRVUkUgaXMgbm90IGEgc3RyaW5nLCBqdXN0IDYgRFdPUkRzICAqLwogICAgaWYgKExDVHlwZSA9PSBMT0NBTEVfRk9OVFNJR05BVFVSRSkgewogICAgICAgIGlmIChsZW4pCiAgICAgICAgICAgIG1lbWNweShidWYsIHJldFN0cmluZywgKGxlbjw9c2l6ZW9mKEZPTlRTSUdOQVRVUkUpKT9sZW46c2l6ZW9mKEZPTlRTSUdOQVRVUkUpKTsKICAgICAgICByZXR1cm4gc2l6ZW9mKEZPTlRTSUdOQVRVUkUpOwogICAgfQogICAgLyogaWYgbGVuPTAgcmV0dXJuIG9ubHkgdGhlIGxlbmd0aCwgZG9uJ3QgdG91Y2ggdGhlIGJ1ZmZlciovCiAgICBpZiAobGVuKSBsc3RyY3B5bkEoYnVmLHJldFN0cmluZyxsZW4pOwogICAgcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm9XCVtLRVJORUwzMi4zNDNdCiAqCiAqIE5PVEVTCiAqICBNUyBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IGxlbiAic3BlY2lmaWVzIHRoZSBzaXplLCBpbiBieXRlcyAoQU5TSSB2ZXJzaW9uKQogKiAgb3IgY2hhcmFjdGVycyAoVW5pY29kZSB2ZXJzaW9uKSwgb2YiIHdidWYuIFRodXMgdGhlIG51bWJlciByZXR1cm5lZCBpcwogKiAgdGhlIHNhbWUgYmV0d2VlbiBHZXRMb2NhbGVJbmZvVyBhbmQgR2V0TG9jYWxlSW5mb0EuCiAqLwpJTlQgV0lOQVBJIEdldExvY2FsZUluZm9XKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQV1NUUiB3YnVmLElOVCBsZW4pCnsJV09SRCB3bGVuOwoJTFBTVFIgYWJ1ZjsKCQoJaWYgKGxlbiAmJiAoISB3YnVmKSApCgl7IFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgcmV0dXJuIDA7Cgl9CgoJYWJ1ZiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7Cgl3bGVuID0gR2V0TG9jYWxlSW5mb0EobGNpZCwgTENUeXBlLCBhYnVmLCBsZW4pOwoKCWlmICh3bGVuICYmIGxlbikJLyogaWYgbGVuPTAgcmV0dXJuIG9ubHkgdGhlIGxlbmd0aCovCgkgIGxzdHJjcHluQXRvVyh3YnVmLGFidWYsbGVuKTsKCglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsYWJ1Zik7CglyZXR1cm4gd2xlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKgkJR2V0TG9jYWxlU3Via2V5TmFtZSBbaGVscGVyIGZ1bmN0aW9uXQogKgogKiAgICAgICAgICAtIEZvciB1c2Ugd2l0aCB0aGUgcmVnaXN0cnkuCiAqICAgICAgICAgIC0gR2V0cyB0aGUgcmVnaXN0cnkgc3Via2V5IG5hbWUgZm9yIGEgZ2l2ZW4gbGN0eXBlLgogKi8Kc3RhdGljIGNoYXIgKkdldExvY2FsZVN1YmtleU5hbWUoIERXT1JEIGxjdHlwZSApCnsKICAgIGNoYXIgICAgKnBhY0tleT1OVUxMOwoKICAgIHN3aXRjaCAoIGxjdHlwZSApCiAgICB7CiAgICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgU2V0TG9jYWxlSW5mbyBhbmQgR2V0TG9jYWxlSW5mbywgYW5kCiAgICAgKiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LCBjb25maXJtZWQgdW5kZXIgV2luZG93cywKICAgICAqIGZvciB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGFzc2lnbiBwYWNLZXkuIENhc2VzIHRoYXQgYXJlbid0IGZpbmlzaGVkCiAgICAgKiBoYXZlIG5vdCBiZWVuIGNvbmZpcm1lZCwgc28gdGhhdCBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZXkgY2FuIGJlCiAgICAgKiBhZGRlZC4KICAgICAqLwogICAgY2FzZSBMT0NBTEVfU0RBVEUgOiAgICAgICAgLyogVGhlIGRhdGUgc2VwYXJhdG9yLiAqLwogICAgICAgIHBhY0tleSA9ICJzRGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ1VSUkRJR0lUUzoKICAgICAgICBwYWNLZXkgPSAiaUN1cnJEaWdpdHMiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0RFQ0lNQUwgOgogICAgICAgIHBhY0tleSA9ICJzRGVjaW1hbCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ1VSUkVOQ1k6CiAgICAgICAgcGFjS2V5ID0gImlDdXJyZW5jeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TR1JPVVBJTkcgOgogICAgICAgIHBhY0tleSA9ICJzR3JvdXBpbmciOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSURJR0lUUzoKICAgICAgICBwYWNLZXkgPSAiaURpZ2l0cyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTElTVCA6CiAgICAgICAgcGFjS2V5ID0gInNMaXN0IjsKICAgICAgICBicmVhazsKICAgIC8qIGNhc2UgTE9DQUxFX0lDQUxFTkRBUlRZUEU6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JRklSU1REQVlPRldFRUs6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSOiAqLwogICAgLyogY2FzZSBMT0NBTEVfU1lFQVJNT05USCA6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9TUE9TSVRJVkVTSUdOIDogKi8KICAgIC8qIGNhc2UgTE9DQUxFX0lQQVBFUlNJWkU6ICovCiAgICAvKiAgICAgYnJlYWs7ICovCiAgICBjYXNlIExPQ0FMRV9TTE9OR0RBVEUgOgogICAgICAgIHBhY0tleSA9ICJzTG9uZ0RhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTkRFQ0lNQUxTRVAgOgogICAgICAgIHBhY0tleSA9ICJzTW9uRGVjaW1hbFNlcCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTU9OR1JPVVBJTkc6CiAgICAgICAgcGFjS2V5ID0gInNNb25Hcm91cGluZyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTUVBU1VSRToKICAgICAgICBwYWNLZXkgPSAiaU1lYXN1cmUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTlRIT1VTQU5EU0VQIDoKICAgICAgICBwYWNLZXkgPSAic01vblRob3VzYW5kU2VwIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lORUdDVVJSOgogICAgICAgIHBhY0tleSA9ICJpTmVnQ3VyciI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTkVHQVRJVkVTSUdOIDoKICAgICAgICBwYWNLZXkgPSAic05lZ2F0aXZlU2lnbiI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTkVHTlVNQkVSOgogICAgICAgIHBhY0tleSA9ICJpTmVnTnVtYmVyIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NTSE9SVERBVEUgOgogICAgICAgIHBhY0tleSA9ICJzU2hvcnREYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lMREFURTogICAgICAgIC8qIExvbmcgRGF0ZSBmb3JtYXQgb3JkZXJpbmcgc3BlY2lmaWVyLiAqLwogICAgICAgIHBhY0tleSA9ICJpTERhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUxaRVJPOgogICAgICAgIHBhY0tleSA9ICJpTFplcm8iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSVRMWkVSTzoKICAgICAgICBwYWNLZXkgPSAiaVRMWmVybyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JVElNRTogICAgICAgIC8qIFRpbWUgZm9ybWF0IHNwZWNpZmllci4gKi8KICAgICAgICBwYWNLZXkgPSAiaVRpbWUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RIT1VTQU5EIDoKICAgICAgICBwYWNLZXkgPSAic1Rob3VzYW5kIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1MxMTU5OiAgICAgICAgLyogQU0gKi8KICAgICAgICBwYWNLZXkgPSAiczExNTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RJTUU6CiAgICAgICAgcGFjS2V5ID0gInNUaW1lIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1MyMzU5OiAgICAgICAgLyogUE0gKi8KICAgICAgICBwYWNLZXkgPSAiczIzNTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RJTUVGT1JNQVQgOgogICAgICAgIHBhY0tleSA9ICJzVGltZUZvcm1hdCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TQ1VSUkVOQ1k6CiAgICAgICAgcGFjS2V5ID0gInNDdXJyZW5jeSI7CiAgICAgICAgYnJlYWs7CgogICAgLyogVGhlIGZvbGxvd2luZyBhcmUgbm90IGxpc3RlZCB1bmRlciBNU0ROIGFzIHN1cHBvcnRlZCwgCiAgICAgKiBidXQgc2VlbSB0byBiZSB1c2VkIGFuZCBhbHNvIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBjYXNlIExPQ0FMRV9JREFURToKICAgICAgICBwYWNLZXkgPSAiaURhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0NPVU5UUlk6CiAgICAgICAgcGFjS2V5ID0gInNDb3VudHJ5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lDT1VOVFJZOgogICAgICAgIHBhY0tleSA9ICJpQ291bnRyeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTEFOR1VBR0U6CiAgICAgICAgcGFjS2V5ID0gInNMYW5ndWFnZSI7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4oIHBhY0tleSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXRMb2NhbGVJbmZvQQlbS0VSTkVMMzIuNjU2XQogKi8KQk9PTDE2IFdJTkFQSSBTZXRMb2NhbGVJbmZvQShEV09SRCBsY2lkLCBEV09SRCBsY3R5cGUsIExQQ1NUUiBkYXRhKQp7CiAgICBIS0VZICAgIGhLZXk7CiAgICBjaGFyICAgICpwYWNLZXk7CiAgICBjaGFyICAgIGFjUmVhbEtleVsxMjhdOwoKICAgIGlmICggKHBhY0tleSA9IEdldExvY2FsZVN1YmtleU5hbWUobGN0eXBlKSkgKQogICAgewogICAgICAgIHNwcmludGYoIGFjUmVhbEtleSwgIkNvbnRyb2wgUGFuZWxcXEludGVybmF0aW9uYWxcXCVzIiwgcGFjS2V5ICk7CiAgICAgICAgaWYgKCBSZWdDcmVhdGVLZXlBKCBIS0VZX0NVUlJFTlRfVVNFUiwgYWNSZWFsS2V5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoS2V5ICkgPT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIFJlZ1NldFZhbHVlRXhBKCBoS2V5LCBOVUxMLCAwLCBSRUdfU1osIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBzdHJsZW4oZGF0YSkrMSApICE9IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIlNldExvY2FsZUluZm9BOiAlcyBkaWQgbm90IHdvcmtcbiIsIHBhY0tleSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KCBoS2V5ICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgRklYTUUoIiglbGQsJWxkLCVzKTogc3R1YlxuIixsY2lkLGxjdHlwZSxkYXRhKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJc1ZhbGlkTG9jYWxlCVtLRVJORUwzMi40ODldCiAqLwpCT09MIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewoJLyogd2Ugc3VwcG9ydCBBTlkgbGFuZ3VhZ2UuIFdlbGwsIGF0IGxlYXN0IHNheSB0aGF0Li4uKi8KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlc1cJW0tFUk5FTDMyLjIwOV0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzVyggTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wJcmV0OwoJV0NIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFXyh3aW4zMikoIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5Vyh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApCiAgICAgICAgewogICAgICAgICAgICBMUFdTVFIgY3A7CgkgICAgY2hhciAgIHhidWZmZXJbMTBdOwogIAkKCSAgICBzcHJpbnRmKHhidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgoJICAgIGNwID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4YnVmZmVyICk7CiAgICAgICAgICAgIHJldCA9IGxwZm5Mb2NhbGVFbnVtKGNwKTsKICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNwICk7CiAgICAgICAgICAgIGlmICghcmV0KSBicmVhazsKICAgICAgICAgICAgaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzQQlbS0VSTkVMMzIuMjA4XQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNBKExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKCWludAlpOwoJQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0VfKHdpbjMyKSgiKCVwLCUwOGx4KVxuIiwKCQlscGZuTG9jYWxlRW51bSxmbGFncwoJKTsKCglpZiAoIEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwKICAgICAgICAgICAgICAgICAgICAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcTmxzXFxMb2NhbGVcXCIsCiAgICAgICAgICAgICAgICAgICAgJnhoa2V5KSkgewogICAgICAgICAgICBpPTA7CiAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICBEV09SRCBzaXplPXNpemVvZihidWZmZXIpOwogICAgICAgICAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1WYWx1ZUEoeGhrZXksaSxidWZmZXIsJnNpemUsTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsTlVMTCkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiAoc2l6ZSAmJiAhbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZWdDbG9zZUtleSh4aGtleSk7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwoJfQoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKY29uc3QgV09SRCBPTEUyTkxTX0NUX0NUeXBlM19MVVRbXSA9IHsgCiAgMHgwMDAwLCAvKiAgIC0gICAwICovCiAgMHgwMDAwLCAvKiAgIC0gICAxICovCiAgMHgwMDAwLCAvKiAgIC0gICAyICovCiAgMHgwMDAwLCAvKiAgIC0gICAzICovCiAgMHgwMDAwLCAvKiAgIC0gICA0ICovCiAgMHgwMDAwLCAvKiAgIC0gICA1ICovCiAgMHgwMDAwLCAvKiAgIC0gICA2ICovCiAgMHgwMDAwLCAvKiAgIC0gICA3ICovCiAgMHgwMDAwLCAvKiAgIC0gICA4ICovCiAgMHgwMDA4LCAvKiAgIC0gICA5ICovCiAgMHgwMDA4LCAvKiAgIC0gIDEwICovCiAgMHgwMDA4LCAvKiAgIC0gIDExICovCiAgMHgwMDA4LCAvKiAgIC0gIDEyICovCiAgMHgwMDA4LCAvKiAgIC0gIDEzICovCiAgMHgwMDAwLCAvKiAgIC0gIDE0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDIwICovCiAgMHgwMDAwLCAvKiAgIC0gIDIxICovCiAgMHgwMDAwLCAvKiAgIC0gIDIyICovCiAgMHgwMDAwLCAvKiAgIC0gIDIzICovCiAgMHgwMDAwLCAvKiAgIC0gIDI0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDMwICovCiAgMHgwMDAwLCAvKiAgIC0gIDMxICovCiAgMHgwMDQ4LCAvKiAgIC0gIDMyICovCiAgMHgwMDQ4LCAvKiAhIC0gIDMzICovCiAgMHgwNDQ4LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICAweDAwNDgsIC8qICMgLSAgMzUgKi8KICAweDA0NDgsIC8qICQgLSAgMzYgKi8KICAweDAwNDgsIC8qICUgLSAgMzcgKi8KICAweDAwNDgsIC8qICYgLSAgMzggKi8KICAweDA0NDAsIC8qICcgLSAgMzkgKi8KICAweDAwNDgsIC8qICggLSAgNDAgKi8KICAweDAwNDgsIC8qICkgLSAgNDEgKi8KICAweDAwNDgsIC8qICogLSAgNDIgKi8KICAweDAwNDgsIC8qICsgLSAgNDMgKi8KICAweDAwNDgsIC8qICwgLSAgNDQgKi8KICAweDA0NDAsIC8qIC0gLSAgNDUgKi8KICAweDAwNDgsIC8qIC4gLSAgNDYgKi8KICAweDA0NDgsIC8qIC8gLSAgNDcgKi8KICAweDAwNDAsIC8qIDAgLSAgNDggKi8KICAweDAwNDAsIC8qIDEgLSAgNDkgKi8KICAweDAwNDAsIC8qIDIgLSAgNTAgKi8KICAweDAwNDAsIC8qIDMgLSAgNTEgKi8KICAweDAwNDAsIC8qIDQgLSAgNTIgKi8KICAweDAwNDAsIC8qIDUgLSAgNTMgKi8KICAweDAwNDAsIC8qIDYgLSAgNTQgKi8KICAweDAwNDAsIC8qIDcgLSAgNTUgKi8KICAweDAwNDAsIC8qIDggLSAgNTYgKi8KICAweDAwNDAsIC8qIDkgLSAgNTcgKi8KICAweDAwNDgsIC8qIDogLSAgNTggKi8KICAweDAwNDgsIC8qIDsgLSAgNTkgKi8KICAweDAwNDgsIC8qIDwgLSAgNjAgKi8KICAweDA0NDgsIC8qID0gLSAgNjEgKi8KICAweDAwNDgsIC8qID4gLSAgNjIgKi8KICAweDAwNDgsIC8qID8gLSAgNjMgKi8KICAweDA0NDgsIC8qIEAgLSAgNjQgKi8KICAweDgwNDAsIC8qIEEgLSAgNjUgKi8KICAweDgwNDAsIC8qIEIgLSAgNjYgKi8KICAweDgwNDAsIC8qIEMgLSAgNjcgKi8KICAweDgwNDAsIC8qIEQgLSAgNjggKi8KICAweDgwNDAsIC8qIEUgLSAgNjkgKi8KICAweDgwNDAsIC8qIEYgLSAgNzAgKi8KICAweDgwNDAsIC8qIEcgLSAgNzEgKi8KICAweDgwNDAsIC8qIEggLSAgNzIgKi8KICAweDgwNDAsIC8qIEkgLSAgNzMgKi8KICAweDgwNDAsIC8qIEogLSAgNzQgKi8KICAweDgwNDAsIC8qIEsgLSAgNzUgKi8KICAweDgwNDAsIC8qIEwgLSAgNzYgKi8KICAweDgwNDAsIC8qIE0gLSAgNzcgKi8KICAweDgwNDAsIC8qIE4gLSAgNzggKi8KICAweDgwNDAsIC8qIE8gLSAgNzkgKi8KICAweDgwNDAsIC8qIFAgLSAgODAgKi8KICAweDgwNDAsIC8qIFEgLSAgODEgKi8KICAweDgwNDAsIC8qIFIgLSAgODIgKi8KICAweDgwNDAsIC8qIFMgLSAgODMgKi8KICAweDgwNDAsIC8qIFQgLSAgODQgKi8KICAweDgwNDAsIC8qIFUgLSAgODUgKi8KICAweDgwNDAsIC8qIFYgLSAgODYgKi8KICAweDgwNDAsIC8qIFcgLSAgODcgKi8KICAweDgwNDAsIC8qIFggLSAgODggKi8KICAweDgwNDAsIC8qIFkgLSAgODkgKi8KICAweDgwNDAsIC8qIFogLSAgOTAgKi8KICAweDAwNDgsIC8qIFsgLSAgOTEgKi8KICAweDA0NDgsIC8qIFwgLSAgOTIgKi8KICAweDAwNDgsIC8qIF0gLSAgOTMgKi8KICAweDA0NDgsIC8qIF4gLSAgOTQgKi8KICAweDA0NDgsIC8qIF8gLSAgOTUgKi8KICAweDA0NDgsIC8qIGAgLSAgOTYgKi8KICAweDgwNDAsIC8qIGEgLSAgOTcgKi8KICAweDgwNDAsIC8qIGIgLSAgOTggKi8KICAweDgwNDAsIC8qIGMgLSAgOTkgKi8KICAweDgwNDAsIC8qIGQgLSAxMDAgKi8KICAweDgwNDAsIC8qIGUgLSAxMDEgKi8KICAweDgwNDAsIC8qIGYgLSAxMDIgKi8KICAweDgwNDAsIC8qIGcgLSAxMDMgKi8KICAweDgwNDAsIC8qIGggLSAxMDQgKi8KICAweDgwNDAsIC8qIGkgLSAxMDUgKi8KICAweDgwNDAsIC8qIGogLSAxMDYgKi8KICAweDgwNDAsIC8qIGsgLSAxMDcgKi8KICAweDgwNDAsIC8qIGwgLSAxMDggKi8KICAweDgwNDAsIC8qIG0gLSAxMDkgKi8KICAweDgwNDAsIC8qIG4gLSAxMTAgKi8KICAweDgwNDAsIC8qIG8gLSAxMTEgKi8KICAweDgwNDAsIC8qIHAgLSAxMTIgKi8KICAweDgwNDAsIC8qIHEgLSAxMTMgKi8KICAweDgwNDAsIC8qIHIgLSAxMTQgKi8KICAweDgwNDAsIC8qIHMgLSAxMTUgKi8KICAweDgwNDAsIC8qIHQgLSAxMTYgKi8KICAweDgwNDAsIC8qIHUgLSAxMTcgKi8KICAweDgwNDAsIC8qIHYgLSAxMTggKi8KICAweDgwNDAsIC8qIHcgLSAxMTkgKi8KICAweDgwNDAsIC8qIHggLSAxMjAgKi8KICAweDgwNDAsIC8qIHkgLSAxMjEgKi8KICAweDgwNDAsIC8qIHogLSAxMjIgKi8KICAweDAwNDgsIC8qIHsgLSAxMjMgKi8KICAweDAwNDgsIC8qIHwgLSAxMjQgKi8KICAweDAwNDgsIC8qIH0gLSAxMjUgKi8KICAweDA0NDgsIC8qIH4gLSAxMjYgKi8KICAweDAwMDAsIC8qIH8gLSAxMjcgKi8KICAweDAwMDAsIC8qIIAgLSAxMjggKi8KICAweDAwMDAsIC8qIIEgLSAxMjkgKi8KICAweDAwMDgsIC8qIIIgLSAxMzAgKi8KICAweDgwMDAsIC8qIIMgLSAxMzEgKi8KICAweDAwMDgsIC8qIIQgLSAxMzIgKi8KICAweDAwMDgsIC8qIIUgLSAxMzMgKi8KICAweDAwMDgsIC8qIIYgLSAxMzQgKi8KICAweDAwMDgsIC8qIIcgLSAxMzUgKi8KICAweDAwMDEsIC8qIIggLSAxMzYgKi8KICAweDAwMDgsIC8qIIkgLSAxMzcgKi8KICAweDgwMDMsIC8qIIogLSAxMzggKi8KICAweDAwMDgsIC8qIIsgLSAxMzkgKi8KICAweDgwMDAsIC8qIIwgLSAxNDAgKi8KICAweDAwMDAsIC8qII0gLSAxNDEgKi8KICAweDAwMDAsIC8qII4gLSAxNDIgKi8KICAweDAwMDAsIC8qII8gLSAxNDMgKi8KICAweDAwMDAsIC8qIJAgLSAxNDQgKi8KICAweDAwODgsIC8qIJEgLSAxNDUgKi8KICAweDAwODgsIC8qIJIgLSAxNDYgKi8KICAweDAwODgsIC8qIJMgLSAxNDcgKi8KICAweDAwODgsIC8qIJQgLSAxNDggKi8KICAweDAwMDgsIC8qIJUgLSAxNDkgKi8KICAweDA0MDAsIC8qIJYgLSAxNTAgKi8KICAweDA0MDAsIC8qIJcgLSAxNTEgKi8KICAweDA0MDgsIC8qIJggLSAxNTIgKi8KICAweDAwMDAsIC8qIJkgLSAxNTMgKi8KICAweDgwMDMsIC8qIJogLSAxNTQgKi8KICAweDAwMDgsIC8qIJsgLSAxNTUgKi8KICAweDgwMDAsIC8qIJwgLSAxNTYgKi8KICAweDAwMDAsIC8qIJ0gLSAxNTcgKi8KICAweDAwMDAsIC8qIJ4gLSAxNTggKi8KICAweDgwMDMsIC8qIJ8gLSAxNTkgKi8KICAweDAwMDgsIC8qIKAgLSAxNjAgKi8KICAweDAwMDgsIC8qIKEgLSAxNjEgKi8KICAweDAwNDgsIC8qIKIgLSAxNjIgKi8KICAweDAwNDgsIC8qIKMgLSAxNjMgKi8KICAweDAwMDgsIC8qIKQgLSAxNjQgKi8KICAweDAwNDgsIC8qIKUgLSAxNjUgKi8KICAweDAwNDgsIC8qIKYgLSAxNjYgKi8KICAweDAwMDgsIC8qIKcgLSAxNjcgKi8KICAweDA0MDgsIC8qIKggLSAxNjggKi8KICAweDAwMDgsIC8qIKkgLSAxNjkgKi8KICAweDA0MDAsIC8qIKogLSAxNzAgKi8KICAweDAwMDgsIC8qIKsgLSAxNzEgKi8KICAweDAwNDgsIC8qIKwgLSAxNzIgKi8KICAweDA0MDgsIC8qIK0gLSAxNzMgKi8KICAweDAwMDgsIC8qIK4gLSAxNzQgKi8KICAweDA0NDgsIC8qIK8gLSAxNzUgKi8KICAweDAwMDgsIC8qILAgLSAxNzYgKi8KICAweDAwMDgsIC8qILEgLSAxNzcgKi8KICAweDAwMDAsIC8qILIgLSAxNzggKi8KICAweDAwMDAsIC8qILMgLSAxNzkgKi8KICAweDA0MDgsIC8qILQgLSAxODAgKi8KICAweDAwMDgsIC8qILUgLSAxODEgKi8KICAweDAwMDgsIC8qILYgLSAxODIgKi8KICAweDAwMDgsIC8qILcgLSAxODMgKi8KICAweDA0MDgsIC8qILggLSAxODQgKi8KICAweDAwMDAsIC8qILkgLSAxODUgKi8KICAweDA0MDAsIC8qILogLSAxODYgKi8KICAweDAwMDgsIC8qILsgLSAxODcgKi8KICAweDAwMDAsIC8qILwgLSAxODggKi8KICAweDAwMDAsIC8qIL0gLSAxODkgKi8KICAweDAwMDAsIC8qIL4gLSAxOTAgKi8KICAweDAwMDgsIC8qIL8gLSAxOTEgKi8KICAweDgwMDMsIC8qIMAgLSAxOTIgKi8KICAweDgwMDMsIC8qIMEgLSAxOTMgKi8KICAweDgwMDMsIC8qIMIgLSAxOTQgKi8KICAweDgwMDMsIC8qIMMgLSAxOTUgKi8KICAweDgwMDMsIC8qIMQgLSAxOTYgKi8KICAweDgwMDMsIC8qIMUgLSAxOTcgKi8KICAweDgwMDAsIC8qIMYgLSAxOTggKi8KICAweDgwMDMsIC8qIMcgLSAxOTkgKi8KICAweDgwMDMsIC8qIMggLSAyMDAgKi8KICAweDgwMDMsIC8qIMkgLSAyMDEgKi8KICAweDgwMDMsIC8qIMogLSAyMDIgKi8KICAweDgwMDMsIC8qIMsgLSAyMDMgKi8KICAweDgwMDMsIC8qIMwgLSAyMDQgKi8KICAweDgwMDMsIC8qIM0gLSAyMDUgKi8KICAweDgwMDMsIC8qIM4gLSAyMDYgKi8KICAweDgwMDMsIC8qIM8gLSAyMDcgKi8KICAweDgwMDAsIC8qINAgLSAyMDggKi8KICAweDgwMDMsIC8qINEgLSAyMDkgKi8KICAweDgwMDMsIC8qINIgLSAyMTAgKi8KICAweDgwMDMsIC8qINMgLSAyMTEgKi8KICAweDgwMDMsIC8qINQgLSAyMTIgKi8KICAweDgwMDMsIC8qINUgLSAyMTMgKi8KICAweDgwMDMsIC8qINYgLSAyMTQgKi8KICAweDAwMDgsIC8qINcgLSAyMTUgKi8KICAweDgwMDMsIC8qINggLSAyMTYgKi8KICAweDgwMDMsIC8qINkgLSAyMTcgKi8KICAweDgwMDMsIC8qINogLSAyMTggKi8KICAweDgwMDMsIC8qINsgLSAyMTkgKi8KICAweDgwMDMsIC8qINwgLSAyMjAgKi8KICAweDgwMDMsIC8qIN0gLSAyMjEgKi8KICAweDgwMDAsIC8qIN4gLSAyMjIgKi8KICAweDgwMDAsIC8qIN8gLSAyMjMgKi8KICAweDgwMDMsIC8qIOAgLSAyMjQgKi8KICAweDgwMDMsIC8qIOEgLSAyMjUgKi8KICAweDgwMDMsIC8qIOIgLSAyMjYgKi8KICAweDgwMDMsIC8qIOMgLSAyMjcgKi8KICAweDgwMDMsIC8qIOQgLSAyMjggKi8KICAweDgwMDMsIC8qIOUgLSAyMjkgKi8KICAweDgwMDAsIC8qIOYgLSAyMzAgKi8KICAweDgwMDMsIC8qIOcgLSAyMzEgKi8KICAweDgwMDMsIC8qIOggLSAyMzIgKi8KICAweDgwMDMsIC8qIOkgLSAyMzMgKi8KICAweDgwMDMsIC8qIOogLSAyMzQgKi8KICAweDgwMDMsIC8qIOsgLSAyMzUgKi8KICAweDgwMDMsIC8qIOwgLSAyMzYgKi8KICAweDgwMDMsIC8qIO0gLSAyMzcgKi8KICAweDgwMDMsIC8qIO4gLSAyMzggKi8KICAweDgwMDMsIC8qIO8gLSAyMzkgKi8KICAweDgwMDAsIC8qIPAgLSAyNDAgKi8KICAweDgwMDMsIC8qIPEgLSAyNDEgKi8KICAweDgwMDMsIC8qIPIgLSAyNDIgKi8KICAweDgwMDMsIC8qIPMgLSAyNDMgKi8KICAweDgwMDMsIC8qIPQgLSAyNDQgKi8KICAweDgwMDMsIC8qIPUgLSAyNDUgKi8KICAweDgwMDMsIC8qIPYgLSAyNDYgKi8KICAweDAwMDgsIC8qIPcgLSAyNDcgKi8KICAweDgwMDMsIC8qIPggLSAyNDggKi8KICAweDgwMDMsIC8qIPkgLSAyNDkgKi8KICAweDgwMDMsIC8qIPogLSAyNTAgKi8KICAweDgwMDMsIC8qIPsgLSAyNTEgKi8KICAweDgwMDMsIC8qIPwgLSAyNTIgKi8KICAweDgwMDMsIC8qIP0gLSAyNTMgKi8KICAweDgwMDAsIC8qIP4gLSAyNTQgKi8KICAweDgwMDMgIC8qIP8gLSAyNTUgKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVBCVtLRVJORUwzMi4zOTZdCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeEEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeEEJW0tFUk5FTDMyLjM5N10KICoKICogRklYTUU6IElnbm9yZXMgdGhlIGxvY2FsZS4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeEEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgkKCWlmICgoc3JjPT1OVUxMKSB8fCAoY2hhcnR5cGU9PU5VTEwpIHx8IChzcmM9PShMUFNUUiljaGFydHlwZSkpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiBGQUxTRTsKCX0KCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW5BKHNyYykrMTsKCSAgCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUxOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV0gPSAwOwoJICAgIGlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCSAgICBpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkgICAgaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJICAgIGlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCSAgICBpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkgICAgaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJICAgIGlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KCSAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCSAgICAvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwoKCWNhc2UgQ1RfQ1RZUEUyOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV09KFdPUkQpQ1RfQ1R5cGUyX0xVVFtpXTsKCSAgfQoJICByZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMzoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPU9MRTJOTFNfQ1RfQ1R5cGUzX0xVVFtpXTsKCSAgfQoJICByZXR1cm4gVFJVRTsKCglkZWZhdWx0OgoJICBFUlIoIlVua25vd24gZHdJbmZvVHlwZTolbGRcbiIsZHdJbmZvVHlwZSk7CgkgIHJldHVybiBGQUxTRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZVcJW0tFUk5FTDMyLjM5OV0KICoKICogTk9URVMKICogWWVzLCB0aGlzIGlzIG1pc3NpbmcgTENJRCBsb2NhbGUuIE1TIGZhdWx0LgogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZVcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQgY2NoU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4VygwLypkZWZhdWx0bG9jYWxlKi8sZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZUV4VwlbS0VSTkVMMzIuMzk4XQogKgogKiBGSVhNRTogdW5pY29kZSBjaGFycyBhcmUgYXNzdW1lZCBjaGFycwogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUV4VyhMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlblcoc3JjKSsxOwoJCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUyOgoJCUZJWE1FKCJDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWNhc2UgQ1RfQ1RZUEUzOgoJCUZJWE1FKCJDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWRlZmF1bHQ6YnJlYWs7Cgl9Cglmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKCQljaGFydHlwZVtpXSA9IDA7CgkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCQlpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCQlpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwogICAgICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkJLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lICAgW2ludGVybmFsXSAKICovCnN0YXRpYyBMUENTVFIgV0lORV9HZXRMYW5ndWFnZU5hbWUoIFVJTlQgbGFuZ2lkICkKewogICAgaW50IGk7CiAgICBmb3IgKCBpID0gMDsgbGFuZ3VhZ2VzW2ldLmxhbmdpZCAhPSAwOyBpKysgKQogICAgICAgIGlmICggbGFuZ2lkID09IGxhbmd1YWdlc1tpXS5sYW5naWQgKQogICAgICAgICAgICBicmVhazsKCiAgICByZXR1cm4gbGFuZ3VhZ2VzW2ldLmxhbmduYW1lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZUEgICAgICAgICAgICAgIFtLRVJORUwzMi43MDldW1ZFUlNJT04uOV0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVBKCBVSU5UIHdMYW5nLCBMUFNUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBjaGFyICAgIGJ1ZmZlcls4MF07CiAgICBMUENTVFIgIG5hbWU7CiAgICBEV09SRCAgIHJlc3VsdDsKCiAgICAvKgogICAgICogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CiAgICAgKiBmcm9tIHRoZSByZWdpc3RyeS4KICAgICAqLwoKICAgIHNwcmludGYoIGJ1ZmZlciwKICAgICAgICAgICAgICJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IiwKICAgICAgICAgICAgIHdMYW5nICk7CgogICAgcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZUEoIEhLRVlfTE9DQUxfTUFDSElORSwgYnVmZmVyLCBzekxhbmcsIChMUERXT1JEKSZuU2l6ZSApOwogICAgaWYgKCByZXN1bHQgPT0gRVJST1JfU1VDQ0VTUyB8fCByZXN1bHQgPT0gRVJST1JfTU9SRV9EQVRBICkKICAgICAgICByZXR1cm4gblNpemU7CgogICAgLyoKICAgICAqIElmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUKICAgICAqLwoKICAgIG5hbWUgPSBXSU5FX0dldExhbmd1YWdlTmFtZSggd0xhbmcgKTsKICAgIGxzdHJjcHluQSggc3pMYW5nLCBuYW1lLCBuU2l6ZSApOwogICAgcmV0dXJuIGxzdHJsZW5BKCBuYW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lVyAgICAgICAgICAgICAgW0tFUk5FTDMyLjcxMF1bVkVSU0lPTi4xMF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVXKCBVSU5UIHdMYW5nLCBMUFdTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgY2hhciAgICBidWZmZXJbODBdOwogICAgTFBXU1RSICBrZXluYW1lOwogICAgTFBDU1RSICBuYW1lOwogICAgRFdPUkQgICByZXN1bHQ7CgogICAgLyoKICAgICAqIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogICAgICogZnJvbSB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBzcHJpbnRmKCBidWZmZXIsCiAgICAgICAgICAgICAiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCiAgICAgICAgICAgICB3TGFuZyApOwoKICAgIGtleW5hbWUgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwogICAgcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZVcoIEhLRVlfTE9DQUxfTUFDSElORSwga2V5bmFtZSwgc3pMYW5nLCAoTFBEV09SRCkmblNpemUgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CgogICAgaWYgKCByZXN1bHQgPT0gRVJST1JfU1VDQ0VTUyB8fCByZXN1bHQgPT0gRVJST1JfTU9SRV9EQVRBICkKICAgICAgICByZXR1cm4gblNpemU7CgogICAgLyoKICAgICAqIElmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUKICAgICAqLwoKICAgIG5hbWUgPSBXSU5FX0dldExhbmd1YWdlTmFtZSggd0xhbmcgKTsKICAgIGxzdHJjcHluQXRvVyggc3pMYW5nLCBuYW1lLCBuU2l6ZSApOwogICAgcmV0dXJuIGxzdHJsZW5BKCBuYW1lICk7Cn0KCiAKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUW10gPSB7CiAgNiAgICAgICwgICAzLCAvKiAgIC0gICAxICovICAKICA2ICAgICAgLCAgIDQsIC8qICAgLSAgIDIgKi8gIAogIDYgICAgICAsICAgNSwgLyogICAtICAgMyAqLyAgCiAgNiAgICAgICwgICA2LCAvKiAgIC0gICA0ICovICAKICA2ICAgICAgLCAgIDcsIC8qICAgLSAgIDUgKi8gIAogIDYgICAgICAsICAgOCwgLyogICAtICAgNiAqLyAgCiAgNiAgICAgICwgICA5LCAvKiAgIC0gICA3ICovICAKICA2ICAgICAgLCAgMTAsIC8qICAgLSAgIDggKi8gIAogIDcgICAgICAsICAgNSwgLyogICAtICAgOSAqLyAgCiAgNyAgICAgICwgICA2LCAvKiAgIC0gIDEwICovICAKICA3ICAgICAgLCAgIDcsIC8qICAgLSAgMTEgKi8gIAogIDcgICAgICAsICAgOCwgLyogICAtICAxMiAqLyAgCiAgNyAgICAgICwgICA5LCAvKiAgIC0gIDEzICovICAKICA2ICAgICAgLCAgMTEsIC8qICAgLSAgMTQgKi8gIAogIDYgICAgICAsICAxMiwgLyogICAtICAxNSAqLyAgCiAgNiAgICAgICwgIDEzLCAvKiAgIC0gIDE2ICovICAKICA2ICAgICAgLCAgMTQsIC8qICAgLSAgMTcgKi8gIAogIDYgICAgICAsICAxNSwgLyogICAtICAxOCAqLyAgCiAgNiAgICAgICwgIDE2LCAvKiAgIC0gIDE5ICovICAKICA2ICAgICAgLCAgMTcsIC8qICAgLSAgMjAgKi8gIAogIDYgICAgICAsICAxOCwgLyogICAtICAyMSAqLyAgCiAgNiAgICAgICwgIDE5LCAvKiAgIC0gIDIyICovICAKICA2ICAgICAgLCAgMjAsIC8qICAgLSAgMjMgKi8gIAogIDYgICAgICAsICAyMSwgLyogICAtICAyNCAqLyAgCiAgNiAgICAgICwgIDIyLCAvKiAgIC0gIDI1ICovICAKICA2ICAgICAgLCAgMjMsIC8qICAgLSAgMjYgKi8gIAogIDYgICAgICAsICAyNCwgLyogICAtICAyNyAqLyAgCiAgNiAgICAgICwgIDI1LCAvKiAgIC0gIDI4ICovICAKICA2ICAgICAgLCAgMjYsIC8qICAgLSAgMjkgKi8gIAogIDYgICAgICAsICAyNywgLyogICAtICAzMCAqLyAgCiAgNiAgICAgICwgIDI4LCAvKiAgIC0gIDMxICovICAKICA3ICAgICAgLCAgIDIsIC8qICAgLSAgMzIgKi8KICA3ICAgICAgLCAgMjgsIC8qICEgLSAgMzMgKi8KICA3ICAgICAgLCAgMjksIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDcgICAgICAsICAzMSwgLyogIyAtICAzNSAqLwogIDcgICAgICAsICAzMywgLyogJCAtICAzNiAqLwogIDcgICAgICAsICAzNSwgLyogJSAtICAzNyAqLwogIDcgICAgICAsICAzNywgLyogJiAtICAzOCAqLwogIDYgICAgICAsIDEyOCwgLyogJyAtICAzOSAqLwogIDcgICAgICAsICAzOSwgLyogKCAtICA0MCAqLwogIDcgICAgICAsICA0MiwgLyogKSAtICA0MSAqLwogIDcgICAgICAsICA0NSwgLyogKiAtICA0MiAqLwogIDggICAgICAsICAgMywgLyogKyAtICA0MyAqLwogIDcgICAgICAsICA0NywgLyogLCAtICA0NCAqLwogIDYgICAgICAsIDEzMCwgLyogLSAtICA0NSAqLwogIDcgICAgICAsICA1MSwgLyogLiAtICA0NiAqLwogIDcgICAgICAsICA1MywgLyogLyAtICA0NyAqLwogMTIgICAgICAsICAgMywgLyogMCAtICA0OCAqLwogMTIgICAgICAsICAzMywgLyogMSAtICA0OSAqLwogMTIgICAgICAsICA1MSwgLyogMiAtICA1MCAqLwogMTIgICAgICAsICA3MCwgLyogMyAtICA1MSAqLwogMTIgICAgICAsICA4OCwgLyogNCAtICA1MiAqLwogMTIgICAgICAsIDEwNiwgLyogNSAtICA1MyAqLwogMTIgICAgICAsIDEyNSwgLyogNiAtICA1NCAqLwogMTIgICAgICAsIDE0NCwgLyogNyAtICA1NSAqLwogMTIgICAgICAsIDE2MiwgLyogOCAtICA1NiAqLwogMTIgICAgICAsIDE4MCwgLyogOSAtICA1NyAqLwogIDcgICAgICAsICA1NSwgLyogOiAtICA1OCAqLwogIDcgICAgICAsICA1OCwgLyogOyAtICA1OSAqLwogIDggICAgICAsICAxNCwgLyogPCAtICA2MCAqLwogIDggICAgICAsICAxOCwgLyogPSAtICA2MSAqLwogIDggICAgICAsICAyMCwgLyogPiAtICA2MiAqLwogIDcgICAgICAsICA2MCwgLyogPyAtICA2MyAqLwogIDcgICAgICAsICA2MiwgLyogQCAtICA2NCAqLwogMTQgICAgICAsICAgMiwgLyogQSAtICA2NSAqLwogMTQgICAgICAsICAgOSwgLyogQiAtICA2NiAqLwogMTQgICAgICAsICAxMCwgLyogQyAtICA2NyAqLwogMTQgICAgICAsICAyNiwgLyogRCAtICA2OCAqLwogMTQgICAgICAsICAzMywgLyogRSAtICA2OSAqLwogMTQgICAgICAsICAzNSwgLyogRiAtICA3MCAqLwogMTQgICAgICAsICAzNywgLyogRyAtICA3MSAqLwogMTQgICAgICAsICA0NCwgLyogSCAtICA3MiAqLwogMTQgICAgICAsICA1MCwgLyogSSAtICA3MyAqLwogMTQgICAgICAsICA1MywgLyogSiAtICA3NCAqLwogMTQgICAgICAsICA1NCwgLyogSyAtICA3NSAqLwogMTQgICAgICAsICA3MiwgLyogTCAtICA3NiAqLwogMTQgICAgICAsICA4MSwgLyogTSAtICA3NyAqLwogMTQgICAgICAsIDExMiwgLyogTiAtICA3OCAqLwogMTQgICAgICAsIDEyNCwgLyogTyAtICA3OSAqLwogMTQgICAgICAsIDEyNiwgLyogUCAtICA4MCAqLwogMTQgICAgICAsIDEzNywgLyogUSAtICA4MSAqLwogMTQgICAgICAsIDEzOCwgLyogUiAtICA4MiAqLwogMTQgICAgICAsIDE0NSwgLyogUyAtICA4MyAqLwogMTQgICAgICAsIDE1MywgLyogVCAtICA4NCAqLwogMTQgICAgICAsIDE1OSwgLyogVSAtICA4NSAqLwogMTQgICAgICAsIDE2MiwgLyogViAtICA4NiAqLwogMTQgICAgICAsIDE2NCwgLyogVyAtICA4NyAqLwogMTQgICAgICAsIDE2NiwgLyogWCAtICA4OCAqLwogMTQgICAgICAsIDE2NywgLyogWSAtICA4OSAqLwogMTQgICAgICAsIDE2OSwgLyogWiAtICA5MCAqLwogIDcgICAgICAsICA2MywgLyogWyAtICA5MSAqLwogIDcgICAgICAsICA2NSwgLyogXCAtICA5MiAqLwogIDcgICAgICAsICA2NiwgLyogXSAtICA5MyAqLwogIDcgICAgICAsICA2NywgLyogXiAtICA5NCAqLwogIDcgICAgICAsICA2OCwgLyogXyAtICA5NSAqLwogIDcgICAgICAsICA3MiwgLyogYCAtICA5NiAqLwogMTQgICAgICAsICAgMiwgLyogYSAtICA5NyAqLwogMTQgICAgICAsICAgOSwgLyogYiAtICA5OCAqLwogMTQgICAgICAsICAxMCwgLyogYyAtICA5OSAqLwogMTQgICAgICAsICAyNiwgLyogZCAtIDEwMCAqLwogMTQgICAgICAsICAzMywgLyogZSAtIDEwMSAqLwogMTQgICAgICAsICAzNSwgLyogZiAtIDEwMiAqLwogMTQgICAgICAsICAzNywgLyogZyAtIDEwMyAqLwogMTQgICAgICAsICA0NCwgLyogaCAtIDEwNCAqLwogMTQgICAgICAsICA1MCwgLyogaSAtIDEwNSAqLwogMTQgICAgICAsICA1MywgLyogaiAtIDEwNiAqLwogMTQgICAgICAsICA1NCwgLyogayAtIDEwNyAqLwogMTQgICAgICAsICA3MiwgLyogbCAtIDEwOCAqLwogMTQgICAgICAsICA4MSwgLyogbSAtIDEwOSAqLwogMTQgICAgICAsIDExMiwgLyogbiAtIDExMCAqLwogMTQgICAgICAsIDEyNCwgLyogbyAtIDExMSAqLwogMTQgICAgICAsIDEyNiwgLyogcCAtIDExMiAqLwogMTQgICAgICAsIDEzNywgLyogcSAtIDExMyAqLwogMTQgICAgICAsIDEzOCwgLyogciAtIDExNCAqLwogMTQgICAgICAsIDE0NSwgLyogcyAtIDExNSAqLwogMTQgICAgICAsIDE1MywgLyogdCAtIDExNiAqLwogMTQgICAgICAsIDE1OSwgLyogdSAtIDExNyAqLwogMTQgICAgICAsIDE2MiwgLyogdiAtIDExOCAqLwogMTQgICAgICAsIDE2NCwgLyogdyAtIDExOSAqLwogMTQgICAgICAsIDE2NiwgLyogeCAtIDEyMCAqLwogMTQgICAgICAsIDE2NywgLyogeSAtIDEyMSAqLwogMTQgICAgICAsIDE2OSwgLyogeiAtIDEyMiAqLwogIDcgICAgICAsICA3NCwgLyogeyAtIDEyMyAqLwogIDcgICAgICAsICA3NiwgLyogfCAtIDEyNCAqLwogIDcgICAgICAsICA3OCwgLyogfSAtIDEyNSAqLwogIDcgICAgICAsICA4MCwgLyogfiAtIDEyNiAqLwogIDYgICAgICAsICAyOSwgLyogfyAtIDEyNyAqLwogIDYgICAgICAsICAzMCwgLyoggCAtIDEyOCAqLwogIDYgICAgICAsICAzMSwgLyoggSAtIDEyOSAqLwogIDcgICAgICAsIDEyMywgLyoggiAtIDEzMCAqLwogMTQgICAgICAsICAzNSwgLyoggyAtIDEzMSAqLwogIDcgICAgICAsIDEyNywgLyoghCAtIDEzMiAqLwogMTAgICAgICAsICAyMSwgLyoghSAtIDEzMyAqLwogMTAgICAgICAsICAxNSwgLyoghiAtIDEzNCAqLwogMTAgICAgICAsICAxNiwgLyoghyAtIDEzNSAqLwogIDcgICAgICAsICA2NywgLyogiCAtIDEzNiAqLwogMTAgICAgICAsICAyMiwgLyogiSAtIDEzNyAqLwogMTQgICAgICAsIDE0NSwgLyogiiAtIDEzOCAqLwogIDcgICAgICAsIDEzNiwgLyogiyAtIDEzOSAqLwogMTQgKyAxNiAsIDEyNCwgLyogjCAtIDE0MCAqLwogIDYgICAgICAsICA0MywgLyogjSAtIDE0MSAqLwogIDYgICAgICAsICA0NCwgLyogjiAtIDE0MiAqLwogIDYgICAgICAsICA0NSwgLyogjyAtIDE0MyAqLwogIDYgICAgICAsICA0NiwgLyogkCAtIDE0NCAqLwogIDcgICAgICAsIDEyMSwgLyogkSAtIDE0NSAqLwogIDcgICAgICAsIDEyMiwgLyogkiAtIDE0NiAqLwogIDcgICAgICAsIDEyNSwgLyogkyAtIDE0NyAqLwogIDcgICAgICAsIDEyNiwgLyoglCAtIDE0OCAqLwogMTAgICAgICAsICAxNywgLyoglSAtIDE0OSAqLwogIDYgICAgICAsIDEzNywgLyogliAtIDE1MCAqLwogIDYgICAgICAsIDEzOSwgLyoglyAtIDE1MSAqLwogIDcgICAgICAsICA5MywgLyogmCAtIDE1MiAqLwogMTQgICAgICAsIDE1NiwgLyogmSAtIDE1MyAqLwogMTQgICAgICAsIDE0NSwgLyogmiAtIDE1NCAqLwogIDcgICAgICAsIDEzNywgLyogmyAtIDE1NSAqLwogMTQgKyAxNiAsIDEyNCwgLyognCAtIDE1NiAqLwogIDYgICAgICAsICA1OSwgLyognSAtIDE1NyAqLwogIDYgICAgICAsICA2MCwgLyogniAtIDE1OCAqLwogMTQgICAgICAsIDE2NywgLyognyAtIDE1OSAqLwogIDcgICAgICAsICAgNCwgLyogoCAtIDE2MCAqLwogIDcgICAgICAsICA4MSwgLyogoSAtIDE2MSAqLwogMTAgICAgICAsICAgMiwgLyogoiAtIDE2MiAqLwogMTAgICAgICAsICAgMywgLyogoyAtIDE2MyAqLwogMTAgICAgICAsICAgNCwgLyogpCAtIDE2NCAqLwogMTAgICAgICAsICAgNSwgLyogpSAtIDE2NSAqLwogIDcgICAgICAsICA4MiwgLyogpiAtIDE2NiAqLwogMTAgICAgICAsICAgNiwgLyogpyAtIDE2NyAqLwogIDcgICAgICAsICA4MywgLyogqCAtIDE2OCAqLwogMTAgICAgICAsICAgNywgLyogqSAtIDE2OSAqLwogMTQgICAgICAsICAgMiwgLyogqiAtIDE3MCAqLwogIDggICAgICAsICAyNCwgLyogqyAtIDE3MSAqLwogMTAgICAgICAsICAgOCwgLyogrCAtIDE3MiAqLwogIDYgICAgICAsIDEzMSwgLyogrSAtIDE3MyAqLwogMTAgICAgICAsICAgOSwgLyogriAtIDE3NCAqLwogIDcgICAgICAsICA4NCwgLyogryAtIDE3NSAqLwogMTAgICAgICAsICAxMCwgLyogsCAtIDE3NiAqLwogIDggICAgICAsICAyMywgLyogsSAtIDE3NyAqLwogMTIgICAgICAsICA1MSwgLyogsiAtIDE3OCAqLwogMTIgICAgICAsICA3MCwgLyogsyAtIDE3OSAqLwogIDcgICAgICAsICA4NSwgLyogtCAtIDE4MCAqLwogMTAgICAgICAsICAxMSwgLyogtSAtIDE4MSAqLwogMTAgICAgICAsICAxMiwgLyogtiAtIDE4MiAqLwogMTAgICAgICAsICAxMywgLyogtyAtIDE4MyAqLwogIDcgICAgICAsICA4NiwgLyoguCAtIDE4NCAqLwogMTIgICAgICAsICAzMywgLyoguSAtIDE4NSAqLwogMTQgICAgICAsIDEyNCwgLyoguiAtIDE4NiAqLwogIDggICAgICAsICAyNiwgLyoguyAtIDE4NyAqLwogMTIgICAgICAsICAyMSwgLyogvCAtIDE4OCAqLwogMTIgICAgICAsICAyNSwgLyogvSAtIDE4OSAqLwogMTIgICAgICAsICAyOSwgLyogviAtIDE5MCAqLwogIDcgICAgICAsICA4NywgLyogvyAtIDE5MSAqLwogMTQgICAgICAsICAgMiwgLyogwCAtIDE5MiAqLwogMTQgICAgICAsICAgMiwgLyogwSAtIDE5MyAqLwogMTQgICAgICAsICAgMiwgLyogwiAtIDE5NCAqLwogMTQgICAgICAsICAgMiwgLyogwyAtIDE5NSAqLwogMTQgICAgICAsICAgMiwgLyogxCAtIDE5NiAqLwogMTQgICAgICAsICAgMiwgLyogxSAtIDE5NyAqLwogMTQgKyAxNiAsICAgMiwgLyogxiAtIDE5OCAqLwogMTQgICAgICAsICAxMCwgLyogxyAtIDE5OSAqLwogMTQgICAgICAsICAzMywgLyogyCAtIDIwMCAqLwogMTQgICAgICAsICAzMywgLyogySAtIDIwMSAqLwogMTQgICAgICAsICAzMywgLyogyiAtIDIwMiAqLwogMTQgICAgICAsICAzMywgLyogyyAtIDIwMyAqLwogMTQgICAgICAsICA1MCwgLyogzCAtIDIwNCAqLwogMTQgICAgICAsICA1MCwgLyogzSAtIDIwNSAqLwogMTQgICAgICAsICA1MCwgLyogziAtIDIwNiAqLwogMTQgICAgICAsICA1MCwgLyogzyAtIDIwNyAqLwogMTQgICAgICAsICAyNiwgLyog0CAtIDIwOCAqLwogMTQgICAgICAsIDExMiwgLyog0SAtIDIwOSAqLwogMTQgICAgICAsIDEyNCwgLyog0iAtIDIxMCAqLwogMTQgICAgICAsIDEyNCwgLyog0yAtIDIxMSAqLwogMTQgICAgICAsIDEyNCwgLyog1CAtIDIxMiAqLwogMTQgICAgICAsIDEyNCwgLyog1SAtIDIxMyAqLwogMTQgICAgICAsIDEyNCwgLyog1iAtIDIxNCAqLwogIDggICAgICAsICAyOCwgLyog1yAtIDIxNSAqLwogMTQgICAgICAsIDEyNCwgLyog2CAtIDIxNiAqLwogMTQgICAgICAsIDE1OSwgLyog2SAtIDIxNyAqLwogMTQgICAgICAsIDE1OSwgLyog2iAtIDIxOCAqLwogMTQgICAgICAsIDE1OSwgLyog2yAtIDIxOSAqLwogMTQgICAgICAsIDE1OSwgLyog3CAtIDIyMCAqLwogMTQgICAgICAsIDE2NywgLyog3SAtIDIyMSAqLwogMTQgKyAzMiAsIDE1MywgLyog3iAtIDIyMiAqLwogMTQgKyA0OCAsIDE0NSwgLyog3yAtIDIyMyAqLwogMTQgICAgICAsICAgMiwgLyog4CAtIDIyNCAqLwogMTQgICAgICAsICAgMiwgLyog4SAtIDIyNSAqLwogMTQgICAgICAsICAgMiwgLyog4iAtIDIyNiAqLwogMTQgICAgICAsICAgMiwgLyog4yAtIDIyNyAqLwogMTQgICAgICAsICAgMiwgLyog5CAtIDIyOCAqLwogMTQgICAgICAsICAgMiwgLyog5SAtIDIyOSAqLwogMTQgKyAxNiAsICAgMiwgLyog5iAtIDIzMCAqLwogMTQgICAgICAsICAxMCwgLyog5yAtIDIzMSAqLwogMTQgICAgICAsICAzMywgLyog6CAtIDIzMiAqLwogMTQgICAgICAsICAzMywgLyog6SAtIDIzMyAqLwogMTQgICAgICAsICAzMywgLyog6iAtIDIzNCAqLwogMTQgICAgICAsICAzMywgLyog6yAtIDIzNSAqLwogMTQgICAgICAsICA1MCwgLyog7CAtIDIzNiAqLwogMTQgICAgICAsICA1MCwgLyog7SAtIDIzNyAqLwogMTQgICAgICAsICA1MCwgLyog7iAtIDIzOCAqLwogMTQgICAgICAsICA1MCwgLyog7yAtIDIzOSAqLwogMTQgICAgICAsICAyNiwgLyog8CAtIDI0MCAqLwogMTQgICAgICAsIDExMiwgLyog8SAtIDI0MSAqLwogMTQgICAgICAsIDEyNCwgLyog8iAtIDI0MiAqLwogMTQgICAgICAsIDEyNCwgLyog8yAtIDI0MyAqLwogMTQgICAgICAsIDEyNCwgLyog9CAtIDI0NCAqLwogMTQgICAgICAsIDEyNCwgLyog9SAtIDI0NSAqLwogMTQgICAgICAsIDEyNCwgLyog9iAtIDI0NiAqLwogIDggICAgICAsICAyOSwgLyog9yAtIDI0NyAqLwogMTQgICAgICAsIDEyNCwgLyog+CAtIDI0OCAqLwogMTQgICAgICAsIDE1OSwgLyog+SAtIDI0OSAqLwogMTQgICAgICAsIDE1OSwgLyog+iAtIDI1MCAqLwogMTQgICAgICAsIDE1OSwgLyog+yAtIDI1MSAqLwogMTQgICAgICAsIDE1OSwgLyog/CAtIDI1MiAqLwogMTQgICAgICAsIDE2NywgLyog/SAtIDI1MyAqLwogMTQgKyAzMiAsIDE1MywgLyog/iAtIDI1NCAqLwogMTQgICAgICAsIDE2NyAgLyog/yAtIDI1NSAqLyB9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUXzJbXSA9IHsgMzMsIDQ0LCAxNDUgfTsKCiNkZWZpbmUgTENNX0RpYWNyaXRpY19TdGFydCAxMzEKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9EaWFjcml0aWNfTFVUW10gPSB7IAoxMjMsICAvKiCDIC0gMTMxICovCiAgMiwgIC8qIIQgLSAxMzIgKi8KICAyLCAgLyoghSAtIDEzMyAqLwogIDIsICAvKiCGIC0gMTM0ICovCiAgMiwgIC8qIIcgLSAxMzUgKi8KICAzLCAgLyogiCAtIDEzNiAqLwogIDIsICAvKiCJIC0gMTM3ICovCiAyMCwgIC8qIIogLSAxMzggKi8KICAyLCAgLyogiyAtIDEzOSAqLwogIDIsICAvKiCMIC0gMTQwICovCiAgMiwgIC8qII0gLSAxNDEgKi8KICAyLCAgLyogjiAtIDE0MiAqLwogIDIsICAvKiCPIC0gMTQzICovCiAgMiwgIC8qIJAgLSAxNDQgKi8KICAyLCAgLyogkSAtIDE0NSAqLwogIDIsICAvKiCSIC0gMTQ2ICovCiAgMiwgIC8qIJMgLSAxNDcgKi8KICAyLCAgLyoglCAtIDE0OCAqLwogIDIsICAvKiCVIC0gMTQ5ICovCiAgMiwgIC8qIJYgLSAxNTAgKi8KICAyLCAgLyoglyAtIDE1MSAqLwogIDIsICAvKiCYIC0gMTUyICovCiAgMiwgIC8qIJkgLSAxNTMgKi8KIDIwLCAgLyogmiAtIDE1NCAqLwogIDIsICAvKiCbIC0gMTU1ICovCiAgMiwgIC8qIJwgLSAxNTYgKi8KICAyLCAgLyognSAtIDE1NyAqLwogIDIsICAvKiCeIC0gMTU4ICovCiAxOSwgIC8qIJ8gLSAxNTkgKi8KICAyLCAgLyogoCAtIDE2MCAqLwogIDIsICAvKiChIC0gMTYxICovCiAgMiwgIC8qIKIgLSAxNjIgKi8KICAyLCAgLyogoyAtIDE2MyAqLwogIDIsICAvKiCkIC0gMTY0ICovCiAgMiwgIC8qIKUgLSAxNjUgKi8KICAyLCAgLyogpiAtIDE2NiAqLwogIDIsICAvKiCnIC0gMTY3ICovCiAgMiwgIC8qIKggLSAxNjggKi8KICAyLCAgLyogqSAtIDE2OSAqLwogIDMsICAvKiCqIC0gMTcwICovCiAgMiwgIC8qIKsgLSAxNzEgKi8KICAyLCAgLyogrCAtIDE3MiAqLwogIDIsICAvKiCtIC0gMTczICovCiAgMiwgIC8qIK4gLSAxNzQgKi8KICAyLCAgLyogryAtIDE3NSAqLwogIDIsICAvKiCwIC0gMTc2ICovCiAgMiwgIC8qILEgLSAxNzcgKi8KICAyLCAgLyogsiAtIDE3OCAqLwogIDIsICAvKiCzIC0gMTc5ICovCiAgMiwgIC8qILQgLSAxODAgKi8KICAyLCAgLyogtSAtIDE4MSAqLwogIDIsICAvKiC2IC0gMTgyICovCiAgMiwgIC8qILcgLSAxODMgKi8KICAyLCAgLyoguCAtIDE4NCAqLwogIDIsICAvKiC5IC0gMTg1ICovCiAgMywgIC8qILogLSAxODYgKi8KICAyLCAgLyoguyAtIDE4NyAqLwogIDIsICAvKiC8IC0gMTg4ICovCiAgMiwgIC8qIL0gLSAxODkgKi8KICAyLCAgLyogviAtIDE5MCAqLwogIDIsICAvKiC/IC0gMTkxICovCiAxNSwgIC8qIMAgLSAxOTIgKi8KIDE0LCAgLyogwSAtIDE5MyAqLwogMTgsICAvKiDCIC0gMTk0ICovCiAyNSwgIC8qIMMgLSAxOTUgKi8KIDE5LCAgLyogxCAtIDE5NiAqLwogMjYsICAvKiDFIC0gMTk3ICovCiAgMiwgIC8qIMYgLSAxOTggKi8KIDI4LCAgLyogxyAtIDE5OSAqLwogMTUsICAvKiDIIC0gMjAwICovCiAxNCwgIC8qIMkgLSAyMDEgKi8KIDE4LCAgLyogyiAtIDIwMiAqLwogMTksICAvKiDLIC0gMjAzICovCiAxNSwgIC8qIMwgLSAyMDQgKi8KIDE0LCAgLyogzSAtIDIwNSAqLwogMTgsICAvKiDOIC0gMjA2ICovCiAxOSwgIC8qIM8gLSAyMDcgKi8KMTA0LCAgLyog0CAtIDIwOCAqLwogMjUsICAvKiDRIC0gMjA5ICovCiAxNSwgIC8qINIgLSAyMTAgKi8KIDE0LCAgLyog0yAtIDIxMSAqLwogMTgsICAvKiDUIC0gMjEyICovCiAyNSwgIC8qINUgLSAyMTMgKi8KIDE5LCAgLyog1iAtIDIxNCAqLwogIDIsICAvKiDXIC0gMjE1ICovCiAzMywgIC8qINggLSAyMTYgKi8KIDE1LCAgLyog2SAtIDIxNyAqLwogMTQsICAvKiDaIC0gMjE4ICovCiAxOCwgIC8qINsgLSAyMTkgKi8KIDE5LCAgLyog3CAtIDIyMCAqLwogMTQsICAvKiDdIC0gMjIxICovCiAgMiwgIC8qIN4gLSAyMjIgKi8KICAyLCAgLyog3yAtIDIyMyAqLwogMTUsICAvKiDgIC0gMjI0ICovCiAxNCwgIC8qIOEgLSAyMjUgKi8KIDE4LCAgLyog4iAtIDIyNiAqLwogMjUsICAvKiDjIC0gMjI3ICovCiAxOSwgIC8qIOQgLSAyMjggKi8KIDI2LCAgLyog5SAtIDIyOSAqLwogIDIsICAvKiDmIC0gMjMwICovCiAyOCwgIC8qIOcgLSAyMzEgKi8KIDE1LCAgLyog6CAtIDIzMiAqLwogMTQsICAvKiDpIC0gMjMzICovCiAxOCwgIC8qIOogLSAyMzQgKi8KIDE5LCAgLyog6yAtIDIzNSAqLwogMTUsICAvKiDsIC0gMjM2ICovCiAxNCwgIC8qIO0gLSAyMzcgKi8KIDE4LCAgLyog7iAtIDIzOCAqLwogMTksICAvKiDvIC0gMjM5ICovCjEwNCwgIC8qIPAgLSAyNDAgKi8KIDI1LCAgLyog8SAtIDI0MSAqLwogMTUsICAvKiDyIC0gMjQyICovCiAxNCwgIC8qIPMgLSAyNDMgKi8KIDE4LCAgLyog9CAtIDI0NCAqLwogMjUsICAvKiD1IC0gMjQ1ICovCiAxOSwgIC8qIPYgLSAyNDYgKi8KICAyLCAgLyog9yAtIDI0NyAqLwogMzMsICAvKiD4IC0gMjQ4ICovCiAxNSwgIC8qIPkgLSAyNDkgKi8KIDE0LCAgLyog+iAtIDI1MCAqLwogMTgsICAvKiD7IC0gMjUxICovCiAxOSwgIC8qIPwgLSAyNTIgKi8KIDE0LCAgLyog/SAtIDI1MyAqLwogIDIsICAvKiD+IC0gMjU0ICovCiAxOSwgIC8qIP8gLSAyNTUgKi8KfSA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNQdW5jdHVhdGlvbiBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNQdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogInB1bmN0dWF0aW9uIGNoYXJhY3RlciIgaW4gdGhpcyBjb250ZXh0IGlzIGEgY2hhcmFjdGVyIHdoaWNoIGlzIAogICAgIGNvbnNpZGVyZWQgImxlc3MgaW1wb3J0YW50IiBkdXJpbmcgd29yZCBzb3J0IGNvbXBhcmlzb24uCiAgICAgU2VlIExDTWFwU3RyaW5nIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJlY2lzZSBkZWZpbml0aW9uIAogICAgIG9mICJsZXNzIGltcG9ydGFudCIuICovCgogIHJldHVybiAoTENNX1VuaWNvZGVfTFVUWy0yKzIqY109PTYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNOb25TcGFjaW5nIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc05vblNwYWNpbmcodW5zaWduZWQgY2hhciBjKSAKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBMQ01hcFN0cmluZ0EuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRU5PTlNQQUNFICovCiAgcmV0dXJuICgoYz09MTM2KSB8fCAoYz09MTcwKSB8fCAoYz09MTg2KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1N5bWJvbCBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNTeW1ib2wodW5zaWduZWQgY2hhciBjKSAKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBMQ01hcFN0cmluZ0EuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIUlzQ2hhckFscGhhTnVtZXJpY0EoYykgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJaWRlbnRpdHkJW0ludGVybmFsXQogKi8Kc3RhdGljIGludCBpZGVudGl0eShpbnQgYykKewogIHJldHVybiBjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmdBICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTJdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCiAqIGEgc29ydCBrZXkgZm9yIHRoZSBzb3VyY2Ugc3RyaW5nLiAgRWxzZSwgaXQgd2lsbCBjb252ZXJ0IGl0CiAqIGFjY29yZGluZ2x5IHRvIHRoZSBmbGFncyBMQ01BUF9VUFBFUkNBU0UsIExDTUFQX0xPV0VSQ0FTRSwuLi4KICoKICogUkVUVVJOUwogKiAgICBFcnJvciA6IDAuCiAqICAgIFN1Y2Nlc3MgOiBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCiAqCiAqIE5PVEVTCiAqICAgIElmIGNhbGxlZCB3aXRoIHNjcmxlbiA9IC0xLCB0aGUgZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBsZW5ndGgKICogICAgICBvZiB0aGUgMC10ZXJtaW5hdGVkIHN0cmluZyBzdHJzcmMgYnkgaXRzZWxmLiAgICAgIAogKiAKICogICAgSWYgY2FsbGVkIHdpdGggZHN0bGVuID0gMCwgcmV0dXJucyB0aGUgYnVmZmVyIGxlbmd0aCB0aGF0IAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIHdpZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4gIAogKiAgICBJbiB0aGUgb25seSBjb2RlIHBhZ2UgaW1wbGVtZW50ZWQgc28gZmFyLCB0aGVyZSBtYXkgbm90IGJlCiAqICAgIHdpZGUgY2hhcmFjdGVycyBpbiBzdHJpbmdzIHBhc3NlZCB0byBMQ01hcFN0cmluZ0EsCiAqICAgIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgdGhpcyBmbGFnLgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ0EoCglMQ0lEIGxjaWQgLyogbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOyAKCQkgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgCiAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgdmFsdWVzLiAqLywKCURXT1JEIG1hcGZsYWdzIC8qIGZsYWdzICovLAoJTFBDU1RSIHNyY3N0ciAgLyogc291cmNlIGJ1ZmZlciAqLywKCUlOVCBzcmNsZW4gICAvKiBzb3VyY2UgbGVuZ3RoICovLAoJTFBTVFIgZHN0c3RyICAgLyogZGVzdGluYXRpb24gYnVmZmVyICovLAoJSU5UIGRzdGxlbiAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGggKi8pIAp7CiAgaW50IGk7CgogIFRSQUNFXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIoIihzcmM9JXMsZGVzdD0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbiA9PSAtMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuQShzcmNzdHIpICsgMSA7ICAgIC8qIChpbmNsdWRlIGZpbmFsICdcMCcpICovCgojZGVmaW5lIExDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MgKExDTUFQX1VQUEVSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9MT1dFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfU09SVEtFWSAgICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09SVF9TVFJJTkdTT1JUICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFV0lEVEggICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUtBTkFUWVBFKQogIC8qIEZJWE1FOiBhcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgS2FuYWthbmEgbm9yIEhpcmlnYW5hIAogICAqIGNoYXJhY3RlcnMsIHdlIGNhbiBzdXBwb3J0IE5PUk1fSUdOT1JFS0FOQVRZUEUKICAgKi8KICBpZiAobWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUykKICB7CiAgICBGSVhNRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsCgkgIG1hcGZsYWdzLAoJICBzcmNzdHIsCgkgIHNyY2xlbiwKCSAgZHN0c3RyLAoJICBkc3RsZW4sCgkgIG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MKICAgICApOwogIH0KCiAgaWYgKCAhKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgKQogIHsKICAgIGludCBpLGo7CiAgICBpbnQgKCpmKShpbnQpID0gaWRlbnRpdHk7IAogICAgaW50IGZsYWdfaWdub3Jlbm9uc3BhY2UgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0U7CiAgICBpbnQgZmxhZ19pZ25vcmVzeW1ib2xzID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRVNZTUJPTFM7CgogICAgaWYgKGZsYWdfaWdub3Jlbm9uc3BhY2UgfHwgZmxhZ19pZ25vcmVzeW1ib2xzKQogICAgewogICAgICAvKiBGb3Igc29tZSB2YWx1ZXMgb2YgbWFwZmxhZ3MsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyAKCSBzdHJpbmcgaXMgbm90IGtub3duIGF0IHRoaXMgcG9pbnQuICBXaW5kb3dzIGRvZXMgbWFwIHRoZSBzdHJpbmcKCSBhbmQgZG9lcyBub3QgU2V0TGFzdEVycm9yIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgaW4KCSB0aGVzZSBjYXNlcy4gKi8KICAgICAgaWYgKGRzdGxlbj09MCkKICAgICAgewoJLyogQ29tcHV0ZSByZXF1aXJlZCBsZW5ndGggKi8KCWZvciAoaT1qPTA7IGkgPCBzcmNsZW47IGkrKykKCXsKCSAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICAgICAmJiAhKGZsYWdfaWdub3Jlc3ltYm9scyAmJiBPTEUyTkxTX2lzU3ltYm9sKHNyY3N0cltpXSkpICkKCSAgICBqKys7Cgl9CglyZXR1cm4gajsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoZHN0bGVuPT0wKQoJcmV0dXJuIHNyY2xlbjsgIAogICAgICBpZiAoZHN0bGVuPHNyY2xlbikgCgkgICB7CgkgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgcmV0dXJuIDA7CgkgICB9CiAgICB9CiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgLyogRklYTUU6IE5PUk1fSUdOT1JFTk9OU1BBQ0UgcmVxdWlyZXMgYW5vdGhlciBjb252ZXJzaW9uICovCiAgICBmb3IgKGk9aj0wOyAoaTxzcmNsZW4pICYmIChqPGRzdGxlbikgOyBpKyspCiAgICB7CiAgICAgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAmJiAhKGZsYWdfaWdub3Jlc3ltYm9scyAmJiBPTEUyTkxTX2lzU3ltYm9sKHNyY3N0cltpXSkpICkKICAgICAgewoJZHN0c3RyW2pdID0gKENIQVIpIGYoc3Jjc3RyW2ldKTsKCWorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGo7CiAgfQoKICAvKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICovCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0ciAoZHN0c3RyLHJvb20pKQogICAgeyBFUlJfKHN0cmluZykoImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCgl7CgkgIFVJTlQxNiBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmdXICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTNdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogTk9URQogKgogKiBTZWUgTENNYXBTdHJpbmdBIGZvciBkb2N1bWVudGF0aW9uCiAqLwpJTlQgV0lOQVBJIExDTWFwU3RyaW5nVygKCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQgc3JjbGVuLExQV1NUUiBkc3RzdHIsCglJTlQgZHN0bGVuKQp7CiAgaW50IGk7CiAKICBUUkFDRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCiAgICAgICAgICAgICAgICAgbGNpZCwgbWFwZmxhZ3MsIHNyY3N0ciwgc3JjbGVuLCBkc3RzdHIsIGRzdGxlbik7CiAgCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIoIihzcmM9JXAsZHN0PSVwKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgTENfQ09MTEFURS4gKi8KICAgICAgY2hhciAqbGNfY29sbGF0ZV9kZWZhdWx0ID0gMDsgLyogdmFsdWUgcHJpb3IgdG8gdGhpcyBmdW5jdGlvbiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2VudiA9IDA7ICAgICAvKiB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KCiAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBpbmRleCBpbnRvIHN0cmluZ3Mgb2YgYW55IHR5cGUuICovCiAgICAgIGludCBzdHJfaWR4ID0gMDsKCiAgICAgIC8qIExlbmd0aHMgb2YgdmFyaW91cyBzdHJpbmdzIHdoZXJlIHRoZSBsZW5ndGggaXMgbWVhc3VyZWQgaW4KICAgICAgICogd2lkZSBjaGFyYWN0ZXJzIGZvciB3aWRlIGNoYXJhY3RlciBzdHJpbmdzIGFuZCBpbiBieXRlcyBmb3IKICAgICAgICogbmF0aXZlIHN0cmluZ3MuICBUaGUgbGVuZ3RocyBpbmNsdWRlIHRoZSBOVUxMIHRlcm1pbmF0b3IuICAqLwogICAgICBzaXplX3QgcmV0dXJuZWRfbGVuICAgID0gMDsKICAgICAgc2l6ZV90IHNyY19uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RfbmF0aXZlX2xlbiAgPSAwOwogICAgICBzaXplX3QgZHN0c3RyX2xpYmNfbGVuID0gMDsKCiAgICAgIC8qIE5hdGl2ZSAoY2hhcmFjdGVyIHNldCBkZXRlcm1pbmVkIGJ5IGxvY2FsZSkgdmVyc2lvbnMgb2YgdGhlCiAgICAgICAqIHN0cmluZ3Mgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzLiAgKi8KICAgICAgTFBTVFIgc3JjX25hdGl2ZSA9IDA7CiAgICAgIExQU1RSIGRzdF9uYXRpdmUgPSAwOwoKICAgICAgLyogVmVyc2lvbiBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzIHVzaW5nIHRoZQogICAgICAgKiAid2NoYXJfdCIgVW5pY29kZSBkYXRhIHR5cGUgbmVlZGVkIGJ5IHZhcmlvdXMgbGliYyBmdW5jdGlvbnMuICAqLwogICAgICB3Y2hhcl90ICpzcmNzdHJfbGliYyA9IDA7CiAgICAgIHdjaGFyX3QgKmRzdHN0cl9saWJjID0gMDsKCiAgICAgIGlmKCEoc3Jjc3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNsZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY3N0cl9saWJjXG4iLAogICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgc291cmNlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIGZvcihzdHJfaWR4ID0gMDsgc3RyX2lkeCA8IHNyY2xlbjsgc3RyX2lkeCsrKQogICAgICB7CiAgICAgICAgICBzcmNzdHJfbGliY1tzdHJfaWR4XSA9IHNyY3N0cltzdHJfaWR4XTsKICAgICAgfQoKICAgICAgLyogc3JjX25hdGl2ZSBzaG91bGQgY29udGFpbiBhdCBtb3N0IDMgYnl0ZXMgZm9yIGVhY2gKICAgICAgICogbXVsdGlieXRlIGNoYXJhY3RlcnMgaW4gdGhlIG9yaWdpbmFsIHNyY3N0ciBzdHJpbmcuICAqLwogICAgICBzcmNfbmF0aXZlX2xlbiA9IDMgKiBzcmNsZW47CiAgICAgIGlmKCEoc3JjX25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY19uYXRpdmVcbiIsIHNyY19uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIEZJWE1FOiBQcmlvciB0byB0byBzZXR0aW5nIHRoZSBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSB0aGUKICAgICAgICogY3VycmVudCB2YWx1ZSBpcyBiYWNrZWQgdXAgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGFmdGVyIHRoZQogICAgICAgKiBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9uIHJldHVybnMuCiAgICAgICAqIAogICAgICAgKiBFdmVuIHRob3VnaCB0aGUgbG9jYWxlIGlzIGFkanVzdGVkIGZvciBhIG1pbmltdW0gYW1vdW50IG9mCiAgICAgICAqIHRpbWUgYSByYWNlIGNvbmRpdGlvbiBleGlzdHMgd2hlcmUgb3RoZXIgdGhyZWFkcyBtYXkgYmUKICAgICAgICogYWZmZWN0ZWQgaWYgdGhleSBpbnZva2UgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb25zLiAgT25lCiAgICAgICAqIHBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIHdyYXAgYWxsIExDX0NPTExBVEUgc2Vuc2l0aXZlIFdpbmUKICAgICAgICogZnVuY3Rpb25zLCBsaWtlIExDTWFwU3RyaW5nVygpLCBpbiBhIG11dGV4LgogICAgICAgKgogICAgICAgKiBBbm90aGVyIGVuaGFuY2VtZW50IHRvIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdG8gc2V0IHRoZQogICAgICAgKiBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAibGNpZCIKICAgICAgICogcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlICJMQ19DT0xMQVRFIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KICAgICAgaWYoIShsY19jb2xsYXRlX2RlZmF1bHQgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgTlVMTCkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBxdWVyeSB0aGUgTENfQ09MTEFURSBjYXRhZ29yeVxuIik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIGlmKCEobGNfY29sbGF0ZV9lbnYgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgIiIpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gaW5oZXJpdCB0aGUgTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgZnJvbSB0aGUgIgogICAgICAgICAgICAgICJlbnZpcm9ubWVudC4gIFRoZSBcIkxDX0NPTExBVEVcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyAiCiAgICAgICAgICAgICAgIlwiJXNcIi5cbiIsIGdldGVudigiTENfQ09MTEFURSIpID8KICAgICAgICAgICAgICBnZXRlbnYoIkxDX0NPTExBVEUiKSA6ICI8dW5zZXQ+Iik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIFRSQUNFXyhzdHJpbmcpKCJsY19jb2xsYXRlX2RlZmF1bHQgPSAlc1xuIiwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgVFJBQ0VfKHN0cmluZykoImxjX2NvbGxhdGVfZW52ID0gJXNcbiIsIGxjX2NvbGxhdGVfZW52KTsKCiAgICAgIC8qIENvbnZlcnQgdGhlIGxpYmMgVW5pY29kZSBzdHJpbmcgdG8gYSBuYXRpdmUgbXVsdGlieXRlIGNoYXJhY3RlcgogICAgICAgKiBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IHdjc3RvbWJzKHNyY19uYXRpdmUsIHNyY3N0cl9saWJjLCBzcmNfbmF0aXZlX2xlbikgKyAxOwogICAgICBpZihyZXR1cm5lZF9sZW4gPT0gMCkKICAgICAgewogICAgICAgICAgTFBTVFIgc3Jjc3RyX2FzY2lpID0gKExQU1RSKUhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLAoJCQkJCSAgIDAsIHNyY3N0cik7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIGZhaWxlZC4gIFRoZSBzdHJpbmcgc3BlY2lmaWVkICglcykgbWF5IGNvbnRhaW5zIGFuICIKICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBzcmNzdHJfYXNjaWkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9hc2NpaSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2FzY2lpKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZWxzZSBpZihyZXR1cm5lZF9sZW4gPiBzcmNfbmF0aXZlX2xlbikKICAgICAgewogICAgICAgICAgc3JjX25hdGl2ZVtzcmNfbmF0aXZlX2xlbiAtIDFdID0gMDsKICAgICAgICAgIEVSUigid2NzdG9tYnMgcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0VfKHN0cmluZykoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwogICAgICAKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBkc3RfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZHN0X25hdGl2ZV9sZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIAogICAgICBUUkFDRV8oc3RyaW5nKSgiZHN0X25hdGl2ZSA9ICVzICBkc3RfbmF0aXZlX2xlbiA9ICVkXG4iLAogICAgICAgICAgICAgZHN0X25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgZHN0c3RyX2xpYmNfbGVuID0gZHN0X25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0c3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdHJfbGliY19sZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdHN0cl9saWJjXG4iLAogICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IHRoZSBuYXRpdmUgbXVsdGlieXRlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IG1ic3Rvd2NzKGRzdHN0cl9saWJjLCBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgLyogUmVzdG9yZSBMQ19DT0xMQVRFIG5vdyB0aGF0IHRoZSBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlCiAgICAgICAqIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4gKi8KICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7IAoKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigibWJzdG93Y3MgZmFpbGVkLiAgVGhlIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSB0cmFuc2xhdGVkIHN0cmluZyAiCiAgICAgICAgICAgICAgIiglcykgbWF5IGNvbnRhaW4gYW4gaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZihkc3RsZW4pCiAgICAgIHsKICAgICAgICAgIGlmKHJldHVybmVkX2xlbiA+IGRzdGxlbikKICAgICAgICAgIHsKICAgICAgICAgICAgICBFUlIoIm1ic3Rvd2NzIHJldHVybmVkIGEgc3RyaW5nIHRoYXQgd2FzIGxvbmdlciAoJWQgY2hhcnMpICIgCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICAgIGRzdGxlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgICAgICAvKiBDb252ZXJ0IGEgbGliYyBVbmljb2RlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nLiAqLwogICAgICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgZHN0bGVuOyBzdHJfaWR4KyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgZHN0c3RyW3N0cl9pZHhdID0gZHN0c3RyX2xpYmNbc3RyX2lkeF07CiAgICAgICAgICB9CiAgICAgICAgICBUUkFDRV8oc3RyaW5nKSgiMXN0IDQgaW50IHNpemVkIGNodW5rcyBvZiBkc3RzdHIgPSAleCAleCAleCAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMykpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwogICAgICB9CiAgICAgIFRSQUNFXyhzdHJpbmcpKCJkc3RsZW4gKHJldHVybikgPSAlZFxuIiwgZHN0bGVuKTsKICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICByZXR1cm4gZHN0bGVuOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgICByZXR1cm4gc3JjbGVuOyAgCiAgICBpZiAoZHN0bGVuPHNyY2xlbikgCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aAogKgogKiBFc3RpbWF0ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN0cmluZwogKiBjb21wdXRlZCBieSBMQ01hcFN0cmluZ0EuCiAqCiAqIFRoZSBzaXplIGlzIGFsd2F5cyBvdmVyLWVzdGltYXRlZCwgd2l0aCBhIGZpeGVkIGxpbWl0IG9uIHRoZQogKiBhbW91bnQgb2YgZXN0aW1hdGlvbiBlcnJvci4KICoKICogTm90ZSB0aGF0IGxlbiA9PSAtMSBpcyBub3QgcGVybWl0dGVkLgogKi8Kc3RhdGljIGlubGluZSBpbnQgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgoTENJRCBsY2lkLCBEV09SRCBkd01hcEZsYWdzLAoJCQkJCQlMUENTVFIgc3RyLCBEV09SRCBsZW4pCnsKICAgIC8qIEVzdGltYXRlIG9ubHkgZm9yIHNtYWxsIHN0cmluZ3MgdG8ga2VlcCB0aGUgZXN0aW1hdGlvbiBlcnJvciBmcm9tCiAgICAgKiBiZWNvbWluZyB0b28gbGFyZ2UuICovCiAgICBpZiAobGVuIDwgMTI4KSByZXR1cm4gbGVuICogOCArIDU7CiAgICBlbHNlIHJldHVybiBMQ01hcFN0cmluZ0EobGNpZCwgZHdNYXBGbGFncywgc3RyLCBsZW4sIE5VTEwsIDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nQQlbS0VSTkVMMzIuMTQzXQogKiBDb21wYXJlcyB0d28gc3RyaW5ncyB1c2luZyBsb2NhbGUKICoKICogUkVUVVJOUwogKgogKiBzdWNjZXNzOiBDU1RSX0xFU1NfVEhBTiwgQ1NUUl9FUVVBTCwgQ1NUUl9HUkVBVEVSX1RIQU4KICogZmFpbHVyZTogMAogKgogKiBOT1RFUwogKgogKiBEZWZhdWx0cyB0byBhIHdvcmQgc29ydCwgYnV0IHVzZXMgYSBzdHJpbmcgc29ydCBpZgogKiBTT1JUX1NUUklOR1NPUlQgaXMgc2V0LgogKiBDYWxscyBTZXRMYXN0RXJyb3IgZm9yIEVSUk9SX0lOVkFMSURfRkxBR1MsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLgogKiAKICogQlVHUwogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKgogKiBGSVhNRQogKiAKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nQSgKICAgIERXT1JEIGxjaWQsICAgICAvKiBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBmaXJzdCBzdHJpbmcgKi8KICAgIERXT1JEIGwxLCAgICAgICAvKiBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogc2Vjb25kIHN0cmluZyAqLwogICAgRFdPUkQgbDIpICAgICAgIC8qIGxlbmd0aCBvZiBzZWNvbmQgc3RyaW5nICovCnsKICBpbnQgbWFwc3RyaW5nX2ZsYWdzOwogIGludCBsZW4xLGxlbjI7CiAgaW50IHJlc3VsdDsKICBMUFNUUiBzazEsc2syOwogIFRSQUNFKCIlcyBhbmQgJXNcbiIsCglkZWJ1Z3N0cl9hIChzMSksIGRlYnVnc3RyX2EgKHMyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzMSwgczIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IGxzdHJsZW5BKHMxKTsKICBpZiAobDIgPT0gLTEpIGwyID0gbHN0cmxlbkEoczIpOwogIAkKICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOwogIGxlbjEgPSBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aChsY2lkLCBtYXBzdHJpbmdfZmxhZ3MsIHMxLCBsMSk7CiAgbGVuMiA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczIsIGwyKTsKCiAgaWYgKChsZW4xPT0wKXx8KGxlbjI9PTApKQogICAgcmV0dXJuIDA7ICAgICAvKiBzb21ldGhpbmcgd3JvbmcgaGFwcGVuZWQgKi8KCiAgc2sxID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4xICsgbGVuMik7CiAgc2syID0gc2sxICsgbGVuMTsKICBpZiAoICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLHNrMSxsZW4xKSkKCSB8fCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixzazIsbGVuMikpICkKICB7CiAgICBFUlIoIkJ1ZyBpbiBMQ21hcFN0cmluZ0EuXG4iKTsKICAgIHJlc3VsdCA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAvKiBzdHJjbXAgZG9lc24ndCBuZWNlc3NhcmlseSByZXR1cm4gLTEsIDAsIG9yIDEgKi8KICAgIHJlc3VsdCA9IHN0cmNtcChzazEsc2syKTsKICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMSk7CgogIGlmIChyZXN1bHQgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKHJlc3VsdCA9PSAwKQogICAgcmV0dXJuIDI7CgogIC8qIG11c3QgYmUgZ3JlYXRlciwgaWYgd2UgcmVhY2ggdGhpcyBwb2ludCAqLwogIHJldHVybiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nVwlbS0VSTkVMMzIuMTQ0XQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nVyhEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUoIklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwcnRlZFxuIik7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKCQlGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlblcoczEpOmwxOwoJbDIgPSAobDI9PS0xKT9sc3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJQ1JURExMX193Y3NuaWNtcChzMSxzMixsZW4pIDogQ1JURExMX3djc25jbXAoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRBKExDSUQgbG9jYWxlLAoJCQkgICAgRFdPUkQgZmxhZ3MsCgkJCSAgICBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENTVFIgX2Zvcm1hdCwgCS8qaW4qLwoJCQkgICAgTFBTVFIgZGF0ZSwJCS8qb3V0Ki8KCQkJICAgIElOVCBkYXRlbGVuKQp7CiAgIElOVCBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRSgiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkKICAgICAgIHsKCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSAgICAgIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0RheSk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gMykgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCSAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgIHR5cGUsIGNvdW50KTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCQkgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcC5cbiIpOwoJCSAgc3RyY3B5KGJ1ZiwgIkFEIik7CgkgICAgfSBlbHNlIHsKCQkgIHN0cmNweShidWYsICJnIik7CgkJICBXQVJOKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3MnKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndTZWNvbmQpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKCQkgIC8qIHNwcmludGYoYnVmLCAiJXMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gIkFNIiA6ICJQTSIpOyAqLwoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4oImluc3VmZmljaWVudCBidWZmZXJcbiIpOwoJCSByZXR1cm4gMDsKCSAgICB9CgoJICAgIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgaXRlbSAqLwoJICAgIGNvdW50ID0gMDsKCSAgICB0eXBlID0gJ1wwJzsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKCSAgICAgICB0aGF0IGJyZWFrcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGxhc3QgZm9ybWF0LWl0ZW0gKi8KCSAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgICAgLyogY29udGludWluZyBhIGNvZGUgZm9yIGFuIGl0ZW0gKi8KCSAgICBjb3VudCArPTE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChzdHJjaHIoImhIbXN0eU1kZyIsIGZvcm1hdFtpbnBvc10pKSB7CgkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgICAgY291bnQgPSAxOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaW5xdW90ZSA9IDE7CgkgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSB9CiAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgaWYgKG91dHBvcyA+PSBkYXRlbGVuKSB7CiAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICByZXR1cm4gMDsKICAgICAgfQogICB9CiAgIAogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICB9OwoKICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KICAgb3V0cG9zKys7CiAgIC8qIHNhbml0eSBjaGVjayAqLwogICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CiAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CiAgIAogICBUUkFDRSgiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbM107CiAgIGludCAgICAgZGF0ZXZhcnM9MCwgdGltZXZhcnM9MDsKCiAgIGFyZ2FyclswXSA9IGFyZzA7CiAgIGFyZ2FyclsxXSA9IGFyZzE7CiAgIGFyZ2FyclsyXSA9IGFyZzI7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIFRSQUNFKCJhcmdzOiAweCVseCwgMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6JXMgKGF0ICVwKSwgIgogICAJICAgICAgIiVwIHdpdGggbWF4IGxlbiAlZFxuIiwKCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGRlYnVnc3RyX3coZm9ybWF0KSwgZm9ybWF0LCBvdXRwdXQsIG91dGxlbik7CiAgIAogICBpZihvdXRsZW4gPT0gMCkgewogICAgIEZJWE1FKCJvdXRsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsKICAgaW5xdW90ZSA9IE92ZXJmbG93ID0gMDsKICAgLyogdGhpcyBpcyByZWFsbHkganVzdCBhIHNhbml0eSBjaGVjayAqLwogICBvdXRwdXRbMF0gPSBidWZbMF0gPSAwOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCSAgICAgTE9DQUxFX1NEQVlOQU1FMSArIHh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJCUxPQ0FMRV9TQUJCUkVWREFZTkFNRTEgKwoJCQkJeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbMV0gLyogIiVkIiAqLywKCQkJIHh0aW1lLT53WWVhcik7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgInl5eSIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDYsIGFyZ2Fycltjb3VudF0sCgkJCSAgICB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkgICAgICAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSB4dGltZS0+d0hvdXIpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnbScgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKICAgICAgICAgICAgbHN0cmNweVcoIG91dHB1dCArIG91dHBvcywgYnVmICk7CgkgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSB9IGVsc2UgewogICAgICAgICAgICBsc3RyY3B5blcoIG91dHB1dCArIG91dHBvcywgYnVmLCBvdXRsZW4gLSBvdXRwb3MgKTsKCSAgICBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7IC8qIEFibm9ybWFsIGV4aXQgKi8KCSB9CgoJIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0aGlzIHRpbWUgKi8KCSBjb3VudCA9IDA7CgkgdHlwZSA9ICdcMCc7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGJlZ2lubmluZywgIGJlY2F1c2UgdGhhdCAKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZSAKCSBzdHJpbmcgKi8KCSBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgYnJlYWs7ICAvKiAgTk9STUFMIEVYSVQgICovCiAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAvKiBob3cgd2Uga2VlcCB0cmFjayBvZiB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0IHNwZWMgKi8KCSBjb3VudCsrOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCAoZGF0ZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdkJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J00nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0neScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdnJykgICkgfHwKCQkgICh0aW1ldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J0gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0naCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdtJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3MnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ndCcpICkgICAgKSB7CgkgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgY291bnQgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJIGlucXVvdGUgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewoJIC8qIHVucXVvdGVkIGxpdGVyYWxzICovCgkgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CiAgICAgIH0KICAgfQoKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgV0FSTigiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIFRSQUNFKCIgcmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdEEJW0tFUk5FTDMyLjMxMF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVCBkYXRlbGVuKSAKewogICAKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwogIElOVCByZXQ7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKICAKICBpZiAoIWxvY2FsZSkgewogICAgIGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKICAgICB9OwogIAogIGlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgewogICAgIHRoaXNsb2NhbGUgPSBsb2NhbGU7CiAgIH07CgogIGlmICh4dGltZSA9PSBOVUxMKSB7CiAgICAgR2V0U3lzdGVtVGltZSgmdCk7CiAgICAgdGhpc3RpbWUgPSAmdDsKICB9IGVsc2UgewogICAgIHRoaXN0aW1lID0geHRpbWU7CiAgfTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRSgKCSAgICAgICAiR2V0RGF0ZUZvcm1hdEEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRXCVtLRVJORUwzMi4zMTFdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0QSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0VyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgICAgTFBXU1RSIGRhdGUsIElOVCBkYXRlbGVuKQp7CiAgIHVuc2lnbmVkIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUUoIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzQQkoS0VSTkVMMzIuMTk4KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzQSgKICBEQVRFRk1UX0VOVU1QUk9DQSBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsICBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsgCiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKCiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfSAgICAgICAKCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU0teXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCBkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NIHl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eSBNTSBkZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTAwOTogIC8qIChMb2MsImVuX0NBIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5LU1NLWRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2RkL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQtTU1NLXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjAwOTogIC8qIChMb2MsImVuX0pNIikgKi8gIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjgwOTogIC8qIChMb2MsImVuX0JaIikgKi8KICAgY2FzZSAweDAwMDAyYzA5OiAgLyogKExvYywiZW5fVFQiKSAqLyAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGRlZmF1bHQ6ICAvKiBkZWZhdWx0IHRvIFVTIEVuZ2xpc2ggImVuX1VTIiAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi4xOTkpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuMjEwKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzQSgKICBUSU1FRk1UX0VOVU1QUk9DQSBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOyAKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICBpZihkd0ZsYWdzKQogICAgewogICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsgCiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJILm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJILm1tJ1VociciKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfSAgICAgICAKCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgnaCdtbSIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8gCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8KICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLyAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovICAgCiAgIGNhc2UgMHgwMDAwMjgwOTogIC8qIChMb2MsImVuX0JaIikgKi8KICAgY2FzZSAweDAwMDAyYzA5OiAgLyogKExvYywiZW5fVFQiKSAqLyAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsgCiAgICByZXR1cm4gVFJVRTsgIAogICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBzdHlsZSAiZW5fVVMiICovICAgCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNXCShLRVJORUwzMi4yMTEpCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNXKAogIFRJTUVGTVRfRU5VTVBST0NXIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsJWxkLCVsZCk6IHN0dWJcbiIsIGxwVGltZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IEludmVydHMgYSBzdHJpbmcuCiAqLyAKc3RhdGljIHZvaWQgT0xFX0ludmVydFN0cmluZyhjaGFyKiBzdHJpbmcpCnsgICAgCiAgICBjaGFyICAgIHNUbXBBcnJheVsxMjhdOwogICAgSU5UICAgICBjb3VudGVyLCBpID0gMDsKCiAgICBmb3IgKGNvdW50ZXIgPSBzdHJsZW4oc3RyaW5nKTsgY291bnRlciA+IDA7IGNvdW50ZXItLSkKICAgIHsKICAgICAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgc3RyaW5nICsgY291bnRlci0xLCAxKTsKICAgICAgICBpKys7CiAgICB9CiAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgIlwwIiwgMSk7CiAgICBzdHJjcHkoc3RyaW5nLCBzVG1wQXJyYXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBUZXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgKHBzTnVtYmVyKSBpcyB2YWxpZCBvciBub3QuCiAqICAgICAgICAgICAgICAgVGhlIHZhbGlkIGNoYXJhY3RlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgLSBDaGFyYWN0ZXJzICcwJyB0aHJvdWdoICc5Jy4gCiAqICAgICAgICAgICAgICAgLSBPbmUgZGVjaW1hbCBwb2ludCAoZG90KSBpZiB0aGUgbnVtYmVyIGlzIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUuIAogKiAgICAgICAgICAgICAgIC0gQSBtaW51cyBzaWduIGluIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaWYgdGhlIG51bWJlciBpcyAKICogICAgICAgICAgICAgICAgIGEgbmVnYXRpdmUgdmFsdWUuCiAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHBzQmVmb3JlL3BzQWZ0ZXIgd2lsbCBwb2ludCB0byB0aGUgc3RyaW5nCiAqICAgICAgICAgICAgICBvbiB0aGUgcmlnaHQvbGVmdCBvZiB0aGUgZGVjaW1hbCBzeW1ib2wuIHBiTmVnYXRpdmUgaW5kaWNhdGVzIGlmIHRoZSAKICogICAgICAgICAgICAgIG51bWJlciBpcyBuZWdhdGl2ZS4KICovCnN0YXRpYyBJTlQgT0xFX0dldE51bWJlckNvbXBvbmVudHMoY2hhciogcElucHV0LCBjaGFyKiBwc0JlZm9yZSwgY2hhciogcHNBZnRlciwgQk9PTCogcGJOZWdhdGl2ZSkKewpjaGFyCXNOdW1iZXJTZXRbXSA9ICIwMTIzNDU2Nzg5IjsKQk9PTAliSW5EZWNpbWFsID0gRkFMU0U7CgoJLyogVGVzdCBpZiB3ZSBkbyBoYXZlIGEgbWludXMgc2lnbiAqLwoJaWYgKCAqcElucHV0ID09ICctJyApCgl7CgkJKnBiTmVnYXRpdmUgPSBUUlVFOwoJCXBJbnB1dCsrOyAvKiBKdW1wIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KCX0KCQoJd2hpbGUoKnBJbnB1dCAhPSAnXDAnKQoJewoJCS8qIERvIHdlIGhhdmUgYSB2YWxpZCBudW1lcmljIGNoYXJhY3RlciAqLwoJCWlmICggc3RyY2hyKHNOdW1iZXJTZXQsICpwSW5wdXQpICE9IE5VTEwgKQoJCXsKCQkJaWYgKGJJbkRlY2ltYWwgPT0gVFJVRSkKICAgICAgICAgICAgICAgICpwc0FmdGVyKysgPSAqcElucHV0OwoJCQllbHNlCiAgICAgICAgICAgICAgICAqcHNCZWZvcmUrKyA9ICpwSW5wdXQ7CgkJfQoJCWVsc2UKCQl7CgkJCS8qIElzIHRoaXMgYSBkZWNpbWFsIHBvaW50IChkb3QpICovCgkJCWlmICggKnBJbnB1dCA9PSAnLicgKQoJCQl7CgkJCQkvKiBJcyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIGl0ICovCgkJCQlpZiAoKGJJbkRlY2ltYWwgPT0gRkFMU0UpKQoJCQkJCWJJbkRlY2ltYWwgPSBUUlVFOwoJCQkJZWxzZQoJCQkJCXJldHVybiAtMTsgLyogRVJST1I6IEludmFsaWQgcGFyYW1ldGVyICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvKiBJdCdzIG5laXRoZXIgYSBudW1lcmljIGNoYXJhY3Rlciwgbm9yIGEgZGVjaW1hbCBwb2ludC4KCQkJCSAqIFRodXMsIHJldHVybiBhbiBlcnJvci4KICAgICAgICAgICAgICAgICAqLwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQogICAgICAgIHBJbnB1dCsrOwoJfQoJCgkvKiBBZGQgYW4gRW5kIG9mIExpbmUgY2hhcmFjdGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVycyAqLwoJKnBzQmVmb3JlID0gJ1wwJzsKCSpwc0FmdGVyID0gJ1wwJzsKCglyZXR1cm4gMDsgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogQSBudW1iZXIgY291bGQgYmUgZm9ybWF0dGVkIHVzaW5nIGRpZmZlcmVudCBudW1iZXJzIAogKiAgICAgICAgICAgICAgIG9mICJkaWdpdHMgaW4gZ3JvdXAiIChleGFtcGxlOiA0OzM7MjswKS4KICogICAgICAgICAgICAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgYW4gYXJyYXkKICogICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBydWxlIHRvIGJlIHVzZWQuIEl0J3MgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgfE5ER3xERzF8REcyfC4uLnwwfAogKiAgICAgICAgICAgICAgIHdoZXJlIE5ERyBpcyB0aGUgbnVtYmVyIG9mIHVzZWQgImRpZ2l0cyBpbiBncm91cCIgYW5kIERHMSwgREcyLAogKiAgICAgICAgICAgICAgIGFyZSB0aGUgY29ycmVzcG9uZGluZyAiZGlnaXRzIGluIGdyb3VwIi4KICogICAgICAgICAgICAgICBUaHVzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGluIHRoZSBhcnJheQogKiAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRHcm91cGluZyhjaGFyKiBzUnVsZSwgSU5UIGluZGV4KQp7CiAgICBjaGFyICAgIHNEYXRhWzJdLCBzUnVsZVNpemVbMl07CiAgICBJTlQgICAgIG5EYXRhLCBuUnVsZVNpemU7CgogICAgbWVtY3B5KHNSdWxlU2l6ZSwgc1J1bGUsIDEpOwogICAgbWVtY3B5KHNSdWxlU2l6ZSsxLCAiXDAiLCAxKTsKICAgIG5SdWxlU2l6ZSA9IGF0b2koc1J1bGVTaXplKTsKCiAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgblJ1bGVTaXplKQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUraW5kZXgsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOyAgICAgICAgICAgIAogICAgfQogICAgICAgIAogICAgZWxzZQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUrblJ1bGVTaXplLTEsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOyAgICAgICAgICAgIAogICAgfQogICAgCiAgICByZXR1cm4gbkRhdGE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0QQkoS0VSTkVMMzIuMzU1KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgTlVNQkVSRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKICAgIGNoYXIgICBzTnVtYmVyRGlnaXRzWzNdLCBzRGVjaW1hbFN5bWJvbFs1XSwgc0RpZ2l0c0luR3JvdXBbMTFdLCBzRGlnaXRHcm91cFN5bWJvbFs1XSwgc0lMWmVyb1syXTsKICAgIElOVCAgICBuTnVtYmVyRGlnaXRzLCBuTnVtYmVyRGVjaW1hbCwgaSwgaiwgbkNvdW50ZXIsIG5TdGVwLCBuUnVsZUluZGV4LCBuR3JvdXBpbmcsIG5EaWdpdHMsIHJldFZhbCwgbkxaOwogICAgY2hhciAgIHNOdW1iZXJbMTI4XSwgc0Rlc3RpbmF0aW9uWzEyOF0sIHNEaWdpdHNBZnRlckRlY2ltYWxbMTBdLCBzRGlnaXRzQmVmb3JlRGVjaW1hbFsxMjhdOwogICAgY2hhciAgIHNSdWxlWzEwXSwgc1NlbWlDb2x1bW5bXT0iOyIsIHNCdWZmZXJbNV0sIHNOZWdOdW1iZXJbMl07ICAgIAogICAgY2hhciAgICpwU3RyID0gTlVMTCwgKnBUbXBTdHIgPSBOVUxMOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJOZWdhdGl2ZSA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMgCiAgICB7CiAgICAgICAgVVNFX1BBUkFNRVRFUiwKICAgICAgICBVU0VfTE9DQUxFSU5GTywKICAgICAgICBVU0VfU1lTVEVNREVGQVVMVCwKICAgICAgICBSRVRVUk5fRVJST1IKICAgIH0gdXNlZF9vcGVyYXRpb247CgogICAgc3RybmNweShzTnVtYmVyLCBscHZhbHVlLCAxMjgpOwogICAgc051bWJlclsxMjddID0gJ1wwJzsKCiAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGlucHV0IHN0cmluZywgZ2V0IHRoZSBudW1iZXIKICAgICAqIG9mIGRpZ2l0cyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNpbWFsIHN5bWJvbCwgYW5kIGNoZWNrCiAgICAgKiBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLgogICAgICovCiAgICBpZiAoIE9MRV9HZXROdW1iZXJDb21wb25lbnRzKHNOdW1iZXIsIHNEaWdpdHNCZWZvcmVEZWNpbWFsLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsLCAmYk5lZ2F0aXZlKSAhPSAtMSkKICAgIHsKICAgICAgICBuTnVtYmVyRGVjaW1hbCA9IHN0cmxlbihzRGlnaXRzQmVmb3JlRGVjaW1hbCk7CiAgICAgICAgbkRpZ2l0cyA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIFdoaWNoIHNvdXJjZSB3aWxsIHdlIHVzZSB0byBmb3JtYXQgdGhlIHN0cmluZyAqLwogICAgdXNlZF9vcGVyYXRpb24gPSBSRVRVUk5fRVJST1I7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyA9PSAwKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9QQVJBTUVURVI7IAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChkd2ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9MT0NBTEVJTkZPOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgIH0KCiAgICAvKiBMb2FkIHRoZSBmaWVsZHMgd2UgbmVlZCAqLwogICAgc3dpdGNoKHVzZWRfb3BlcmF0aW9uKQogICAgewogICAgY2FzZSBVU0VfTE9DQUxFSU5GTzoKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgc3ByaW50ZihzTnVtYmVyRGlnaXRzLCAiJWQiLGxwRm9ybWF0LT5OdW1EaWdpdHMpOwogICAgICAgIHN0cmNweShzRGVjaW1hbFN5bWJvbCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCk7CiAgICAgICAgc3ByaW50ZihzRGlnaXRzSW5Hcm91cCwgIiVkOzAiLGxwRm9ybWF0LT5Hcm91cGluZyk7CiAgICAgICAgc3RyY3B5KHNEaWdpdEdyb3VwU3ltYm9sLCBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCk7CiAgICAgICAgc3ByaW50ZihzSUxaZXJvLCAiJWQiLGxwRm9ybWF0LT5MZWFkaW5nWmVybyk7CiAgICAgICAgc3ByaW50ZihzTmVnTnVtYmVyLCAiJWQiLGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBuTnVtYmVyRGlnaXRzID0gYXRvaShzTnVtYmVyRGlnaXRzKTsKICAgIAogICAgLyogUmVtb3ZlIHRoZSAiOyIgKi8KICAgIGk9MDsKICAgIGogPSAxOwogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxzdHJsZW4oc0RpZ2l0c0luR3JvdXApOyBuQ291bnRlcisrKQogICAgewogICAgICAgIGlmICggbWVtY21wKHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIHNTZW1pQ29sdW1uLCAxKSAhPSAwICkKICAgICAgICB7CiAgICAgICAgICAgIG1lbWNweShzUnVsZSArIGosIHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHNCdWZmZXIsICIlZCIsIGkpOwogICAgbWVtY3B5KHNSdWxlLCBzQnVmZmVyLCAxKTsgLyogTnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZ3JvdXBzICggdXNlZCBieSBPTEVfR2V0R3JvdXBpbmcoKSApICovCiAgICBtZW1jcHkoc1J1bGUgKyBqLCAiXDAiLCAxKTsKICAgIAogICAgLyogRmlyc3QsIGZvcm1hdCB0aGUgZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbC4gKi8KICAgIGlmICgobk51bWJlckRlY2ltYWw+MCkgJiYgKGF0b2koc0RpZ2l0c0JlZm9yZURlY2ltYWwpICE9IDApKSAKICAgIHsKICAgICAgICAvKiBXb3JraW5nIG9uIGFuIGludmVydGVkIHN0cmluZyBpcyBlYXNpZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwoKICAgICAgICBuU3RlcCA9IG5Db3VudGVyID0gaSA9IGogPSAwOwogICAgICAgIG5SdWxlSW5kZXggPSAxOwogICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgCiAgICAgICAgLyogSGVyZSwgd2Ugd2lsbCBsb29wIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgICAgICAgKiBBbiBpbnRlcm5hbCBjb3VudGVyIChqKSBpcyB1c2VkIGluIG9yZGVyIHRvIGtub3cgd2hlbiB0byAKICAgICAgICAgKiBpbnNlcnQgdGhlICJkaWdpdCBncm91cCBzeW1ib2wiLgogICAgICAgICAqLwogICAgICAgIHdoaWxlIChuTnVtYmVyRGVjaW1hbCA+IDApCiAgICAgICAgewogICAgICAgICAgICBpID0gbkNvdW50ZXIgKyBuU3RlcDsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGksIHNEaWdpdHNCZWZvcmVEZWNpbWFsICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBuQ291bnRlcisrOwogICAgICAgICAgICBqKys7CiAgICAgICAgICAgIGlmIChqID49IG5Hcm91cGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoblJ1bGVJbmRleCA8IHNSdWxlWzBdKQogICAgICAgICAgICAgICAgICAgIG5SdWxlSW5kZXgrKzsKICAgICAgICAgICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCBzRGlnaXRHcm91cFN5bWJvbCwgc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgICAgICAgICBuU3RlcCs9IHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5OdW1iZXJEZWNpbWFsLS07CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCAiXDAiLCAxKTsKICAgICAgICAvKiBHZXQgdGhlIHN0cmluZyBpbiB0aGUgcmlnaHQgb3JkZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0Rlc3RpbmF0aW9uKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICBuTFogPSBhdG9pKHNJTFplcm8pOwogICAgICAgIGlmIChuTFogIT0gMCkKICAgICAgICB7ICAgICAgICAKICAgICAgICAgICAgLyogVXNlIDAueHh4IGluc3RlYWQgb2YgLnh4eCAqLwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiMCIsIDEpOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uKzEsICJcMCIsIDEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICJcMCIsIDEpOwoKICAgICB9CgogICAgLyogU2Vjb25kLCBmb3JtYXQgdGhlIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gKi8KICAgIGogPSAwOwogICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzOwogICAgaWYgKCAobkRpZ2l0cz4wKSAmJiAocFN0ciA9IHN0cnN0ciAoc051bWJlciwgIi4iKSkgKQogICAgewogICAgICAgIGkgPSBzdHJsZW4oc051bWJlcikgLSBzdHJsZW4ocFN0cikgKyAxOyAgICAgICAgCiAgICAgICAgc3RybmNweSAoIHNEaWdpdHNBZnRlckRlY2ltYWwsIHNOdW1iZXIgKyBpLCBuTnVtYmVyRGlnaXRzKTsKICAgICAgICBqID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgICAgIGlmIChqIDwgbk51bWJlckRpZ2l0cykKICAgICAgICAgICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzLWo7ICAgICAgICAgICAgCiAgICB9CiAgICBmb3IgKGk9MDtpPG5Db3VudGVyO2krKykKICAgICAgICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwraStqLCAiMCIsIDEpOyAgICAKICAgIG1lbWNweShzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgbk51bWJlckRpZ2l0cywgIlwwIiwgMSk7ICAgIAoKICAgIGkgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKTsKICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAvKiBGaW5hbGx5LCBjb25zdHJ1Y3QgdGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgc3RyaW5nLiAqLwogICAgICAgIAogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxpOyBuQ291bnRlcisrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIsIHNEZXN0aW5hdGlvbiArIG5Db3VudGVyLCAxKTsKICAgICAgIAogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0RlY2ltYWxTeW1ib2wsIHN0cmxlbihzRGVjaW1hbFN5bWJvbCkpOwoKICAgIGZvciAoaT0wOyBpPGo7IGkrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgc0RpZ2l0c0FmdGVyRGVjaW1hbCArIGksIDEpOwogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpK3N0cmxlbihzRGVjaW1hbFN5bWJvbCksICJcMCIsIDEpOwogICAgICAgIAogICAgLyogSXMgaXQgYSBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIGlmIChiTmVnYXRpdmUgPT0gVFJVRSkKICAgIHsKICAgICAgICBpID0gYXRvaShzTmVnTnVtYmVyKTsKICAgICAgICBwU3RyID0gc0Rlc3RpbmF0aW9uOwogICAgICAgIHBUbXBTdHIgPSBzTnVtYmVyOwogICAgICAgIHN3aXRjaCAoaSkKICAgICAgICB7ICAgICAgICAgIAogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgKnBTdHIrKyA9ICcoJzsKICAgICAgICAgICAgd2hpbGUgKCpzTnVtYmVyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnKSc7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICBicmVhazsgIAogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KHNEZXN0aW5hdGlvbiwgc051bWJlcik7CgogICAgLyogSWYgY2NoTnVtYmVyIGlzIHplcm8sIHRoZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMgCiAgICAgKiByZXF1aXJlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIHN0cmluZwogICAgICovCiAgICBpZiAoY2NoTnVtYmVyPT0wKQogICAgICAgIHJldFZhbCA9IHN0cmxlbihzRGVzdGluYXRpb24pICsgMTsKICAgIGVsc2UgICAgICAgICAgIAogICAgewogICAgICAgIHN0cm5jcHkgKGxwTnVtYmVyU3RyLCBzRGVzdGluYXRpb24sIGNjaE51bWJlci0xKTsKICAgICAgICAqKGxwTnVtYmVyU3RyK2NjaE51bWJlci0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldFZhbCA9IHN0cmxlbihscE51bWJlclN0cik7CiAgICB9CiAgICAgICAgICAKICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0VwkoS0VSTkVMMzIueHh4KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBsc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRBCShLRVJORUwzMi4zMDIpCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBVSU5UICAgblBvc09yZGVyLCBuTmVnT3JkZXI7CiAgICBJTlQgICAgcmV0VmFsOwogICAgY2hhciAgIHNEZXN0aW5hdGlvblsxMjhdLCBzTmVnT3JkZXJbOF0sIHNQb3NPcmRlcls4XSwgc0N1cnJlbmN5U3ltYm9sWzhdOwogICAgY2hhciAgICpwRGVzdGluYXRpb24gPSBzRGVzdGluYXRpb247CiAgICBjaGFyICAgc051bWJlckZvcm1hdGVkWzEyOF07CiAgICBjaGFyICAgKnBOdW1iZXJGb3JtYXRlZCA9IHNOdW1iZXJGb3JtYXRlZDsKICAgIExDSUQgICBzeXN0ZW1EZWZhdWx0TENJRDsKICAgIEJPT0wgICBiSXNQb3NpdGl2ZSA9IEZBTFNFLCBiVmFsaWRGb3JtYXQgPSBGQUxTRTsKICAgIGVudW0gICBPcGVyYXRpb25zIAogICAgewogICAgICAgIFVTRV9QQVJBTUVURVIsCiAgICAgICAgVVNFX0xPQ0FMRUlORk8sCiAgICAgICAgVVNFX1NZU1RFTURFRkFVTFQsCiAgICAgICAgUkVUVVJOX0VSUk9SCiAgICB9IHVzZWRfb3BlcmF0aW9uOwoKICAgIE5VTUJFUkZNVEEgIG51bWJlckZtdDsKCiAgICAvKiBXaGljaCBzb3VyY2Ugd2lsbCB3ZSB1c2UgdG8gZm9ybWF0IHRoZSBzdHJpbmcgKi8KICAgIHVzZWRfb3BlcmF0aW9uID0gUkVUVVJOX0VSUk9SOwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgPT0gMCkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfUEFSQU1FVEVSOyAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfTE9DQUxFSU5GTzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1NZU1RFTURFRkFVTFQ7CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEqLwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NDVVJSRU5DWSwgc0N1cnJlbmN5U3ltYm9sLCBzaXplb2Yoc0N1cnJlbmN5U3ltYm9sKSk7CiAgICAgICAgCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjogICAgICAgIAogICAgICAgIC8qIFNwZWNpZmljIHRvIENVUlJFTkNZRk1UQSovCiAgICAgICAgbk5lZ09yZGVyID0gbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXI7CiAgICAgICAgblBvc09yZGVyID0gbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXI7CiAgICAgICAgc3RyY3B5KHNDdXJyZW5jeVN5bWJvbCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEqLwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUNVUlJFTkNZLCBzUG9zT3JkZXIsIHNpemVvZihzUG9zT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NDVVJSRU5DWSwgc0N1cnJlbmN5U3ltYm9sLCBzaXplb2Yoc0N1cnJlbmN5U3ltYm9sKSk7CiAgICAgICAgCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIAogICAgLyogQ29uc3RydWN0IGEgdGVtcG9yYXJ5IG51bWJlciBmb3JtYXQgc3RydWN0dXJlICovCiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBudW1iZXJGbXQuTnVtRGlnaXRzICAgICA9IGxwRm9ybWF0LT5OdW1EaWdpdHM7CiAgICAgICAgbnVtYmVyRm10LkxlYWRpbmdaZXJvICAgPSBscEZvcm1hdC0+TGVhZGluZ1plcm87CiAgICAgICAgbnVtYmVyRm10Lkdyb3VwaW5nICAgICAgPSBscEZvcm1hdC0+R3JvdXBpbmc7CiAgICAgICAgbnVtYmVyRm10Lk5lZ2F0aXZlT3JkZXIgPSAwOwogICAgICAgIG51bWJlckZtdC5scERlY2ltYWxTZXAgPSBscEZvcm1hdC0+bHBEZWNpbWFsU2VwOwogICAgICAgIG51bWJlckZtdC5scFRob3VzYW5kU2VwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXA7CiAgICAgICAgYlZhbGlkRm9ybWF0ID0gVFJVRTsKICAgIH0KCiAgICAvKiBNYWtlIGEgY2FsbCB0byBHZXROdW1iZXJGb3JtYXRBKCkgKi8KICAgIGlmICgqbHB2YWx1ZSA9PSAnLScpCiAgICB7CiAgICAgICAgYklzUG9zaXRpdmUgPSBGQUxTRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUrMSwoYlZhbGlkRm9ybWF0KT8mbnVtYmVyRm10Ok5VTEwscE51bWJlckZvcm1hdGVkLDEyOCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYklzUG9zaXRpdmUgPSBUUlVFOwogICAgICAgIHJldFZhbCA9IEdldE51bWJlckZvcm1hdEEobG9jYWxlLDAsbHB2YWx1ZSwoYlZhbGlkRm9ybWF0KT8mbnVtYmVyRm10Ok5VTEwscE51bWJlckZvcm1hdGVkLDEyOCk7CiAgICB9CiAgICAgICAgCiAgICBpZiAocmV0VmFsID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyogY29uc3RydWN0IHRoZSBmb3JtYXR0ZWQgc3RyaW5nICovCiAgICBpZiAoYklzUG9zaXRpdmUpCiAgICB7CiAgICAgICAgc3dpdGNoIChuUG9zT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBQcmVmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogU3VmZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIFByZWZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIFN1ZmZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAgLyogbmVnYXRpdmUgbnVtYmVyICovCiAgICB7CiAgICAgICAgc3dpdGNoIChuTmVnT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBmb3JtYXQ6ICgkMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIGZvcm1hdDogLSQxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIGZvcm1hdDogJC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIGZvcm1hdDogJDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OiAgIC8qIGZvcm1hdDogKDEuMSQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6ICAgLyogZm9ybWF0OiAtMS4xJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6ICAgLyogZm9ybWF0OiAxLjEtJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDc6ICAgLyogZm9ybWF0OiAxLjEkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6ICAgLyogZm9ybWF0OiAtMS4xICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTogICAvKiBmb3JtYXQ6IC0kIDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDogICAvKiBmb3JtYXQ6IDEuMSAkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMTogICAvKiBmb3JtYXQ6ICQgMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMjogICAvKiBmb3JtYXQ6ICQgLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMzogICAvKiBmb3JtYXQ6IDEuMS0gJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDogICAvKiBmb3JtYXQ6ICgkIDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7IAogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNTogICAvKiBmb3JtYXQ6ICgxLjEgJCkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7IAogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChjY2hDdXJyZW5jeSA9PSAwKQogICAgICAgIHJldHVybiBzdHJsZW4ocERlc3RpbmF0aW9uKSArIDE7CgogICAgZWxzZQogICAgewogICAgICAgIHN0cm5jcHkgKGxwQ3VycmVuY3lTdHIsIHBEZXN0aW5hdGlvbiwgY2NoQ3VycmVuY3ktMSk7CiAgICAgICAgKihscEN1cnJlbmN5U3RyK2NjaEN1cnJlbmN5LTEpID0gJ1wwJzsgICAvKiBlbnN1cmUgd2UgZ290IGEgTlVMTCBhdCB0aGUgZW5kICovCiAgICAgICAgcmV0dXJuICBzdHJsZW4obHBDdXJyZW5jeVN0cik7CiAgICB9ICAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0VwkoS0VSTkVMMzIuMzAzKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBGSVhNRSgiVGhpcyBBUEkgZnVuY3Rpb24gaXMgTk9UIGltcGxlbWVudGVkICFcbiIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRTJOTFNfQ2hlY2tMb2NhbGUJW2ludGVybl0KICovIApzdGF0aWMgTENJRCBPTEUyTkxTX0NoZWNrTG9jYWxlIChMQ0lEIGxvY2FsZSkKewoJaWYgKCFsb2NhbGUpIAoJeyBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7Cgl9CiAgCglpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgCiAgCXsgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIAoJeyByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CgllbHNlCgl7IHJldHVybiBsb2NhbGU7Cgl9Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdEEJW0tFUk5FTDMyLjQyMl0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0QShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBpbiAgKi8KCQkgTFBTVFIgdGltZXN0ciwgICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKeyBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlPTA7CiAgRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwogIElOVCByZXQ7CiAgICAKICBUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuKTsKCiAgdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCiAgaWYgKCBmbGFncyAmIChUSU1FX05PVElNRU1BUktFUiB8IFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgKSkKICB7IEZJWE1FKCJUSU1FX05PVElNRU1BUktFUiBvciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAgfQogIAogIGZsYWdzICY9IChUSU1FX05PU0VDT05EUyB8IFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKTsgLyogbWFzayBmb3IgT0xFX0dldEZvcm1hdEEqLwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIAogIHsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwogICAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgIH0KICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0KICBlbHNlIAogIHsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9CiAgCiAgaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUqLwogIHsgR2V0TG9jYWxUaW1lKCZ0KTsKICAgIHRoaXN0aW1lID0gJnQ7CiAgfSAKICBlbHNlCiAgeyB0aGlzdGltZSA9IHh0aW1lOwogIH0KICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwKICAJCQkgdGltZXN0ciwgdGltZWxlbik7CiAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRXCVtLRVJORUwzMi40MjNdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICovCklOVCBXSU5BUEkgCkdldFRpbWVGb3JtYXRXKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENXU1RSIGZvcm1hdCwgICAgIC8qIGluICAqLwoJCSBMUFdTVFIgdGltZXN0ciwgICAgIC8qIG91dCAqLwoJCSBJTlQgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJTFBTWVNURU1USU1FIHRoaXN0aW1lOwoJTENJRCB0aGlzbG9jYWxlPTA7CglEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovCglJTlQgcmV0OwoJICAgIAoJVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCWlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCgl7IEZJWE1FKCJUSU1FX05PVElNRU1BUktFUiBvciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIG5vdCBpbXBsZW1lbnRlZFxuIik7Cgl9CiAgCglmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCglpZiAoZm9ybWF0ID09IE5VTEwpIAoJeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQkgIAoJZWxzZSAKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KIAoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUqLwoJeyBHZXRTeXN0ZW1UaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0gCgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLjE5Nl0KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9BKAoJQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlCikgewoJRklYTUUoIiglcCwweCUwNGx4LDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIsY2FsaW5mb3Byb2MsbG9jYWxlLGNhbGVuZGFyLGNhbHR5cGUpOwoJcmV0dXJuIEZBTFNFOwp9Cg==