LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgIm9wdGlvbnMuaCIKI2luY2x1ZGUgIndpbnZlci5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJjcnRkbGwuaCIKI2luY2x1ZGUgIm1haW4uaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwpERUNMQVJFX0RFQlVHX0NIQU5ORUwoc3RyaW5nKTsKREVDTEFSRV9ERUJVR19DSEFOTkVMKHdpbjMyKTsKCnN0cnVjdCBOTFNfbGFuZ2xvY2FsZSB7Cgljb25zdCBpbnQgbGFuZzsKCXN0cnVjdCBOTFNfbG9jYWxldmFyIHsKCQljb25zdCBpbnQJdHlwZTsKCQljb25zdCBjaGFyCSp2YWw7Cgl9IGxvY3ZhcnNbMTUwXTsKfTsKCnN0YXRpYyBMUFZPSUQgbHBOTFNJbmZvID0gTlVMTDsKCiNkZWZpbmUgTEFOR19CRUdJTihsLHMpCXsJTUFLRUxBTkdJRChsLHMpLCB7CgojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKQkJCQkJe3R5cGUsdmFsdWV9LAoKI2RlZmluZSBMQU5HX0VORAkJCQkJIH19LAoKc3RhdGljIGNvbnN0IHN0cnVjdCBOTFNfbGFuZ2xvY2FsZSBsYW5nbG9jYWxlc1tdID0gewovKiBhZGQgbGFuZ3VhZ2VzIGluIG51bWVyaWNhbCBvcmRlciBvZiBtYWluIGxhbmd1YWdlIChsYXN0IHR3byBkaWdpdHMpCiAqIGl0IGlzIG11Y2ggZWFzaWVyIHRvIGZpbmQgdGhlIG1pc3NpbmcgaG9sZXMgdGhhdCB3YXkgKi8KCkxBTkdfQkVHSU4gKExBTkdfQ0FUQUxBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwMyovCiNpbmNsdWRlICJubHMvY2F0Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfQ1pFQ0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MDUqLwojaW5jbHVkZSAibmxzL2N6ZS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RBTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNiovCiNpbmNsdWRlICJubHMvZGFuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTikJCS8qMHgwNDA3Ki8KI2luY2x1ZGUgIm5scy9kZXUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fU1dJU1MpCQkvKjB4MDgwNyovCiNpbmNsdWRlICJubHMvZGVzLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOKQkvKjB4MEMwNyovCiNpbmNsdWRlICJubHMvZGVhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcpCS8qMHgxMDA3Ki8KI2luY2x1ZGUgIm5scy9kZWwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTikJLyoweDE0MDcqLwojaW5jbHVkZSAibmxzL2RlYy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUykJCS8qMHgwNDA5Ki8KI2luY2x1ZGUgIm5scy9lbnUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VSykJCS8qMHgwODA5Ki8KI2luY2x1ZGUgIm5scy9lbmcubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9BVVMpCQkvKjB4MEMwOSovCiNpbmNsdWRlICJubHMvZW5hLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQ0FOKQkJLyoweDEwMDkqLwojaW5jbHVkZSAibmxzL2VuYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX05aKQkJLyoweDE0MDkqLwojaW5jbHVkZSAibmxzL2Vuei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0VJUkUpCQkvKjB4MTgwOSovCiNpbmNsdWRlICJubHMvaXJsLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfU0FGUklDQSkJLyoweDFDMDkqLwojaW5jbHVkZSAibmxzL2Vucy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EpCS8qMHgyMDA5Ki8KI2luY2x1ZGUgIm5scy9lbmoubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQVJSSUJFQU4pCS8qMHgyNDA5Ki8KI2luY2x1ZGUgIm5scy9lbmIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUpCS8qMHgyODA5Ki8KI2luY2x1ZGUgIm5scy9lbmwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCkgICAgCS8qMHgyQzA5Ki8KI2luY2x1ZGUgIm5scy9lbnQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0gpCQkvKjB4MDQwYSovCiNpbmNsdWRlICJubHMvZXNwLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTikJLyoweDA4MGEqLwojaW5jbHVkZSAibmxzL2VzbS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX01PREVSTikJLyoweDBDMGEqLwojaW5jbHVkZSAibmxzL2Vzbi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSkJLyoweDEwMGEqLwojaW5jbHVkZSAibmxzL2VzZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPU1RBUklDQSkJLyoweDE0MGEqLwojaW5jbHVkZSAibmxzL2VzYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BBTkFNQSkJLyoweDE4MGEqLwojaW5jbHVkZSAibmxzL2VzYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTikJLyoweDFDMEEqLwojaW5jbHVkZSAibmxzL2VzZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSkJLyoweDIwMGEqLwojaW5jbHVkZSAibmxzL2Vzdi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBKQkvKjB4MjQwYSovCiNpbmNsdWRlICJubHMvZXNvLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEVSVSkJCS8qMHgyODBhKi8KI2luY2x1ZGUgIm5scy9lc3IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEpCS8qMHgyYzBhKi8KI2luY2x1ZGUgIm5scy9lc3MubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SKQkvKjB4MzAwYSovCiNpbmNsdWRlICJubHMvZXNmLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUpCS8qMHgzNDBhKi8KI2luY2x1ZGUgIm5scy9lc2wubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZKQkvKjB4MzgwYSovCiNpbmNsdWRlICJubHMvZXN5Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkpCS8qMHgzYzBhKi8KI2luY2x1ZGUgIm5scy9lc3oubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBKQkvKjB4NDAwYSovCiNpbmNsdWRlICJubHMvZXNiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IpCS8qMHg0NDBhKi8KI2luY2x1ZGUgIm5scy9lc2UubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUykJLyoweDQ4MGEqLwojaW5jbHVkZSAibmxzL2VzaC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSkJLyoweDRjMGEqLwojaW5jbHVkZSAibmxzL2VzaS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPKQkvKjB4NTAwYSovCiNpbmNsdWRlICJubHMvZXN1Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRklOTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwQiovCiNpbmNsdWRlICJubHMvZmluLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSCkJCS8qMHgwNDBDKi8KI2luY2x1ZGUgIm5scy9mcmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfQkVMR0lBTikJLyoweDA4MEMqLwojaW5jbHVkZSAibmxzL2ZyYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTikJLyoweDBDMEMqLwojaW5jbHVkZSAibmxzL2ZyYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9TV0lTUykJCS8qMHgxMDBDKi8KI2luY2x1ZGUgIm5scy9mcnMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRykJLyoweDE0MEMqLwojaW5jbHVkZSAibmxzL2ZybC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwZSovCiNpbmNsdWRlICJubHMvaHVuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOKQkJLyoweDA0MTAqLwojaW5jbHVkZSAibmxzL2l0YS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOX1NXSVNTKQkvKjB4MDgxMCovCiNpbmNsdWRlICJubHMvaXRzLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSkFQQU5FU0UsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTEqLwojaW5jbHVkZSAibmxzL2pwbi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0tPUkVBTiwgU1VCTEFOR19LT1JFQU4pCS8qMHgwNDEyKi8KI2luY2x1ZGUgIm5scy9rb3IubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19EVVRDSCwgU1VCTEFOR19EVVRDSCkJCS8qMHgwNDEzKi8KI2luY2x1ZGUgIm5scy9ubGQubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIX0JFTEdJQU4pCS8qMHgwODEzKi8KI2luY2x1ZGUgIm5scy9ubGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIX1NVUklOQU0pCS8qMHgwQzEzKi8KI2luY2x1ZGUgIm5scy9ubHMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTCkJLyoweDA0MTQqLwojaW5jbHVkZSAibmxzL25vci5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9OWU5PUlNLKQkvKjB4MDgxNCovCiNpbmNsdWRlICJubHMvbm9uLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDE1Ki8KI2luY2x1ZGUgIm5scy9wbGsubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT1JUVUdVRVNFICxTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOKQkvKjB4MDQxNiovCiNpbmNsdWRlICJubHMvcHRiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19QT1JUVUdVRVNFICxTVUJMQU5HX1BPUlRVR1VFU0UpCQkvKjB4MDgxNiovCiNpbmNsdWRlICJubHMvcHRnLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfUlVTU0lBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4NDE5Ki8KI2luY2x1ZGUgIm5scy9ydXMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TTE9WQUssIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MWIqLwojaW5jbHVkZSAibmxzL3NreS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NXRURJU0gsIFNVQkxBTkdfU1dFRElTSCkJCS8qMHgwNDFkKi8KI2luY2x1ZGUgIm5scy9zdmUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NXRURJU0gsIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5EKQkvKjB4MDgxZCovCiNpbmNsdWRlICJubHMvc3ZmLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfVEhBSSwgU1VCTEFOR19ERUZBVUxUKQkvKjB4NDFlKi8KI2luY2x1ZGUgIm5scy90aGEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19ERUZBVUxUKSAvKiAweDA0M2MgKi8KI2luY2x1ZGUgIm5scy9nYWUubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HQUVMSUMsIFNVQkxBTkdfR0FFTElDX1NDT1RUSVNIKQojaW5jbHVkZSAibmxzL2dkaC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19HQUVMSUNfTUFOWCkKI2luY2x1ZGUgIm5scy9nZHYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19FU1BFUkFOVE8sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OGYqLwojaW5jbHVkZSAibmxzL2VzcGVyYW50by5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1dBTE9OLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDkwKi8KI2luY2x1ZGUgIm5scy93YWwubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DT1JOSVNILCBTVUJMQU5HX0RFRkFVTFQpIC8qIDB4MDQ5MSAgKi8KI2luY2x1ZGUgIm5scy9jb3IubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19XRUxTSCwgU1VCTEFOR19ERUZBVUxUKSAvKiAweDA0OTIgKi8KI2luY2x1ZGUgIm5scy9jeW0ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19CUkVUT04sIFNVQkxBTkdfREVGQVVMVCkgLyogMHgweDkzICAqLwojaW5jbHVkZSAibmxzL2JyZi5ubHMiCkxBTkdfRU5ECgoJICAgIH07CgoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbGVJbmZvQSAKICogTVVTVCBjb250YWluIGFsbCAjZGVmaW5lcyBmcm9tIHdpbm5scy5oCiAqIGxhc3QgZW50cnkgaGFzIE5VTEwgbmFtZSwgMCBpZC4KICovIAojZGVmaW5lIExPQ0FMRV9FTlRSWSh4KQl7I3gsTE9DQUxFXyMjeH0Kc3RhdGljIHN0cnVjdCB0YWdMT0NBTEVfTkFNRTJJRCB7CgljaGFyCSpuYW1lOwoJRFdPUkQJaWQ7Cn0gbG9jYWxlX25hbWUyaWRbXT0gewoJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTRU5HTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShJQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNFTkdDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVEFOU0lDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRNQUNDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoU0xJU1QpLAoJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKCUxPQ0FMRV9FTlRSWShTREVDSU1BTCksCglMT0NBTEVfRU5UUlkoU1RIT1VTQU5EKSwKCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElMWkVSTyksCglMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCglMT0NBTEVfRU5UUlkoU05BVElWRURJR0lUUyksCglMT0NBTEVfRU5UUlkoU0NVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCglMT0NBTEVfRU5UUlkoU01PTkRFQ0lNQUxTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05USE9VU0FORFNFUCksCglMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUlOVExDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKElORUdDVVJSKSwKCUxPQ0FMRV9FTlRSWShTREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUUpLAoJTE9DQUxFX0VOVFJZKFNTSE9SVERBVEUpLAoJTE9DQUxFX0VOVFJZKFNMT05HREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAoJTE9DQUxFX0VOVFJZKElEQVRFKSwKCUxPQ0FMRV9FTlRSWShJTERBVEUpLAoJTE9DQUxFX0VOVFJZKElUSU1FKSwKCUxPQ0FMRV9FTlRSWShJVElNRU1BUktQT1NOKSwKCUxPQ0FMRV9FTlRSWShJQ0VOVFVSWSksCglMT0NBTEVfRU5UUlkoSVRMWkVSTyksCglMT0NBTEVfRU5UUlkoSURBWUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTU9OTFpFUk8pLAoJTE9DQUxFX0VOVFJZKFMxMTU5KSwKCUxPQ0FMRV9FTlRSWShTMjM1OSksCglMT0NBTEVfRU5UUlkoSUNBTEVOREFSVFlQRSksCglMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAoJTE9DQUxFX0VOVFJZKElGSVJTVERBWU9GV0VFSyksCglMT0NBTEVfRU5UUlkoSUZJUlNUV0VFS09GWUVBUiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTUE9TSVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShTTkVHQVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElORUdTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSVBPU1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoSU5FR1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksCglMT0NBTEVfRU5UUlkoU0lTTzYzOUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTSVNPMzE2NkNUUllOQU1FKSwKCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaWMgKFNhdWRpIEFyYWJpYSkifSwKCXsweDA4MDEsIkFyYWJpYyAoSXJhcSkifSwKCXsweDBjMDEsIkFyYWJpYyAoRWd5cHQpIn0sCgl7MHgxMDAxLCJBcmFiaWMgKExpYnlhKSJ9LAoJezB4MTQwMSwiQXJhYmljIChBbGdlcmlhKSJ9LAoJezB4MTgwMSwiQXJhYmljIChNb3JvY2NvKSJ9LAoJezB4MWMwMSwiQXJhYmljIChUdW5pc2lhKSJ9LAoJezB4MjAwMSwiQXJhYmljIChPbWFuKSJ9LAoJezB4MjQwMSwiQXJhYmljIChZZW1lbikifSwKCXsweDI4MDEsIkFyYWJpYyAoU3lyaWEpIn0sCgl7MHgyYzAxLCJBcmFiaWMgKEpvcmRhbikifSwKCXsweDMwMDEsIkFyYWJpYyAoTGViYW5vbikifSwKCXsweDM0MDEsIkFyYWJpYyAoS3V3YWl0KSJ9LAoJezB4MzgwMSwiQXJhYmljIChVbml0ZWQgQXJhYiBFbWlyYXRlcykifSwKCXsweDNjMDEsIkFyYWJpYyAoQmFocmFpbikifSwKCXsweDQwMDEsIkFyYWJpYyAoUWF0YXIpIn0sCgl7MHgwNDAyLCJCdWxnYXJpYW4ifSwKCXsweDA0MDMsIkNhdGFsYW4ifSwKCXsweDA0MDQsIkNoaW5lc2UgKFRhaXdhbikifSwKCXsweDA4MDQsIkNoaW5lc2UgKFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hKSJ9LAoJezB4MGMwNCwiQ2hpbmVzZSAoSG9uZyBLb25nKSJ9LAoJezB4MTAwNCwiQ2hpbmVzZSAoU2luZ2Fwb3JlKSJ9LAoJezB4MTQwNCwiQ2hpbmVzZSAoTWFjYXUpIn0sCgl7MHgwNDA1LCJDemVjaCJ9LAoJezB4MDQwNiwiRGFuaXNoIn0sCgl7MHgwNDA3LCJHZXJtYW4gKEdlcm1hbnkpIn0sCgl7MHgwODA3LCJHZXJtYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MGMwNywiR2VybWFuIChBdXN0cmlhKSJ9LAoJezB4MTAwNywiR2VybWFuIChMdXhlbWJvdXJnKSJ9LAoJezB4MTQwNywiR2VybWFuIChMaWVjaHRlbnN0ZWluKSJ9LAoJezB4MDQwOCwiR3JlZWsifSwKCXsweDA0MDksIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIn0sCgl7MHgwODA5LCJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkifSwKCXsweDBjMDksIkVuZ2xpc2ggKEF1c3RyYWxpYSkifSwKCXsweDEwMDksIkVuZ2xpc2ggKENhbmFkYSkifSwKCXsweDE0MDksIkVuZ2xpc2ggKE5ldyBaZWFsYW5kKSJ9LAoJezB4MTgwOSwiRW5nbGlzaCAoSXJlbGFuZCkifSwKCXsweDFjMDksIkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkifSwKCXsweDIwMDksIkVuZ2xpc2ggKEphbWFpY2EpIn0sCgl7MHgyNDA5LCJFbmdsaXNoIChDYXJpYmJlYW4pIn0sCgl7MHgyODA5LCJFbmdsaXNoIChCZWxpemUpIn0sCgl7MHgyYzA5LCJFbmdsaXNoIChUcmluaWRhZCkifSwKCXsweDMwMDksIkVuZ2xpc2ggKFppbWJhYndlKSJ9LAoJezB4MzQwOSwiRW5nbGlzaCAoUGhpbGlwcGluZXMpIn0sCgl7MHgwNDBhLCJTcGFuaXNoIChTcGFpbiwgdHJhZGl0aW9uYWwgc29ydGluZykifSwKCXsweDA4MGEsIlNwYW5pc2ggKE1leGljbykifSwKCXsweDBjMGEsIlNwYW5pc2ggKFNwYWluLCBpbnRlcm5hdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgxMDBhLCJTcGFuaXNoIChHdWF0ZW1hbGEpIn0sCgl7MHgxNDBhLCJTcGFuaXNoIChDb3N0YSBSaWNhKSJ9LAoJezB4MTgwYSwiU3BhbmlzaCAoUGFuYW1hKSJ9LAoJezB4MWMwYSwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSJ9LAoJezB4MjAwYSwiU3BhbmlzaCAoVmVuZXp1ZWxhKSJ9LAoJezB4MjQwYSwiU3BhbmlzaCAoQ29sb21iaWEpIn0sCgl7MHgyODBhLCJTcGFuaXNoIChQZXJ1KSJ9LAoJezB4MmMwYSwiU3BhbmlzaCAoQXJnZW50aW5hKSJ9LAoJezB4MzAwYSwiU3BhbmlzaCAoRWN1YWRvcikifSwKCXsweDM0MGEsIlNwYW5pc2ggKENoaWxlKSJ9LAoJezB4MzgwYSwiU3BhbmlzaCAoVXJ1Z3VheSkifSwKCXsweDNjMGEsIlNwYW5pc2ggKFBhcmFndWF5KSJ9LAoJezB4NDAwYSwiU3BhbmlzaCAoQm9saXZpYSkifSwKCXsweDQ0MGEsIlNwYW5pc2ggKEVsIFNhbHZhZG9yKSJ9LAoJezB4NDgwYSwiU3BhbmlzaCAoSG9uZHVyYXMpIn0sCgl7MHg0YzBhLCJTcGFuaXNoIChOaWNhcmFndWEpIn0sCgl7MHg1MDBhLCJTcGFuaXNoIChQdWVydG8gUmljbykifSwKCXsweDA0MGIsIkZpbm5pc2gifSwKCXsweDA0MGMsIkZyZW5jaCAoRnJhbmNlKSJ9LAoJezB4MDgwYywiRnJlbmNoIChCZWxnaXVtKSJ9LAoJezB4MGMwYywiRnJlbmNoIChDYW5hZGEpIn0sCgl7MHgxMDBjLCJGcmVuY2ggKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MTQwYywiRnJlbmNoIChMdXhlbWJvdXJnKSJ9LAoJezB4MTgwYywiRnJlbmNoIChNb25hY28pIn0sCgl7MHgwNDBkLCJIZWJyZXcifSwKCXsweDA0MGUsIkh1bmdhcmlhbiJ9LAoJezB4MDQwZiwiSWNlbGFuZGljIn0sCgl7MHgwNDEwLCJJdGFsaWFuIChJdGFseSkifSwKCXsweDA4MTAsIkl0YWxpYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MDQxMSwiSmFwYW5lc2UifSwKCXsweDA0MTIsIktvcmVhbiAoV2Fuc3VuZykifSwKCXsweDA4MTIsIktvcmVhbiAoSm9oYWIpIn0sCgl7MHgwNDEzLCJEdXRjaCAoTmV0aGVybGFuZHMpIn0sCgl7MHgwODEzLCJEdXRjaCAoQmVsZ2l1bSkifSwKCXsweDA0MTQsIk5vcndlZ2lhbiAoQm9rbWFsKSJ9LAoJezB4MDgxNCwiTm9yd2VnaWFuIChOeW5vcnNrKSJ9LAoJezB4MDQxNSwiUG9saXNoIn0sCgl7MHgwNDE2LCJQb3J0dWd1ZXNlIChCcmF6aWwpIn0sCgl7MHgwODE2LCJQb3J0dWd1ZXNlIChQb3J0dWdhbCkifSwKCXsweDA0MTcsIlJoYWV0byBSb21hbmljIn0sCgl7MHgwNDE4LCJSb21hbmlhbiJ9LAoJezB4MDgxOCwiTW9sZGF2aWFuIn0sCgl7MHgwNDE5LCJSdXNzaWFuIChSdXNzaWEpIn0sCgl7MHgwODE5LCJSdXNzaWFuIChNb2xkYXZpYSkifSwKCXsweDA0MWEsIkNyb2F0aWFuIn0sCgl7MHgwODFhLCJTZXJiaWFuIChsYXRpbikifSwKCXsweDBjMWEsIlNlcmJpYW4gKGN5cmlsbGljKSJ9LAoJezB4MDQxYiwiU2xvdmFrIn0sCgl7MHgwNDFjLCJBbGJhbmlhbiJ9LAoJezB4MDQxZCwiU3dlZGlzaCAoU3dlZGVuKSJ9LAoJezB4MDgxZCwiU3dlZGlzaCAoRmlubGFuZCkifSwKCXsweDA0MWUsIlRoYWkifSwKCXsweDA0MWYsIlR1cmtpc2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkluZG9uZXNpYW4ifSwKCXsweDA0MjIsIlVrcmFpbmlhbiJ9LAoJezB4MDQyMywiQmVsYXJ1c2lhbiJ9LAoJezB4MDQyNCwiU2xvdmVuZSJ9LAoJezB4MDQyNSwiRXN0b25pYW4ifSwKCXsweDA0MjYsIkxhdHZpYW4ifSwKCXsweDA0MjcsIkxpdGh1YW5pYW4gKG1vZGVybikifSwKCXsweDA4MjcsIkxpdGh1YW5pYW4gKGNsYXNzaWMpIn0sCgl7MHgwNDI4LCJNYW9yaSJ9LAoJezB4MDQyOSwiRmFyc2kifSwKCXsweDA0MmEsIlZpZXRuYW1lc2UifSwKCXsweDA0MmIsIkFybWVuaWFuIn0sCgl7MHgwNDJjLCJBemVyaSAobGF0aW4pIn0sCgl7MHgwODJjLCJBemVyaSAoY3lyaWxsaWMpIn0sCgl7MHgwNDJkLCJCYXNxdWUifSwKCXsweDA0MmUsIlNvcmJpYW4ifSwKCXsweDA0MmYsIk1hY2Vkb25pYW4ifSwKCXsweDA0MzAsIlN1dHUifSwKCXsweDA0MzEsIlRzb25nYSJ9LAoJezB4MDQzMiwiVHN3YW5hIn0sCgl7MHgwNDMzLCJWZW5kYSJ9LAoJezB4MDQzNCwiWGhvc2EifSwKCXsweDA0MzUsIlp1bHUifSwKCXsweDA0MzYsIkFmcmlrYWFucyJ9LAoJezB4MDQzNywiR2VvcmdpYW4ifSwKCXsweDA0MzgsIkZhZXJvZXNlIn0sCgl7MHgwNDM5LCJIaW5kaSJ9LAoJezB4MDQzYSwiTWFsdGVzZSJ9LAoJezB4MDQzYiwiU2FhbWkifSwKCXsweDA0M2MsIklyaXNoIGdhZWxpYyJ9LAoJezB4MDgzYywiU2NvdHRpc2ggZ2FlbGljIn0sCgl7MHgwYzNjLCJNYW54IEdhZWxpYyJ9LAoJezB4MDQzZSwiTWFsYXkgKE1hbGF5c2lhKSJ9LAoJezB4MDgzZSwiTWFsYXkgKEJydW5laSBEYXJ1c3NhbGFtKSJ9LAoJezB4MDQzZiwiS2F6YWsifSwKCXsweDA0NDEsIlN3YWhpbGkifSwKCXsweDA0NDMsIlV6YmVrIChsYXRpbikifSwKCXsweDA4NDMsIlV6YmVrIChjeXJpbGxpYykifSwKCXsweDA0NDQsIlRhdGFyIn0sCgl7MHgwNDQ1LCJCZW5nYWxpIn0sCgl7MHgwNDQ2LCJQdW5qYWJpIn0sCgl7MHgwNDQ3LCJHdWphcmF0aSJ9LAoJezB4MDQ0OCwiT3JpeWEifSwKCXsweDA0NDksIlRhbWlsIn0sCgl7MHgwNDRhLCJUZWx1Z3UifSwKCXsweDA0NGIsIkthbm5hZGEifSwKCXsweDA0NGMsIk1hbGF5YWxhbSJ9LAoJezB4MDQ0ZCwiQXNzYW1lc2UifSwKCXsweDA0NGUsIk1hcmF0aGkifSwKCXsweDA0NGYsIlNhbnNrcml0In0sCgl7MHgwNDU3LCJLb25rYW5pIn0sCgl7MHgwNDhmLCJFc3BlcmFudG8ifSwgLyogTm9uIG9mZmljaWFsICovCgl7MHgwNDkwLCJXYWxvbiJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDA0OTEsIkNvcm5pc2gifSwJLyogTm90IG9mZmljaWFsICovCgl7MHgwNDkyLCJXZWxzaCJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDA0OTMsIkJyZXRvbiJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDAwMDAsIlVua25vd24ifQogICAgfSwgbGFuZ3VhZ2VzX2RlW109ewoJezB4MDQwMSwiQXJhYmljIn0sCgl7MHgwNDAyLCJCdWxnYXJpc2NoIn0sCgl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAoJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCgl7MHgwNDA1LCJUc2NoZWNpc2NoIn0sCgl7MHgwNDA2LCJE5G5pc2NoIn0sCgl7MHgwNDA3LCJEZXV0c2NoIn0sCgl7MHgwNDA4LCJHcmllY2hpc2NoIn0sCgl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDQwQSwiS2FzdGlsaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwNDBCLCJGaW5uaXNjaCJ9LAoJezB4MDQwQywiRnJhbnp2c2lzY2gifSwKCXsweDA0MEQsIkhlYnJkaXNjaCJ9LAoJezB4MDQwRSwiVW5nYXJpc2NoIn0sCgl7MHgwNDBGLCJJc2xkbmRpc2NoIn0sCgl7MHgwNDEwLCJJdGFsaWVuaXNjaCJ9LAoJezB4MDQxMSwiSmFwYW5pc2NoIn0sCgl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCgl7MHgwNDEzLCJOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDQxNCwiTm9yd2VnaXNjaC1Cb2ttYWwifSwKCXsweDA0MTUsIlBvbG5pc2NoIn0sCgl7MHgwNDE2LCJCcmFzaWxpYW5pc2NoZXMgUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDQxNywiUmR0b3JvbWFuaXNjaCJ9LAoJezB4MDQxOCwiUnVtZG5pc2NoIn0sCgl7MHgwNDE5LCJSdXNzaXNjaCJ9LAoJezB4MDQxQSwiS3JvYXRvc2VyYmlzY2ggKGxhdGVpbmlzY2gpIn0sCgl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCgl7MHgwNDFDLCJBbGJhbmlzY2gifSwKCXsweDA0MUQsIlNjaHdlZGlzY2gifSwKCXsweDA0MUUsIlRoYWkifSwKCXsweDA0MUYsIlT8cmtpc2NoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJCYWhhc2EifSwKCXsweDA4MDQsIlZlcmVpbmZhY2h0ZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDgwNywiU2Nod2VpemVyZGV1dHNjaCJ9LAoJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDgwQSwiTWV4aWthbmlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDgwQywiQmVsZ2lzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCgl7MHgwODEzLCJCZWxnaXNjaGVzIE5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwODE0LCJOb3Jnd2VnaXNjaC1OeW5vcnNrIn0sCgl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCgl7MHgwODFBLCJTZXJib2tyYXRpc2NoIChreXJpbGxpc2NoKSJ9LAoJezB4MEMxQywiS2FuYWRpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDAwMCwiVW5iZWthbm50In0sCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4xKQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjIpCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgKE9MRTJOTFMuMykKICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQoKQp7CgkvKiBjYWNoaW5nIHJlc3VsdCwgaWYgZGVmaW5lZCBmcm9tIGVudmlyb25tZW50LCB3aGljaCBzaG91bGQgKD8pIG5vdCBjaGFuZ2UgZHVyaW5nIGEgV0lORSBzZXNzaW9uICovCglzdGF0aWMJTEFOR0lECXVzZXJMQ0lEID0gMDsKCWlmIChPcHRpb25zLmxhbmd1YWdlKSB7CgkJcmV0dXJuIExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5sYW5naWQ7Cgl9CgoJaWYgKHVzZXJMQ0lEID09IDApIHsKCQljaGFyICpidWY9TlVMTDsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoJCWludCAJcmV0PTA7CgkJCgkJYnVmPWdldGVudigiTEFOR1VBR0UiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTEFORyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19BTEwiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfTUVTU0FHRVMiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfQ1RZUEUiKTsKCQlpZiAoIWJ1ZikgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlpZiAoIXN0cmNtcChidWYsIlBPU0lYIikgfHwgIXN0cmNtcChidWYsIkMiKSkgewoJCQlyZXR1cm4gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQl9CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQlyZXQ9TUFJTl9HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCQkKCQl9IHdoaWxlIChsYW5nICYmICFyZXQpOwoJCQoJCS8qIEZJWE1FIDogYXJlIHN0cmluZ3MgcmV0dXJuZWQgYnkgZ2V0ZW52KCkgdG8gYmUgZnJlZSgpJ2VkID8gKi8KCQl1c2VyTENJRCA9IChMQU5HSUQpcmV0OwoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm8xNglbT0xFMk5MUy41XQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KSU5UMTYgV0lOQVBJIEdldExvY2FsZUluZm8xNihMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMTYgbGVuKQp7CglyZXR1cm4gR2V0TG9jYWxlSW5mb0EobGNpZCxMQ1R5cGUsYnVmLGxlbik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIFtLRVJORUwzMi4xNDddCiAqLwpMQ0lEIFdJTkFQSSBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIChMQ0lEIGxjaWQpCnsJc3dpdGNoIChsY2lkKQoJeyAgY2FzZSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICAgY2FzZSBMT0NBTEVfVVNFUl9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIDA6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldExvY2FsZUluZm8zMkEgW0tFUk5FTDMyLjM0Ml0KICoKICogTk9URVMgCiAqICBMQU5HX05FVVRSQUwgaXMgZXF1YWwgdG8gTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqCiAqICBNUyBvbmxpbmUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgc3RyaW5nIHJldHVybmVkIGlzIE5VTEwgdGVybWluYXRlZAogKiAgZXhjZXB0IGZvciBMT0NBTEVfRk9OVFNJR05BVFVSRSAgd2hpY2ggIndpbGwgcmV0dXJuIGEgbm9uLU5VTEwKICogIHRlcm1pbmF0ZWQgc3RyaW5nIi4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb0EoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVCBsZW4pCnsKICBMUENTVFIgIHJldFN0cmluZzsKCWludAlmb3VuZCxpOwoJaW50CWxhbmc9MDsKCiAgVFJBQ0UoIihsY2lkPTB4JWx4LGxjdHlwZT0weCVseCwlcCwleClcbiIsbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgogIGlmIChsZW4gJiYgKCEgYnVmKSApIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAobGNpZCA9PTAgfHwgbGNpZCA9PSBMQU5HX1NZU1RFTV9ERUZBVUxUIHx8IChMQ1R5cGUgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICkJLyogMHgwMCwgMHg0MDAgKi8KCXsKICAgICAgICAgICAgbGNpZCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobGNpZCA9PSBMQU5HX1VTRVJfREVGQVVMVCkgLyoweDgwMCovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgoJLyogQXMgYW4gb3B0aW9uLCB3ZSBjb3VsZCBvYnRhaW4gdGhlIHZhbHVlIGZyb20gd2luLmluaS4KCSAgIFRoaXMgd291bGQgbm90IG1hdGNoIHRoZSBXaW5lIGNvbXBpbGUtdGltZSBvcHRpb24uCgkgICBBbHNvLCBub3QgYWxsIGlkZW50aWZpZXJzIGFyZSBhdmFpbGFibGUgZnJvbSB3aW4uaW5pICovCglyZXRTdHJpbmc9MDsKCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCgkgICBJZiBpdCBpcywgdGhlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KCWk9MDsKCXdoaWxlIChsb2NhbGVfbmFtZTJpZFtpXS5uYW1lIT1OVUxMKSB7CgkJaWYgKExDVHlwZSA9PSBsb2NhbGVfbmFtZTJpZFtpXS5pZCkgewoJCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOwoJCQlicmVhazsKCQl9CgkJaSsrOwoJfQoJaWYgKCFyZXRTdHJpbmcpIHsKICAgICAgRklYTUUoIlVua293biBMQyB0eXBlICVsWFxuIixMQ1R5cGUpOwoJCXJldHVybiAwOwoJfQoKICAgIGZvdW5kPTA7bGFuZz1sY2lkOwogICAgZm9yIChpPTA7KGk8MyAmJiAhZm91bmQpO2krKykgewogICAgICBpbnQgajsKCiAgICAgIGZvciAoaj0wO2o8c2l6ZW9mKGxhbmdsb2NhbGVzKS9zaXplb2YobGFuZ2xvY2FsZXNbMF0pO2orKykgewoJaWYgKGxhbmdsb2NhbGVzW2pdLmxhbmcgPT0gbGFuZykgewoJICBpbnQgazsKCgkgIGZvciAoaz0wO2s8c2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnMpL3NpemVvZihsYW5nbG9jYWxlc1tqXS5sb2N2YXJzWzBdKSAmJiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlKTtrKyspIHsKCSAgICBpZiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlID09IExDVHlwZSkgewoJICAgICAgZm91bmQgPSAxOwoJICAgICAgcmV0U3RyaW5nID0gbGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS52YWw7CgkgIGJyZWFrOwoJICAgIH0KCSAgfQogICAgICAgICAgaWYgKGZvdW5kKQoJICAgIGJyZWFrOwoJfQogICAgICB9CgkgIC8qIGxhbmd1YWdlIG5vdCBmb3VuZCwgdHJ5IHdpdGhvdXQgYSBzdWJsYW5ndWFnZSovCgkgIGlmIChpPT0xKSBsYW5nPU1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGFuZyksIFNVQkxBTkdfREVGQVVMVCk7CgkgIC8qIG1hc2sgdGhlIExDIFZhbHVlICovCgkgIGlmIChpPT0yKSBMQ1R5cGUgJj0gMHhmZmY7CiAgICB9CgogICAgaWYoIWZvdW5kKSB7CiAgICAgIEVSUigiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIsCgkJCXJldFN0cmluZywoV09SRClsY2lkKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiAwOwkJCQoJfQogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKQogICAgICAgICAgICBtZW1jcHkoYnVmLCByZXRTdHJpbmcsIChsZW48PXNpemVvZihGT05UU0lHTkFUVVJFKSk/bGVuOnNpemVvZihGT05UU0lHTkFUVVJFKSk7CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKICAgIHJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRMb2NhbGVJbmZvMzJXCVtLRVJORUwzMi4zNDNdCiAqCiAqIE5PVEVTCiAqICBNUyBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IGxlbiAic3BlY2lmaWVzIHRoZSBzaXplLCBpbiBieXRlcyAoQU5TSSB2ZXJzaW9uKQogKiAgb3IgY2hhcmFjdGVycyAoVW5pY29kZSB2ZXJzaW9uKSwgb2YiIHdidWYuIFRodXMgdGhlIG51bWJlciByZXR1cm5lZCBpcwogKiAgdGhlIHNhbWUgYmV0d2VlbiBHZXRMb2NhbGVJbmZvMzJXIGFuZCBHZXRMb2NhbGVJbmZvMzJBLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwoJICBsc3RyY3B5bkF0b1cod2J1ZixhYnVmLGxlbik7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldExvY2FsZUluZm9BCVtLRVJORUwzMi42NTZdCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FKCIoJWxkLCVsZCwlcyk6IHN0dWJcbiIsbGNpZCxsY3R5cGUsZGF0YSk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSXNWYWxpZExvY2FsZQlbS0VSTkVMMzIuNDg5XQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKCS8qIHdlIHN1cHBvcnQgQU5ZIGxhbmd1YWdlLiBXZWxsLCBhdCBsZWFzdCBzYXkgdGhhdC4uLiovCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXMzMlcJW0tFUk5FTDMyLjIwOV0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzVyggTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wJcmV0OwoJV0NIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFXyh3aW4zMikoIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5Vyh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApCiAgICAgICAgewogICAgICAgICAgICBMUFdTVFIgY3A7CgkgICAgY2hhciAgIHhidWZmZXJbMTBdOwogIAkKCSAgICBzcHJpbnRmKHhidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgoJICAgIGNwID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4YnVmZmVyICk7CiAgICAgICAgICAgIHJldCA9IGxwZm5Mb2NhbGVFbnVtKGNwKTsKICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNwICk7CiAgICAgICAgICAgIGlmICghcmV0KSBicmVhazsKICAgICAgICAgICAgaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzMzJBCVtLRVJORUwzMi4yMDhdCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc0EoTE9DQUxFX0VOVU1QUk9DQSBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncykKewoJaW50CWk7CglDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRV8od2luMzIpKCIoJXAsJTA4bHgpXG4iLAoJCWxwZm5Mb2NhbGVFbnVtLGZsYWdzCgkpOwoKCWlmICggRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLAogICAgICAgICAgICAgICAgICAgICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxObHNcXExvY2FsZVxcIiwKICAgICAgICAgICAgICAgICAgICAmeGhrZXkpKSB7CiAgICAgICAgICAgIGk9MDsKICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgIERXT1JEIHNpemU9c2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICBpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bVZhbHVlQSh4aGtleSxpLGJ1ZmZlciwmc2l6ZSxOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCxOVUxMKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGlmIChzaXplICYmICFscGZuTG9jYWxlRW51bShidWZmZXIpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KHhoa2V5KTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7Cgl9CglpPTA7Cgl3aGlsZSAobGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MCkgewoJCXNwcmludGYoYnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJYnJlYWs7CgkJaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIENUX0NUeXBlMl9MVVRbXSA9IHsKICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDggKi8KICBDMl9TRUdNRU5UU0VQQVJBVE9SLCAvKiAgIC0gICA5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qICAgLSAgMzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICEgLSAgMzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICMgLSAgMzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAkIC0gIDM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJSAtICAzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiAmIC0gIDM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAnIC0gIDM5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAoIC0gIDQwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiApIC0gIDQxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAqIC0gIDQyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogKyAtICA0MyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogLCAtICA0NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIC0gLSAgNDUgKi8KICBDMl9FVVJPUEVTRVBBUkFUT1IsIC8qIC4gLSAgNDYgKi8KICBDMl9FVVJPUEVTRVBBUkFUT1IsIC8qIC8gLSAgNDcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDAgLSAgNDggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDEgLSAgNDkgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDIgLSAgNTAgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDMgLSAgNTEgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDQgLSAgNTIgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDUgLSAgNTMgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDYgLSAgNTQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDcgLSAgNTUgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDggLSAgNTYgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDkgLSAgNTcgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qIDogLSAgNTggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIDsgLSAgNTkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIDwgLSAgNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID0gLSAgNjEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID4gLSAgNjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID8gLSAgNjMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQCAtICA2NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBBIC0gIDY1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEIgLSAgNjYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQyAtICA2NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBEIC0gIDY4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEUgLSAgNjkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRiAtICA3MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBHIC0gIDcxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEggLSAgNzIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSSAtICA3MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBKIC0gIDc0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEsgLSAgNzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTCAtICA3NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBNIC0gIDc3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE4gLSAgNzggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTyAtICA3OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBQIC0gIDgwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFEgLSAgODEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUiAtICA4MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBTIC0gIDgzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFQgLSAgODQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVSAtICA4NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBWIC0gIDg2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFcgLSAgODcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWCAtICA4OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBZIC0gIDg5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFogLSAgOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIFsgLSAgOTEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIFwgLSAgOTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF0gLSAgOTMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF4gLSAgOTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF8gLSAgOTUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIGAgLSAgOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYSAtICA5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBiIC0gIDk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGMgLSAgOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZCAtIDEwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBlIC0gMTAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGYgLSAxMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZyAtIDEwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBoIC0gMTA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGkgLSAxMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaiAtIDEwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBrIC0gMTA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGwgLSAxMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbSAtIDEwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBuIC0gMTEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG8gLSAxMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcCAtIDExMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBxIC0gMTEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHIgLSAxMTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcyAtIDExNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB0IC0gMTE2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHUgLSAxMTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdiAtIDExOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB3IC0gMTE5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHggLSAxMjAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeSAtIDEyMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB6IC0gMTIyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB7IC0gMTIzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB8IC0gMTI0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB9IC0gMTI1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB+IC0gMTI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogfyAtIDEyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIAgLSAxMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCBIC0gMTI5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCCIC0gMTMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIMgLSAxMzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIQgLSAxMzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIUgLSAxMzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIYgLSAxMzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIcgLSAxMzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogiCAtIDEzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIIkgLSAxMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogiiAtIDEzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogiyAtIDEzOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCMIC0gMTQwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjSAtIDE0MSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII4gLSAxNDIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCPIC0gMTQzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogkCAtIDE0NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkSAtIDE0NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkiAtIDE0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkyAtIDE0NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglCAtIDE0OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglSAtIDE0OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogliAtIDE1MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglyAtIDE1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCYIC0gMTUyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCZIC0gMTUzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJogLSAxNTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJsgLSAxNTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognCAtIDE1NiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ0gLSAxNTcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCeIC0gMTU4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJ8gLSAxNTkgKi8KICBDMl9XSElURVNQQUNFLCAvKiCgIC0gMTYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiChIC0gMTYxICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoiAtIDE2MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKMgLSAxNjMgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCkIC0gMTY0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpSAtIDE2NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogpiAtIDE2NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogpyAtIDE2NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqCAtIDE2OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqSAtIDE2OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqiAtIDE3MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqyAtIDE3MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogrCAtIDE3MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogrSAtIDE3MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogriAtIDE3NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogryAtIDE3NSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILAgLSAxNzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCxIC0gMTc3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiCyIC0gMTc4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiCzIC0gMTc5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC0IC0gMTgwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC1IC0gMTgxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC2IC0gMTgyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC3IC0gMTgzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC4IC0gMTg0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiC5IC0gMTg1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC6IC0gMTg2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC7IC0gMTg3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC8IC0gMTg4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC9IC0gMTg5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC+IC0gMTkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC/IC0gMTkxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMAgLSAxOTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwSAtIDE5MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDCIC0gMTk0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMMgLSAxOTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxCAtIDE5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDFIC0gMTk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMYgLSAxOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxyAtIDE5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDIIC0gMjAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMkgLSAyMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyiAtIDIwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDLIC0gMjAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMwgLSAyMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzSAtIDIwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDOIC0gMjA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM8gLSAyMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0CAtIDIwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDRIC0gMjA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINIgLSAyMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0yAtIDIxMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDUIC0gMjEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINUgLSAyMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1iAtIDIxNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog1yAtIDIxNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDYIC0gMjE2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINkgLSAyMTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2iAtIDIxOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDbIC0gMjE5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINwgLSAyMjAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3SAtIDIyMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDeIC0gMjIyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN8gLSAyMjMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4CAtIDIyNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDhIC0gMjI1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOIgLSAyMjYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4yAtIDIyNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDkIC0gMjI4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOUgLSAyMjkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5iAtIDIzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDnIC0gMjMxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOggLSAyMzIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6SAtIDIzMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDqIC0gMjM0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOsgLSAyMzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7CAtIDIzNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDtIC0gMjM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO4gLSAyMzggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7yAtIDIzOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDwIC0gMjQwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPEgLSAyNDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8iAtIDI0MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDzIC0gMjQzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPQgLSAyNDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9SAtIDI0NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD2IC0gMjQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiD3IC0gMjQ3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPggLSAyNDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+SAtIDI0OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD6IC0gMjUwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPsgLSAyNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/CAtIDI1MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD9IC0gMjUzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP4gLSAyNTQgKi8KICBDMl9MRUZUVE9SSUdIVCAvKiD/IC0gMjU1ICovCn07Cgpjb25zdCBXT1JEIE9MRTJOTFNfQ1RfQ1R5cGUzX0xVVFtdID0geyAKICAweDAwMDAsIC8qICAgLSAgIDAgKi8KICAweDAwMDAsIC8qICAgLSAgIDEgKi8KICAweDAwMDAsIC8qICAgLSAgIDIgKi8KICAweDAwMDAsIC8qICAgLSAgIDMgKi8KICAweDAwMDAsIC8qICAgLSAgIDQgKi8KICAweDAwMDAsIC8qICAgLSAgIDUgKi8KICAweDAwMDAsIC8qICAgLSAgIDYgKi8KICAweDAwMDAsIC8qICAgLSAgIDcgKi8KICAweDAwMDAsIC8qICAgLSAgIDggKi8KICAweDAwMDgsIC8qICAgLSAgIDkgKi8KICAweDAwMDgsIC8qICAgLSAgMTAgKi8KICAweDAwMDgsIC8qICAgLSAgMTEgKi8KICAweDAwMDgsIC8qICAgLSAgMTIgKi8KICAweDAwMDgsIC8qICAgLSAgMTMgKi8KICAweDAwMDAsIC8qICAgLSAgMTQgKi8KICAweDAwMDAsIC8qICAgLSAgMTUgKi8KICAweDAwMDAsIC8qICAgLSAgMTYgKi8KICAweDAwMDAsIC8qICAgLSAgMTcgKi8KICAweDAwMDAsIC8qICAgLSAgMTggKi8KICAweDAwMDAsIC8qICAgLSAgMTkgKi8KICAweDAwMDAsIC8qICAgLSAgMjAgKi8KICAweDAwMDAsIC8qICAgLSAgMjEgKi8KICAweDAwMDAsIC8qICAgLSAgMjIgKi8KICAweDAwMDAsIC8qICAgLSAgMjMgKi8KICAweDAwMDAsIC8qICAgLSAgMjQgKi8KICAweDAwMDAsIC8qICAgLSAgMjUgKi8KICAweDAwMDAsIC8qICAgLSAgMjYgKi8KICAweDAwMDAsIC8qICAgLSAgMjcgKi8KICAweDAwMDAsIC8qICAgLSAgMjggKi8KICAweDAwMDAsIC8qICAgLSAgMjkgKi8KICAweDAwMDAsIC8qICAgLSAgMzAgKi8KICAweDAwMDAsIC8qICAgLSAgMzEgKi8KICAweDAwNDgsIC8qICAgLSAgMzIgKi8KICAweDAwNDgsIC8qICEgLSAgMzMgKi8KICAweDA0NDgsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDB4MDA0OCwgLyogIyAtICAzNSAqLwogIDB4MDQ0OCwgLyogJCAtICAzNiAqLwogIDB4MDA0OCwgLyogJSAtICAzNyAqLwogIDB4MDA0OCwgLyogJiAtICAzOCAqLwogIDB4MDQ0MCwgLyogJyAtICAzOSAqLwogIDB4MDA0OCwgLyogKCAtICA0MCAqLwogIDB4MDA0OCwgLyogKSAtICA0MSAqLwogIDB4MDA0OCwgLyogKiAtICA0MiAqLwogIDB4MDA0OCwgLyogKyAtICA0MyAqLwogIDB4MDA0OCwgLyogLCAtICA0NCAqLwogIDB4MDQ0MCwgLyogLSAtICA0NSAqLwogIDB4MDA0OCwgLyogLiAtICA0NiAqLwogIDB4MDQ0OCwgLyogLyAtICA0NyAqLwogIDB4MDA0MCwgLyogMCAtICA0OCAqLwogIDB4MDA0MCwgLyogMSAtICA0OSAqLwogIDB4MDA0MCwgLyogMiAtICA1MCAqLwogIDB4MDA0MCwgLyogMyAtICA1MSAqLwogIDB4MDA0MCwgLyogNCAtICA1MiAqLwogIDB4MDA0MCwgLyogNSAtICA1MyAqLwogIDB4MDA0MCwgLyogNiAtICA1NCAqLwogIDB4MDA0MCwgLyogNyAtICA1NSAqLwogIDB4MDA0MCwgLyogOCAtICA1NiAqLwogIDB4MDA0MCwgLyogOSAtICA1NyAqLwogIDB4MDA0OCwgLyogOiAtICA1OCAqLwogIDB4MDA0OCwgLyogOyAtICA1OSAqLwogIDB4MDA0OCwgLyogPCAtICA2MCAqLwogIDB4MDQ0OCwgLyogPSAtICA2MSAqLwogIDB4MDA0OCwgLyogPiAtICA2MiAqLwogIDB4MDA0OCwgLyogPyAtICA2MyAqLwogIDB4MDQ0OCwgLyogQCAtICA2NCAqLwogIDB4ODA0MCwgLyogQSAtICA2NSAqLwogIDB4ODA0MCwgLyogQiAtICA2NiAqLwogIDB4ODA0MCwgLyogQyAtICA2NyAqLwogIDB4ODA0MCwgLyogRCAtICA2OCAqLwogIDB4ODA0MCwgLyogRSAtICA2OSAqLwogIDB4ODA0MCwgLyogRiAtICA3MCAqLwogIDB4ODA0MCwgLyogRyAtICA3MSAqLwogIDB4ODA0MCwgLyogSCAtICA3MiAqLwogIDB4ODA0MCwgLyogSSAtICA3MyAqLwogIDB4ODA0MCwgLyogSiAtICA3NCAqLwogIDB4ODA0MCwgLyogSyAtICA3NSAqLwogIDB4ODA0MCwgLyogTCAtICA3NiAqLwogIDB4ODA0MCwgLyogTSAtICA3NyAqLwogIDB4ODA0MCwgLyogTiAtICA3OCAqLwogIDB4ODA0MCwgLyogTyAtICA3OSAqLwogIDB4ODA0MCwgLyogUCAtICA4MCAqLwogIDB4ODA0MCwgLyogUSAtICA4MSAqLwogIDB4ODA0MCwgLyogUiAtICA4MiAqLwogIDB4ODA0MCwgLyogUyAtICA4MyAqLwogIDB4ODA0MCwgLyogVCAtICA4NCAqLwogIDB4ODA0MCwgLyogVSAtICA4NSAqLwogIDB4ODA0MCwgLyogViAtICA4NiAqLwogIDB4ODA0MCwgLyogVyAtICA4NyAqLwogIDB4ODA0MCwgLyogWCAtICA4OCAqLwogIDB4ODA0MCwgLyogWSAtICA4OSAqLwogIDB4ODA0MCwgLyogWiAtICA5MCAqLwogIDB4MDA0OCwgLyogWyAtICA5MSAqLwogIDB4MDQ0OCwgLyogXCAtICA5MiAqLwogIDB4MDA0OCwgLyogXSAtICA5MyAqLwogIDB4MDQ0OCwgLyogXiAtICA5NCAqLwogIDB4MDQ0OCwgLyogXyAtICA5NSAqLwogIDB4MDQ0OCwgLyogYCAtICA5NiAqLwogIDB4ODA0MCwgLyogYSAtICA5NyAqLwogIDB4ODA0MCwgLyogYiAtICA5OCAqLwogIDB4ODA0MCwgLyogYyAtICA5OSAqLwogIDB4ODA0MCwgLyogZCAtIDEwMCAqLwogIDB4ODA0MCwgLyogZSAtIDEwMSAqLwogIDB4ODA0MCwgLyogZiAtIDEwMiAqLwogIDB4ODA0MCwgLyogZyAtIDEwMyAqLwogIDB4ODA0MCwgLyogaCAtIDEwNCAqLwogIDB4ODA0MCwgLyogaSAtIDEwNSAqLwogIDB4ODA0MCwgLyogaiAtIDEwNiAqLwogIDB4ODA0MCwgLyogayAtIDEwNyAqLwogIDB4ODA0MCwgLyogbCAtIDEwOCAqLwogIDB4ODA0MCwgLyogbSAtIDEwOSAqLwogIDB4ODA0MCwgLyogbiAtIDExMCAqLwogIDB4ODA0MCwgLyogbyAtIDExMSAqLwogIDB4ODA0MCwgLyogcCAtIDExMiAqLwogIDB4ODA0MCwgLyogcSAtIDExMyAqLwogIDB4ODA0MCwgLyogciAtIDExNCAqLwogIDB4ODA0MCwgLyogcyAtIDExNSAqLwogIDB4ODA0MCwgLyogdCAtIDExNiAqLwogIDB4ODA0MCwgLyogdSAtIDExNyAqLwogIDB4ODA0MCwgLyogdiAtIDExOCAqLwogIDB4ODA0MCwgLyogdyAtIDExOSAqLwogIDB4ODA0MCwgLyogeCAtIDEyMCAqLwogIDB4ODA0MCwgLyogeSAtIDEyMSAqLwogIDB4ODA0MCwgLyogeiAtIDEyMiAqLwogIDB4MDA0OCwgLyogeyAtIDEyMyAqLwogIDB4MDA0OCwgLyogfCAtIDEyNCAqLwogIDB4MDA0OCwgLyogfSAtIDEyNSAqLwogIDB4MDQ0OCwgLyogfiAtIDEyNiAqLwogIDB4MDAwMCwgLyogfyAtIDEyNyAqLwogIDB4MDAwMCwgLyoggCAtIDEyOCAqLwogIDB4MDAwMCwgLyoggSAtIDEyOSAqLwogIDB4MDAwOCwgLyoggiAtIDEzMCAqLwogIDB4ODAwMCwgLyoggyAtIDEzMSAqLwogIDB4MDAwOCwgLyoghCAtIDEzMiAqLwogIDB4MDAwOCwgLyoghSAtIDEzMyAqLwogIDB4MDAwOCwgLyoghiAtIDEzNCAqLwogIDB4MDAwOCwgLyoghyAtIDEzNSAqLwogIDB4MDAwMSwgLyogiCAtIDEzNiAqLwogIDB4MDAwOCwgLyogiSAtIDEzNyAqLwogIDB4ODAwMywgLyogiiAtIDEzOCAqLwogIDB4MDAwOCwgLyogiyAtIDEzOSAqLwogIDB4ODAwMCwgLyogjCAtIDE0MCAqLwogIDB4MDAwMCwgLyogjSAtIDE0MSAqLwogIDB4MDAwMCwgLyogjiAtIDE0MiAqLwogIDB4MDAwMCwgLyogjyAtIDE0MyAqLwogIDB4MDAwMCwgLyogkCAtIDE0NCAqLwogIDB4MDA4OCwgLyogkSAtIDE0NSAqLwogIDB4MDA4OCwgLyogkiAtIDE0NiAqLwogIDB4MDA4OCwgLyogkyAtIDE0NyAqLwogIDB4MDA4OCwgLyoglCAtIDE0OCAqLwogIDB4MDAwOCwgLyoglSAtIDE0OSAqLwogIDB4MDQwMCwgLyogliAtIDE1MCAqLwogIDB4MDQwMCwgLyoglyAtIDE1MSAqLwogIDB4MDQwOCwgLyogmCAtIDE1MiAqLwogIDB4MDAwMCwgLyogmSAtIDE1MyAqLwogIDB4ODAwMywgLyogmiAtIDE1NCAqLwogIDB4MDAwOCwgLyogmyAtIDE1NSAqLwogIDB4ODAwMCwgLyognCAtIDE1NiAqLwogIDB4MDAwMCwgLyognSAtIDE1NyAqLwogIDB4MDAwMCwgLyogniAtIDE1OCAqLwogIDB4ODAwMywgLyognyAtIDE1OSAqLwogIDB4MDAwOCwgLyogoCAtIDE2MCAqLwogIDB4MDAwOCwgLyogoSAtIDE2MSAqLwogIDB4MDA0OCwgLyogoiAtIDE2MiAqLwogIDB4MDA0OCwgLyogoyAtIDE2MyAqLwogIDB4MDAwOCwgLyogpCAtIDE2NCAqLwogIDB4MDA0OCwgLyogpSAtIDE2NSAqLwogIDB4MDA0OCwgLyogpiAtIDE2NiAqLwogIDB4MDAwOCwgLyogpyAtIDE2NyAqLwogIDB4MDQwOCwgLyogqCAtIDE2OCAqLwogIDB4MDAwOCwgLyogqSAtIDE2OSAqLwogIDB4MDQwMCwgLyogqiAtIDE3MCAqLwogIDB4MDAwOCwgLyogqyAtIDE3MSAqLwogIDB4MDA0OCwgLyogrCAtIDE3MiAqLwogIDB4MDQwOCwgLyogrSAtIDE3MyAqLwogIDB4MDAwOCwgLyogriAtIDE3NCAqLwogIDB4MDQ0OCwgLyogryAtIDE3NSAqLwogIDB4MDAwOCwgLyogsCAtIDE3NiAqLwogIDB4MDAwOCwgLyogsSAtIDE3NyAqLwogIDB4MDAwMCwgLyogsiAtIDE3OCAqLwogIDB4MDAwMCwgLyogsyAtIDE3OSAqLwogIDB4MDQwOCwgLyogtCAtIDE4MCAqLwogIDB4MDAwOCwgLyogtSAtIDE4MSAqLwogIDB4MDAwOCwgLyogtiAtIDE4MiAqLwogIDB4MDAwOCwgLyogtyAtIDE4MyAqLwogIDB4MDQwOCwgLyoguCAtIDE4NCAqLwogIDB4MDAwMCwgLyoguSAtIDE4NSAqLwogIDB4MDQwMCwgLyoguiAtIDE4NiAqLwogIDB4MDAwOCwgLyoguyAtIDE4NyAqLwogIDB4MDAwMCwgLyogvCAtIDE4OCAqLwogIDB4MDAwMCwgLyogvSAtIDE4OSAqLwogIDB4MDAwMCwgLyogviAtIDE5MCAqLwogIDB4MDAwOCwgLyogvyAtIDE5MSAqLwogIDB4ODAwMywgLyogwCAtIDE5MiAqLwogIDB4ODAwMywgLyogwSAtIDE5MyAqLwogIDB4ODAwMywgLyogwiAtIDE5NCAqLwogIDB4ODAwMywgLyogwyAtIDE5NSAqLwogIDB4ODAwMywgLyogxCAtIDE5NiAqLwogIDB4ODAwMywgLyogxSAtIDE5NyAqLwogIDB4ODAwMCwgLyogxiAtIDE5OCAqLwogIDB4ODAwMywgLyogxyAtIDE5OSAqLwogIDB4ODAwMywgLyogyCAtIDIwMCAqLwogIDB4ODAwMywgLyogySAtIDIwMSAqLwogIDB4ODAwMywgLyogyiAtIDIwMiAqLwogIDB4ODAwMywgLyogyyAtIDIwMyAqLwogIDB4ODAwMywgLyogzCAtIDIwNCAqLwogIDB4ODAwMywgLyogzSAtIDIwNSAqLwogIDB4ODAwMywgLyogziAtIDIwNiAqLwogIDB4ODAwMywgLyogzyAtIDIwNyAqLwogIDB4ODAwMCwgLyog0CAtIDIwOCAqLwogIDB4ODAwMywgLyog0SAtIDIwOSAqLwogIDB4ODAwMywgLyog0iAtIDIxMCAqLwogIDB4ODAwMywgLyog0yAtIDIxMSAqLwogIDB4ODAwMywgLyog1CAtIDIxMiAqLwogIDB4ODAwMywgLyog1SAtIDIxMyAqLwogIDB4ODAwMywgLyog1iAtIDIxNCAqLwogIDB4MDAwOCwgLyog1yAtIDIxNSAqLwogIDB4ODAwMywgLyog2CAtIDIxNiAqLwogIDB4ODAwMywgLyog2SAtIDIxNyAqLwogIDB4ODAwMywgLyog2iAtIDIxOCAqLwogIDB4ODAwMywgLyog2yAtIDIxOSAqLwogIDB4ODAwMywgLyog3CAtIDIyMCAqLwogIDB4ODAwMywgLyog3SAtIDIyMSAqLwogIDB4ODAwMCwgLyog3iAtIDIyMiAqLwogIDB4ODAwMCwgLyog3yAtIDIyMyAqLwogIDB4ODAwMywgLyog4CAtIDIyNCAqLwogIDB4ODAwMywgLyog4SAtIDIyNSAqLwogIDB4ODAwMywgLyog4iAtIDIyNiAqLwogIDB4ODAwMywgLyog4yAtIDIyNyAqLwogIDB4ODAwMywgLyog5CAtIDIyOCAqLwogIDB4ODAwMywgLyog5SAtIDIyOSAqLwogIDB4ODAwMCwgLyog5iAtIDIzMCAqLwogIDB4ODAwMywgLyog5yAtIDIzMSAqLwogIDB4ODAwMywgLyog6CAtIDIzMiAqLwogIDB4ODAwMywgLyog6SAtIDIzMyAqLwogIDB4ODAwMywgLyog6iAtIDIzNCAqLwogIDB4ODAwMywgLyog6yAtIDIzNSAqLwogIDB4ODAwMywgLyog7CAtIDIzNiAqLwogIDB4ODAwMywgLyog7SAtIDIzNyAqLwogIDB4ODAwMywgLyog7iAtIDIzOCAqLwogIDB4ODAwMywgLyog7yAtIDIzOSAqLwogIDB4ODAwMCwgLyog8CAtIDI0MCAqLwogIDB4ODAwMywgLyog8SAtIDI0MSAqLwogIDB4ODAwMywgLyog8iAtIDI0MiAqLwogIDB4ODAwMywgLyog8yAtIDI0MyAqLwogIDB4ODAwMywgLyog9CAtIDI0NCAqLwogIDB4ODAwMywgLyog9SAtIDI0NSAqLwogIDB4ODAwMywgLyog9iAtIDI0NiAqLwogIDB4MDAwOCwgLyog9yAtIDI0NyAqLwogIDB4ODAwMywgLyog+CAtIDI0OCAqLwogIDB4ODAwMywgLyog+SAtIDI0OSAqLwogIDB4ODAwMywgLyog+iAtIDI1MCAqLwogIDB4ODAwMywgLyog+yAtIDI1MSAqLwogIDB4ODAwMywgLyog/CAtIDI1MiAqLwogIDB4ODAwMywgLyog/SAtIDI1MyAqLwogIDB4ODAwMCwgLyog/iAtIDI1NCAqLwogIDB4ODAwMyAgLyog/yAtIDI1NSAqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTE2CVtPTEUyTkxTLjddCiAqLwpCT09MMTYgV0lOQVBJIEdldFN0cmluZ1R5cGUxNihMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGUzMkEJW0tFUk5FTDMyLjM5Nl0KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4QShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZUV4MzJBCVtLRVJORUwzMi4zOTddCiAqCiAqIEZJWE1FOiBJZ25vcmVzIHRoZSBsb2NhbGUuCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXhBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoJCglpZiAoKHNyYz09TlVMTCkgfHwgKGNoYXJ0eXBlPT1OVUxMKSB8fCAoc3JjPT0oTFBTVFIpY2hhcnR5cGUpKQoJewoJICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJICByZXR1cm4gRkFMU0U7Cgl9CgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuQShzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGUzMlcJW0tFUk5FTDMyLjM5OV0KICoKICogTk9URVMKICogWWVzLCB0aGlzIGlzIG1pc3NpbmcgTENJRCBsb2NhbGUuIE1TIGZhdWx0LgogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZVcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQgY2NoU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4VygwLypkZWZhdWx0bG9jYWxlKi8sZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZUV4MzJXCVtLRVJORUwzMi4zOThdCiAqCiAqIEZJWE1FOiB1bmljb2RlIGNoYXJzIGFyZSBhc3N1bWVkIGNoYXJzCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXhXKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuVyhzcmMpKzE7CgkKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTI6CgkJRklYTUUoIkNUX0NUWVBFMiBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJY2FzZSBDVF9DVFlQRTM6CgkJRklYTUUoIkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJZGVmYXVsdDpicmVhazsKCX0KCWZvciAoaT0wO2k8Y2NoU3JjO2krKykgewoJCWNoYXJ0eXBlW2ldID0gMDsKCQlpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkJaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJCWlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCQlpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkJaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJCWlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCQlpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCiAgICAgICAgICAgICAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCQkvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogV0lORV9HZXRMYW5ndWFnZU5hbWUgICBbaW50ZXJuYWxdIAogKi8Kc3RhdGljIExQQ1NUUiBXSU5FX0dldExhbmd1YWdlTmFtZSggVUlOVCBsYW5naWQgKQp7CiAgICBpbnQgaTsKICAgIGZvciAoIGkgPSAwOyBsYW5ndWFnZXNbaV0ubGFuZ2lkICE9IDA7IGkrKyApCiAgICAgICAgaWYgKCBsYW5naWQgPT0gbGFuZ3VhZ2VzW2ldLmxhbmdpZCApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIHJldHVybiBsYW5ndWFnZXNbaV0ubGFuZ25hbWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lQSAgICAgICAgICAgICAgW0tFUk5FTDMyLjcwOV1bVkVSU0lPTi45XQogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZUEoIFVJTlQgd0xhbmcsIExQU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGNoYXIgICAgYnVmZmVyWzgwXTsKICAgIExQQ1NUUiAgbmFtZTsKICAgIERXT1JEICAgcmVzdWx0OwoKICAgIC8qCiAgICAgKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KICAgICAqIGZyb20gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgc3ByaW50ZiggYnVmZmVyLAogICAgICAgICAgICAgIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAogICAgICAgICAgICAgd0xhbmcgKTsKCiAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlQSggSEtFWV9MT0NBTF9NQUNISU5FLCBidWZmZXIsIHN6TGFuZywgKExQRFdPUkQpJm5TaXplICk7CiAgICBpZiAoIHJlc3VsdCA9PSBFUlJPUl9TVUNDRVNTIHx8IHJlc3VsdCA9PSBFUlJPUl9NT1JFX0RBVEEgKQogICAgICAgIHJldHVybiBuU2l6ZTsKCiAgICAvKgogICAgICogSWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcm5hbCB0YWJsZQogICAgICovCgogICAgbmFtZSA9IFdJTkVfR2V0TGFuZ3VhZ2VOYW1lKCB3TGFuZyApOwogICAgbHN0cmNweW5BKCBzekxhbmcsIG5hbWUsIG5TaXplICk7CiAgICByZXR1cm4gbHN0cmxlbkEoIG5hbWUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVXICAgICAgICAgICAgICBbS0VSTkVMMzIuNzEwXVtWRVJTSU9OLjEwXQogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZVcoIFVJTlQgd0xhbmcsIExQV1NUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBjaGFyICAgIGJ1ZmZlcls4MF07CiAgICBMUFdTVFIgIGtleW5hbWU7CiAgICBMUENTVFIgIG5hbWU7CiAgICBEV09SRCAgIHJlc3VsdDsKCiAgICAvKgogICAgICogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CiAgICAgKiBmcm9tIHRoZSByZWdpc3RyeS4KICAgICAqLwoKICAgIHNwcmludGYoIGJ1ZmZlciwKICAgICAgICAgICAgICJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IiwKICAgICAgICAgICAgIHdMYW5nICk7CgogICAga2V5bmFtZSA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmZmVyICk7CiAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlVyggSEtFWV9MT0NBTF9NQUNISU5FLCBrZXluYW1lLCBzekxhbmcsIChMUERXT1JEKSZuU2l6ZSApOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGtleW5hbWUgKTsKCiAgICBpZiAoIHJlc3VsdCA9PSBFUlJPUl9TVUNDRVNTIHx8IHJlc3VsdCA9PSBFUlJPUl9NT1JFX0RBVEEgKQogICAgICAgIHJldHVybiBuU2l6ZTsKCiAgICAvKgogICAgICogSWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcm5hbCB0YWJsZQogICAgICovCgogICAgbmFtZSA9IFdJTkVfR2V0TGFuZ3VhZ2VOYW1lKCB3TGFuZyApOwogICAgbHN0cmNweW5BdG9XKCBzekxhbmcsIG5hbWUsIG5TaXplICk7CiAgICByZXR1cm4gbHN0cmxlbkEoIG5hbWUgKTsKfQoKIApzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8gIAogIDYgICAgICAsICAgNCwgLyogICAtICAgMiAqLyAgCiAgNiAgICAgICwgICA1LCAvKiAgIC0gICAzICovICAKICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8gIAogIDYgICAgICAsICAgNywgLyogICAtICAgNSAqLyAgCiAgNiAgICAgICwgICA4LCAvKiAgIC0gICA2ICovICAKICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8gIAogIDYgICAgICAsICAxMCwgLyogICAtICAgOCAqLyAgCiAgNyAgICAgICwgICA1LCAvKiAgIC0gICA5ICovICAKICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8gIAogIDcgICAgICAsICAgNywgLyogICAtICAxMSAqLyAgCiAgNyAgICAgICwgICA4LCAvKiAgIC0gIDEyICovICAKICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8gIAogIDYgICAgICAsICAxMSwgLyogICAtICAxNCAqLyAgCiAgNiAgICAgICwgIDEyLCAvKiAgIC0gIDE1ICovICAKICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8gIAogIDYgICAgICAsICAxNCwgLyogICAtICAxNyAqLyAgCiAgNiAgICAgICwgIDE1LCAvKiAgIC0gIDE4ICovICAKICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8gIAogIDYgICAgICAsICAxNywgLyogICAtICAyMCAqLyAgCiAgNiAgICAgICwgIDE4LCAvKiAgIC0gIDIxICovICAKICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8gIAogIDYgICAgICAsICAyMCwgLyogICAtICAyMyAqLyAgCiAgNiAgICAgICwgIDIxLCAvKiAgIC0gIDI0ICovICAKICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8gIAogIDYgICAgICAsICAyMywgLyogICAtICAyNiAqLyAgCiAgNiAgICAgICwgIDI0LCAvKiAgIC0gIDI3ICovICAKICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8gIAogIDYgICAgICAsICAyNiwgLyogICAtICAyOSAqLyAgCiAgNiAgICAgICwgIDI3LCAvKiAgIC0gIDMwICovICAKICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8gIAogIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLwogIDcgICAgICAsICAyOCwgLyogISAtICAzMyAqLwogIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCiAgNyAgICAgICwgIDMzLCAvKiAkIC0gIDM2ICovCiAgNyAgICAgICwgIDM1LCAvKiAlIC0gIDM3ICovCiAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCiAgNiAgICAgICwgMTI4LCAvKiAnIC0gIDM5ICovCiAgNyAgICAgICwgIDM5LCAvKiAoIC0gIDQwICovCiAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCiAgNyAgICAgICwgIDQ1LCAvKiAqIC0gIDQyICovCiAgOCAgICAgICwgICAzLCAvKiArIC0gIDQzICovCiAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCiAgNiAgICAgICwgMTMwLCAvKiAtIC0gIDQ1ICovCiAgNyAgICAgICwgIDUxLCAvKiAuIC0gIDQ2ICovCiAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCiAxMiAgICAgICwgICAzLCAvKiAwIC0gIDQ4ICovCiAxMiAgICAgICwgIDMzLCAvKiAxIC0gIDQ5ICovCiAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCiAxMiAgICAgICwgIDcwLCAvKiAzIC0gIDUxICovCiAxMiAgICAgICwgIDg4LCAvKiA0IC0gIDUyICovCiAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCiAxMiAgICAgICwgMTI1LCAvKiA2IC0gIDU0ICovCiAxMiAgICAgICwgMTQ0LCAvKiA3IC0gIDU1ICovCiAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCiAxMiAgICAgICwgMTgwLCAvKiA5IC0gIDU3ICovCiAgNyAgICAgICwgIDU1LCAvKiA6IC0gIDU4ICovCiAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCiAgOCAgICAgICwgIDE0LCAvKiA8IC0gIDYwICovCiAgOCAgICAgICwgIDE4LCAvKiA9IC0gIDYxICovCiAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCiAgNyAgICAgICwgIDYwLCAvKiA/IC0gIDYzICovCiAgNyAgICAgICwgIDYyLCAvKiBAIC0gIDY0ICovCiAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCiAxNCAgICAgICwgICA5LCAvKiBCIC0gIDY2ICovCiAxNCAgICAgICwgIDEwLCAvKiBDIC0gIDY3ICovCiAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCiAxNCAgICAgICwgIDMzLCAvKiBFIC0gIDY5ICovCiAxNCAgICAgICwgIDM1LCAvKiBGIC0gIDcwICovCiAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCiAxNCAgICAgICwgIDQ0LCAvKiBIIC0gIDcyICovCiAxNCAgICAgICwgIDUwLCAvKiBJIC0gIDczICovCiAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCiAxNCAgICAgICwgIDU0LCAvKiBLIC0gIDc1ICovCiAxNCAgICAgICwgIDcyLCAvKiBMIC0gIDc2ICovCiAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCiAxNCAgICAgICwgMTEyLCAvKiBOIC0gIDc4ICovCiAxNCAgICAgICwgMTI0LCAvKiBPIC0gIDc5ICovCiAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCiAxNCAgICAgICwgMTM3LCAvKiBRIC0gIDgxICovCiAxNCAgICAgICwgMTM4LCAvKiBSIC0gIDgyICovCiAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCiAxNCAgICAgICwgMTUzLCAvKiBUIC0gIDg0ICovCiAxNCAgICAgICwgMTU5LCAvKiBVIC0gIDg1ICovCiAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCiAxNCAgICAgICwgMTY0LCAvKiBXIC0gIDg3ICovCiAxNCAgICAgICwgMTY2LCAvKiBYIC0gIDg4ICovCiAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCiAxNCAgICAgICwgMTY5LCAvKiBaIC0gIDkwICovCiAgNyAgICAgICwgIDYzLCAvKiBbIC0gIDkxICovCiAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCiAgNyAgICAgICwgIDY2LCAvKiBdIC0gIDkzICovCiAgNyAgICAgICwgIDY3LCAvKiBeIC0gIDk0ICovCiAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCiAgNyAgICAgICwgIDcyLCAvKiBgIC0gIDk2ICovCiAxNCAgICAgICwgICAyLCAvKiBhIC0gIDk3ICovCiAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCiAxNCAgICAgICwgIDEwLCAvKiBjIC0gIDk5ICovCiAxNCAgICAgICwgIDI2LCAvKiBkIC0gMTAwICovCiAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCiAxNCAgICAgICwgIDM1LCAvKiBmIC0gMTAyICovCiAxNCAgICAgICwgIDM3LCAvKiBnIC0gMTAzICovCiAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCiAxNCAgICAgICwgIDUwLCAvKiBpIC0gMTA1ICovCiAxNCAgICAgICwgIDUzLCAvKiBqIC0gMTA2ICovCiAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCiAxNCAgICAgICwgIDcyLCAvKiBsIC0gMTA4ICovCiAxNCAgICAgICwgIDgxLCAvKiBtIC0gMTA5ICovCiAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCiAxNCAgICAgICwgMTI0LCAvKiBvIC0gMTExICovCiAxNCAgICAgICwgMTI2LCAvKiBwIC0gMTEyICovCiAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCiAxNCAgICAgICwgMTM4LCAvKiByIC0gMTE0ICovCiAxNCAgICAgICwgMTQ1LCAvKiBzIC0gMTE1ICovCiAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCiAxNCAgICAgICwgMTU5LCAvKiB1IC0gMTE3ICovCiAxNCAgICAgICwgMTYyLCAvKiB2IC0gMTE4ICovCiAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCiAxNCAgICAgICwgMTY2LCAvKiB4IC0gMTIwICovCiAxNCAgICAgICwgMTY3LCAvKiB5IC0gMTIxICovCiAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCiAgNyAgICAgICwgIDc0LCAvKiB7IC0gMTIzICovCiAgNyAgICAgICwgIDc2LCAvKiB8IC0gMTI0ICovCiAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCiAgNyAgICAgICwgIDgwLCAvKiB+IC0gMTI2ICovCiAgNiAgICAgICwgIDI5LCAvKiB/IC0gMTI3ICovCiAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCiAgNiAgICAgICwgIDMxLCAvKiCBIC0gMTI5ICovCiAgNyAgICAgICwgMTIzLCAvKiCCIC0gMTMwICovCiAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCiAgNyAgICAgICwgMTI3LCAvKiCEIC0gMTMyICovCiAxMCAgICAgICwgIDIxLCAvKiCFIC0gMTMzICovCiAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCiAxMCAgICAgICwgIDE2LCAvKiCHIC0gMTM1ICovCiAgNyAgICAgICwgIDY3LCAvKiCIIC0gMTM2ICovCiAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCiAxNCAgICAgICwgMTQ1LCAvKiCKIC0gMTM4ICovCiAgNyAgICAgICwgMTM2LCAvKiCLIC0gMTM5ICovCiAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCiAgNiAgICAgICwgIDQzLCAvKiCNIC0gMTQxICovCiAgNiAgICAgICwgIDQ0LCAvKiCOIC0gMTQyICovCiAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCiAgNiAgICAgICwgIDQ2LCAvKiCQIC0gMTQ0ICovCiAgNyAgICAgICwgMTIxLCAvKiCRIC0gMTQ1ICovCiAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCiAgNyAgICAgICwgMTI1LCAvKiCTIC0gMTQ3ICovCiAgNyAgICAgICwgMTI2LCAvKiCUIC0gMTQ4ICovCiAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCiAgNiAgICAgICwgMTM3LCAvKiCWIC0gMTUwICovCiAgNiAgICAgICwgMTM5LCAvKiCXIC0gMTUxICovCiAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCiAxNCAgICAgICwgMTU2LCAvKiCZIC0gMTUzICovCiAxNCAgICAgICwgMTQ1LCAvKiCaIC0gMTU0ICovCiAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCiAxNCArIDE2ICwgMTI0LCAvKiCcIC0gMTU2ICovCiAgNiAgICAgICwgIDU5LCAvKiCdIC0gMTU3ICovCiAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCiAxNCAgICAgICwgMTY3LCAvKiCfIC0gMTU5ICovCiAgNyAgICAgICwgICA0LCAvKiCgIC0gMTYwICovCiAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCiAxMCAgICAgICwgICAyLCAvKiCiIC0gMTYyICovCiAxMCAgICAgICwgICAzLCAvKiCjIC0gMTYzICovCiAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCiAxMCAgICAgICwgICA1LCAvKiClIC0gMTY1ICovCiAgNyAgICAgICwgIDgyLCAvKiCmIC0gMTY2ICovCiAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCiAgNyAgICAgICwgIDgzLCAvKiCoIC0gMTY4ICovCiAxMCAgICAgICwgICA3LCAvKiCpIC0gMTY5ICovCiAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCiAgOCAgICAgICwgIDI0LCAvKiCrIC0gMTcxICovCiAxMCAgICAgICwgICA4LCAvKiCsIC0gMTcyICovCiAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCiAxMCAgICAgICwgICA5LCAvKiCuIC0gMTc0ICovCiAgNyAgICAgICwgIDg0LCAvKiCvIC0gMTc1ICovCiAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCiAgOCAgICAgICwgIDIzLCAvKiCxIC0gMTc3ICovCiAxMiAgICAgICwgIDUxLCAvKiCyIC0gMTc4ICovCiAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCiAgNyAgICAgICwgIDg1LCAvKiC0IC0gMTgwICovCiAxMCAgICAgICwgIDExLCAvKiC1IC0gMTgxICovCiAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCiAxMCAgICAgICwgIDEzLCAvKiC3IC0gMTgzICovCiAgNyAgICAgICwgIDg2LCAvKiC4IC0gMTg0ICovCiAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCiAxNCAgICAgICwgMTI0LCAvKiC6IC0gMTg2ICovCiAgOCAgICAgICwgIDI2LCAvKiC7IC0gMTg3ICovCiAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCiAxMiAgICAgICwgIDI1LCAvKiC9IC0gMTg5ICovCiAxMiAgICAgICwgIDI5LCAvKiC+IC0gMTkwICovCiAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCiAxNCAgICAgICwgICAyLCAvKiDAIC0gMTkyICovCiAxNCAgICAgICwgICAyLCAvKiDBIC0gMTkzICovCiAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCiAxNCAgICAgICwgICAyLCAvKiDDIC0gMTk1ICovCiAxNCAgICAgICwgICAyLCAvKiDEIC0gMTk2ICovCiAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCiAxNCArIDE2ICwgICAyLCAvKiDGIC0gMTk4ICovCiAxNCAgICAgICwgIDEwLCAvKiDHIC0gMTk5ICovCiAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCiAxNCAgICAgICwgIDMzLCAvKiDJIC0gMjAxICovCiAxNCAgICAgICwgIDMzLCAvKiDKIC0gMjAyICovCiAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCiAxNCAgICAgICwgIDUwLCAvKiDMIC0gMjA0ICovCiAxNCAgICAgICwgIDUwLCAvKiDNIC0gMjA1ICovCiAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCiAxNCAgICAgICwgIDUwLCAvKiDPIC0gMjA3ICovCiAxNCAgICAgICwgIDI2LCAvKiDQIC0gMjA4ICovCiAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCiAxNCAgICAgICwgMTI0LCAvKiDSIC0gMjEwICovCiAxNCAgICAgICwgMTI0LCAvKiDTIC0gMjExICovCiAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCiAxNCAgICAgICwgMTI0LCAvKiDVIC0gMjEzICovCiAxNCAgICAgICwgMTI0LCAvKiDWIC0gMjE0ICovCiAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCiAxNCAgICAgICwgMTI0LCAvKiDYIC0gMjE2ICovCiAxNCAgICAgICwgMTU5LCAvKiDZIC0gMjE3ICovCiAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCiAxNCAgICAgICwgMTU5LCAvKiDbIC0gMjE5ICovCiAxNCAgICAgICwgMTU5LCAvKiDcIC0gMjIwICovCiAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCiAxNCArIDMyICwgMTUzLCAvKiDeIC0gMjIyICovCiAxNCArIDQ4ICwgMTQ1LCAvKiDfIC0gMjIzICovCiAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCiAxNCAgICAgICwgICAyLCAvKiDhIC0gMjI1ICovCiAxNCAgICAgICwgICAyLCAvKiDiIC0gMjI2ICovCiAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCiAxNCAgICAgICwgICAyLCAvKiDkIC0gMjI4ICovCiAxNCAgICAgICwgICAyLCAvKiDlIC0gMjI5ICovCiAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCiAxNCAgICAgICwgIDEwLCAvKiDnIC0gMjMxICovCiAxNCAgICAgICwgIDMzLCAvKiDoIC0gMjMyICovCiAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCiAxNCAgICAgICwgIDMzLCAvKiDqIC0gMjM0ICovCiAxNCAgICAgICwgIDMzLCAvKiDrIC0gMjM1ICovCiAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCiAxNCAgICAgICwgIDUwLCAvKiDtIC0gMjM3ICovCiAxNCAgICAgICwgIDUwLCAvKiDuIC0gMjM4ICovCiAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCiAxNCAgICAgICwgIDI2LCAvKiDwIC0gMjQwICovCiAxNCAgICAgICwgMTEyLCAvKiDxIC0gMjQxICovCiAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCiAxNCAgICAgICwgMTI0LCAvKiDzIC0gMjQzICovCiAxNCAgICAgICwgMTI0LCAvKiD0IC0gMjQ0ICovCiAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCiAxNCAgICAgICwgMTI0LCAvKiD2IC0gMjQ2ICovCiAgOCAgICAgICwgIDI5LCAvKiD3IC0gMjQ3ICovCiAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCiAxNCAgICAgICwgMTU5LCAvKiD5IC0gMjQ5ICovCiAxNCAgICAgICwgMTU5LCAvKiD6IC0gMjUwICovCiAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCiAxNCAgICAgICwgMTU5LCAvKiD8IC0gMjUyICovCiAxNCAgICAgICwgMTY3LCAvKiD9IC0gMjUzICovCiAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCiAxNCAgICAgICwgMTY3ICAvKiD/IC0gMjU1ICovIH07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OwoKI2RlZmluZSBMQ01fRGlhY3JpdGljX1N0YXJ0IDEzMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX0RpYWNyaXRpY19MVVRbXSA9IHsgCjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1B1bmN0dWF0aW9uIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiAicHVuY3R1YXRpb24gY2hhcmFjdGVyIiBpbiB0aGlzIGNvbnRleHQgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggaXMgCiAgICAgY29uc2lkZXJlZCAibGVzcyBpbXBvcnRhbnQiIGR1cmluZyB3b3JkIHNvcnQgY29tcGFyaXNvbi4KICAgICBTZWUgTENNYXBTdHJpbmcgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc05vblNwYWNpbmcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzTm9uU3BhY2luZyh1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IExDTWFwU3RyaW5nMzJBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmczMkEuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIUlzQ2hhckFscGhhTnVtZXJpY0EoYykgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJaWRlbnRpdHkJW0ludGVybmFsXQogKi8Kc3RhdGljIGludCBpZGVudGl0eShpbnQgYykKewogIHJldHVybiBjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMkEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5Ml0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAqIAogKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCiAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCiAqCiAqICAgIE5PUk1fSUdOT1JFV0lEVEggbWVhbnMgdG8gY29tcGFyZSBBU0NJSSBhbmQgd2lkZSBjaGFyYWN0ZXJzCiAqICAgIGFzIGlmIHRoZXkgYXJlIGVxdWFsLiAgCiAqICAgIEluIHRoZSBvbmx5IGNvZGUgcGFnZSBpbXBsZW1lbnRlZCBzbyBmYXIsIHRoZXJlIG1heSBub3QgYmUKICogICAgd2lkZSBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgcGFzc2VkIHRvIExDTWFwU3RyaW5nMzJBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVCBkc3RsZW4gICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovKSAKewogIGludCBpOwoKICBUUkFDRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVzLGRlc3Q9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW4gPT0gLTEpIAogICAgc3JjbGVuID0gbHN0cmxlbkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKI2RlZmluZSBMQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTIChMQ01BUF9VUFBFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfTE9XRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX1NPUlRLRVkgICAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVOT05TUEFDRSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPUlRfU1RSSU5HU09SVCAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRVdJRFRIICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVLQU5BVFlQRSkKICAvKiBGSVhNRTogYXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEthbmFrYW5hIG5vciBIaXJpZ2FuYSAKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUVfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OyAKICAgIGludCBmbGFnX2lnbm9yZW5vbnNwYWNlID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFOwogICAgaW50IGZsYWdfaWdub3Jlc3ltYm9scyA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVTWU1CT0xTOwoKICAgIGlmIChmbGFnX2lnbm9yZW5vbnNwYWNlIHx8IGZsYWdfaWdub3Jlc3ltYm9scykKICAgIHsKICAgICAgLyogRm9yIHNvbWUgdmFsdWVzIG9mIG1hcGZsYWdzLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgCgkgc3RyaW5nIGlzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LiAgV2luZG93cyBkb2VzIG1hcCB0aGUgc3RyaW5nCgkgYW5kIGRvZXMgbm90IFNldExhc3RFcnJvciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGluCgkgdGhlc2UgY2FzZXMuICovCiAgICAgIGlmIChkc3RsZW49PTApCiAgICAgIHsKCS8qIENvbXB1dGUgcmVxdWlyZWQgbGVuZ3RoICovCglmb3IgKGk9aj0wOyBpIDwgc3JjbGVuOyBpKyspCgl7CgkgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAgICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCgkgICAgaisrOwoJfQoJcmV0dXJuIGo7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGRzdGxlbj09MCkKCXJldHVybiBzcmNsZW47ICAKICAgICAgaWYgKGRzdGxlbjxzcmNsZW4pIAoJICAgewoJICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgIHJldHVybiAwOwoJICAgfQogICAgfQogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIC8qIEZJWE1FOiBOT1JNX0lHTk9SRU5PTlNQQUNFIHJlcXVpcmVzIGFub3RoZXIgY29udmVyc2lvbiAqLwogICAgZm9yIChpPWo9MDsgKGk8c3JjbGVuKSAmJiAoajxkc3RsZW4pIDsgaSsrKQogICAgewogICAgICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCiAgICAgIHsKCWRzdHN0cltqXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CglqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqOwogIH0KCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0ciAoZHN0c3RyLHJvb20pKQogICAgeyBFUlJfKHN0cmluZykoImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCgl7CgkgIFVJTlQxNiBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMlcgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5M10KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZzMyQSBmb3IgZG9jdW1lbnRhdGlvbgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ1coCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0VfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW5XKHNyY3N0cikrMTsKCiAgaWYgKGRzdGxlbj09MCkKICAgIHJldHVybiBzcmNsZW47ICAKICBpZiAoZHN0bGVuPHNyY2xlbikgCiAgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAogIHsKICAgIEZJWE1FXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgoJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseC4gIElnbm9yaW5nIExDX0NPTExBVEUuXG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgICBtZW1jcHkoZHN0c3RyLCBzcmNzdHIsIHNyY2xlbiAqIHNpemVvZigqc3Jjc3RyKSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIGZvciAoaT0wOyBpIDwgc3JjbGVuOyBpKyspCiAgICAgIGRzdHN0cltpXSA9IChXQ0hBUikgZihzcmNzdHJbaV0pOwogICAgcmV0dXJuIHNyY2xlbjsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tcGFyZVN0cmluZzE2ICAgICAgIChPTEUyTkxTLjgpCiAqLwpVSU5UMTYgV0lOQVBJIENvbXBhcmVTdHJpbmcxNihEV09SRCBsY2lkLERXT1JEIGZkd1N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgczEsRFdPUkQgbDEsTFBDU1RSIHMyLERXT1JEIGwyKQp7CglyZXR1cm4gKFVJTlQxNilDb21wYXJlU3RyaW5nQShsY2lkLGZkd1N0eWxlLHMxLGwxLHMyLGwyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZzMyQQlbS0VSTkVMMzIuMTQzXQogKiBDb21wYXJlcyB0d28gc3RyaW5ncyB1c2luZyBsb2NhbGUKICoKICogUkVUVVJOUwogKgogKiBzdWNjZXNzOiBDU1RSX0xFU1NfVEhBTiwgQ1NUUl9FUVVBTCwgQ1NUUl9HUkVBVEVSX1RIQU4KICogZmFpbHVyZTogMAogKgogKiBOT1RFUwogKgogKiBEZWZhdWx0cyB0byBhIHdvcmQgc29ydCwgYnV0IHVzZXMgYSBzdHJpbmcgc29ydCBpZgogKiBTT1JUX1NUUklOR1NPUlQgaXMgc2V0LgogKiBDYWxscyBTZXRMYXN0RXJyb3IgZm9yIEVSUk9SX0lOVkFMSURfRkxBR1MsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLgogKiAKICogQlVHUwogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKgogKiBGSVhNRQogKiAKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nQSgKICAgIERXT1JEIGxjaWQsICAgICAvKiBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBmaXJzdCBzdHJpbmcgKi8KICAgIERXT1JEIGwxLCAgICAgICAvKiBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogc2Vjb25kIHN0cmluZyAqLwogICAgRFdPUkQgbDIpICAgICAgIC8qIGxlbmd0aCBvZiBzZWNvbmQgc3RyaW5nICovCnsKICBpbnQgbWFwc3RyaW5nX2ZsYWdzOwogIGludCBsZW4xLGxlbjI7CiAgaW50IHJlc3VsdDsKICBMUFNUUiBzazEsc2syOwogIFRSQUNFKCIlcyBhbmQgJXNcbiIsCglkZWJ1Z3N0cl9hIChzMSksIGRlYnVnc3RyX2EgKHMyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzMSwgczIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKICAJCiAgbWFwc3RyaW5nX2ZsYWdzID0gTENNQVBfU09SVEtFWSB8IGZkd1N0eWxlIDsKICBsZW4xID0gTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLE5VTEwsMCk7CiAgbGVuMiA9IExDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixOVUxMLDApOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4xKTsKICBzazIgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4yKTsKICBpZiAoICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLHNrMSxsZW4xKSkKCSB8fCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixzazIsbGVuMikpICkKICB7CiAgICBFUlIoIkJ1ZyBpbiBMQ21hcFN0cmluZzMyQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2syKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmczMlcJW0tFUk5FTDMyLjE0NF0KICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICogRklYTUUgOiAgRG9lcyBvbmx5IHN0cmluZyBzb3J0LiAgU2hvdWxkCiAqIGJlIHJlaW1wbGVtZW50ZWQgdGhlIHNhbWUgd2F5IGFzIENvbXBhcmVTdHJpbmczMkEuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nVyhEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUoIklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwcnRlZFxuIik7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKCQlGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlblcoczEpOmwxOwoJbDIgPSAobDI9PS0xKT9sc3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJQ1JURExMX193Y3NuaWNtcChzMSxzMixsZW4pIDogQ1JURExMX3djc25jbXAoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgUmVnaXN0ZXJOTFNJbmZvQ2hhbmdlZCAgW09MRTJOTFMuMTBdCiAqLwpCT09MMTYgV0lOQVBJIFJlZ2lzdGVyTkxTSW5mb0NoYW5nZWQxNihMUFZPSUQvKkZJWE1FKi8gbHBOZXdOTFNJbmZvKQp7CglGSVhNRSgiRnVsbHkgaW1wbGVtZW50ZWQsIGJ1dCBkb2Vzbid0IGVmZmVjdCBhbnl0aGluZy5cbiIpOwoKCWlmICghbHBOZXdOTFNJbmZvKQoJewoJCWxwTkxTSW5mbyA9IE5VTEw7CgkJcmV0dXJuIFRSVUU7Cgl9CgllbHNlCgl7CgkJaWYgKCFscE5MU0luZm8pCgkJewoJCQlscE5MU0luZm8gPSBscE5ld05MU0luZm87CgkJCXJldHVybiBUUlVFOwoJCX0KCX0KCglyZXR1cm4gRkFMU0U7IC8qIHB0ciBub3Qgc2V0ICovCn0gCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRBKExDSUQgbG9jYWxlLAoJCQkgICAgRFdPUkQgZmxhZ3MsCgkJCSAgICBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENTVFIgX2Zvcm1hdCwgCS8qaW4qLwoJCQkgICAgTFBTVFIgZGF0ZSwJCS8qb3V0Ki8KCQkJICAgIElOVCBkYXRlbGVuKQp7CiAgIElOVCBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRSgiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkKICAgICAgIHsKCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSAgICAgIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0RheSk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gMykgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCSAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgIHR5cGUsIGNvdW50KTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCQkgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcC5cbiIpOwoJCSAgc3RyY3B5KGJ1ZiwgIkFEIik7CgkgICAgfSBlbHNlIHsKCQkgIHN0cmNweShidWYsICJnIik7CgkJICBXQVJOKCJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3MnKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndTZWNvbmQpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKCQkgIC8qIHNwcmludGYoYnVmLCAiJXMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gIkFNIiA6ICJQTSIpOyAqLwoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4oImluc3VmZmljaWVudCBidWZmZXJcbiIpOwoJCSByZXR1cm4gMDsKCSAgICB9CgoJICAgIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgaXRlbSAqLwoJICAgIGNvdW50ID0gMDsKCSAgICB0eXBlID0gJ1wwJzsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKCSAgICAgICB0aGF0IGJyZWFrcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGxhc3QgZm9ybWF0LWl0ZW0gKi8KCSAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgICAgLyogY29udGludWluZyBhIGNvZGUgZm9yIGFuIGl0ZW0gKi8KCSAgICBjb3VudCArPTE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChzdHJjaHIoImhIbXN0eU1kZyIsIGZvcm1hdFtpbnBvc10pKSB7CgkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgICAgY291bnQgPSAxOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaW5xdW90ZSA9IDE7CgkgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSB9CiAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgaWYgKG91dHBvcyA+PSBkYXRlbGVuKSB7CiAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICByZXR1cm4gMDsKICAgICAgfQogICB9CiAgIAogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICB9OwoKICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KICAgb3V0cG9zKys7CiAgIC8qIHNhbml0eSBjaGVjayAqLwogICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CiAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CiAgIAogICBUUkFDRSgiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbM107CiAgIGludCAgICAgZGF0ZXZhcnM9MCwgdGltZXZhcnM9MDsKCiAgIGFyZ2FyclswXSA9IGFyZzA7CiAgIGFyZ2FyclsxXSA9IGFyZzE7CiAgIGFyZ2FyclsyXSA9IGFyZzI7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIFRSQUNFKCJhcmdzOiAweCVseCwgMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6JXMgKGF0ICVwKSwgIgogICAJICAgICAgIiVwIHdpdGggbWF4IGxlbiAlZFxuIiwKCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGRlYnVnc3RyX3coZm9ybWF0KSwgZm9ybWF0LCBvdXRwdXQsIG91dGxlbik7CiAgIAogICBpZihvdXRsZW4gPT0gMCkgewogICAgIEZJWE1FKCJvdXRsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsKICAgaW5xdW90ZSA9IE92ZXJmbG93ID0gMDsKICAgLyogdGhpcyBpcyByZWFsbHkganVzdCBhIHNhbml0eSBjaGVjayAqLwogICBvdXRwdXRbMF0gPSBidWZbMF0gPSAwOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCSAgICAgTE9DQUxFX1NEQVlOQU1FMSArIHh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJCUxPQ0FMRV9TQUJCUkVWREFZTkFNRTEgKwoJCQkJeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbMV0gLyogIiVkIiAqLywKCQkJIHh0aW1lLT53WWVhcik7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgInl5eSIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDYsIGFyZ2Fycltjb3VudF0sCgkJCSAgICB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkgICAgICAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSB4dGltZS0+d0hvdXIpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnbScgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKICAgICAgICAgICAgbHN0cmNweVcoIG91dHB1dCArIG91dHBvcywgYnVmICk7CgkgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSB9IGVsc2UgewogICAgICAgICAgICBsc3RyY3B5blcoIG91dHB1dCArIG91dHBvcywgYnVmLCBvdXRsZW4gLSBvdXRwb3MgKTsKCSAgICBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7IC8qIEFibm9ybWFsIGV4aXQgKi8KCSB9CgoJIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0aGlzIHRpbWUgKi8KCSBjb3VudCA9IDA7CgkgdHlwZSA9ICdcMCc7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGJlZ2lubmluZywgIGJlY2F1c2UgdGhhdCAKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZSAKCSBzdHJpbmcgKi8KCSBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgYnJlYWs7ICAvKiAgTk9STUFMIEVYSVQgICovCiAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAvKiBob3cgd2Uga2VlcCB0cmFjayBvZiB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0IHNwZWMgKi8KCSBjb3VudCsrOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCAoZGF0ZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdkJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J00nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0neScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdnJykgICkgfHwKCQkgICh0aW1ldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J0gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0naCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdtJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3MnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ndCcpICkgICAgKSB7CgkgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgY291bnQgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJIGlucXVvdGUgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewoJIC8qIHVucXVvdGVkIGxpdGVyYWxzICovCgkgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CiAgICAgIH0KICAgfQoKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgV0FSTigiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIFRSQUNFKCIgcmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdDMyQQlbS0VSTkVMMzIuMzEwXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UIGRhdGVsZW4pIAp7CiAgIAogIGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU7CiAgSU5UIHJldDsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgICB0aGlzdGltZSA9ICZ0OwogIH0gZWxzZSB7CiAgICAgdGhpc3RpbWUgPSB4dGltZTsKICB9OwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCAoKGZsYWdzJkRBVEVfTE9OR0RBVEUpIAoJCQkJICAgPyBMT0NBTEVfU0xPTkdEQVRFCgkJCQkgICA6IExPQ0FMRV9TU0hPUlREQVRFKSwKCQkgICAgICBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0gZWxzZSB7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9OwoKICAKICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCBmbGFncywgMCwgdGhpc3RpbWUsIHRoaXNmb3JtYXQsIAoJCSAgICAgICBkYXRlLCBkYXRlbGVuKTsKICAKCiAgIFRSQUNFKAoJICAgICAgICJHZXREYXRlRm9ybWF0MzJBKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgICAgICAgcmV0LCBkYXRlKTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0MzJXCVtLRVJORUwzMi4zMTFdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0MzJBKCksICBleGNlcHQgdGhhdCBpdCdzIFVuaWNvZGUuCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgICBMUFdTVFIgZGF0ZSwgSU5UIGRhdGVsZW4pCnsKICAgdW5zaWduZWQgc2hvcnQgZGF0ZWFycltdID0geycxJywnOScsJzknLCc0JywnLScsJzEnLCctJywnMScsMH07CgogICBGSVhNRSgiU1RVQiAoc2hvdWxkIGNhbGwgT0xFX0dldEZvcm1hdFcpXG4iKTsgICAKICAgbHN0cmNweW5XKGRhdGUsIGRhdGVhcnIsIGRhdGVsZW4pOwogICByZXR1cm4gKCAgZGF0ZWxlbiA8IDkpID8gZGF0ZWxlbiA6IDk7CiAgIAogICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHMzMkEJKEtFUk5FTDMyLjE5OCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0EoCiAgREFURUZNVF9FTlVNUFJPQ0EgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCAgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKCiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHMzMlcJKEtFUk5FTDMyLjE5OSkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c1coCiAgREFURUZNVF9FTlVNUFJPQ1cgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwgJWxkLCAlbGQpOiBzdHViXG4iLCBscERhdGVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHMzMkEJKEtFUk5FTDMyLjIxMCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoCiAgVElNRUZNVF9FTlVNUFJPQ0EgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIk9ubHkgVVMgRW5nbGlzaCBzdXBwb3J0ZWRcbiIpOwoKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKICAgIH0KICAKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKCiAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzMzJXCShLRVJORUwzMi4yMTEpCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNXKAogIFRJTUVGTVRfRU5VTVBST0NXIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsJWxkLCVsZCk6IHN0dWJcbiIsIGxwVGltZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXQzMkEJKEtFUk5FTDMyLjM1NSkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscFZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CglMQ0lEIHRoaXNsb2NhbGU7CglVSU5UIHRoaXNudW1kaWdpdHM7CiAgICBVSU5UIHRoaXNsZWFkaW5nemVybzsKICAgIFVJTlQgdGhpc2dyb3VwaW5nWzhdPXsgLTEgfTsKICAgIExQQ1NUUiB0aGlzZGVjaW1hbHNlcDsKICAgIExQQ1NUUiB0aGlzdGhvdXNhbmRzZXA7CiAgICBVSU5UIHRoaXNuZWdhdGl2ZW9yZGVyOwoKCglMUENTVFIgc3B0cjsKCUxQU1RSIGRwdHI7CgljaGFyIHJvdW5kYnVmZmVyWzI0XTsgLyogU2hvdWxkIGJlIGVub3VnaCAqLwoJY2hhciAqZ3B0cjsKCWludCBpLGo7CglpbnQgZG90ZmxhZz0wLG5lZ2ZsYWc9MDsKCWNoYXIgbWlzY19idWZbOF0sIG5lZ2F0aXZlX2J1Zls0XSwgZGVjaW1hbF9idWZbNF0sIHRob3VzYW5kX2J1Zls0XTsKCWNoYXIgZGlnaXRzX2J1ZlsxMV07CglpbnQgaW50c2l6ZT0wLGRlY3NpemU9MCx0b3RhbHNpemUsbGFzdGdyb3VwLCBsZWFkaW5nemVyb3M9MDsKCWludCBuZWdzaWduc2l6ZSxkZWNpbWFsc2Vwc2l6ZSx0aG91c2FuZHNlcHNpemU7CgovKiBEZWZhdWx0IHNldHRpbmcgc3R1ZmYgLSBwYXJ0aWFsbHkgYm9ycm93ZWQgZnJvbSBHZXRGb3JtYXRlZERhdGUgKi8KCWlmICghbG9jYWxlKSB7CgkJbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwoJfQoKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7CgkJdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CgkJdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfSBlbHNlIHsKCQl0aGlzbG9jYWxlID0gbG9jYWxlOwoJfQovKiBQYXJ0aWFsIGltcGxlbWVudGF0aW9uOiB0aGluZ3MgbGlrZSBuYXRpdmUgZGlnaXRzIGFyZSBub3QgY29uc2lkZXJlZCAqLwoJaWYgKGxwRm9ybWF0ID09IE5VTEwpIHsKCglHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCBMT0NBTEVfSURJR0lUUywKCQkJCQltaXNjX2J1Ziwgc2l6ZW9mKG1pc2NfYnVmKSk7Cgl0aGlzbnVtZGlnaXRzID0gYXRvaShtaXNjX2J1Zik7CgoJR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgTE9DQUxFX0lMWkVSTywKCQkJCQltaXNjX2J1Ziwgc2l6ZW9mKG1pc2NfYnVmKSk7CiAgICAgdGhpc2xlYWRpbmd6ZXJvID0gYXRvaShtaXNjX2J1Zik7CgogICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsIExPQ0FMRV9TR1JPVVBJTkcsCgkJCQkJbWlzY19idWYsIHNpemVvZihtaXNjX2J1ZikpOwoKLyogQWJvdXQgZ3JvdXBpbmcgbWVjaGFuaXNtOgogICBJIHBhcnNlIHRoZSBzdHJpbmcgYW5kIHBvdXIgdGhlIGdyb3VwIHNpemUgdmFsdWVzIGFsb25nIHRoZSAKICAgdGhpc2dyb3VwaW5nW10gYXJyYXksIHN0YXJ0aW5nIGJ5IGVsZW1lbnQgMS4gVGhlbiBJIGNvbnZlcnQgdGhlc2UKICAgdmFsdWVzIHRvIGluZGV4ZXMgZm9yIGluc2VydGlvbiBpbnRvIHRoZSBpbnRlZ2VyIHBhcnQuCiAgIHRoaXNncm91cGluZ1swXT09LTEsIHRoZXJlZm9yZSBJIGVuc3VyZSBpbmRleCBjb3JyZWN0bmVzcyB3aXRob3V0CiAgIG5lZWQgZm9yIHJhbmdlIGNoZWNraW5nIGFuZCByZWxhdGVkIHN0dWZmLgogICBUaGUgb25seSBkcmF3YmFjayBpcyB0aGUgNyBzZXBhcmF0b3JzIGxpbWl0LCBob3BlZnVsbHkgdGhhdCBtZWFucwogICBpdCB3aWxsIGZhaWwgd2l0aCBudW1iZXJzIGJpZ2dlciB0aGFuIDEwXjIxIGlmIHVzaW5nIGdyb3VwcyBvZiB0aHJlZQogICBhcyB1c3VhbC4gKi8KCgoJZm9yIChpPTEsZ3B0cj1taXNjX2J1ZjsqZ3B0ciE9J1wwJztpKyspIHsKCQkvKiBJbiBjb250cm9sIHBhbmVsLCBncm91cHMgdXAgOSBkaWdpdHMgbG9uZyBhcmUgYWxsb3dlZC4gSWYgdGhlcmUgaXMgYW55IHdheSB0byB1c2UgbGFyZ2VyIGdyb3VwcywKCQkgICB0aGVuIHRoZSBuZXh0IGxpbmUgbXVzdCBiZSByZXBsYWNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToKCQkgICB0aGlzZ3JvdXBpbmdbaV0gPSBhdG9pKGdwdHIpOwoJCSAgIGZvciAoOypncHRyIT0nOycgJiYgKmdwdHIhPSdcMCc7Z3B0cisrKSA7ICovCgkKCQl0aGlzZ3JvdXBpbmdbaV0gPSAqKGdwdHIrKyktJzAnOwogICAgIAkKCQlpZiAoKmdwdHI9PSc7JykKCSAgCQlncHRyKys7Cgl9CgogICAgLyogVGFrZSBjYXJlIGZvciByZXBlYXRpbmcgZ3JvdXAgc2l6ZSAqLwoJaWYgKHRoaXNncm91cGluZ1tpLTFdPT0wKSB7CgkJZm9yIChqPWktMTtqPDg7aisrKQoJCQl0aGlzZ3JvdXBpbmdbal09dGhpc2dyb3VwaW5nW2ktMl07CgkJbGFzdGdyb3VwPTc7Cgl9IGVsc2UKCQlsYXN0Z3JvdXA9aS0xOwoKCWZvciAoaT0yO2k8PWxhc3Rncm91cDtpKyspCgkJdGhpc2dyb3VwaW5nW2ldKz10aGlzZ3JvdXBpbmdbaS0xXTsKCglHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCBMT0NBTEVfU0RFQ0lNQUwsCgkJCQkJZGVjaW1hbF9idWYsIHNpemVvZihkZWNpbWFsX2J1ZikpOwoJdGhpc2RlY2ltYWxzZXAgID0gZGVjaW1hbF9idWY7CgoJR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgTE9DQUxFX1NUSE9VU0FORCwKCQkJCQl0aG91c2FuZF9idWYsIHNpemVvZih0aG91c2FuZF9idWYpKTsKCXRoaXN0aG91c2FuZHNlcCAgPSB0aG91c2FuZF9idWY7CgoJR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgTE9DQUxFX0lORUdOVU1CRVIsCgkJCQkJbWlzY19idWYsIHNpemVvZihtaXNjX2J1ZikpOwoJdGhpc25lZ2F0aXZlb3JkZXIgPSBhdG9pKG1pc2NfYnVmKTsgCgoJfSBlbHNlIHsKCgkJdGhpc251bWRpZ2l0cyA9IGxwRm9ybWF0LT5OdW1EaWdpdHM7CgkJdGhpc2xlYWRpbmd6ZXJvID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwoJCQoJCXRoaXNncm91cGluZ1sxXSA9IGxwRm9ybWF0LT5Hcm91cGluZzsJCgkJZm9yIChpPTI7aTw4O2krKykKCQkJdGhpc2dyb3VwaW5nW2ldPXRoaXNncm91cGluZ1tpLTFdK2xwRm9ybWF0LT5Hcm91cGluZzsKCQlsYXN0Z3JvdXA9NzsKCQkKCQl0aGlzZGVjaW1hbHNlcCA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXA7CgkJdGhpc3Rob3VzYW5kc2VwID0gbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXA7CgkJdGhpc25lZ2F0aXZlb3JkZXIgPSBscEZvcm1hdC0+TmVnYXRpdmVPcmRlcjsKCiAgICB9CgoJR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgTE9DQUxFX1NOQVRJVkVESUdJVFMsCgkJCQkJZGlnaXRzX2J1Ziwgc2l6ZW9mKGRpZ2l0c19idWYpKTsKCglHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCBMT0NBTEVfU05FR0FUSVZFU0lHTiwKCQkJCQluZWdhdGl2ZV9idWYsIHNpemVvZihuZWdhdGl2ZV9idWYpKTsKCgluZWdzaWduc2l6ZT1zdHJsZW4obmVnYXRpdmVfYnVmKTsKCWRlY2ltYWxzZXBzaXplPXN0cmxlbih0aGlzZGVjaW1hbHNlcCk7Cgl0aG91c2FuZHNlcHNpemU9c3RybGVuKHRoaXN0aG91c2FuZHNlcCk7CgoJLyogU2l6ZSBjYWxjdWxhdGlvbiAqLwoJc3B0cj1scFZhbHVlOwoJaWYgKCpzcHRyPT0nLScpIHsKCQluZWdmbGFnPTE7CgkJc3B0cisrOwoJfQoJZm9yICg7ICpzcHRyPT0nMCc7IHNwdHIrKykgbGVhZGluZ3plcm9zKys7IC8qIElnbm9yZSBsZWFkaW5nIHplcm9zICovCglmb3IgKDsgKnNwdHIhPSdcMCc7IHNwdHIrKykgewoJCWlmICghZG90ZmxhZyAmJiAqc3B0cj09Jy4nKSB7CgkJCWRvdGZsYWc9MTsKCQl9IGVsc2UgaWYgKCpzcHRyPCcwJyB8fCAqc3B0cj4nOScpIHsKCQkJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCQkJcmV0dXJuIDA7CgkJfSBlbHNlIHsKCQkJaWYgKGRvdGZsYWcpIHsKCQkJCWRlY3NpemUrKzsKCQkJfSBlbHNlIHsKICAgICAgIAkJCWludHNpemUrKzsKCQkJfQogICAgCX0KCX0KCgovKiBUYWtlIGNhcmUgb2YgZXZlbnR1YWwgcm91bmRpbmcuIE9ubHksIGlmIEkgbmVlZCB0byBkbyBpdCwgdGhlbiBJIHdyaXRlCiAgIHRoZSByb3VuZGVkIGxwVmFsdWUgY29weSBpbnRvIHJvdW5kYnVmZmVyLCBhbmQgY3JlYXRlIHRoZSBmb3JtYXR0ZWQKICAgc3RyaW5nIGZyb20gdGhlIHByb3BlciBzb3VyY2UuIFRoaXMgaXMgc21hcnRlciB0aGFuIGNvcHlpbmcgaXQgYWx3YXlzCiAgIFRoZSBidWZmZXIgaW5jbHVkZXMgYW4gZXh0cmEgbGVhZGluZyB6ZXJvLCBhcyB0aGUgbnVtYmVyIGNhbiBjYXJyeSBhbmQKICAgZ2V0IGFuZCBleHRyYSBvbmUuIElmIGl0IGRvZXNuJ3QsIHRoZSB6ZXJvIGlzIGlnbm9yZWQgYXMgYW55IG90aGVyCiAgIHVzZWxlc3MgbGVhZGluZyB6ZXJvCiovCgoJaWYgKGRlY3NpemU+MCAmJiBkZWNzaXplPnRoaXNudW1kaWdpdHMpIHsKCSAgICBzcHRyLT0oZGVjc2l6ZS10aGlzbnVtZGlnaXRzKTsKCSAgICAKCSAgICBpZiAoKnNwdHI+PSc1JykgewoJCXN0cmNweShyb3VuZGJ1ZmZlcisxLGxwVmFsdWUpOwoJCWlmIChuZWdmbGFnKSB7CgkJICAgICpyb3VuZGJ1ZmZlcj0nLSc7CgkJICAgICoocm91bmRidWZmZXIrMSk9JzAnOwoJCX0gZWxzZQoJCSAgICAqcm91bmRidWZmZXI9JzAnOwoJCWRwdHI9cm91bmRidWZmZXIrKHNwdHItbHBWYWx1ZSk7ICAvLyArMS0xCgkJCgkJd2hpbGUgKCAoKysqZHB0cikgPiAnOScpIHsKCQkgICAgKihkcHRyLS0pPScwJzsKCQkgICAgaWYgKCpkcHRyPT0nLicpIGRwdHItLTsKCQl9CgkJaWYgKChuZWdmbGFnID8gKihyb3VuZGJ1ZmZlcitsZWFkaW5nemVyb3MrMSkgOiAqKHJvdW5kYnVmZmVyK2xlYWRpbmd6ZXJvcykpICA9PSAnMScpCgkJICAgIGludHNpemUrKzsJCgkJc3B0cj1yb3VuZGJ1ZmZlcjsKCSAgICB9IGVsc2UKCQlzcHRyPWxwVmFsdWU7Cgl9IGVsc2UKCSAgICBzcHRyPWxwVmFsdWU7CgoJdG90YWxzaXplPWludHNpemU7CgoJaWYgKGludHNpemU9PTAgJiYgKGRlY3NpemU9PTAgfHwgdGhpc2xlYWRpbmd6ZXJvKSkKCQl0b3RhbHNpemUrKzsKCglpZiAobmVnZmxhZykKCQl0b3RhbHNpemUrPSB0aGlzbmVnYXRpdmVvcmRlciA9PSAxIHx8IHRoaXNuZWdhdGl2ZW9yZGVyID09IDMgPyBuZWdzaWduc2l6ZQoJCQk6IHRoaXNuZWdhdGl2ZW9yZGVyID09IDIgfHwgdGhpc25lZ2F0aXZlb3JkZXIgPT0gNCA/IG5lZ3NpZ25zaXplKzEgOiAyIDsKCgkvKiBMb29rIGZvciB0aGUgZmlyc3QgZ3JvdXBpbmcgdG8gYmUgZG9uZSAqLwoJZm9yIChqPWxhc3Rncm91cDt0aGlzZ3JvdXBpbmdbal0+PWludHNpemUgJiYgaj4wO2otLSkgOwoKICAKCXRvdGFsc2l6ZSs9dGhvdXNhbmRzZXBzaXplICogajsKCWlmICh0aGlzbnVtZGlnaXRzPjApCgkJdG90YWxzaXplKz1kZWNpbWFsc2Vwc2l6ZSt0aGlzbnVtZGlnaXRzOwoKCWlmIChjY2hOdW1iZXI9PTApIC8qIGlmIGNjaE51bWJlciBpcyB6ZXJvLCBqdXN0IHJldHVybiBzaXplIG5lZWRlZCAqLwoJCXJldHVybiB0b3RhbHNpemUrMTsKCWVsc2UKCQlpZiAoY2NoTnVtYmVyPHRvdGFsc2l6ZSsxKSAgeyAvKiArMSA9IE51bGwgdGVybWluYXRvciAocmlnaHQ/KSAqLwoJCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkJCXJldHVybiAwOwoJCX0gZWxzZSB7CgoKCQkJLyogRm9ybWF0dGluZyBzdHVmZiBzdGFydHMgaGVyZSAqLwoKCQkJZHB0cj1scE51bWJlclN0cjsKCgkJCWlmIChuZWdmbGFnKSB7CgkJCQlpZiAodGhpc25lZ2F0aXZlb3JkZXI9PTApCgkJCQkJKmRwdHIrKz0nKCc7CgkJCQllbHNlIGlmICh0aGlzbmVnYXRpdmVvcmRlcjw9MikgewoJCQkJCXN0cmNweShkcHRyLG5lZ2F0aXZlX2J1Zik7CgkJCQkJZHB0cis9bmVnc2lnbnNpemU7CgkJCQkJaWYgKHRoaXNuZWdhdGl2ZW9yZGVyPT0yKQoJCQkJCQkqZHB0cisrPScgJzsKCQkJCX0KCQkJCXNwdHIrKzsKCQkJfQoKCQkJZm9yIChpPTE7KnNwdHI9PScwJyA7aSsrLCBzcHRyKyspIDsgLyogSWdub3JlIGxlYWRpbmcgemVyb3MgZnJvbSBzb3VyY2UqLwoJCQkJaWYgKGludHNpemU9PTAgJiYgKGRlY3NpemU9PTAgfHwgdGhpc2xlYWRpbmd6ZXJvKSkgLyogSW5zZXJ0IG9uZSBsZWFkaW5nIHplcm8gaW50byBkZXN0aW5hdGlvbiBpZiByZXF1aXJlZCAqLwoJCQkJCSooZHB0cisrKT1kaWdpdHNfYnVmWzBdOwoJCQkJZm9yIChpPTE7aTw9aW50c2l6ZTtpKyspIHsKCgkJCQkJKihkcHRyKyspPWRpZ2l0c19idWZbKihzcHRyKyspLScwJ107CgkJCQkJCgkJCQkJLyogSW5zZXJ0IGEgZ3JvdXAgc2VwYXJhdG9yIGlmIHdlIGp1c3QgcmVhY2hlZCB0aGUgZW5kIG9mIGEgZ3JvdXAgKi8KCQkJCQlpZiAoaT09aW50c2l6ZS10aGlzZ3JvdXBpbmdbal0pIHsKCQkJCQkJc3RyY3B5KGRwdHIsdGhpc3Rob3VzYW5kc2VwKTsKCQkJCQkJZHB0cis9dGhvdXNhbmRzZXBzaXplOwoJCQkJCQlqLS07CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChkZWNzaXplPjApCgkJCQkJc3B0cisrOwoJCQkJaWYgKHRoaXNudW1kaWdpdHM+MCkgewoJCQkJCXN0cmNweShkcHRyLGRlY2ltYWxfYnVmKTsKCQkJCQlkcHRyKz1kZWNpbWFsc2Vwc2l6ZTsKCQkJCQlmb3IgKGk9MDtpPHRoaXNudW1kaWdpdHM7aSsrKQoJCQkJCQkqKGRwdHIrKyk9KnNwdHIgIT0nXDAnID8gZGlnaXRzX2J1ZlsqKHNwdHIrKyktJzAnXSA6IGRpZ2l0c19idWZbMF07CgkJCQl9CgoJCQkJaWYgKG5lZ2ZsYWcpIHsKCQkJCQlpZiAodGhpc25lZ2F0aXZlb3JkZXI9PTApCgkJCQkJCSpkcHRyKys9JyknOwoJCQkJCWVsc2UgaWYgKHRoaXNuZWdhdGl2ZW9yZGVyPj0zKSB7CgkJCQkJCWlmICh0aGlzbmVnYXRpdmVvcmRlcj09NCkKCQkJCQkJCSpkcHRyKys9JyAnOyAgICAgIAkKCQkJCQkJCXN0cmNweShkcHRyLG5lZ2F0aXZlX2J1Zik7CgkJCQkJCQlkcHRyKz1uZWdzaWduc2l6ZTsKCQkJCQkJCXNwdHIrKzsKCQkJCQl9CgkJCQl9CgoJCQkJKmRwdHI9J1wwJzsKCgkJfQogICAgcmV0dXJuIHRvdGFsc2l6ZSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyVwkoS0VSTkVMMzIueHh4KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBsc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0MzJBCVtLRVJORUwzMi40MjJdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdEEoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1NUUiBmb3JtYXQsICAgICAgLyogaW4gICovCgkJIExQU1RSIHRpbWVzdHIsICAgICAgLyogb3V0ICovCgkJIElOVCB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZT0wOwogIERXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KICBJTlQgcmV0OwogICAgCiAgVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwogIH0KICAKICBmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KICAgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICB9CiAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0gCiAgZWxzZQogIHsgdGhpc3RpbWUgPSB4dGltZTsKICB9CiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0MzJXCVtLRVJORUwzMi40MjNdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICovCklOVCBXSU5BUEkgCkdldFRpbWVGb3JtYXRXKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENXU1RSIGZvcm1hdCwgICAgIC8qIGluICAqLwoJCSBMUFdTVFIgdGltZXN0ciwgICAgIC8qIG91dCAqLwoJCSBJTlQgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJTFBTWVNURU1USU1FIHRoaXN0aW1lOwoJTENJRCB0aGlzbG9jYWxlPTA7CglEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovCglJTlQgcmV0OwoJICAgIAoJVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCWlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCgl7IEZJWE1FKCJUSU1FX05PVElNRU1BUktFUiBvciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIG5vdCBpbXBsZW1lbnRlZFxuIik7Cgl9CiAgCglmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCglpZiAoZm9ybWF0ID09IE5VTEwpIAoJeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQkgIAoJZWxzZSAKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KIAoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUqLwoJeyBHZXRTeXN0ZW1UaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0gCgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLjE5Nl0KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9BKAoJQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlCikgewoJRklYTUUoIiglcCwweCUwNGx4LDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIsY2FsaW5mb3Byb2MsbG9jYWxlLGNhbGVuZGFyLGNhbHR5cGUpOwoJcmV0dXJuIEZBTFNFOwp9Cg==