LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX0RBVEFfSAojZGVmaW5lIFJCVF9EQVRBX0gKCiNpbmNsdWRlICJyYnRfc2V0LmgiCgpjbGFzcyBVbmljb2RlU3RyaW5nOwpjbGFzcyBVbmljb2RlU2V0OwpjbGFzcyBIYXNodGFibGU7CgovKioKICogVGhlIHJ1bGUgZGF0YSBmb3IgYSBSdWxlQmFzZWRUcmFuc2xpdGVyYXRvcnMuICBSQlQgb2JqZWN0cyBob2xkCiAqIGEgY29uc3QgcG9pbnRlciB0byBhIFRSRCBvYmplY3QgdGhhdCB0aGV5IGRvIG5vdCBvd24uICBUUkQgb2JqZWN0cwogKiBhcmUgZXNzZW50aWFsbHkgdGhlIHBhcnNlZCBydWxlcyBpbiBjb21wYWN0LCB1c2FibGUgZm9ybS4gIFRoZQogKiBUUkQgb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSBoZWxkIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzcyBpbgogKiBhIHN0YXRpYyBjYWNoZSBvd25lZCBieSBUcmFuc2xpdGVyYXRvci4KICoKICogVGhpcyBjbGFzcycgQVBJIGlzIGEgbGl0dGxlIGFzeW1tZXRyaWMuICBUaGVyZSBpcyBhIG1ldGhvZCB0bwogKiBkZWZpbmUgYSB2YXJpYWJsZSwgYnV0IG5vIHdheSB0byBkZWZpbmUgYSBzZXQuICBUaGlzIGlzIGJlY2F1c2UgdGhlCiAqIHNldHMgYXJlIGRlZmluZWQgYnkgdGhlIHBhcnNlciBpbiBhIFVWZWN0b3IsIGFuZCB0aGUgdmVjdG9yIGlzCiAqIGNvcGllZCBpbnRvIGEgZml4ZWQtc2l6ZSBhcnJheSBoZXJlLiAgT25jZSB0aGlzIGlzIGRvbmUsIG5vIG5ldwogKiBzZXRzIG1heSBiZSBkZWZpbmVkLiAgSW4gcHJhY3RpY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gc28sIHNpbmNlCiAqIGdlbmVyYXRpbmcgdGhlIGRhdGEgYW5kIHVzaW5nIGl0IGFyZSBkaXNjcmV0ZSBwaGFzZXMuICBXaGVuIHRoZXJlCiAqIGlzIGEgbmVlZCB0byBhY2Nlc3MgdGhlIHNldCBkYXRhIGR1cmluZyB0aGUgcGFyc2UgcGhhc2UsIGFub3RoZXIKICogZGF0YSBzdHJ1Y3R1cmUgaGFuZGxlcyB0aGlzLiAgU2VlIHRoZSBwYXJzaW5nIGNvZGUgZm9yIG1vcmUKICogZGV0YWlscy4KICovCmNsYXNzIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhIHsKCnB1YmxpYzoKCiAgICAvLyBQVUJMSUMgREFUQSBNRU1CRVJTCgogICAgLyoqCiAgICAgKiBSdWxlIHRhYmxlLiAgTWF5IGJlIGVtcHR5LgogICAgICovCiAgICBUcmFuc2xpdGVyYXRpb25SdWxlU2V0IHJ1bGVTZXQ7CgogICAgLyoqCiAgICAgKiBNYXAgdmFyaWFibGUgbmFtZSAoU3RyaW5nKSB0byB2YXJpYWJsZSAoVW5pY29kZVN0cmluZykuICBBIHZhcmlhYmxlIG5hbWUKICAgICAqIGNvcnJlc3BvbmRzIHRvIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLCBzdG9yZWQgaW4gYSBVbmljb2RlU3RyaW5nIGluCiAgICAgKiB0aGlzIGhhc2guICBPbmUgb3IgbW9yZSBvZiB0aGVzZSBjaGFycyBtYXkgYWxzbyBjb3JyZXNwb25kIHRvIGEKICAgICAqIFVuaWNvZGVTZXQsIGluIHdoaWNoIGNhc2UgdGhlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZVN0cmluZyBpbiB0aGlzIGhhc2ggaXMKICAgICAqIGEgc3RhbmQtaW46IGl0IGlzIGFuIGluZGV4IGZvciBhIHNlY29uZGFyeSBsb29rdXAgaW4KICAgICAqIGRhdGEuc2V0VmFyaWFibGVzLiAgVGhlIHN0YW5kLWluIGFsc28gcmVwcmVzZW50cyB0aGUgVW5pY29kZVNldCBpbgogICAgICogdGhlIHN0b3JlZCBydWxlcy4KICAgICAqLwogICAgSGFzaHRhYmxlKiB2YXJpYWJsZU5hbWVzOwogICAgCiAgICAvKioKICAgICAqIE1hcCBjYXRlZ29yeSB2YXJpYWJsZSAoVUNoYXIpIHRvIHNldCAoVW5pY29kZVNldCkuCiAgICAgKiBWYXJpYWJsZXMgdGhhdCBjb3JyZXNwb25kIHRvIGEgc2V0IG9mIGNoYXJhY3RlcnMgYXJlIG1hcHBlZAogICAgICogZnJvbSB2YXJpYWJsZSBuYW1lIHRvIGEgc3RhbmQtaW4gY2hhcmFjdGVyIGluIGRhdGEudmFyaWFibGVOYW1lcy4KICAgICAqIFRoZSBzdGFuZC1pbiB0aGVuIHNlcnZlcyBhcyBhIGtleSBpbiB0aGlzIGhhc2ggdG8gbG9va3VwIHRoZQogICAgICogYWN0dWFsIFVuaWNvZGVTZXQgb2JqZWN0LiAgSW4gYWRkaXRpb24sIHRoZSBzdGFuZC1pbiBpcwogICAgICogc3RvcmVkIGluIHRoZSBydWxlIHRleHQgdG8gcmVwcmVzZW50IHRoZSBzZXQgb2YgY2hhcmFjdGVycy4KICAgICAqIHNldFZhcmlhYmxlc1tpXSByZXByZXNlbnRzIGNoYXJhY3RlciAoc2V0VmFyaWFibGVzQmFzZSArIGkpLgogICAgICovCiAgICBVbmljb2RlU2V0Kiogc2V0VmFyaWFibGVzOwogICAgCiAgICAvKioKICAgICAqIFRoZSBjaGFyYWN0ZXIgdGhhdCByZXByZXNlbnRzIHNldFZhcmlhYmxlc1swXS4gIENoYXJhY3RlcnMKICAgICAqIHNldFZhcmlhYmxlc0Jhc2UgdGhyb3VnaCBzZXRWYXJpYWJsZXNCYXNlICsKICAgICAqIHNldFZhcmlhYmxlcy5sZW5ndGggLSAxIHJlcHJlc2VudCBVbmljb2RlU2V0IG9iamVjdHMuCiAgICAgKi8KICAgIFVDaGFyIHNldFZhcmlhYmxlc0Jhc2U7CgogICAgLyoqCiAgICAgKiBUaGUgbGVuZ3RoIG9mIHNldFZhcmlhYmxlcy4KICAgICAqLwogICAgaW50MzJfdCBzZXRWYXJpYWJsZXNMZW5ndGg7CgogICAgLyoqCiAgICAgKiBUaGUgY2hhcmFjdGVyIHRoYXQgcmVwcmVzZW50cyBzZWdtZW50IDEuICBDaGFyYWN0ZXJzIHNlZ21lbnRCYXNlCiAgICAgKiB0aHJvdWdoIHNlZ21lbnRCYXNlICsgOCByZXByZXNlbnQgc2VnbWVudHMgMSB0aHJvdWdoIDkuCiAgICAgKi8KICAgIFVDaGFyIHNlZ21lbnRCYXNlOwoKcHVibGljOgoKICAgIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhKFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEoY29uc3QgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEmKTsKCiAgICB+VHJhbnNsaXRlcmF0aW9uUnVsZURhdGEoKTsKCiAgICBjb25zdCBVbmljb2RlU2V0KiBsb29rdXBTZXQoVUNoYXIgc3RhbmRJbikgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHNlZ21lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuCiAgICAgKiBjaGFyYWN0ZXIsIG9yIC0xIGlmIG5vbmUuICBSZXBlYXQ6IFRoaXMgaXMgYSB6ZXJvLWJhc2VkIHJldHVybiB2YWx1ZSwKICAgICAqIDAuLjgsIGV2ZW4gdGhvdWdoIHRoZXNlIGFyZSBub3RhdGVkICIkMSIuLiIkOSIuCiAgICAgKi8KICAgIGludDMyX3QgbG9va3VwU2VnbWVudFJlZmVyZW5jZShVQ2hhciBjKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gc3RhbmQgZm9yIHRoZSBnaXZlbiBzZWdtZW50IHJlZmVyZW5jZS4KICAgICAqIFRoZSByZWZlcmVuY2UgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMS4uOS4KICAgICAqLwogICAgVUNoYXIgZ2V0U2VnbWVudFN0YW5kaW4oaW50MzJfdCByZWYpIGNvbnN0IHsKICAgICAgICByZXR1cm4gKFVDaGFyKShzZWdtZW50QmFzZSArIHJlZiAtIDEpOwogICAgfQp9OwoKI2VuZGlmCg==