LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSB0Y29sZGF0YS5oCi8vCi8vIEludGVybmFsIGZpbGUuICBEZWZpbmVzIFRhYmxlQ29sbGF0aW9uRGF0YSwgYW4gaW50ZXJuYWwgY2xhc3Mgd2hpY2ggaXMgc2hhcmVkCi8vIGJ5IFRhYmxlQ29sbGF0aW9uIG9iamVjdHMsIGFuZCB3aGljaCBjb250YWlucyBhbGwgdGhlIGludmFyaWFudCAoYW5kIGxhcmdlKQovLyBwaWVjZXMgb2YgZGF0YS4gIE9uY2UgY3JlYXRlZCwgVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdHMgZG8gbm90IGNoYW5nZS4KLy8KLy8gQ3JlYXRlZCBieTogQWxhbiBMaXUKLy8KLy8gTW9kaWZpY2F0aW9uIEhpc3Rvcnk6Ci8vCi8vICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgovLyAgMi81Lzk3ICAgICAgYWxpdSAgICAgICAgQ3JlYXRpb24uCi8vICAzLzUvOTcgICAgICBhbGl1ICAgICAgICBEb24ndCBzdHJlYW0gcnVsZSB0YWJsZSBpbiBvciBvdXQuICBBZGRlZCBkYXRhIG1lbWJlcnMKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlzUnVsZVRhYmxlTG9hZGVkLCBkZXNpcmVkTG9jYWxlLCBhbmQgcmVhbExvY2FsZU5hbWUsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgcmVxdWlyZWQgZm9yIGR5bmFtaWMgcmVsb2FkaW5nIG9mIHRoZSBydWxlCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuICBXZSBzdGlsbCBrZWVwIHJ1bGVzIGluIHRoaXMgb2JqZWN0IHNvIHRoYXQKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY2FuIGJlIGhlbGQgaW4gdGhlIGluLW1lbW9yeSBjYWNoZS4KLy8gIDMvMjYvOTcgICAgIGhlbGVuYSAgICAgIFVwZGF0ZWQgd2l0aCBwbGF0Zm9ybSBpbmRlcGVuZGVudCBkYXRhIHR5cGVzLgovLyAgNi8yMC85NyAgICAgaGVsZW5hICAgICAgSmF2YSBjbGFzcyBuYW1lIGNoYW5nZS4KLy8gIDgvMTgvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgVENPTERBVEFfSAojZGVmaW5lIFRDT0xEQVRBX0gKCiNpbmNsdWRlICJ1bmljb2RlL3Vjb2wuaCIKCiNpbmNsdWRlICJ1Y21wMzIuaCIKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJjb2xjYWNoZS5oIgojaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKI2luY2x1ZGUgInVuaWNvZGUvbG9jaWQuaCIKI2luY2x1ZGUgImZpbGVzdHJtLmgiCiNpbmNsdWRlICJ1bWVtc3RybS5oIgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlOwpjbGFzcyBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlOwpjbGFzcyBSdWxlQmFzZWRDb2xsYXRvcjsKY2xhc3MgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOwoKLy8gVGhpcyBpcyBqdXN0IHRlbXBvcmFyeSwgZm9yIHByb3RvdHlwaW5nLgpzdHJ1Y3QgY29sbEl0ZXJhdGU7CnN0cnVjdCBpbmNyZW1lbnRhbENvbnRleHQ7CnR5cGVkZWYgdm9pZCAqICBVQ29sbGF0b3I7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovKioKICogVGFibGVDb2xsYXRpb25EYXRhIGlzIGFuIGludGVybmFsIGNsYXNzIHVzZWQgYnkgVGFibGVDb2xsYXRpb24uICBJdAogKiBlbmNhcHN1bGF0ZXMgbW9zdCBvZiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBUYWJsZUNvbGxhdGlvbi4KICogVGhpcyBpbmNsdWRlcyB0aGUgbGFyZ2UgY29sbGF0aW9uIHRhYmxlcywgaW5jbHVkaW5nIHRoZSBjb250cmFjdAogKiBvcmRlciBhbmQgZXhwYW5kIG9yZGVyIHRhYmxlcywgYW5kIHNvbWUgc21hbGwgcGllY2VzIG9mIGRhdGEgdGhhdAogKiBkb24ndCBjaGFuZ2UsIHN1Y2ggYXMgdGhlIG1heGltdW0gc2Vjb25kYXJ5IG9yZGVyLiAgVGhlIGdlbmVyYWwKICogaWRlYSBpcyB0aGF0IHRoZSBUYWJsZUNvbGxhdGlvbiBvYmplY3Qgc2hvdWxkIGJlIGEgbGlnaHR3ZWlnaHQKICogb2JqZWN0LiAgSWYgdGhlcmUgYXJlIHR3byBUYWJsZUNvbGxhdGlvbiBvYmplY3RzLCB0aGV5IHdpbGwgZWFjaCBiZQogKiB2ZXJ5IHNtYWxsLCBhbmQgdXNlcnMgY2FuIGFsdGVyIHRoZSBzdHJlbmd0aCBvZiBlYWNoIG9iamVjdAogKiBpbmRlcGVuZGVudGx5LiAgSG93ZXZlciwgYm90aCBvYmplY3RzLCBpZiB0aGV5IGFyZSByZWZlcmluZyB0byB0aGUKICogc2FtZSB1bmRlcmx5aW5nIGNvbGxhdGlvbiwgd2lsbCBzaGFyZSBwb2ludGVycyB0byB0aGUgc2FtZQogKiBUYWJsZUNvbGxhdGlvbkRhdGEgb2JqZWN0LCB3aGljaCBkb2Vzbid0IGNoYW5nZS4gIDxQPgogKiBUYWJsZUNvbGxhdGlvbkRhdGEgb2JqZWN0cyBhcmUgdGhlcmVmb3JlIGdvb2QgY2FuZGlkYXRlcyBmb3IKICogY2FjaGluZyBpbiBtZW1vcnkgYW5kIHBvdGVudGlhbGx5IGZvciByZWZlcmVuY2UgY291bnRpbmcuICAqLwpjbGFzcyBUYWJsZUNvbGxhdGlvbkRhdGEKewpwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVDb2xsYXRpb25EYXRhKCk7CiAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICAgICAgflRhYmxlQ29sbGF0aW9uRGF0YSgpOwoKICAgIC8qKgogICAgICogQ2FjaGUgaW50ZXJmYWNlLiAgVGhlIGNhY2hlIHVzZXMgVW5pY29kZVN0cmluZyBvYmplY3RzIGFzIGtleXMuICBUaGVzZQogICAgICogYXJlIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LCBidXQgYXJlIHVzdWFsbHkgc29tZXRoaW5nIHVuaXF1ZWx5IGFzc29jaWF0ZWQKICAgICAqIHdpdGggZWFjaCBjb2xsYXRpb24sIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgZmFpcmx5IHNtYWxsLCBzdWNoIGFzIGEKICAgICAqIGxvY2FsZSBpZGVudGlmaWVyIHN0cmluZy4KICAgICAqIDxQPiBBZGRzIHRoZSBjb2xsYXRpb24gZGF0YSBvYmplY3QgdG8gdGhlIGNhY2hlIGxpc3QuCiAgICAgKiBAcGFyYW0ga2V5IHRoZSB1bmlxdWUga2V5IG9mIHRoZSBhc3NvY2lhdGVkIGNvbGxhdGlvbiBkYXRhIG9iamVjdC4KICAgICAqIEBwYXJhbSBkYXRhIHRoZSBjb2xsYXRpb24gZGF0YSBvYmplY3QuCiAgICAgKi8KICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBhZGRUb0NhY2hlKGNvbnN0IFVuaWNvZGVTdHJpbmcmIGtleSwgVGFibGVDb2xsYXRpb25EYXRhKiBkYXRhKTsKICAgIC8qKgogICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGNhY2hlZCBjb2xsYXRpb24gZGF0YS4KICAgICAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgb2YgdGhlIGFzc29jaWF0ZWQgY29sbGF0aW9uIGRhdGEgb2JqZWN0LgogICAgICogQHJldHVybnMgdGhlIGZvdW5kIGNvbGxhdGlvbiBkYXRhIG9iamVjdC4KICAgICAqLwogICAgc3RhdGljICBUYWJsZUNvbGxhdGlvbkRhdGEqIGZpbmRJbkNhY2hlKGNvbnN0IFVuaWNvZGVTdHJpbmcmIGtleSk7CgogICAgLyoqCiAgICAgKiBUaGUgc3RyZWFtSW4gYW5kIHN0cmVhbU91dCBtZXRob2RzIHJlYWQgYW5kIHdyaXRlIG9iamVjdHMgb2YgdGhpcwogICAgICogY2xhc3MgYXMgYmluYXJ5LCBwbGF0Zm9ybS1kZXBlbmRlbnQgZGF0YSBpbiB0aGUgaW9zdHJlYW0uICBUaGUgc3RyZWFtCiAgICAgKiBtdXN0IGJlIGluIGlvczo6YmluYXJ5IG1vZGUgZm9yIHRoaXMgdG8gd29yay4gIFRoZXNlIG1ldGhvZHMgYXJlIG5vdAogICAgICogaW50ZW5kZWQgZm9yIGdlbmVyYWwgcHVibGljIHVzZTsgdGhleSBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGltcHJvdmUKICAgICAqIHBlcmZvcm1hbmNlIGJ5IHN0b3JpbmcgY2VydGFpbiBvYmplY3RzIGluIGJpbmFyeSBmaWxlcy4KICAgICAqLwogICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0cmVhbUluKEZpbGVTdHJlYW0qIGlzKTsKICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdHJlYW1PdXQoRmlsZVN0cmVhbSogb3MpIGNvbnN0OwoKICAgIC8qKgogICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5IC0gc3RyZWFtaW5nIHRvIG1lbW9yeQogICAgICovCiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtSW4oVU1lbW9yeVN0cmVhbSogaXMsIFVFcnJvckNvZGUmIHN0YXR1cyk7CiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc3RyZWFtT3V0KFVNZW1vcnlTdHJlYW0qIG9zKSBjb25zdDsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgb2JqZWN0IGlzIHZhbGlkLgogICAgICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgICAgIFVCb29sICAgICAgICAgICAgICBpc0JvZ3VzKCkgY29uc3Q7CnByaXZhdGU6CiAgICAvKioKICAgICAqIFRoZSBmb2xsb3dpbmcgYXJlIGRpc2FsbG93ZWQgb3BlcmF0aW9uczogbm90IGltcGxlbWVudGVkLgogICAgICovCiAgICBUYWJsZUNvbGxhdGlvbkRhdGEoY29uc3QgVGFibGVDb2xsYXRpb25EYXRhJik7CiAgICBUYWJsZUNvbGxhdGlvbkRhdGEmIG9wZXJhdG9yPShjb25zdCBUYWJsZUNvbGxhdGlvbkRhdGEmKTsKCnByaXZhdGU6CiAgICAvLyBEbyBub3QgYWNjZXNzIHRoZSBmZ0NhY2hlIG9iamVjdCBkaXJlY3RseTsgdXNlIGFkZFRvQ2FjaGUgYW5kIGZpbmRJbkNhY2hlLgogICAgc3RhdGljICBDb2xsYXRpb25DYWNoZSAgICAgIGZnQ2FjaGU7Cgpwcml2YXRlOgogICAgLyoqCiAgICAgKiBUaGUgVGFibGVDb2xsYXRpb24gY2xhc3MgZnJlZWx5IG1hbmlwdWxhdGVzIHRoZSBkYXRhIG1lbWJlcnMgd2l0aGluIGEKICAgICAqIFRhYmxlQ29sbGF0aW9uRGF0YSBvYmplY3QuICBUaGlzIGlzIGJlY2F1c2UgVGFibGVDb2xsYXRpb25EYXRhIGlzCiAgICAgKiBpbnRlbmRlZCB0byBiZSBhbiBpbnRlcm5hbCwgaW52aXNpYmxlIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIElmCiAgICAgKiBUYWJsZUNvbGxhdGlvbkRhdGEgZXZlcnkgYmVjb21lcyBhIG1vcmUgcHVibGljIEFQSSwgdGhlbiB0aGlzIHdpbGwgaGF2ZQogICAgICogdG8gY2hhbmdlLCBhbHRob3VnaCB0aGlzIGlzIG5vdCByZWFsbHkgYWR2aXNlZC4KICAgICAqLwogICAgZnJpZW5kIGNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yOwogICAgZnJpZW5kIGNsYXNzIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjsKCi8vIFRoaXMgaXMganVzdCB0ZW1wb3JhcnksIGZvciBwcm90b3R5cGluZy4KICAgIGZyaWVuZCBpbnQzMl90IHVjb2xfZ2V0TmV4dENFKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgY29sbEl0ZXJhdGUgKnNvdXJjZSwgVUVycm9yQ29kZSAqc3RhdHVzKTsKICAgIGZyaWVuZCBpbnQzMl90IHVjb2xfZ2V0SW5jcmVtZW50YWxDRShjb25zdCBVQ29sbGF0b3IgKmNvbGwsIGluY3JlbWVudGFsQ29udGV4dCAqc291cmNlLCBVRXJyb3JDb2RlICpzdGF0dXMpOyAKICAgIGZyaWVuZCBpbnQzMl90IGdldENvbXBsaWNhdGVkQ0UoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBjb2xsSXRlcmF0ZSAqc291cmNlLCBVRXJyb3JDb2RlICpzdGF0dXMpOwogIGZyaWVuZCBpbnQzMl90IHVjb2xfZ2V0U29ydEtleShjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsIGNvbnN0ICAgIFVDaGFyICAgICAgICAqc291cmNlLAogICAgICAgIGludDMyX3QgICAgICAgIHNvdXJjZUxlbmd0aCwgdWludDhfdCAgICAgICAgKnJlc3VsdCwgaW50MzJfdCAgICAgICAgcmVzdWx0TGVuZ3RoKTsKICBmcmllbmQgVUNvbGxhdGlvblJlc3VsdCB1Y29sX3N0cmNvbGwoICAgIGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgc291cmNlTGVuZ3RoLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqdGFyZ2V0LAogICAgICAgIGludDMyX3QgICAgICAgICAgICB0YXJnZXRMZW5ndGgpOwogIGZyaWVuZCBVQ29sbGF0aW9uUmVzdWx0IHVjb2xfc3RyY29sbEV4KCAgICBjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsCiAgICAgICAgY29uc3QgICAgVUNoYXIgICAgICAgICpzb3VyY2UsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHNvdXJjZUxlbmd0aCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnRhcmdldCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgdGFyZ2V0TGVuZ3RoKTsKCiAgICBVQm9vbCAgICAgICAgICAgICAgICAgICAgICBpc0ZyZW5jaFNlYzsKICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICBtYXhTZWNPcmRlcjsKICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICBtYXhUZXJPcmRlcjsKICAgIENvbXBhY3RJbnRBcnJheSogICAgICAgICAgICBtYXBwaW5nOwogICAgVmVjdG9yT2ZQVG9Db250cmFjdFRhYmxlKiAgIGNvbnRyYWN0VGFibGU7CiAgICBWZWN0b3JPZlBUb0V4cGFuZFRhYmxlKiAgICAgZXhwYW5kVGFibGU7CiAgICBVQm9vbCAgICAgICAgICAgICAgICAgICAgICBmQm9ndXM7CgogICAgLyoqCiAgICAgKiBSdWxlIHN0cmluZyBkYXRhIGlzIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHJlcXVpcmVkIGJ5IHRoZSBUYWJsZUNvbGxhdGlvbgogICAgICogb2JqZWN0LiAgSW4gcGFydGljdWxhciwgd2hlbiBhIGJpbmFyeSBmaWxlIGlzIGNyZWF0ZWQsIHRoZSBydWxlIGRhdGEgaXMKICAgICAqIG5vdCBzdHJlYW1lZCBvdXQgLS0gdGhpcyBrZWVwcyB0aGUgYmluYXJ5IGZpbGUgc21hbGwuICBIb3dldmVyLCB0d28gcGllY2VzCiAgICAgKiBvZiBkYXRhIGFyZSBrZXB0IGFyb3VuZCAodGhlIGRlc2lyZWRMb2NhbGUgYW5kIHRoZSByZWFsTG9jYWxlTmFtZSkgd2hpY2gKICAgICAqIGFsbG93IGxhdGVyIGxvYWRpbmcgb2YgdGhlIHJ1bGUgc3RyaW5nIGVmZmljaWVudGx5LiAgQnkgZWZmaWNpZW50bHksIHdlIG1lYW4KICAgICAqIHRoYXQgdGhlIHVzdWFsIHNlYXJjaCBwcm9jZWR1cmUgaXMgc2hvcnRlbmVkLCBhbmQgdGhlIGZpbmFsIGZpbGUgd2hpY2gKICAgICAqIGFjdHVhbGx5IGxlZCB0byB0aGUgc3VjY2Vzc2Z1bCBsb2FkaW5nIG9mIHRoZSBjb2xsYXRpb24gZWxlbWVudHMgaXMgYWNjZXNzZWQKICAgICAqIGRpcmVjdGx5LiAgVGhlIGJvb2xlYW4gaXNSdWxlVGFibGVMb2FkZWQgYWxsb3dzIHRoZSBjb2xsYXRpb24gb2JqZWN0IHRvCiAgICAgKiBrbm93IHdoZXRoZXIgcnVsZXMgaGF2ZSBiZWVuIGxvYWRlZCAoYW4gYWx0ZXJuYXRpdmUgaXMgdG8gdXNlIGFuIGVtcHR5CiAgICAgKiBydWxlVGFibGUgdG8gaW5kaWNhdGUgdGhpcywgYnV0IHRoaXMgdGhlbiBkaXNhbGxvd3MgdGhlIGVtcHR5IHN0cmluZyBhcwogICAgICogYSB2YWxpZCBydWxlIHN0cmluZykuICBOb3RlIHRoYXQgd2hlbiBhIGNvbGxhdGlvbiBpcyBjb25zdHJ1Y3RlZCAiZnJvbQogICAgICogc2NyYXRjaCIgKG5vdCBsb2FkZWQgZnJvbSBhIGJpbmFyeSBmaWxlKSwgdGhlIHJ1bGUgdGFibGUgaXMgYWxyZWFkeSBpbiBwbGFjZSwKICAgICAqIGFuZCBpc1J1bGVUYWJsZUxvYWRlZCBpcyBzZXQgdG8gdHJ1ZS4KICAgICAqCiAgICAgKiBTZWUgUnVsZUJhc2VkQ29sbGF0b3I6OmdldFJ1bGVzKCkuCiAgICAgKi8KICAgIFVuaWNvZGVTdHJpbmcgICAgICAgICAgICAgICBydWxlVGFibGU7CiAgICBVQm9vbCAgICAgICAgICAgICAgICAgICAgICBpc1J1bGVUYWJsZUxvYWRlZDsKICAgIExvY2FsZSAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkTG9jYWxlOwogICAgVW5pY29kZVN0cmluZyAgICAgICAgICAgICAgIHJlYWxMb2NhbGVOYW1lOwp9OwoKI2VuZGlmIC8vX1RDT0xEQVRBCi8vZW9mCg==