LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkNvcHlyaWdodCAxOTkxLTE5OTUgYnkgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLCBBbXN0ZXJkYW0sClRoZSBOZXRoZXJsYW5kcy4KCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpTVElDSFRJTkcgTUFUSEVNQVRJU0NIIENFTlRSVU0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPClRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIEJFIExJQUJMRQpGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwpXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIFB5dGhvbiBpbnRlcnByZXRlciBtYWluIHByb2dyYW0gKi8KCiNpbmNsdWRlICJQeXRob24uaCIKI2luY2x1ZGUgInB5dGhvbnJlc291cmNlcy5oIgojaW5jbHVkZSAiaW1wb3J0LmgiCiNpbmNsdWRlICJtYXJzaGFsLmgiCgojaW5jbHVkZSA8TWVtb3J5Lmg+CiNpbmNsdWRlIDxSZXNvdXJjZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxFdmVudHMuaD4KI2luY2x1ZGUgPFdpbmRvd3MuaD4KI2luY2x1ZGUgPERlc2suaD4KCiNpZmRlZiBfX01XRVJLU19fCiNpbmNsdWRlIDxTSU9VWC5oPgojZGVmaW5lIFVTRV9TSU9VWAojZW5kaWYKCiNpZmRlZiBUSElOS19DCiNpbmNsdWRlIDxjb25zb2xlLmg+CiNlbmRpZgoKI2RlZmluZSBTVEFSVFVQICJQeXRob25TdGFydHVwIgoKZXh0ZXJuIGludCBQeV9EZWJ1Z0ZsYWc7IC8qIEZvciBwYXJzZXIuYywgZGVjbGFyZWQgaW4gcHl0aG9ucnVuLmMgKi8KZXh0ZXJuIGludCBQeV9WZXJib3NlRmxhZzsgLyogRm9yIGltcG9ydC5jLCBkZWNsYXJlZCBpbiBweXRob25ydW4uYyAqLwpleHRlcm4gaW50IFB5X1N1cHByZXNzUHJpbnRpbmdGbGFnOyAvKiBGb3IgY2V2YWwuYywgZGVjbGFyZWQgaW4gcHl0aG9ucnVuLmMgKi8KCgovKiBTdWJyb3V0aW5lcyB0aGF0IGxpdmUgaW4gdGhlaXIgb3duIGZpbGUgKi8KZXh0ZXJuIGNoYXIgKmdldHZlcnNpb24gUHlfUFJPVE8oKHZvaWQpKTsKZXh0ZXJuIGNoYXIgKmdldGNvcHlyaWdodCBQeV9QUk9UTygodm9pZCkpOwoKCi8qIEZvciBnZXRwcm9ncmFtbmFtZSgpOyBzZXQgYnkgbWFpbigpICovCnN0YXRpYyBjaGFyICphcmd2MDsKCi8qIEZvciBnZXRhcmdjYXJndigpOyBzZXQgYnkgbWFpbigpICovCnN0YXRpYyBjaGFyICoqb3JpZ19hcmd2OwpzdGF0aWMgaW50ICBvcmlnX2FyZ2M7CgovKiBGbGFncyBpbmRpY2F0aW5nIHdoZXRoZXIgc3RkaW8gd2luZG93IHNob3VsZCBzdGF5IG9wZW4gb24gdGVybWluYXRpb24gKi8Kc3RhdGljIGludCBrZWVwX25vcm1hbDsKc3RhdGljIGludCBrZWVwX2Vycm9yID0gMTsKCi8qIEluaXRpYWxpemUgdGhlIE1hYyB0b29sYm94IHdvcmxkICovCgpzdGF0aWMgdm9pZAppbml0X21hY193b3JsZCgpCnsKI2lmZGVmIFRISU5LX0MKCXByaW50ZigiXG4iKTsKI2Vsc2UKCU1heEFwcGxab25lKCk7CglJbml0R3JhZigmcWQudGhlUG9ydCk7CglJbml0Rm9udHMoKTsKCUluaXRXaW5kb3dzKCk7CglURUluaXQoKTsKCUluaXREaWFsb2dzKChsb25nKTApOwoJSW5pdE1lbnVzKCk7CglJbml0Q3Vyc29yKCk7CiNlbmRpZgp9CgovKiBJbml0aWFsaXphdGlvbiBjb2RlIHNoYXJlZCBieSBpbnRlcnByZXRlciBhbmQgYXBwbGV0cyAqLwoKc3RhdGljIHZvaWQKaW5pdF9jb21tb24oKQp7CgoJLyogSW5pdGlhbGl6ZSB0b29sYm94ZXMgKi8KCWluaXRfbWFjX3dvcmxkKCk7CgkKI2lmZGVmIFVTRV9NQUNfU0hBUkVEX0xJQlJBUlkKCS8qIEFkZCB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gdGhlIHN0YWNrIG9mIHJlc291cmNlIGZpbGVzICovCglQeU1hY19BZGRMaWJSZXNvdXJjZXMoKTsKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfR1VTSSkKCS8qIFNldHVwIEdVU0kgKi8KCUdVU0lEZWZhdWx0U2V0dXAoKTsKI2VuZGlmCgojaWZkZWYgVVNFX1NJT1VYCgkvKiBTZXQgdmFyaW91cyBTSU9VWCBmbGFncy4gU29tZSBhcmUgY2hhbmdlZCBsYXRlciBiYXNlZCBvbiBvcHRpb25zICovCglTSU9VWFNldHRpbmdzLmFza3Rvc2F2ZW9uY2xvc2UgPSAwOwoJU0lPVVhTZXR0aW5ncy5zaG93c3RhdHVzbGluZSA9IDA7CglTSU9VWFNldHRpbmdzLnRhYnNwYWNlcyA9IDQ7CiNlbmRpZgoKfQoKCiNpZmRlZiBVU0VfTUFDX0FQUExFVF9TVVBQT1JUCi8qIEFwcGxldCBzdXBwb3J0ICovCgovKiBSdW4gYSBjb21waWxlZCBQeXRob24gUHl0aG9uIHNjcmlwdCBmcm9tICdQWUMgJyByZXNvdXJjZSBfX21haW5fXyAqLwpzdGF0aWMgaW50CnJ1bl9tYWluX3Jlc291cmNlKCkKewoJSGFuZGxlIGg7Cglsb25nIHNpemU7CglQeU9iamVjdCAqY29kZTsKCVB5T2JqZWN0ICpyZXN1bHQ7CgkKCWggPSBHZXROYW1lZFJlc291cmNlKCdQWUMgJywgIlxwX19tYWluX18iKTsKCWlmIChoID09IE5VTEwpIHsKCQlBbGVydChOT1BZQ19BTEVSVCwgTlVMTCk7CgkJcmV0dXJuIDE7Cgl9CglzaXplID0gR2V0UmVzb3VyY2VTaXplT25EaXNrKGgpOwoJSExvY2soaCk7Cgljb2RlID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKCpoICsgOCwgKGludCkoc2l6ZSAtIDgpKTsKCUhVbmxvY2soaCk7CglSZWxlYXNlUmVzb3VyY2UoaCk7CglpZiAoY29kZSA9PSBOVUxMKSB7CgkJUHlFcnJfUHJpbnQoKTsKCQlyZXR1cm4gMTsKCX0KCXJlc3VsdCA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlKCJfX21haW5fXyIsIGNvZGUpOwoJUHlfREVDUkVGKGNvZGUpOwoJaWYgKHJlc3VsdCA9PSBOVUxMKSB7CgkJUHlFcnJfUHJpbnQoKTsKCQlyZXR1cm4gMTsKCX0KCVB5X0RFQ1JFRihyZXN1bHQpOwoJcmV0dXJuIDA7Cn0KCi8qIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGZvciBhcHBsZXRzICovCnZvaWQKUHlNYWNfSW5pdEFwcGxldCgpCnsKCWludCBhcmdjOwoJY2hhciAqKmFyZ3Y7CglpbnQgZXJyOwoKCWluaXRfY29tbW9uKCk7CglhcmdjID0gUHlNYWNfR2V0QXJndigmYXJndik7CglQeV9Jbml0aWFsaXplKCk7CglQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOwoJZXJyID0gcnVuX21haW5fcmVzb3VyY2UoKTsKCWZmbHVzaChzdGRlcnIpOwoJZmZsdXNoKHN0ZG91dCk7CglQeU1hY19FeGl0KGVycik7CgkvKiBYWFggU2hvdWxkIHdlIGJvdGhlciB0byBQeV9FeGl0KHN0cyk/ICovCn0KCiNlbmRpZiAvKiBVU0VfTUFDX0FQUExFVF9TVVBQT1JUICovCgovKiBGb3Igbm9ybWFsIGFwcGxpY2F0aW9uICovCnZvaWQKUHlNYWNfSW5pdEFwcGxpY2F0aW9uKCkKewoJaW50IGFyZ2M7CgljaGFyICoqYXJndjsKCQoJaW5pdF9jb21tb24oKTsKCWFyZ2MgPSBQeU1hY19HZXRBcmd2KCZhcmd2KTsKCWlmICggYXJnYyA+IDEgKSB7CgkJLyogV2UncmUgcnVubmluZyBhIHNjcmlwdC4gQXR0ZW1wdCB0byBjaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgKi8KCQljaGFyIGN1cndkWzI1Nl0sICplbmRwOwoJCQoJCXN0cmNweShjdXJ3ZCwgYXJndlsxXSk7CgkJZW5kcCA9IHN0cnJjaHIoY3Vyd2QsICc6Jyk7CgkJaWYgKCBlbmRwICYmIGVuZHAgPiBjdXJ3ZCApIHsKCQkJKmVuZHAgPSAnXDAnOwoKCQkJY2hkaXIoY3Vyd2QpOwoJCX0KCX0KCVB5X01haW4oYXJnYywgYXJndik7Cn0KCi8qCioqIFB5TWFjX0ludGVyYWN0aXZlT3B0aW9ucyAtIEFsbG93IHVzZXIgdG8gc2V0IG9wdGlvbnMgaWYgb3B0aW9uIGtleSBpcyBwcmVzc2VkCiovCnZvaWQKUHlNYWNfSW50ZXJhY3RpdmVPcHRpb25zKGludCAqaW5zcGVjdCwgaW50ICp2ZXJib3NlLCBpbnQgKnN1cHByZXNzX3ByaW50LCAKCQkJCQkJIGludCAqdW5idWZmZXJlZCwgaW50ICpkZWJ1Z2dpbmcsIGludCAqa2VlcF9ub3JtYWwsCgkJCQkJCSBpbnQgKmtlZXBfZXJyb3IpCnsKCUtleU1hcCBybWFwOwoJdW5zaWduZWQgY2hhciAqbWFwOwoJc2hvcnQgaXRlbSwgdHlwZTsKCUNvbnRyb2xIYW5kbGUgaGFuZGxlOwoJRGlhbG9nUHRyIGRpYWxvZzsKCVJlY3QgcmVjdDsKCQoJLyogRGVmYXVsdC1kZWZhdWx0czogKi8KCSprZWVwX2Vycm9yID0gMTsKCS8qIEdldCBkZWZhdWx0IHNldHRpbmdzIGZyb20gb3VyIHByZWZlcmVuY2UgZmlsZSAqLwoJUHlNYWNfUHJlZmVyZW5jZU9wdGlvbnMoaW5zcGVjdCwgdmVyYm9zZSwgc3VwcHJlc3NfcHJpbnQsCgkJCXVuYnVmZmVyZWQsIGRlYnVnZ2luZywga2VlcF9ub3JtYWwsIGtlZXBfZXJyb3IpOwoJLyogSWYgb3B0aW9uIGlzIHByZXNzZWQgb3ZlcnJpZGUgdGhlc2UgKi8KCUdldEtleXMocm1hcCk7CgltYXAgPSAodW5zaWduZWQgY2hhciAqKXJtYXA7CglpZiAoICggbWFwWzB4M2E+PjNdICYgKDE8PCgweDNhJjcpKSApID09IDAgKQkvKiBvcHRpb24ga2V5IGlzIDNhICovCgkJcmV0dXJuOwoKCWRpYWxvZyA9IEdldE5ld0RpYWxvZyhPUFRfRElBTE9HLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKCWlmICggZGlhbG9nID09IE5VTEwgKSB7CgkJcHJpbnRmKCJPcHRpb24gZGlhbG9nIG5vdCBmb3VuZCAtIGNhbm5vdCBzZXQgb3B0aW9uc1xuIik7CgkJcmV0dXJuOwoJfQoJCgkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgKi8KI2RlZmluZSBTRVRfT1BUX0lURU0obnVtLCB2YXIpIFwKCQlHZXREaWFsb2dJdGVtKGRpYWxvZywgKG51bSksICZ0eXBlLCAoSGFuZGxlICopJmhhbmRsZSwgJnJlY3QpOyBcCgkJU2V0Q3RsVmFsdWUoaGFuZGxlLCAoc2hvcnQpKih2YXIpKTsKCglTRVRfT1BUX0lURU0oT1BUX0lOU1BFQ1QsIGluc3BlY3QpOwoJU0VUX09QVF9JVEVNKE9QVF9WRVJCT1NFLCB2ZXJib3NlKTsKCVNFVF9PUFRfSVRFTShPUFRfU1VQUFJFU1MsIHN1cHByZXNzX3ByaW50KTsKCVNFVF9PUFRfSVRFTShPUFRfVU5CVUZGRVJFRCwgdW5idWZmZXJlZCk7CglTRVRfT1BUX0lURU0oT1BUX0RFQlVHR0lORywgZGVidWdnaW5nKTsKCVNFVF9PUFRfSVRFTShPUFRfS0VFUE5PUk1BTCwga2VlcF9ub3JtYWwpOwoJU0VUX09QVF9JVEVNKE9QVF9LRUVQRVJST1IsIGtlZXBfZXJyb3IpOwoKI3VuZGVmIFNFVF9PUFRfSVRFTQoJCgl3aGlsZSAoMSkgewoJCWhhbmRsZSA9IE5VTEw7CgkJTW9kYWxEaWFsb2coTlVMTCwgJml0ZW0pOwoJCWlmICggaXRlbSA9PSBPUFRfT0sgKQoJCQlicmVhazsKCQlpZiAoIGl0ZW0gPT0gT1BUX0NBTkNFTCApIHsKCQkJRGlzcG9zRGlhbG9nKGRpYWxvZyk7CgkJCWV4aXQoMCk7CgkJfQojZGVmaW5lIE9QVF9JVEVNKG51bSwgdmFyKSBcCgkJaWYgKCBpdGVtID09IChudW0pICkgeyBcCgkJCSoodmFyKSA9ICEqKHZhcik7IFwKCQkJR2V0RGlhbG9nSXRlbShkaWFsb2csIChudW0pLCAmdHlwZSwgKEhhbmRsZSAqKSZoYW5kbGUsICZyZWN0KTsgXAoJCQlTZXRDdGxWYWx1ZShoYW5kbGUsIChzaG9ydCkqKHZhcikpOyBcCgkJfQoJCQoJCU9QVF9JVEVNKE9QVF9JTlNQRUNULCBpbnNwZWN0KTsKCQlPUFRfSVRFTShPUFRfVkVSQk9TRSwgdmVyYm9zZSk7CgkJT1BUX0lURU0oT1BUX1NVUFBSRVNTLCBzdXBwcmVzc19wcmludCk7CgkJT1BUX0lURU0oT1BUX1VOQlVGRkVSRUQsIHVuYnVmZmVyZWQpOwoJCU9QVF9JVEVNKE9QVF9ERUJVR0dJTkcsIGRlYnVnZ2luZyk7CgkJT1BUX0lURU0oT1BUX0tFRVBOT1JNQUwsIGtlZXBfbm9ybWFsKTsKCQlPUFRfSVRFTShPUFRfS0VFUEVSUk9SLCBrZWVwX2Vycm9yKTsKCQkKI3VuZGVmIE9QVF9JVEVNCgl9CglEaXNwb3NEaWFsb2coZGlhbG9nKTsKfQovKiBNYWluIHByb2dyYW0gKi8KCmludApQeV9NYWluKGFyZ2MsIGFyZ3YpCglpbnQgYXJnYzsKCWNoYXIgKiphcmd2Owp7CglpbnQgc3RzOwoJY2hhciAqY29tbWFuZCA9IE5VTEw7CgljaGFyICpmaWxlbmFtZSA9IE5VTEw7CglGSUxFICpmcCA9IHN0ZGluOwoJaW50IGluc3BlY3QgPSAwOwoJaW50IHVuYnVmZmVyZWQgPSAwOwoKCW9yaWdfYXJnYyA9IGFyZ2M7CS8qIEZvciBnZXRhcmdjYXJndigpICovCglvcmlnX2FyZ3YgPSBhcmd2OwoJYXJndjAgPSBhcmd2WzBdOwkvKiBGb3IgZ2V0cHJvZ3JhbW5hbWUoKSAqLwoJCglQeU1hY19JbnRlcmFjdGl2ZU9wdGlvbnMoJmluc3BlY3QsICZQeV9WZXJib3NlRmxhZywgJlB5X1N1cHByZXNzUHJpbnRpbmdGbGFnLAoJCQkmdW5idWZmZXJlZCwgJlB5X0RlYnVnRmxhZywgJmtlZXBfbm9ybWFsLCAma2VlcF9lcnJvcik7CgoJaWYgKHVuYnVmZmVyZWQpIHsKI2lmbmRlZiBNUFcKCQlzZXRidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwpOwoJCXNldGJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCk7CiNlbHNlCgkJLyogT24gTVBXICgzLjIpIHVuYnVmZmVyZWQgc2VlbXMgdG8gaGFuZyAqLwoJCXNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKCQlzZXR2YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7CiNlbmRpZgoJfQoKCWZpbGVuYW1lID0gYXJndlsxXTsKCglpZiAoUHlfVmVyYm9zZUZsYWcgfHwKCSAgICBjb21tYW5kID09IE5VTEwgJiYgZmlsZW5hbWUgPT0gTlVMTCAmJiBpc2F0dHkoKGludClmaWxlbm8oZnApKSkKCQlmcHJpbnRmKHN0ZGVyciwgIlB5dGhvbiAlc1xuJXNcbiIsCgkJCWdldHZlcnNpb24oKSwgZ2V0Y29weXJpZ2h0KCkpOwoJCglpZiAoZmlsZW5hbWUgIT0gTlVMTCkgewoJCWlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkgPT0gTlVMTCkgewoJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIGZpbGUgJyVzJ1xuIiwKCQkJCWFyZ3ZbMF0sIGZpbGVuYW1lKTsKCQkJUHlNYWNfRXhpdCgyKTsKCQl9Cgl9CgkKCVB5X0luaXRpYWxpemUoKTsKCQoJUHlTeXNfU2V0QXJndihhcmdjLTEsIGFyZ3YrMSk7CgoJaWYgKGZpbGVuYW1lID09IE5VTEwgJiYgaXNhdHR5KChpbnQpZmlsZW5vKGZwKSkpIHsKCQlGSUxFICpmcCA9IGZvcGVuKFNUQVJUVVAsICJyIik7CgkJaWYgKGZwICE9IE5VTEwpIHsKCQkJKHZvaWQpIFB5UnVuX1NpbXBsZUZpbGUoZnAsIFNUQVJUVVApOwoJCQlQeUVycl9DbGVhcigpOwoJCQlmY2xvc2UoZnApOwoJCX0KCX0KCXN0cyA9IFB5UnVuX0FueUZpbGUoCgkJCWZwLCBmaWxlbmFtZSA9PSBOVUxMID8gIjxzdGRpbj4iIDogZmlsZW5hbWUpICE9IDA7CglpZiAoZmlsZW5hbWUgIT0gTlVMTCkKCQlmY2xvc2UoZnApOwoKCWlmIChpbnNwZWN0ICYmIGlzYXR0eSgoaW50KWZpbGVubyhzdGRpbikpICYmCgkgICAgKGZpbGVuYW1lICE9IE5VTEwgfHwgY29tbWFuZCAhPSBOVUxMKSkKCQlzdHMgPSBQeVJ1bl9BbnlGaWxlKHN0ZGluLCAiPHN0ZGluPiIpICE9IDA7CgoJUHlfRXhpdChzdHMpOwoJLypOT1RSRUFDSEVEKi8KfQoKLyoKKiogVGVybWluYXRlIGFwcGxpY2F0aW9uCiovClB5TWFjX0V4aXQoc3RhdHVzKQoJaW50IHN0YXR1czsKewoJaW50IGtlZXA7CgkKCWlmICggc3RhdHVzICkKCQlrZWVwID0ga2VlcF9lcnJvcjsKCWVsc2UKCQlrZWVwID0ga2VlcF9ub3JtYWw7CgkJCiNpZmRlZiBVU0VfU0lPVVgKCWlmIChrZWVwKSB7CgkJU0lPVVhTZXR0aW5ncy5zdGFuZGFsb25lID0gMTsKCQlTSU9VWFNldHRpbmdzLmF1dG9jbG9zZW9ucXVpdCA9IDA7CgkJU0lPVVhTZXRUaXRsZSgiXHCrdGVybWluYXRlZLsiKTsKCX0KCWVsc2UKCQlTSU9VWFNldHRpbmdzLmF1dG9jbG9zZW9ucXVpdCA9IDE7CiNlbmRpZgojaWZkZWYgVEhJTktfQwoJY29uc29sZV9vcHRpb25zLnBhdXNlX2F0ZXhpdCA9IGtlZXA7CiNlbmRpZgoKCWV4aXQoc3RhdHVzKTsKfQoKLyogUmV0dXJuIHRoZSBwcm9ncmFtIG5hbWUgLS0gc29tZSBjb2RlIG91dCB0aGVyZSBuZWVkcyB0aGlzLiAqLwoKY2hhciAqCmdldHByb2dyYW1uYW1lKCkKewoJcmV0dXJuIGFyZ3YwOwp9CgoKLyogTWFrZSB0aGUgKm9yaWdpbmFsKiBhcmdjL2FyZ3YgYXZhaWxhYmxlIHRvIG90aGVyIG1vZHVsZXMuCiAgIFRoaXMgaXMgcmFyZSwgYnV0IGl0IGlzIG5lZWRlZCBieSB0aGUgc2VjdXJld2FyZSBleHRlbnNpb24uICovCgp2b2lkCmdldGFyZ2Nhcmd2KGFyZ2MsYXJndikKCWludCAqYXJnYzsKCWNoYXIgKioqYXJndjsKewoJKmFyZ2MgPSBvcmlnX2FyZ2M7CgkqYXJndiA9IG9yaWdfYXJndjsKfQo=