LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMTEvMTcvOTkgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KI2lmbmRlZiBVTklUT0hFWF9ICiNkZWZpbmUgVU5JVE9IRVhfSAoKI2luY2x1ZGUgInVuaWNvZGUvdHJhbnNsaXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCgpjbGFzcyBVbmljb2RlRmlsdGVyOwoKLyoqCiAqIEEgdHJhbnNsaXRlcmF0b3IgdGhhdCBjb252ZXJ0cyBmcm9tIFVuaWNvZGUgY2hhcmFjdGVycyB0byAKICogaGV4YWRlY2ltYWwgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzLiAgSXQgb3V0cHV0cyBhCiAqIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBvcHRpb25hbGx5IGNvbnZlcnRzIHRoZSBoZXgKICogZGlnaXRzIHRvIHVwcGVyY2FzZS4KICoKICogQGF1dGhvciBBbGFuIExpdQogKi8KY2xhc3MgVV9JMThOX0FQSSBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvciA6IHB1YmxpYyBUcmFuc2xpdGVyYXRvciB7Cgpwcml2YXRlOgoKICAgIC8qKgogICAgICogSUQgZm9yIHRoaXMgdHJhbnNsaXRlcmF0b3IuCiAgICAgKi8KICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfSUQ7CgogICAgc3RhdGljIGNvbnN0IGNoYXIqIERFRkFVTFRfUFJFRklYOwoKICAgIFVuaWNvZGVTdHJpbmcgcHJlZml4OwoKICAgIGJvb2xfdCB1cHBlcmNhc2U7CgpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgdHJhbnNsaXRlcmF0b3IuCiAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBzdHJpbmcgdGhhdCB3aWxsIHByZWNlZGUgdGhlIGZvdXIgaGV4CiAgICAgKiBkaWdpdHMgZm9yIFVOSUNPREVfSEVYIHRyYW5zbGl0ZXJhdG9ycy4gIElnbm9yZWQKICAgICAqIGlmIGRpcmVjdGlvbiBpcyBIRVhfVU5JQ09ERS4KICAgICAqIEBwYXJhbSB1cHBlcmNhc2UgaWYgdHJ1ZSwgdGhlIGZvdXIgaGV4IGRpZ2l0cyB3aWxsIGJlCiAgICAgKiBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlOyBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGxvd2VyY2FzZS4KICAgICAqIElnbm9yZWQgaWYgZGlyZWN0aW9uIGlzIEhFWF9VTklDT0RFLgogICAgICovCiAgICBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcihjb25zdCBVbmljb2RlU3RyaW5nJiBoZXhQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sX3QgaXNVcHBlcmNhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlRmlsdGVyKiBhZG9wdGVkRmlsdGVyID0gMCk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgdHJhbnNsaXRlcmF0b3Igd2l0aCB0aGUgZGVmYXVsdCBwcmVmaXggIlx1IgogICAgICogdGhhdCBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICovCiAgICBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcihVbmljb2RlRmlsdGVyKiBhZG9wdGVkRmlsdGVyID0gMCk7CgogICAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgICB2aXJ0dWFsIH5Vbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcigpOwoKICAgIC8qKgogICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAqLwogICAgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3IoY29uc3QgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3ImKTsKCiAgICAvKioKICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgKi8KICAgIFVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgVW5pY29kZVRvSGV4VHJhbnNsaXRlcmF0b3ImKTsKCiAgICAvKioKICAgICAqIFRyYW5zbGl0ZXJhdG9yIEFQSS4KICAgICAqLwogICAgdmlydHVhbCBUcmFuc2xpdGVyYXRvciogY2xvbmUodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBwcmVjZWRlcyB0aGUgZm91ciBoZXggZGlnaXRzLgogICAgICogQHJldHVybiBwcmVmaXggc3RyaW5nCiAgICAgKi8KICAgIHZpcnR1YWwgY29uc3QgVW5pY29kZVN0cmluZyYgZ2V0UHJlZml4KHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgc3RyaW5nIHRoYXQgcHJlY2VkZXMgdGhlIGZvdXIgaGV4IGRpZ2l0cy4KICAgICAqCiAgICAgKiA8cD5DYWxsZXJzIG11c3QgdGFrZSBjYXJlIGlmIGEgdHJhbnNsaXRlcmF0b3IgaXMgaW4gdXNlIGJ5CiAgICAgKiBtdWx0aXBsZSB0aHJlYWRzLiAgVGhlIHByZWZpeCBzaG91bGQgbm90IGJlIGNoYW5nZWQgYnkgb25lCiAgICAgKiB0aHJlYWQgd2hpbGUgYW5vdGhlciB0aHJlYWQgbWF5IGJlIHRyYW5zbGl0ZXJhdGluZy4KICAgICAqIEBwYXJhbSBwcmVmaXggcHJlZml4IHN0cmluZwogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlZml4KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHByZWZpeCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2xpdGVyYXRvciBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICovCiAgICB2aXJ0dWFsIGJvb2xfdCBpc1VwcGVyY2FzZSh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFNldHMgaWYgdGhpcyB0cmFuc2xpdGVyYXRvciBvdXRwdXRzIHVwcGVyY2FzZSBoZXggZGlnaXRzLgogICAgICoKICAgICAqIDxwPkNhbGxlcnMgbXVzdCB0YWtlIGNhcmUgaWYgYSB0cmFuc2xpdGVyYXRvciBpcyBpbiB1c2UgYnkKICAgICAqIG11bHRpcGxlIHRocmVhZHMuICBUaGUgdXBwZXJjYXNlIG1vZGUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGJ5CiAgICAgKiBvbmUgdGhyZWFkIHdoaWxlIGFub3RoZXIgdGhyZWFkIG1heSBiZSB0cmFuc2xpdGVyYXRpbmcuCiAgICAgKiBAcGFyYW0gb3V0cHV0VXBwZXJjYXNlIGlmIHRydWUsIHRoZW4gdGhpcyB0cmFuc2xpdGVyYXRvcgogICAgICogb3V0cHV0cyB1cHBlcmNhc2UgaGV4IGRpZ2l0cy4KICAgICAqLwogICAgdmlydHVhbCB2b2lkIHNldFVwcGVyY2FzZShib29sX3Qgb3V0cHV0VXBwZXJjYXNlKTsKCiAgICAvKioKICAgICAqIEltcGxlbWVudHMge0BsaW5rIFRyYW5zbGl0ZXJhdG9yI2hhbmRsZVRyYW5zbGl0ZXJhdGV9LgogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlVHJhbnNsaXRlcmF0ZShSZXBsYWNlYWJsZSYgdGV4dCwgUG9zaXRpb24mIG9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sX3QgaXNJbmNyZW1lbnRhbCkgY29uc3Q7Cgpwcml2YXRlOgoKICAgIHN0YXRpYyBVQ2hhciBIRVhfRElHSVRTWzMyXTsKCiAgICAvKioKICAgICAqIEdpdmVuIGFuIGludGVnZXIsIHJldHVybiBpdHMgbGVhc3Qgc2lnbmlmaWNhbnQgaGV4IGRpZ2l0LgogICAgICovCiAgICBVQ2hhciBpdG9oKGludDMyX3QgaSkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBGb3JtIGVzY2FwZSBzZXF1ZW5jZS4KICAgICAqLwogICAgVW5pY29kZVN0cmluZyYgdG9IZXgoVW5pY29kZVN0cmluZyYgcmVzdWx0LCBVQ2hhciBjKSBjb25zdDsKfTsKCmlubGluZSBVbmljb2RlVG9IZXhUcmFuc2xpdGVyYXRvcjo6flVuaWNvZGVUb0hleFRyYW5zbGl0ZXJhdG9yKCkge30KCiNlbmRpZgo=