LyoKICogTVNXU09DSyBzcGVjaWZpYyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHLpIEpvaGFuc2VuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJtc3dzb2NrLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN3c29jayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjY2VwdEV4IChNU1dTT0NLLkApCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiwgZ2V0IHRoZSBsb2NhbCBhbmQgcmVtb3RlCiAqIGFkZHJlc3MsIGFuZCByZWNlaXZlIHRoZSBpbml0aWFsIGJsb2NrIG9mIGRhdGEgc2VudCBieSB0aGUgY2xpZW50LgogKgogKiBUT0RPCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHN0dWIuCiAqLwoKQk9PTCBXSU5BUEkgQWNjZXB0RXgoCglTT0NLRVQgc0xpc3RlblNvY2tldCwgLyogW2luXSBEZXNjcmlwdG9yIGlkZW50aWZ5aW5nIGEgc29ja2V0IHRoYXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggdGhlIGxpc3RlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLwoJU09DS0VUIHNBY2NlcHRTb2NrZXQsIC8qIFtpbl0gRGVzY3JpcHRvciBpZGVudGlmeWluZyBhIHNvY2tldCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdG8gYWNjZXB0IGFuIGluY29taW5nIGNvbm5lY3Rpb24gKi8KCVBWT0lEIGxwT3V0cHV0QnVmZmVyLCAvKiBbaW5dICBQb2ludGVyIHRvIGEgYnVmZmVyICovCglEV09SRCBkd1JlY2VpdmVEYXRhTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiBscE91dHB1dEJ1ZmZlcgoJCQkJICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGFjdHVhbCByZWNlaXZlIGRhdGEKCQkJCSAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLwoJRFdPUkQgZHdMb2NhbEFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCSAgICAgICBsb2NhbCBhZGRyZXNzIGluZm9ybWF0aW9uICovCglEV09SRCBkd1JlbW90ZUFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCQlyZW1vdGUgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJTFBEV09SRCBscGR3Qnl0ZXNSZWNlaXZlZCwgLyogW291dF0gUG9pbnRlciB0byBhIERXT1JEIHRoYXQgcmVjZWl2ZXMKCQkJCSAgICAgIHRoZSBjb3VudCBvZiBieXRlcyByZWNlaXZlZCAqLwoJTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCkgLyogW2luXSBTcGVjaWZ5IGluIG9yZGVyIHRvIGFjaGlldmUgYW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBlZCAoYXN5bmNocm9ub3VzKSBJL08gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uICovCnsKICAgIEZJWE1FKCIobGlzdGVuPSVsZCwgYWNjZXB0PSVsZCwgJXAsICVkLCAlZCwgJWQsICVwLCAlcCksIG5vdCBpbXBsZW1lbnRlZFxuIiwKCXNMaXN0ZW5Tb2NrZXQsc0FjY2VwdFNvY2tldCxscE91dHB1dEJ1ZmZlcixkd1JlY2VpdmVEYXRhTGVuZ3RoLAoJZHdMb2NhbEFkZHJlc3NMZW5ndGgsZHdSZW1vdGVBZGRyZXNzTGVuZ3RoLGxwZHdCeXRlc1JlY2VpdmVkLGxwT3ZlcmxhcHBlZAogICAgKTsKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRBY2NlcHRFeFNvY2thZGRycyAoTVNXU09DSy5AKQogKi8KVk9JRCBXSU5BUEkgR2V0QWNjZXB0RXhTb2NrYWRkcnMoCglQVk9JRCBscE91dHB1dEJ1ZmZlciwgLyogW2luXSBQb2ludGVyIHRvIGEgYnVmZmVyICovCglEV09SRCBkd1JlY2VpdmVEYXRhTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHVzZWQKCQkJCSAgICAgIGZvciByZWNlaXZpbmcgdGhlIGZpcnN0IGRhdGEgKi8KCURXT1JEIGR3TG9jYWxBZGRyZXNzTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyByZXNlcnZlZCBmb3IgdGhlCgkJCQkgICAgICAgbG9jYWwgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJRFdPUkQgZHdSZW1vdGVBZGRyZXNzTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyByZXNlcnZlZCBmb3IgdGhlCgkJCQkJcmVtb3RlIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KCXN0cnVjdCBzb2NrYWRkciAqKkxvY2FsU29ja2FkZHIsIC8qIFtvdXRdIFBvaW50ZXIgdG8gdGhlIHNvY2thZGRyCgkJCQkJICAgIHN0cnVjdHVyZSB0aGF0IHJlY2VpdmVzIHRoZSBsb2NhbAoJCQkJCSAgICBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uICAqLwoJTFBJTlQgTG9jYWxTb2NrYWRkckxlbmd0aCwgLyogW291dF0gU2l6ZSBpbiBieXRlcyBvZiB0aGUgbG9jYWwKCQkJCSAgICAgIGFkZHJlc3MgKi8KCXN0cnVjdCBzb2NrYWRkciAqKlJlbW90ZVNvY2thZGRyLCAvKiBbb3V0XSBQb2ludGVyIHRvIHRoZSBzb2NrYWRkcgoJCQkJCSAgICAgc3RydWN0dXJlIHRoYXQgcmVjZWl2ZXMgdGhlIHJlbW90ZQoJCQkJCSAgICAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiAqLwoJTFBJTlQgUmVtb3RlU29ja2FkZHJMZW5ndGgpIC8qIFtvdXRdIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbW90ZSBhZGRyZXNzICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVRyYW5zbWl0RmlsZSAoTVNXU09DSy5AKQogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJhbnNtaXQgYSBmaWxlIG92ZXIgc29ja2V0LgogKgogKiBUT0RPCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHN0dWIuCiAqLwoKQk9PTCBXSU5BUEkgVHJhbnNtaXRGaWxlKAogICAgICAgIFNPQ0tFVCBoU29ja2V0LCAvKiBbaW5dIEhhbmRsZSB0byBhIGNvbm5lY3RlZCBzb2NrZXQgKi8KCUhBTkRMRSBoRmlsZSwgICAvKiBbaW5dIEhhbmRsZSB0byB0aGUgb3BlbiBmaWxlIHRoYXQgc2hvdWxkIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0ZWQgKi8KCURXT1JEIG5OdW1iZXJPZkJ5dGVzVG9Xcml0ZSwgLyogW2luXSBOdW1iZXIgb2YgZmlsZSBieXRlcyB0byAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0ICovCglEV09SRCBuTnVtYmVyT2ZCeXRlc1BlclNlbmQsIC8qIFtpbl0gU2l6ZSBpbiBieXRlcyBvZiBlYWNoIGJsb2NrIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzZW50IGluIGVhY2ggc2VuZCBvcGVyYXRpb24gKi8KCUxQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQsIC8qIFtpbl0gU3BlY2lmeSBpbiBvcmRlciB0byBhY2hpZXZlIGFuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXBwZWQgKGFzeW5jaHJvbm91cykgSS9PIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiAqLwoJTFBUUkFOU01JVF9GSUxFX0JVRkZFUlMgbHBUcmFuc21pdEJ1ZmZlcnMsIAoJCS8qIFtpbl0gQ29udGFpbnMgcG9pbnRlcnMgdG8gZGF0YSB0byBzZW5kIGJlZm9yZSBhbmQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGRhdGEgaXMgc2VudCAqLwoJRFdPUkQgZHdGbGFncykgLyogW2luXSBGbGFncyAqLwp7CiAgICBGSVhNRSgibm90IGltcGxlbWVudGVkXG4iKTsKCiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJV1NBUmVjdkV4IChNU1dTT0NLLkApCiAqLwpJTlQgV0lOQVBJIFdTQVJlY3ZFeCgKCVNPQ0tFVCBzLCAgIC8qIFtpbl0gRGVzY3JpcHRvciBpZGVudGlmeWluZyBhIGNvbm5lY3RlZCBzb2NrZXQgKi8KCWNoYXIgKmJ1ZiwgIC8qIFtvdXRdIEJ1ZmZlciBmb3IgdGhlIGluY29taW5nIGRhdGEgKi8KCUlOVCBsZW4sICAgIC8qIFtpbl0gTGVuZ3RoIG9mIGJ1ZiwgaW4gYnl0ZXMgKi8KICAgICAgICBJTlQgKmZsYWdzKSAvKiBbaW4vb3V0XSBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzCgkgICAgICAgICAgICAgICBmdWxseSBvciBwYXJ0aWFsbHkgcmVjZWl2ZWQgZm9yIGRhdGFncmFtIHNvY2tldHMgKi8KewogICAgRklYTUUoIm5vdCBpbXBsZW1lbnRlZFxuIik7CiAgICAKICAgIHJldHVybiBTT0NLRVRfRVJST1I7Cn0K