LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcwoqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKLyoqCiogRmlsZSBjb2xlaXRyLmgKKgoqIAoqCiogQ3JlYXRlZCBieTogSGVsZW5hIFNoaWgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogIERhdGUgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKgoqICA4LzE4Lzk3ICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLgoqIDA4LzAzLzk4ICAgIGVybSAgICAgICAgIFN5bmNoZWQgd2l0aCAxLjIgdmVyc2lvbiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IuamF2YQoqIDEyLzEwLzk5ICAgIGFsaXUgICAgICAgIFBvcnRlZCBUaGFpIGNvbGxhdGlvbiBzdXBwb3J0IGZyb20gSmF2YS4KKiAwMS8yNS8wMSAgICBzd3F1ZWsgICAgICBNb2RpZmllZCBpbnRvIGEgQysrIHdyYXBwZXIgY2FsbGluZyBDIEFQSXMgKHVjb2xpdGVyLmgpCiogMDIvMTkvMDEgICAgc3dxdWVrICAgICAgUmVtb3ZlZCBDb2xsYXRpb25FbGVtZW50c0l0ZXJhdG9yKCkgc2luY2UgaXQgaXMgCiogICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvciBhbmQgbm8gY2FsbHMgYXJlIG1hZGUgdG8gaXQKKi8KCiNpZm5kZWYgQ09MRUlUUl9ICiNkZWZpbmUgQ09MRUlUUl9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInVuaWNvZGUvdW9iamVjdC5oIgojaW5jbHVkZSAidW5pY29kZS90Ymxjb2xsLmgiCiNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCgp0eXBlZGVmIHN0cnVjdCBVQ29sbGF0aW9uRWxlbWVudHMgVUNvbGxhdGlvbkVsZW1lbnRzOwoKVV9OQU1FU1BBQ0VfQkVHSU4KCi8qKgoqIFRoZSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgY2xhc3MgaXMgdXNlZCBhcyBhbiBpdGVyYXRvciB0byB3YWxrIHRocm91Z2ggICAgIAoqIGVhY2ggY2hhcmFjdGVyIG9mIGFuIGludGVybmF0aW9uYWwgc3RyaW5nLiBVc2UgdGhlIGl0ZXJhdG9yIHRvIHJldHVybiB0aGUKKiBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgcG9zaXRpb25lZCBjaGFyYWN0ZXIuIFRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiBhIAoqIGNoYXJhY3Rlciwgd2hpY2ggd2UgcmVmZXIgdG8gYXMgYSBrZXksIGRlZmluZXMgaG93IGEgY2hhcmFjdGVyIGlzIGNvbGxhdGVkIGluIAoqIHRoZSBnaXZlbiBjb2xsYXRpb24gb2JqZWN0LgoqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGluIFNwYW5pc2g6CiogPHByZT4KKiBcY29kZQoqICAgICAgICAiY2EiIC0+IHRoZSBmaXJzdCBrZXkgaXMga2V5KCdjJykgYW5kIHNlY29uZCBrZXkgaXMga2V5KCdhJykuCiogICAgICAgICJjaGEiIC0+IHRoZSBmaXJzdCBrZXkgaXMga2V5KCdjaCcpIGFuZCBzZWNvbmQga2V5IGlzIGtleSgnYScpLgoqIFxlbmRjb2RlCiogPC9wcmU+CiogQW5kIGluIEdlcm1hbiwKKiA8cHJlPgoqIFxjb2RlCiogICAgICAgICLmYiItPiB0aGUgZmlyc3Qga2V5IGlzIGtleSgnYScpLCB0aGUgc2Vjb25kIGtleSBpcyBrZXkoJ2UnKSwgYW5kCiogICAgICAgIHRoZSB0aGlyZCBrZXkgaXMga2V5KCdiJykuCiogXGVuZGNvZGUKKiA8L3ByZT4KKiBUaGUga2V5IG9mIGEgY2hhcmFjdGVyLCBpcyBhbiBpbnRlZ2VyIGNvbXBvc2VkIG9mIHByaW1hcnkgb3JkZXIoc2hvcnQpLAoqIHNlY29uZGFyeSBvcmRlcihjaGFyKSwgYW5kIHRlcnRpYXJ5IG9yZGVyKGNoYXIpLiBKYXZhIHN0cmljdGx5IGRlZmluZXMgdGhlIAoqIHNpemUgYW5kIHNpZ25lZG5lc3Mgb2YgaXRzIHByaW1pdGl2ZSBkYXRhIHR5cGVzLiBUaGVyZWZvcmUsIHRoZSBzdGF0aWMKKiBmdW5jdGlvbnMgcHJpbWFyeU9yZGVyKCksIHNlY29uZGFyeU9yZGVyKCksIGFuZCB0ZXJ0aWFyeU9yZGVyKCkgcmV0dXJuIAoqIGludDMyX3QgdG8gZW5zdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUga2V5IHZhbHVlLgoqIDxwPkV4YW1wbGUgb2YgdGhlIGl0ZXJhdG9yIHVzYWdlOiAod2l0aG91dCBlcnJvciBjaGVja2luZykKKiA8cHJlPgoqIFxjb2RlCiogICB2b2lkIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcl9FeGFtcGxlKCkKKiAgIHsKKiAgICAgICBVbmljb2RlU3RyaW5nIHN0ciA9ICJUaGlzIGlzIGEgdGVzdCI7CiogICAgICAgVUVycm9yQ29kZSBzdWNjZXNzID0gVV9aRVJPX0VSUk9SOwoqICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yKiByYmMgPQoqICAgICAgICAgICAoUnVsZUJhc2VkQ29sbGF0b3IqKSBSdWxlQmFzZWRDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2Uoc3VjY2Vzcyk7CiogICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKiBjID0KKiAgICAgICAgICAgcmJjLT5jcmVhdGVDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoIHN0ciApOwoqICAgICAgIGludDMyX3Qgb3JkZXIgPSBjLT5uZXh0KHN1Y2Nlc3MpOwoqICAgICAgIGMtPnJlc2V0KCk7CiogICAgICAgb3JkZXIgPSBjLT5wcmV2aW91cyhzdWNjZXNzKTsKKiAgICAgICBkZWxldGUgYzsKKiAgICAgICBkZWxldGUgcmJjOwoqICAgfQoqIFxlbmRjb2RlCiogPC9wcmU+CiogPHA+CiogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpuZXh0IHJldHVybnMgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgbmV4dAoqIGNoYXJhY3RlciBiYXNlZCBvbiB0aGUgY29tcGFyaXNvbiBsZXZlbCBvZiB0aGUgY29sbGF0b3IuIAoqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cHJldmlvdXMgcmV0dXJucyB0aGUgY29sbGF0aW9uIG9yZGVyIG9mIHRoZSAKKiBwcmV2aW91cyBjaGFyYWN0ZXIgYmFzZWQgb24gdGhlIGNvbXBhcmlzb24gbGV2ZWwgb2YgdGhlIGNvbGxhdG9yLiAKKiBUaGUgQ29sbGF0aW9uIEVsZW1lbnQgSXRlcmF0b3IgbW92ZXMgb25seSBpbiBvbmUgZGlyZWN0aW9uIGJldHdlZW4gY2FsbHMgdG8KKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnJlc2V0LiBUaGF0IGlzLCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6Om5leHQoKSAKKiBhbmQgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpwcmV2aW91cyBjYW4gbm90IGJlIGludGVyLXVzZWQuIFdoZW5ldmVyIAoqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cHJldmlvdXMgaXMgdG8gYmUgY2FsbGVkIGFmdGVyIAoqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6bmV4dCgpIG9yIHZpY2UgdmVyc2EsIAoqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cmVzZXQgaGFzIHRvIGJlIGNhbGxlZCBmaXJzdCB0byByZXNldCB0aGUgc3RhdHVzLCAKKiBzaGlmdGluZyBwb2ludGVycyB0byBlaXRoZXIgdGhlIGVuZCBvciB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4gSGVuY2UgYXQgdGhlIAoqIG5leHQgY2FsbCBvZiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByZXZpb3VzIG9yIAoqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6bmV4dCgpLCB0aGUgZmlyc3Qgb3IgbGFzdCBjb2xsYXRpb24gb3JkZXIgd2lsbCBiZSAKKiByZXR1cm5lZC4gCiogSWYgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uIGlzIGRvbmUgd2l0aG91dCBhIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cmVzZXQoKSwgCiogdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCiogVGhlIHJlc3VsdCBvZiBhIGZvcndhcmQgaXRlcmF0ZSAoQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpuZXh0KSBhbmQgCiogcmV2ZXJzZWQgcmVzdWx0IG9mIHRoZSBiYWNrd2FyZCBpdGVyYXRlIChDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByZXZpb3VzKSAKKiBvbiB0aGUgc2FtZSBzdHJpbmcgYXJlIGVxdWl2YWxlbnQsIGlmIGNvbGxhdGlvbiBvcmRlcnMgd2l0aCB0aGUgdmFsdWUgCiogVUNPTF9JR05PUkFCTEUgYXJlIGlnbm9yZWQuCiogQ2hhcmFjdGVyIGJhc2VkIG9uIHRoZSBjb21wYXJpc29uIGxldmVsIG9mIHRoZSBjb2xsYXRvci4gIEEgY29sbGF0aW9uIG9yZGVyIAoqIGNvbnNpc3RzIG9mIHByaW1hcnkgb3JkZXIsIHNlY29uZGFyeSBvcmRlciBhbmQgdGVydGlhcnkgb3JkZXIuICBUaGUgZGF0YSAKKiB0eXBlIG9mIHRoZSBjb2xsYXRpb24gb3JkZXIgaXMgPHN0cm9uZz50X2ludDMyPC9zdHJvbmc+LiAKKgoqIE5vdGUsIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBzaG91bGQgbm90IGJlIHN1YmNsYXNzZWQuCiogQHNlZSAgICAgQ29sbGF0b3IKKiBAc2VlICAgICBSdWxlQmFzZWRDb2xsYXRvcgoqIEB2ZXJzaW9uIDEuOCBKYW4gMTYgMjAwMQoqLwpjbGFzcyBVX0kxOE5fQVBJIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciA6IHB1YmxpYyBVT2JqZWN0IHsKcHVibGljOiAKCiAgLy8gQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHB1YmxpYyBkYXRhIG1lbWJlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgKiBOVUxMT1JERVIgaW5kaWNhdGVzIHRoYXQgYW4gZXJyb3IgaGFzIG9jY3VyZWQgd2hpbGUgcHJvY2Vzc2luZwogICovCiAgc3RhdGljIGludDMyX3QgY29uc3QgTlVMTE9SREVSOwoKICAvLyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgcHVibGljIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAqIENvcHkgY29uc3RydWN0b3IuCiAgKgogICogQHBhcmFtIG90aGVyICAgIHRoZSBvYmplY3QgdG8gYmUgY29waWVkIGZyb20KICAqIEBzdGFibGUKICAqLwogIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKCiAgLyoqIAogICogRGVzdHJ1Y3RvcgogICogQHN0YWJsZQogICovCiAgfkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigpOwogIAogIC8vIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBwdWJsaWMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICogUmV0dXJucyB0cnVlIGlmICJvdGhlciIgaXMgdGhlIHNhbWUgYXMgInRoaXMiCiAgKgogICogQHBhcmFtIG90aGVyICAgIHRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQKICAqIEByZXR1cm4gICAgICAgICB0cnVlIGlmICJvdGhlciIgaXMgdGhlIHNhbWUgYXMgInRoaXMiCiAgKiBAc3RhYmxlCiAgKi8KICBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciYgb3RoZXIpIGNvbnN0OwoKICAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiAib3RoZXIiIGlzIG5vdCB0aGUgc2FtZSBhcyAidGhpcyIuCiAgKgogICogQHBhcmFtIG90aGVyICAgIHRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQKICAqIEByZXR1cm4gICAgICAgICB0cnVlIGlmICJvdGhlciIgaXMgbm90IHRoZSBzYW1lIGFzICJ0aGlzIgogICogQHN0YWJsZQogICovCiAgVUJvb2wgb3BlcmF0b3IhPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdDsKCiAgLyoqCiAgKiBSZXNldHMgdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCiAgKiBAc3RhYmxlCiAgKi8KICB2b2lkIHJlc2V0KHZvaWQpOwogICAgCiAgLyoqCiAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIncyBvcmRlcmluZy4gb3RoZXJ3aXNlIHJldHVybnMgTlVMTE9SREVSIGlmIGFuIAogICogICAgICAgICBlcnJvciBoYXMgb2NjdXJlZCBvciBpZiB0aGUgZW5kIG9mIHN0cmluZyBoYXMgYmVlbiByZWFjaGVkCiAgKiBAc3RhYmxlCiAgKi8KICBpbnQzMl90IG5leHQoVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgLyoqCiAgKiBHZXQgdGhlIG9yZGVyaW5nIHByaW9yaXR5IG9mIHRoZSBwcmV2aW91cyBjb2xsYXRpb24gZWxlbWVudCBpbiB0aGUgc3RyaW5nLgogICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBlbGVtZW50J3Mgb3JkZXJpbmcuIG90aGVyd2lzZSByZXR1cm5zIE5VTExPUkRFUiBpZiBhbiAKICAqICAgICAgICAgZXJyb3IgaGFzIG9jY3VyZWQgb3IgaWYgdGhlIHN0YXJ0IG9mIHN0cmluZyBoYXMgYmVlbiByZWFjaGVkCiAgKiBAc3RhYmxlCiAgKi8KICBpbnQzMl90IHByZXZpb3VzKFVFcnJvckNvZGUmIHN0YXR1cyk7CgogIC8qKgogICogR2V0cyB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAgKiBAcmV0dXJuIHRoZSBwcmltYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICogQHN0YWJsZQogICovCiAgc3RhdGljIGludDMyX3QgcHJpbWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpOwoKICAvKioKICAqIEdldHMgdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAgKiBAcmV0dXJuIHRoZSBzZWNvbmRhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAgKiBAc3RhYmxlCiAgKi8KICBzdGF0aWMgaW50MzJfdCBzZWNvbmRhcnlPcmRlcihpbnQzMl90IG9yZGVyKTsKCiAgLyoqCiAgKiBHZXRzIHRoZSB0ZXJ0aWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAgKiBAcmV0dXJuIHRoZSB0ZXJ0aWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAqIEBzdGFibGUKICAqLwogIHN0YXRpYyBpbnQzMl90IHRlcnRpYXJ5T3JkZXIoaW50MzJfdCBvcmRlcik7CgogIC8qKgogICogUmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgZXhwYW5zaW9uIHNlcXVlbmNlcyB0aGF0IGVuZCB3aXRoIHRoZSAKICAqIHNwZWNpZmllZCBjb21wYXJpc29uIG9yZGVyLgogICogQHBhcmFtIG9yZGVyIGEgY29sbGF0aW9uIG9yZGVyIHJldHVybmVkIGJ5IHByZXZpb3VzIG9yIG5leHQuCiAgKiBAcmV0dXJuIG1heGltdW0gc2l6ZSBvZiB0aGUgZXhwYW5zaW9uIHNlcXVlbmNlcyBlbmRpbmcgd2l0aCB0aGUgY29sbGF0aW9uIAogICogICAgICAgICBlbGVtZW50IG9yIDEgaWYgY29sbGF0aW9uIGVsZW1lbnQgZG9lcyBub3Qgb2NjdXIgYXQgdGhlIGVuZCBvZiBhbnkgCiAgKiAgICAgICAgIGV4cGFuc2lvbiBzZXF1ZW5jZQogICogQHN0YWJsZQogICovCiAgaW50MzJfdCBnZXRNYXhFeHBhbnNpb24oaW50MzJfdCBvcmRlcikgY29uc3Q7CgogIC8qKgogICogR2V0cyB0aGUgY29tcGFyaXNvbiBvcmRlciBpbiB0aGUgZGVzaXJlZCBzdHJlbmd0aC4gSWdub3JlIHRoZSBvdGhlcgogICogZGlmZmVyZW5jZXMuCiAgKiBAcGFyYW0gb3JkZXIgVGhlIG9yZGVyIHZhbHVlCiAgKiBAc3RhYmxlCiAgKi8KICBpbnQzMl90IHN0cmVuZ3RoT3JkZXIoaW50MzJfdCBvcmRlcikgY29uc3Q7CgogIC8qKgogICogU2V0cyB0aGUgc291cmNlIHN0cmluZy4KICAqIEBwYXJhbSBzdHIgdGhlIHNvdXJjZSBzdHJpbmcuCiAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEBzdGFibGUKICAqLwogIHZvaWQgc2V0VGV4dChjb25zdCBVbmljb2RlU3RyaW5nJiBzdHIsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogIC8qKgogICogU2V0cyB0aGUgc291cmNlIHN0cmluZy4KICAqIEBwYXJhbSBzdHIgdGhlIHNvdXJjZSBjaGFyYWN0ZXIgaXRlcmF0b3IuCiAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEBzdGFibGUKICAqLwogIHZvaWQgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciYgc3RyLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAvKioKICAqIENoZWNrcyBpZiBhIGNvbXBhcmlzb24gb3JkZXIgaXMgaWdub3JhYmxlLgogICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIuCiAgKiBAcmV0dXJuIFRSVUUgaWYgYSBjaGFyYWN0ZXIgaXMgaWdub3JhYmxlLCBGQUxTRSBvdGhlcndpc2UuCiAgKiBAc3RhYmxlCiAgKi8KICBzdGF0aWMgVUJvb2wgaXNJZ25vcmFibGUoaW50MzJfdCBvcmRlcik7CgogIC8qKgogICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIHN0cmluZy4KICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyLgogICogQHN0YWJsZQogICovCiAgaW50MzJfdCBnZXRPZmZzZXQodm9pZCkgY29uc3Q7CgogIC8qKgogICogU2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIHN0cmluZy4KICAqIEBwYXJhbSBuZXdPZmZzZXQgdGhlIG5ldyBvZmZzZXQuCiAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgY2hhcmFjdGVyLgogICogQHN0YWJsZQogICovCiAgdm9pZCBzZXRPZmZzZXQoaW50MzJfdCBuZXdPZmZzZXQsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogIC8qKgogICAqIElDVSAicG9vciBtYW4ncyBSVFRJIiwgcmV0dXJucyBhIFVDbGFzc0lEIGZvciB0aGUgYWN0dWFsIGNsYXNzLgogICAqCiAgICogQGRyYWZ0IElDVSAyLjIKICAgKi8KICB2aXJ0dWFsIGlubGluZSBVQ2xhc3NJRCBnZXREeW5hbWljQ2xhc3NJRCgpIGNvbnN0IHsgcmV0dXJuIGdldFN0YXRpY0NsYXNzSUQoKTsgfQoKICAvKioKICAgKiBJQ1UgInBvb3IgbWFuJ3MgUlRUSSIsIHJldHVybnMgYSBVQ2xhc3NJRCBmb3IgdGhpcyBjbGFzcy4KICAgKgogICAqIEBkcmFmdCBJQ1UgMi4yCiAgICovCiAgc3RhdGljIGlubGluZSBVQ2xhc3NJRCBnZXRTdGF0aWNDbGFzc0lEKCkgeyByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IH0KCnByb3RlY3RlZDoKICAKICAvLyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBmcmllbmQgY2xhc3MgUnVsZUJhc2VkQ29sbGF0b3I7CgogIC8qKgogICogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNvbnN0cnVjdG9yLiBUaGlzIHRha2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCB0aGUgCiAgKiBjb2xsYXRpb24gb2JqZWN0LiBUaGUgY3Vyc29yIHdpbGwgd2FsayB0aHJ1IHRoZSBzb3VyY2Ugc3RyaW5nIGJhc2VkIG9uIHRoZSAKICAqIHByZWRlZmluZWQgY29sbGF0aW9uIHJ1bGVzLiBJZiB0aGUgc291cmNlIHN0cmluZyBpcyBlbXB0eSwgTlVMTE9SREVSIHdpbGwgCiAgKiBiZSByZXR1cm5lZCBvbiB0aGUgY2FsbHMgdG8gbmV4dCgpLgogICogQHBhcmFtIHNvdXJjZVRleHQgICAgdGhlIHNvdXJjZSBzdHJpbmcuCiAgKiBAcGFyYW0gb3JkZXIgICAgICAgICB0aGUgY29sbGF0aW9uIG9iamVjdC4KICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAqLwogIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihjb25zdCBVbmljb2RlU3RyaW5nJiBzb3VyY2VUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdWxlQmFzZWRDb2xsYXRvciogb3JkZXIsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogIC8qKgogICogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNvbnN0cnVjdG9yLiBUaGlzIHRha2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCB0aGUgCiAgKiBjb2xsYXRpb24gb2JqZWN0LiAgVGhlIGN1cnNvciB3aWxsIHdhbGsgdGhydSB0aGUgc291cmNlIHN0cmluZyBiYXNlZCBvbiB0aGUgCiAgKiBwcmVkZWZpbmVkIGNvbGxhdGlvbiBydWxlcy4gIElmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIGVtcHR5LCBOVUxMT1JERVIgd2lsbCAKICAqIGJlIHJldHVybmVkIG9uIHRoZSBjYWxscyB0byBuZXh0KCkuCiAgKiBAcGFyYW0gc291cmNlVGV4dCAgICB0aGUgc291cmNlIHN0cmluZy4KICAqIEBwYXJhbSBvcmRlciAgICAgICAgIHRoZSBjb2xsYXRpb24gb2JqZWN0LgogICogQHBhcmFtIHN0YXR1cyAgICAgICAgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICovCiAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKGNvbnN0IENoYXJhY3Rlckl0ZXJhdG9yJiBzb3VyY2VUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdWxlQmFzZWRDb2xsYXRvciogb3JkZXIsIFVFcnJvckNvZGUmIHN0YXR1cyk7CiAgCiAgLy8gQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHByb3RlY3RlZCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLyoqCiAgKiBBc3NpZ25tZW50IG9wZXJhdG9yCiAgKgogICogQHBhcmFtIG90aGVyICAgIHRoZSBvYmplY3QgdG8gYmUgY29waWVkCiAgKi8KICBjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKCnByaXZhdGU6CgogIC8vIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBwcml2YXRlIGRhdGEgbWVtYmVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICogRGF0YSB3cmFwcGVyIGZvciBjb2xsYXRpb24gZWxlbWVudHMKICAqLwogIFVDb2xsYXRpb25FbGVtZW50cyAqbV9kYXRhXzsKCiAgLyoqCiAgKiBJbmRpY2F0ZXMgaWYgbV9kYXRhXyBiZWxvbmdzIHRvIHRoaXMgb2JqZWN0LgogICovCiAgVUJvb2wgaXNEYXRhT3duZWRfOwoKICAvKioKICAgKiBUaGUgYWRkcmVzcyBvZiB0aGlzIHN0YXRpYyBjbGFzcyB2YXJpYWJsZSBzZXJ2ZXMgYXMgdGhpcyBjbGFzcydzIElECiAgICogZm9yIElDVSAicG9vciBtYW4ncyBSVFRJIi4KICAgKi8KICBzdGF0aWMgY29uc3QgY2hhciBmZ0NsYXNzSUQ7Cn07CgovLyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgaW5saW5lIG1ldGhvZCBkZWZpbmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKKiBHZXQgdGhlIHByaW1hcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKKiBAcmV0dXJuIHRoZSBwcmltYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgoqLwppbmxpbmUgaW50MzJfdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByaW1hcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgb3JkZXIgJj0gUnVsZUJhc2VkQ29sbGF0b3I6OlBSSU1BUllPUkRFUk1BU0s7CiAgcmV0dXJuIChvcmRlciA+PiBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWU9SREVSU0hJRlQpOwp9CgovKioKKiBHZXQgdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgoqIEByZXR1cm4gdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KKi8KaW5saW5lIGludDMyX3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpzZWNvbmRhcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgb3JkZXIgPSBvcmRlciAmIFJ1bGVCYXNlZENvbGxhdG9yOjpTRUNPTkRBUllPUkRFUk1BU0s7CiAgcmV0dXJuIChvcmRlciA+PiBSdWxlQmFzZWRDb2xsYXRvcjo6U0VDT05EQVJZT1JERVJTSElGVCk7Cn0KCi8qKgoqIEdldCB0aGUgdGVydGlhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKKiBAcmV0dXJuIHRoZSB0ZXJ0aWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KKi8KaW5saW5lIGludDMyX3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjp0ZXJ0aWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpCnsKICByZXR1cm4gKG9yZGVyICY9IFJ1bGVCYXNlZENvbGxhdG9yOjpURVJUSUFSWU9SREVSTUFTSyk7Cn0KCmlubGluZSBpbnQzMl90IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6Z2V0TWF4RXhwYW5zaW9uKGludDMyX3Qgb3JkZXIpIGNvbnN0CnsKICByZXR1cm4gdWNvbF9nZXRNYXhFeHBhbnNpb24obV9kYXRhXywgKHVpbnQzMl90KW9yZGVyKTsKfQoKaW5saW5lIFVCb29sIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6aXNJZ25vcmFibGUoaW50MzJfdCBvcmRlcikKewogIHJldHVybiAocHJpbWFyeU9yZGVyKG9yZGVyKSA9PSBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUlHTk9SQUJMRSk7Cn0KClVfTkFNRVNQQUNFX0VORAoKI2VuZGlmCg==