LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX0RBVEFfSAojZGVmaW5lIFJCVF9EQVRBX0gKCiNpbmNsdWRlICJyYnRfc2V0LmgiCgpjbGFzcyBVbmljb2RlU3RyaW5nOwpjbGFzcyBVbmljb2RlU2V0OwpzdHJ1Y3QgVUhhc2h0YWJsZTsKCi8qKgogKiBUaGUgcnVsZSBkYXRhIGZvciBhIFJ1bGVCYXNlZFRyYW5zbGl0ZXJhdG9ycy4gIFJCVCBvYmplY3RzIGhvbGQKICogYSBjb25zdCBwb2ludGVyIHRvIGEgVFJEIG9iamVjdCB0aGF0IHRoZXkgZG8gbm90IG93bi4gIFRSRCBvYmplY3RzCiAqIGFyZSBlc3NlbnRpYWxseSB0aGUgcGFyc2VkIHJ1bGVzIGluIGNvbXBhY3QsIHVzYWJsZSBmb3JtLiAgVGhlCiAqIFRSRCBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIGhlbGQgZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzIGluCiAqIGEgc3RhdGljIGNhY2hlIG93bmVkIGJ5IFRyYW5zbGl0ZXJhdG9yLgogKgogKiBUaGlzIGNsYXNzJyBBUEkgaXMgYSBsaXR0bGUgYXN5bW1ldHJpYy4gIFRoZXJlIGlzIGEgbWV0aG9kIHRvCiAqIGRlZmluZSBhIHZhcmlhYmxlLCBidXQgbm8gd2F5IHRvIGRlZmluZSBhIHNldC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKICogc2V0cyBhcmUgZGVmaW5lZCBieSB0aGUgcGFyc2VyIGluIGEgVVZlY3RvciwgYW5kIHRoZSB2ZWN0b3IgaXMKICogY29waWVkIGludG8gYSBmaXhlZC1zaXplIGFycmF5IGhlcmUuICBPbmNlIHRoaXMgaXMgZG9uZSwgbm8gbmV3CiAqIHNldHMgbWF5IGJlIGRlZmluZWQuICBJbiBwcmFjdGljZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBzbywgc2luY2UKICogZ2VuZXJhdGluZyB0aGUgZGF0YSBhbmQgdXNpbmcgaXQgYXJlIGRpc2NyZXRlIHBoYXNlcy4gIFdoZW4gdGhlcmUKICogaXMgYSBuZWVkIHRvIGFjY2VzcyB0aGUgc2V0IGRhdGEgZHVyaW5nIHRoZSBwYXJzZSBwaGFzZSwgYW5vdGhlcgogKiBkYXRhIHN0cnVjdHVyZSBoYW5kbGVzIHRoaXMuICBTZWUgdGhlIHBhcnNpbmcgY29kZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KY2xhc3MgVHJhbnNsaXRlcmF0aW9uUnVsZURhdGEgewoKcHVibGljOgoKICAgIC8qKgogICAgICogUnVsZSB0YWJsZS4gIE1heSBiZSBlbXB0eS4KICAgICAqCiAgICAgKiBQVUJMSUMgREFUQSBNRU1CRVIgZm9yIGludGVybmFsIHVzZSBieSBSQlQKICAgICAqLwogICAgVHJhbnNsaXRlcmF0aW9uUnVsZVNldCBydWxlU2V0OwoKICAgIC8qKgogICAgICogTWFwIHZhcmlhYmxlIG5hbWUgKFVuaWNvZGVTdHJpbmcpIHRvIHZhcmlhYmxlIChDaGFyYWN0ZXIpLgogICAgICogQSB2YXJpYWJsZSBuYW1lIG1heSBjb3JyZXNwb25kIHRvIGEgc2luZ2xlIGxpdGVyYWwKICAgICAqIGNoYXJhY3RlciwgaW4gd2hpY2ggY2FzZSB0aGUgY2hhcmFjdGVyIGlzIHN0b3JlZCBpbiB0aGlzCiAgICAgKiBoYXNoLiAgSXQgbWF5IGFsc28gY29ycmVzcG9uZCB0byBhIFVuaWNvZGVTZXQsIGluIHdoaWNoCiAgICAgKiBjYXNlIGEgY2hhcmFjdGVyIGlzIGFnYWluIHN0b3JlZCBpbiB0aGlzIGhhc2gsIGJ1dCB0aGUKICAgICAqIGNoYXJhY3RlciBpcyBhIHN0YW5kLWluOiBpdCBpcyBhIGtleSBmb3IgYSBzZWNvbmRhcnkgbG9va3VwCiAgICAgKiBpbiBkYXRhLnNldFZhcmlhYmxlcy4gIFRoZSBzdGFuZC1pbiBhbHNvIHJlcHJlc2VudHMgdGhlCiAgICAgKiBVbmljb2RlU2V0IGluIHRoZSBzdG9yZWQgcnVsZXMuCiAgICAgKgogICAgICogUFVCTElDIERBVEEgTUVNQkVSIGZvciBpbnRlcm5hbCB1c2UgYnkgUkJUCiAgICAgKi8KICAgIFVIYXNodGFibGUqIHZhcmlhYmxlTmFtZXM7CiAgICAKICAgIC8qKgogICAgICogTWFwIGNhdGVnb3J5IHZhcmlhYmxlIChDaGFyYWN0ZXIpIHRvIHNldCAoVW5pY29kZVNldCkuCiAgICAgKiBWYXJpYWJsZXMgdGhhdCBjb3JyZXNwb25kIHRvIGEgc2V0IG9mIGNoYXJhY3RlcnMgYXJlIG1hcHBlZAogICAgICogZnJvbSB2YXJpYWJsZSBuYW1lIHRvIGEgc3RhbmQtaW4gY2hhcmFjdGVyIGluIGRhdGEudmFyaWFibGVOYW1lcy4KICAgICAqIFRoZSBzdGFuZC1pbiB0aGVuIHNlcnZlcyBhcyBhIGtleSBpbiB0aGlzIGhhc2ggdG8gbG9va3VwIHRoZQogICAgICogYWN0dWFsIFVuaWNvZGVTZXQgb2JqZWN0LiAgSW4gYWRkaXRpb24sIHRoZSBzdGFuZC1pbiBpcwogICAgICogc3RvcmVkIGluIHRoZSBydWxlIHRleHQgdG8gcmVwcmVzZW50IHRoZSBzZXQgb2YgY2hhcmFjdGVycy4KICAgICAqIHNldFZhcmlhYmxlc1tpXSByZXByZXNlbnRzIGNoYXJhY3RlciAoc2V0VmFyaWFibGVzQmFzZSArIGkpLgogICAgICoKICAgICAqIFBVQkxJQyBEQVRBIE1FTUJFUiBmb3IgaW50ZXJuYWwgdXNlIGJ5IFJCVAogICAgICovCiAgICBVbmljb2RlU2V0Kiogc2V0VmFyaWFibGVzOwogICAgCiAgICAvKioKICAgICAqIFRoZSBjaGFyYWN0ZXIgcmVwcmVzZW50ZWQgYnkgc2V0VmFyaWFibGVzWzBdLgogICAgICovCiAgICBVQ2hhciBzZXRWYXJpYWJsZXNCYXNlOwoKICAgIC8qKgogICAgICogVGhlIGxlbmd0aCBvZiBzZXRWYXJpYWJsZXMuCiAgICAgKi8KICAgIGludDMyX3Qgc2V0VmFyaWFibGVzTGVuZ3RoOwoKICAgIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhKFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgflRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhKCk7CiAgICAKICAgIHZvaWQgZGVmaW5lVmFyaWFibGUoY29uc3QgVW5pY29kZVN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cyk7CiAgICAgICAgCiAgICBVQ2hhciBsb29rdXBWYXJpYWJsZShjb25zdCBVbmljb2RlU3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKICAgIAoJY29uc3QgVW5pY29kZVNldCogbG9va3VwU2V0KFVDaGFyIHN0YW5kSW4pIGNvbnN0OwoKICAgIGJvb2xfdCBpc1ZhcmlhYmxlRGVmaW5lZChjb25zdCBVbmljb2RlU3RyaW5nJiBuYW1lKSBjb25zdDsKfTsKCiNlbmRpZgo=