LyogdXRpbC5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiAqCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKICoKICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICovCgojaW5jbHVkZSAibW9kdWxlLmgiCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiCgppbnQgX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQsIENvbm5lY3Rpb24qIGNvbm5lY3Rpb24KKQp7CiAgICBpbnQgcmM7CgogICAgaWYgKHN0YXRlbWVudCA9PSBOVUxMKSB7CiAgICAgICAgLyogdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIFNRTGl0ZSAzLjUgYW5kIGxhdGVyLiBpdCBub3cgYXBwYXJlbnRseQogICAgICAgICAqIHJldHVybnMgTlVMTCBmb3IgIm5vLW9wZXJhdGlvbiIgc3RhdGVtZW50cyAqLwogICAgICAgIHJjID0gU1FMSVRFX09LOwogICAgfSBlbHNlIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgfQoKICAgIHJldHVybiByYzsKfQoKLyoqCiAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uCiAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJyZWQpLgogKi8KaW50IF9zZXRlcnJvcihzcWxpdGUzKiBkYikKewogICAgaW50IGVycm9yY29kZTsKCiAgICBlcnJvcmNvZGUgPSBzcWxpdGUzX2VycmNvZGUoZGIpOwoKICAgIHN3aXRjaCAoZXJyb3Jjb2RlKQogICAgewogICAgICAgIGNhc2UgU1FMSVRFX09LOgogICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNRTElURV9JTlRFUk5BTDoKICAgICAgICBjYXNlIFNRTElURV9OT1RGT1VORDoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEludGVybmFsRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1FMSVRFX05PTUVNOgogICAgICAgICAgICAodm9pZClQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNRTElURV9FUlJPUjoKICAgICAgICBjYXNlIFNRTElURV9QRVJNOgogICAgICAgIGNhc2UgU1FMSVRFX0FCT1JUOgogICAgICAgIGNhc2UgU1FMSVRFX0JVU1k6CiAgICAgICAgY2FzZSBTUUxJVEVfTE9DS0VEOgogICAgICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgogICAgICAgIGNhc2UgU1FMSVRFX0lOVEVSUlVQVDoKICAgICAgICBjYXNlIFNRTElURV9JT0VSUjoKICAgICAgICBjYXNlIFNRTElURV9GVUxMOgogICAgICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgogICAgICAgIGNhc2UgU1FMSVRFX1BST1RPQ09MOgogICAgICAgIGNhc2UgU1FMSVRFX0VNUFRZOgogICAgICAgIGNhc2UgU1FMSVRFX1NDSEVNQToKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9wZXJhdGlvbmFsRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYXRhYmFzZUVycm9yLCBzcWxpdGUzX2Vycm1zZyhkYikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNRTElURV9UT09CSUc6CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYXRhRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CiAgICAgICAgY2FzZSBTUUxJVEVfTUlTTUFUQ0g6CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbnRlZ3JpdHlFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTUUxJVEVfTUlTVVNFOgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFiYXNlRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBlcnJvcmNvZGU7Cn0KCg==