LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBGT1JNQVQuSAoqCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwMi8xOS85NyAgICBhbGl1ICAgICAgICBDb252ZXJ0ZWQgZnJvbSBqYXZhLgoqICAgMDMvMTcvOTcgICAgY2xodWFuZyAgICAgVXBkYXRlZCBwZXIgQysrIGltcGxlbWVudGF0aW9uLgoqICAgMDMvMjcvOTcgICAgaGVsZW5hICAgICAgVXBkYXRlZCB0byBwYXNzIHRoZSBzaW1wbGUgdGVzdCBhZnRlciBjb2RlIHJldmlldy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgamF2YSBzb3VyY2UgZmlsZSBGb3JtYXQuamF2YQovLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiNpZm5kZWYgRk9STUFUX0gKI2RlZmluZSBGT1JNQVRfSAogCgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCiNpbmNsdWRlICJ1bmljb2RlL2ZtdGFibGUuaCIKI2luY2x1ZGUgInVuaWNvZGUvZmllbGRwb3MuaCIKI2luY2x1ZGUgInVuaWNvZGUvcGFyc2Vwb3MuaCIKCi8qKiAKICogQmFzZSBjbGFzcyBmb3IgYWxsIGZvcm1hdHMuICBUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3Mgd2hpY2gKICogc3BlY2lmaWVzIHRoZSBwcm90b2NvbCBmb3IgY2xhc3NlcyB3aGljaCBjb252ZXJ0IG90aGVyIG9iamVjdHMgb3IKICogdmFsdWVzLCBzdWNoIGFzIG51bWVyaWMgdmFsdWVzIGFuZCBkYXRlcywgYW5kIHRoZWlyIHN0cmluZwogKiByZXByZXNlbnRhdGlvbnMuICBJbiBzb21lIGNhc2VzIHRoZXNlIHJlcHJlc2VudGF0aW9ucyBtYXkgYmUKICogbG9jYWxpemVkIG9yIGNvbnRhaW4gbG9jYWxpemVkIGNoYXJhY3RlcnMgb3Igc3RyaW5ncy4gIEZvciBleGFtcGxlLAogKiBhIG51bWVyaWMgZm9ybWF0dGVyIHN1Y2ggYXMgRGVjaW1hbEZvcm1hdCBtYXkgY29udmVydCBhIG51bWVyaWMKICogdmFsdWUgc3VjaCBhcyAxMjM0NSB0byB0aGUgc3RyaW5nICIkMTIsMzQ1Ii4gIEl0IG1heSBhbHNvIHBhcnNlCiAqIHRoZSBzdHJpbmcgYmFjayBpbnRvIGEgbnVtZXJpYyB2YWx1ZS4gIEEgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZXIKICogbGlrZSBTaW1wbGVEYXRlRm9ybWF0IG1heSByZXByZXNlbnQgYSBzcGVjaWZpYyBkYXRlLCBlbmNvZGVkCiAqIG51bWVyaWNhbGx5LCBhcyBhIHN0cmluZyBzdWNoIGFzICJXZWRuZXNkYXksIEZlYnJ1YXJ5IDI2LCAxOTk3IEFEIi4KICogPFA+CiAqIE1hbnkgb2YgdGhlIGNvbmNyZXRlIHN1YmNsYXNzZXMgb2YgRm9ybWF0IGVtcGxveSB0aGUgbm90aW9uIG9mCiAqIGEgcGF0dGVybi4gIEEgcGF0dGVybiBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcnVsZXMgd2hpY2gKICogZ292ZXJuIHRoZSBpbnRlcmNvbnZlcnNpb24gYmV0d2VlbiB2YWx1ZXMgYW5kIHN0cmluZ3MuICBGb3IgZXhhbXBsZSwKICogYSBEZWNpbWFsRm9ybWF0IG9iamVjdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXR0ZXJuCiAqICIkIywjIzAuMDA7KCQjLCMjMC4wMCkiLCB3aGljaCBpcyBhIGNvbW1vbiBVUyBFbmdsaXNoIGZvcm1hdCBmb3IKICogY3VycmVuY3kgdmFsdWVzLCB5aWVsZGluZyBzdHJpbmdzIHN1Y2ggYXMgIiQxLDIzNC40NSIgZm9yIDEyMzQuNDUsCiAqIGFuZCAiKCQ5ODcuNjUpIiBmb3IgOTg3LjY1NDMuICBUaGUgc3BlY2lmaWMgc3ludGF4IG9mIGEgcGF0dGVybgogKiBpcyBkZWZpbmVkIGJ5IGVhY2ggc3ViY2xhc3MuCiAqIDxQPgogKiBFdmVuIHRob3VnaCBtYW55IHN1YmNsYXNzZXMgdXNlIHBhdHRlcm5zLCB0aGUgbm90aW9uIG9mIGEgcGF0dGVybgogKiBpcyBub3QgaW5oZXJlbnQgdG8gRm9ybWF0IGNsYXNzZXMgaW4gZ2VuZXJhbCwgYW5kIGlzIG5vdCBwYXJ0IG9mCiAqIHRoZSBleHBsaWNpdCBiYXNlIGNsYXNzIHByb3RvY29sLgogKiA8UD4KICogVHdvIGNvbXBsZXggZm9ybWF0dGluZyBjbGFzc2VzIGJlYXIgbWVudGlvbmluZy4gIFRoZXNlIGFyZQogKiBNZXNzYWdlRm9ybWF0IGFuZCBDaG9pY2VGb3JtYXQuICBDaG9pY2VGb3JtYXQgaXMgYSBzdWJjbGFzcyBvZgogKiBOdW1iZXJGb3JtYXQgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGZvcm1hdCBkaWZmZXJlbnQgbnVtYmVyIHJhbmdlcwogKiBhcyBzdHJpbmdzLiAgRm9yIGluc3RhbmNlLCAwIG1heSBiZSByZXByZXNlbnRlZCBhcyAibm8gZmlsZXMiLCAxIGFzCiAqICJvbmUgZmlsZSIsIGFuZCBhbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiAxIGFzICJtYW55IGZpbGVzIi4KICogTWVzc2FnZUZvcm1hdCBpcyBhIGZvcm1hdHRlciB3aGljaCB1dGlsaXplcyBvdGhlciBGb3JtYXQgb2JqZWN0cyB0bwogKiBmb3JtYXQgYSBzdHJpbmcgY29udGFpbmluZyB3aXRoIG11bHRpcGxlIHZhbHVlcy4gIEZvciBpbnN0YW5jZSwKICogQSBNZXNzYWdlRm9ybWF0IG9iamVjdCBtaWdodCBwcm9kdWNlIHRoZSBzdHJpbmcgIlRoZXJlIGFyZSBubyBmaWxlcwogKiBvbiB0aGUgZGlzayBNeURpc2sgb24gRmVicnVhcnkgMjcsIDE5OTcuIiBnaXZlbiB0aGUgYXJndW1lbnRzIDAsCiAqICJNeURpc2siLCBhbmQgdGhlIGRhdGUgdmFsdWUgb2YgMi8yNy85Ny4gIFNlZSB0aGUgQ2hvaWNlRm9ybWF0CiAqIGFuZCBNZXNzYWdlRm9ybWF0IGhlYWRlcnMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCiAqIDxQPgogKiBJZiBmb3JtYXR0aW5nIGlzIHVuc3VjY2Vzc2Z1bCwgYSBmYWlsaW5nIFVFcnJvckNvZGUgaXMgcmV0dXJuZWQgd2hlbgogKiB0aGUgRm9ybWF0IGNhbm5vdCBmb3JtYXQgdGhlIHR5cGUgb2Ygb2JqZWN0LCBvdGhlcndpc2UgaWYgdGhlcmUgaXMKICogc29tZXRoaW5nIGlsbGZvcm1lZCBhYm91dCB0aGUgdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCiAqIDB4RkZGRCBpcyByZXR1cm5lZC4KICogPFA+CiAqIElmIHRoZXJlIGlzIG5vIG1hdGNoIHdoZW4gcGFyc2luZywgYSBwYXJzZSBmYWlsdXJlIFVFcnJvckNvZGUgaXMKICogcmV0dXJlZCBmb3IgbWV0aG9kcyB3aGljaCB0YWtlIG5vIFBhcnNlUG9zaXRpb24uICBGb3IgdGhlIG1ldGhvZAogKiB0aGF0IHRha2VzIGEgUGFyc2VQb3NpdGlvbiwgdGhlIGluZGV4IHBhcmFtZXRlciBpcyBsZWZ0IHVuY2hhbmdlZC4KICogPFA+CiAqIFtTdWJjbGFzc2luZy5dIEFsbCBiYXNlIGNsYXNzZXMgdGhhdCBwcm92aWRlIHN0YXRpYyBmdW5jdGlvbnMgdGhhdAogKiBjcmVhdGUgb2JqZWN0cyBmb3IgTG9jYWxlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHN0YXRpYzoKICogPHByZT4KICogLiAgICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgTG9jYWxlKiBnZXRBdmFpbGFibGVMb2NhbGVzKGxvbmcmKQogKiA8L3ByZT4KICovCmNsYXNzIFVfSTE4Tl9BUEkgRm9ybWF0IHsKcHVibGljOgoKICAgIHZpcnR1YWwgfkZvcm1hdCgpOwoKICAgIC8qKgogICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIEZvcm1hdCBvYmplY3RzIGFyZSBzZW1hbnRpY2FsbHkgZXF1YWwuCiAgICAgKiBPYmplY3RzIG9mIGRpZmZlcmVudCBzdWJjbGFzc2VzIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgVUJvb2wgb3BlcmF0b3I9PShjb25zdCBGb3JtYXQmIG90aGVyKSBjb25zdCA9IDA7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gRm9ybWF0IG9iamVjdHMgYXJlIG5vdCBzZW1hbnRpY2FsbHkKICAgICAqIGVxdWFsLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBVQm9vbCBvcGVyYXRvciE9KGNvbnN0IEZvcm1hdCYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQoKICAgIC8qKgogICAgICogQ2xvbmUgdGhpcyBvYmplY3QgcG9seW1vcnBoaWNhbGx5LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQogICAgICogZm9yIGRlbGV0aW5nIHRoZSByZXN1bHQgd2hlbiBkb25lLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIEZvcm1hdCogY2xvbmUoKSBjb25zdCA9IDA7CgogICAgLyoqCiAgICAgKiBGb3JtYXRzIGFuIG9iamVjdCB0byBwcm9kdWNlIGEgc3RyaW5nLgogICAgICoKICAgICAqIEBwYXJhbSBvYmogICAgICAgVGhlIG9iamVjdCB0byBmb3JtYXQuCiAgICAgKiBAcGFyYW0gcmVzdWx0ICAgIE91dHB1dCBwYXJhbWV0ZXIgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkIHN0cmluZy4KICAgICAqIEBwYXJhbSBzdGF0dXMgICAgT3V0cHV0IHBhcmFtZXRlciBmaWxsZWQgaW4gd2l0aCBzdWNjZXNzIG9yIGZhaWx1cmUgc3RhdHVzLgogICAgICogQHJldHVybiAgICAgICAgICBSZWZlcmVuY2UgdG8gJ3Jlc3VsdCcgcGFyYW1ldGVyLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBVbmljb2RlU3RyaW5nJiBmb3JtYXQoY29uc3QgRm9ybWF0dGFibGUmIG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiByZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCiAgICAvKioKICAgICAqIEZvcm1hdCBhbiBvYmplY3QgdG8gcHJvZHVjZSBhIHN0cmluZy4gIFRoaXMgaXMgYSBwdXJlIHZpcnR1YWwgbWV0aG9kIHdoaWNoCiAgICAgKiBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LiBUaGlzIG1ldGhvZCBhbGxvd3MgcG9seW1vcnBoaWMgZm9ybWF0dGluZwogICAgICogb2YgRm9ybWF0dGFibGUgb2JqZWN0cy4gSWYgYSBzdWJjbGFzcyBvZiBGb3JtYXQgcmVjZWl2ZXMgYSBGb3JtYXR0YWJsZQogICAgICogb2JqZWN0IHR5cGUgaXQgZG9lc24ndCBoYW5kbGUgKGUuZy4sIGlmIGEgbnVtZXJpYyBGb3JtYXR0YWJsZSBpcyBwYXNzZWQKICAgICAqIHRvIGEgRGF0ZUZvcm1hdCBvYmplY3QpIHRoZW4gaXQgcmV0dXJucyBhIGZhaWxpbmcgVUVycm9yQ29kZS4KICAgICAqCiAgICAgKiBAcGFyYW0gb2JqICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGZvcm1hdC4KICAgICAqIEBwYXJhbSB0b0FwcGVuZFRvICAgIFdoZXJlIHRoZSB0ZXh0IGlzIHRvIGJlIGFwcGVuZGVkLgogICAgICogQHBhcmFtIHBvcyAgICAgICAgICAgT24gaW5wdXQ6IGFuIGFsaWdubWVudCBmaWVsZCwgaWYgZGVzaXJlZC4KICAgICAqICAgICAgICAgICAgICAgICAgICAgIE9uIG91dHB1dDogdGhlIG9mZnNldHMgb2YgdGhlIGFsaWdubWVudCBmaWVsZC4KICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIE91dHB1dCBwYXJhbSBmaWxsZWQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLgogICAgICogQHJldHVybiAgICAgICAgICAgICAgVGhlIHZhbHVlIHBhc3NlZCBpbiBhcyB0b0FwcGVuZFRvICh0aGlzIGFsbG93cyBjaGFpbmluZywKICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFzIHdpdGggVW5pY29kZVN0cmluZzo6YXBwZW5kKCkpCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgVW5pY29kZVN0cmluZyYgZm9ybWF0KGNvbnN0IEZvcm1hdHRhYmxlJiBvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nJiB0b0FwcGVuZFRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRQb3NpdGlvbiYgcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdCA9IDA7CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIHN0cmluZyB0byBwcm9kdWNlIGFuIG9iamVjdC4gIFRoaXMgaXMgYSBwdXJlIHZpcnR1YWwKICAgICAqIG1ldGhvZCB3aGljaCBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LiAgVGhpcyBtZXRob2QgYWxsb3dzCiAgICAgKiBwb2x5bW9ycGhpYyBwYXJzaW5nIG9mIHN0cmluZ3MgaW50byBGb3JtYXR0YWJsZSBvYmplY3RzLgogICAgICogPFA+CiAgICAgKiBCZWZvcmUgY2FsbGluZywgc2V0IHBhcnNlX3Bvcy5pbmRleCB0byB0aGUgb2Zmc2V0IHlvdSB3YW50IHRvCiAgICAgKiBzdGFydCBwYXJzaW5nIGF0IGluIHRoZSBzb3VyY2UuICBBZnRlciBjYWxsaW5nLCBwYXJzZV9wb3MuaW5kZXgKICAgICAqIGlzIHRoZSBlbmQgb2YgdGhlIHRleHQgeW91IHBhcnNlZC4gIElmIGVycm9yIG9jY3VycywgaW5kZXggaXMKICAgICAqIHVuY2hhbmdlZC4KICAgICAqIDxQPgogICAgICogV2hlbiBwYXJzaW5nLCBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgZGlzY2FyZGVkICh3aXRoIHN1Y2Nlc3NmdWwKICAgICAqIHBhcnNlKSwgd2hpbGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBsZWZ0IGFzIGlzLgogICAgICogPFA+CiAgICAgKiBFeGFtcGxlOgogICAgICogPFA+CiAgICAgKiBQYXJzaW5nICJfMTJfeHkiICh3aGVyZSBfIHJlcHJlc2VudHMgYSBzcGFjZSkgZm9yIGEgbnVtYmVyLAogICAgICogd2l0aCBpbmRleCA9PSAwIHdpbGwgcmVzdWx0IGluIHRoZSBudW1iZXIgMTIsIHdpdGgKICAgICAqIHBhcnNlX3Bvcy5pbmRleCB1cGRhdGVkIHRvIDMgKGp1c3QgYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UpLgogICAgICogUGFyc2luZyBhIHNlY29uZCB0aW1lIHdpbGwgcmVzdWx0IGluIGEgZmFpbGluZyBVRXJyb3JDb2RlIHNpbmNlCiAgICAgKiAieHkiIGlzIG5vdCBhIG51bWJlciwgYW5kIGxlYXZlIGluZGV4IGF0IDMuCiAgICAgKiA8UD4KICAgICAqIFN1YmNsYXNzZXMgd2lsbCB0eXBpY2FsbHkgc3VwcGx5IHNwZWNpZmljIHBhcnNlIG1ldGhvZHMgdGhhdAogICAgICogcmV0dXJuIGRpZmZlcmVudCB0eXBlcyBvZiB2YWx1ZXMuIFNpbmNlIG1ldGhvZHMgY2FuJ3Qgb3ZlcmxvYWQKICAgICAqIG9uIHJldHVybiB0eXBlcywgdGhlc2Ugd2lsbCB0eXBpY2FsbHkgYmUgbmFtZWQgInBhcnNlIiwgd2hpbGUKICAgICAqIHRoaXMgcG9seW1vcnBoaWMgbWV0aG9kIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBwYXJzZU9iamVjdC4gIEFueQogICAgICogcGFyc2UgbWV0aG9kIHRoYXQgZG9lcyBub3QgdGFrZSBhIHBhcnNlX3BvcyBzaG91bGQgc2V0IHN0YXR1cwogICAgICogdG8gYW4gZXJyb3IgdmFsdWUgd2hlbiBubyB0ZXh0IGluIHRoZSByZXF1aXJlZCBmb3JtYXQgaXMgYXQgdGhlCiAgICAgKiBzdGFydCBwb3NpdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gc291cmNlICAgIFRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkIGludG8gYW4gb2JqZWN0LgogICAgICogQHBhcmFtIHJlc3VsdCAgICBGb3JtYXR0YWJsZSB0byBiZSBzZXQgdG8gdGhlIHBhcnNlIHJlc3VsdC4KICAgICAqICAgICAgICAgICAgICAgICAgSWYgcGFyc2UgZmFpbHMsIHJldHVybiBjb250ZW50cyBhcmUgdW5kZWZpbmVkLgogICAgICogQHBhcmFtIHBhcnNlX3BvcyBUaGUgcG9zaXRpb24gdG8gc3RhcnQgcGFyc2luZyBhdC4gVXBvbiByZXR1cm4KICAgICAqICAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbSBpcyBzZXQgdG8gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZQogICAgICogICAgICAgICAgICAgICAgICBsYXN0IGNoYXJhY3RlciBzdWNjZXNzZnVsbHkgcGFyc2VkLiBJZiB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgc291cmNlIGlzIG5vdCBwYXJzZWQgc3VjY2Vzc2Z1bGx5LCB0aGlzIHBhcmFtCiAgICAgKiAgICAgICAgICAgICAgICAgIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCB2b2lkIHBhcnNlT2JqZWN0KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0YWJsZSYgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlUG9zaXRpb24mIHBhcnNlX3BvcykgY29uc3QgPSAwOwoKICAgIC8qKgogICAgICogUGFyc2VzIGEgc3RyaW5nIHRvIHByb2R1Y2UgYW4gb2JqZWN0LiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kCiAgICAgKiB3aGljaCBjYWxscyB0aGUgcHVyZSB2aXJ0dWFsIHBhcnNlT2JqZWN0KCkgbWV0aG9kLCBhbmQgcmV0dXJucyBhCiAgICAgKiBmYWlsdXJlIFVFcnJvckNvZGUgaWYgdGhlIFBhcnNlUG9zaXRpb24gaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgKgogICAgICogQHBhcmFtIHNvdXJjZSAgICBUaGUgc3RyaW5nIHRvIGJlIHBhcnNlZCBpbnRvIGFuIG9iamVjdC4KICAgICAqIEBwYXJhbSByZXN1bHQgICAgRm9ybWF0dGFibGUgdG8gYmUgc2V0IHRvIHRoZSBwYXJzZSByZXN1bHQuCiAgICAgKiAgICAgICAgICAgICAgICAgIElmIHBhcnNlIGZhaWxzLCByZXR1cm4gY29udGVudHMgYXJlIHVuZGVmaW5lZC4KICAgICAqIEBwYXJhbSBzdGF0dXMgICAgT3V0cHV0IHBhcmFtIHRvIGJlIGZpbGxlZCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZQogICAgICogICAgICAgICAgICAgICAgICByZXN1bHQgY29kZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBwYXJzZU9iamVjdChjb25zdCBVbmljb2RlU3RyaW5nJiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRhYmxlJiByZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIGNsYXNzIElEIFBPTFlNT1JQSElDQUxMWS4gIFB1cmUgdmlydHVhbCBtZXRob2QuCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBpbXBsZW1lbnQgYSBzaW1wbGUgdmVyc2lvbiBvZiBSVFRJLCBzaW5jZSBub3QgYWxsCiAgICAgKiBDKysgY29tcGlsZXJzIHN1cHBvcnQgZ2VudWluZSBSVFRJLiAgUG9seW1vcnBoaWMgb3BlcmF0b3I9PSgpIGFuZAogICAgICogY2xvbmUoKSBtZXRob2RzIGNhbGwgdGhpcyBtZXRob2QuCiAgICAgKiA8UD4KICAgICAqIENvbmNyZXRlIHN1YmNsYXNzZXMgb2YgRm9ybWF0IG11c3QgaW1wbGVtZW50IGdldER5bmFtaWNDbGFzc0lEKCkKICAgICAqIGFuZCBhbHNvIGEgc3RhdGljIG1ldGhvZCBhbmQgZGF0YSBtZW1iZXI6CiAgICAgKgogICAgICogICAgICBzdGF0aWMgVUNsYXNzSUQgZ2V0U3RhdGljQ2xhc3NJRCgpIHsgcmV0dXJuIChVQ2xhc3NJRCkmZmdDbGFzc0lEOyB9CiAgICAgKiAgICAgIHN0YXRpYyBjaGFyIGZnQ2xhc3NJRDsKICAgICAqCiAgICAgKiBAcmV0dXJuICAgICAgICAgIFRoZSBjbGFzcyBJRCBmb3IgdGhpcyBvYmplY3QuIEFsbCBvYmplY3RzIG9mIGEKICAgICAqICAgICAgICAgICAgICAgICAgZ2l2ZW4gY2xhc3MgaGF2ZSB0aGUgc2FtZSBjbGFzcyBJRC4gIE9iamVjdHMgb2YKICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXIgY2xhc3NlcyBoYXZlIGRpZmZlcmVudCBjbGFzcyBJRHMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgVUNsYXNzSUQgZ2V0RHluYW1pY0NsYXNzSUQoKSBjb25zdCA9IDA7Cgpwcm90ZWN0ZWQ6CiAgICAvKioKICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIHN1YmNsYXNzIHVzZSBvbmx5LiAgRG9lcyBub3RoaW5nLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBGb3JtYXQoKTsKCiAgICAvKioKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgRm9ybWF0KGNvbnN0IEZvcm1hdCYpOyAvLyBEb2VzIG5vdGhpbmc7IGZvciBzdWJjbGFzc2VzIG9ubHkKCiAgICAvKioKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgRm9ybWF0JiBvcGVyYXRvcj0oY29uc3QgRm9ybWF0Jik7IC8vIERvZXMgbm90aGluZzsgZm9yIHN1YmNsYXNzZXMKfTsKCiNlbmRpZiAvLyBfRk9STUFUCi8vZW9mCg==