LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgVURBVF9ICiNkZWZpbmUgVURBVF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKI2luY2x1ZGUgInVuaWNvZGUvdWNhbC5oIgojaW5jbHVkZSAidW5pY29kZS91bnVtLmgiCi8qKgogKiBAbmFtZSBEYXRlIEZvcm1hdCBDIEFQSQogKgogKiBEYXRlIEZvcm1hdCBDIEFQSSAgY29uc2lzdHMgb2YgZnVuY3Rpb25zIHRoYXQgY29udmVydCBkYXRlcyBhbmQKICogdGltZXMgZnJvbSB0aGVpciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMgdG8gdGV4dHVhbCBmb3JtIGFuZCBiYWNrIGFnYWluIGluIGEKICogbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgbWFubmVyLiBDb252ZXJ0aW5nIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIChtaWxsaXNlY29uZHMKICogc2luY2UgbWlkbmlnaHQsIEphbnVhcnkgMSwgMTk3MCkgdG8gdGV4dCBpcyBrbm93biBhcyAiZm9ybWF0dGluZywiIGFuZCBjb252ZXJ0aW5nCiAqIGZyb20gdGV4dCB0byBtaWxsaXMgaXMga25vd24gYXMgInBhcnNpbmcuIiAgV2UgY3VycmVudGx5IGRlZmluZSBvbmx5IG9uZSBjb25jcmV0ZQogKiBzdHJ1Y3R1cmUgVURhdGVGb3JtYXQsIHdoaWNoIGNhbiBoYW5kbGUgcHJldHR5IG11Y2ggYWxsIG5vcm1hbAogKiBkYXRlIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgYWN0aW9ucy4KICogPFA+CiAqIERhdGUgRm9ybWF0IGhlbHBzIHlvdSB0byBmb3JtYXQgYW5kIHBhcnNlIGRhdGVzIGZvciBhbnkgbG9jYWxlLiBZb3VyIGNvZGUgY2FuCiAqIGJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YgdGhlIGxvY2FsZSBjb252ZW50aW9ucyBmb3IgbW9udGhzLCBkYXlzIG9mIHRoZQogKiB3ZWVrLCBvciBldmVuIHRoZSBjYWxlbmRhciBmb3JtYXQ6IGx1bmFyIHZzLiBzb2xhci4KICogPFA+CiAqIFRvIGZvcm1hdCBhIGRhdGUgZm9yIHRoZSBjdXJyZW50IExvY2FsZSB3aXRoIGRlZmF1bHQgdGltZSBhbmQgZGF0ZSBzdHlsZSwgCiAqIHVzZSBvbmUgb2YgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHM6CiAqIDxwcmU+CiAqIC4gICAgVUVycm9yQ29kZSBzdGF0dXM7CiAqIC4gICAgVUZpZWxkUG9zaXRpb24gcG9zOwogKiAuICAgIFVDaGFyICpteVN0cmluZzsKICogLiAgICB0X2ludDMyIG15U3RybGVuPTA7CiAqIC4gICAgVURhdGVGb3JtYXQqIGRmbXQgPSB1ZGF0X29wZW4oVUNBTF9ERUZBVUxULCBVQ0FMX0RFRkFVTFQsIE5VTEwsICJQU1QiLCAmc3RhdHVzKTsKICogLiAgICBteVN0cmxlbiA9IHVkYXRfZm9ybWF0KGRmbXQsIG15RGF0ZSwgTlVMTCwgbXlTdHJsZW4sICZwb3MsICZzdGF0dXMpOwogKiAuICAgIGlmKHN0YXR1cz09VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpewogKiAuCQlzdGF0dXM9VV9aRVJPX0VSUk9SOwogKiAuCQlteVN0cmluZz0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogKG15U3RybGVuKzEpICk7CiAqIC4JCXVkYXRfZm9ybWF0KGRmbXQsIG15RGF0ZSwgbXlTdHJpbmcsIG15U3RybGVuKzEsICZwb3MsICZzdGF0dXMpOwogKiAuICAgIH0KICogPC9wcmU+CiAqIElmIHlvdSBhcmUgZm9ybWF0dGluZyBtdWx0aXBsZSBudW1iZXJzLCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBnZXQgdGhlCiAqIGZvcm1hdCBhbmQgdXNlIGl0IG11bHRpcGxlIHRpbWVzIHNvIHRoYXQgdGhlIHN5c3RlbSBkb2Vzbid0IGhhdmUgdG8gZmV0Y2ggdGhlCiAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCBsYW5ndWFnZSBhbmQgY291bnRyeSBjb252ZW50aW9ucyBtdWx0aXBsZSB0aW1lcy4KICogPHByZT4KICogLiAgICB0X2ludDMyIGksIG15U3RybGVuPTA7CiAqIC4gICAgVUNoYXIqIG15U3RyaW5nOwogKiAuICAgIFVEYXRlIG15RGF0ZUFycltdID0geyAwLjAsIDEwMDAwMDAwMC4wLCAyMDAwMDAwMDAwLjAgfTsgLy8gdGVzdCB2YWx1ZXMKICogLiAgICBVRGF0ZUZvcm1hdCogZGYgPSB1ZGF0X29wZW4oVUNBTF9ERUZBVUxULCBVQ0FMX0RFRkFVTFQsIE5VTEwsICJHTVQiLCAmc3RhdHVzKTsKICogLiAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CiAqIC4JCW15U3RybGVuID0gdWRhdF9mb3JtYXQoZGYsIG15RGF0ZSwgTlVMTCwgbXlTdHJsZW4sICZwb3MsICZzdGF0dXMpOwogKiAuCQlpZihzdGF0dXM9PVVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKXsKICogLgkJCXN0YXR1cz1VX1pFUk9fRVJST1I7CiAqIC4JCQlteVN0cmluZz0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogKG15U3RybGVuKzEpICk7CiAqIC4JCQl1ZGF0X2Zvcm1hdChkZiwgbXlEYXRlLCBteVN0cmluZywgbXlTdHJsZW4rMSwgJnBvcywgJnN0YXR1cyk7CiAqIC4JCX0KICogLgkJcHJpbnRmKCIlcyBcbiIsIGF1c3RyZHVwKG15U3RyaW5nKSApOyAvL2F1c3RyZHVwKCBhIGZ1bmN0aW9uIHVzZWQgdG8gY29udmVydCBVQ2hhciogdG8gY2hhciopCiAqIC4JCWZyZWUobXlTdHJpbmcpOwogKiAuICAgIH0KICogPC9wcmU+CiAqIFRvIGZvcm1hdCBhIGRhdGUgZm9yIGEgZGlmZmVyZW50IExvY2FsZSwgc3BlY2lmeSBpdCBpbiB0aGUgY2FsbCB0bwogKiB1ZGF0X29wZW4oKQogKiA8cHJlPgogKiAuICAgICAgIFVEYXRlRm9ybWF0KiBkZiA9IHVkYXRfb3BlbihVREFUX1NIT1JULCBVREFUX1NIT1JULCAiZnJfRlIiLCAiR01UIiwgJnN0YXR1cyk7CiAqIDwvcHJlPgogKiBZb3UgY2FuIHVzZSBhIERhdGVGb3JtYXQgQVBJIHVkYXRfcGFyc2UoKSB0byBwYXJzZS4KICogPHByZT4KICogLiAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICogLiAgICAgICB0X2ludDMyIHBhcnNlcG9zPTA7ICAgICAKICogLiAgICAgICBVRGF0ZSBteURhdGUgPSB1ZGF0X3BhcnNlKGRmLCBteVN0cmluZywgdV9zdHJsZW4obXlTdHJpbmcpLCAmcGFyc2Vwb3MsICZzdGF0dXMpOwogKiA8L3ByZT4KICogLiBZb3UgY2FuIHBhc3MgaW4gZGlmZmVyZW50IG9wdGlvbnMgZm9yIHRoZSBhcmd1bWVudHMgZm9yIGRhdGUgYW5kIHRpbWUgc3R5bGUgCiAqIC4gdG8gY29udHJvbCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQ7IGZyb20gU0hPUlQgdG8gTUVESVVNIHRvIExPTkcgdG8gRlVMTC4gCiAqIC4gVGhlIGV4YWN0IHJlc3VsdCBkZXBlbmRzIG9uIHRoZSBsb2NhbGUsIGJ1dCBnZW5lcmFsbHk6CiAqIC4gc2VlIFVEYXRlRm9ybWF0U3R5bGUgZm9yIG1vcmUgZGV0YWlscwogKiA8dWwgdHlwZT1yb3VuZD4KICogICA8bGk+ICAgVURBVF9TSE9SVCBpcyBjb21wbGV0ZWx5IG51bWVyaWMsIHN1Y2ggYXMgMTIvMTMvNTIgb3IgMzozMHBtCiAqICAgPGxpPiAgIFVEQVRfTUVESVVNIGlzIGxvbmdlciwgc3VjaCBhcyBKYW4gMTIsIDE5NTIKICogICA8bGk+ICAgVURBVF9MT05HIGlzIGxvbmdlciwgc3VjaCBhcyBKYW51YXJ5IDEyLCAxOTUyIG9yIDM6MzA6MzJwbQogKiAgIDxsaT4gICBVREFUX0ZVTEwgaXMgcHJldHR5IGNvbXBsZXRlbHkgc3BlY2lmaWVkLCBzdWNoIGFzCiAqICAgICAgICAgIFR1ZXNkYXksIEFwcmlsIDEyLCAxOTUyIEFEIG9yIDM6MzA6NDJwbSBQU1QuCiAqIDwvdWw+CiAqIFlvdSBjYW4gYWxzbyBzZXQgdGhlIHRpbWUgem9uZSBvbiB0aGUgZm9ybWF0IGlmIHlvdSB3aXNoLiAKICogPFA+CiAqIFlvdSBjYW4gYWxzbyB1c2UgZm9ybXMgb2YgdGhlIHBhcnNlIGFuZCBmb3JtYXQgbWV0aG9kcyB3aXRoIFBhcnNlIFBvc2l0aW9uIGFuZAogKiBVRmllbGRQb3NpdGlvbiB0byBhbGxvdyB5b3UgdG8KICogPHVsIHR5cGU9cm91bmQ+CiAqICAgPGxpPiAgIFByb2dyZXNzaXZlbHkgcGFyc2UgdGhyb3VnaCBwaWVjZXMgb2YgYSBzdHJpbmcuCiAqICAgPGxpPiAgIEFsaWduIGFueSBwYXJ0aWN1bGFyIGZpZWxkLCBvciBmaW5kIG91dCB3aGVyZSBpdCBpcyBmb3Igc2VsZWN0aW9uCiAqICAgICAgICAgIG9uIHRoZSBzY3JlZW4uCiAqIDwvdWw+CiAqLwoKLyoqIEEgZGF0ZSBmb3JtYXR0ZXIuCiAqICBGb3IgdXNhZ2UgaW4gQyBwcm9ncmFtcy4KICovCnR5cGVkZWYgdm9pZCogVURhdGVGb3JtYXQ7CgovKiogVGhlIHBvc3NpYmxlIGRhdGUvdGltZSBmb3JtYXQgc3R5bGVzICovCmVudW0gVURhdGVGb3JtYXRTdHlsZSB7CiAgICAvKiogRnVsbCBzdHlsZSAqLwogICAgVURBVF9GVUxMLAogICAgLyoqIExvbmcgc3R5bGUgKi8KICAgIFVEQVRfTE9ORywKICAgIC8qKiBNZWRpdW0gc3R5bGUgKi8KICAgIFVEQVRfTUVESVVNLAogICAgLyoqIFNob3J0IHN0eWxlICovCiAgICBVREFUX1NIT1JULAogICAgLyoqIERlZmF1bHQgc3R5bGUgKi8KICAgIFVEQVRfREVGQVVMVCA9IFVEQVRfTUVESVVNLAogICAgLyoqIE5vIHN0eWxlICovCiAgICBVREFUX05PTkUgPSAtMQp9Owp0eXBlZGVmIGVudW0gVURhdGVGb3JtYXRTdHlsZSBVRGF0ZUZvcm1hdFN0eWxlOwoKLyoqCiogT3BlbiBhIG5ldyBVRGF0ZUZvcm1hdCBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBkYXRlcyBhbmQgdGltZXMuCiogQSBVRGF0ZUZvcm1hdCBtYXkgYmUgdXNlZCB0byBmb3JtYXQgZGF0ZXMgaW4gY2FsbHMgdG8gXFJlZnt1ZGF0X2Zvcm1hdH0sCiogYW5kIHRvIHBhcnNlIGRhdGVzIGluIGNhbGxzIHRvIFxSZWZ7dWRhdF9wYXJzZX0uCiogQHBhcmFtIHRpbWVTdHlsZSBUaGUgc3R5bGUgdXNlZCB0byBmb3JtYXQgdGltZXM7IG9uZSBvZiBVREFUX0ZVTExfU1RZTEUsIFVEQVRfTE9OR19TVFlMRSwgCiogVURBVF9NRURJVU1fU1RZTEUsIFVEQVRfU0hPUlRfU1RZTEUsIG9yIFVEQVRfREVGQVVMVF9TVFlMRQoqIEBwYXJhbSBkYXRlU3R5bGUgVGhlIHN0eWxlIHVzZWQgdG8gZm9ybWF0IGRhdGVzOyBvbmUgb2YgVURBVF9GVUxMX1NUWUxFLCBVREFUX0xPTkdfU1RZTEUsIAoqIFVEQVRfTUVESVVNX1NUWUxFLCBVREFUX1NIT1JUX1NUWUxFLCBvciBVREFUX0RFRkFVTFRfU1RZTEUKKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3BlY2lmeWluZyB0aGUgZm9ybWF0dGluZyBjb252ZW50aW9ucwoqIEBwYXJhbSB0eklEIEEgdGltZXpvbmUgSUQgc3BlY2lmeWluZyB0aGUgdGltZXpvbmUgdG8gdXNlLiAgSWYgMCwgdXNlCiogdGhlIGRlZmF1bHQgdGltZXpvbmUuCiogQHBhcmFtIHR6SURMZW5ndGggVGhlIGxlbmd0aCBvZiB0eklELCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVEYXRlRm9ybWF0IHRvIHVzZSBmb3IgZm9ybWF0dGluZyBkYXRlcyBhbmQgdGltZXMsIG9yIDAgaWYKKiBhbiBlcnJvciBvY2N1cnJlZC4KKiBAc2VlIHVkYXRfb3BlblBhdHRlcm4KKi8KVV9DQVBJIFVEYXRlRm9ybWF0Kgp1ZGF0X29wZW4oVURhdGVGb3JtYXRTdHlsZSAgdGltZVN0eWxlLCAKICAgICAgICAgIFVEYXRlRm9ybWF0U3R5bGUgIGRhdGVTdHlsZSwKICAgICAgICAgIGNvbnN0IGNoYXIgICAgICAgICpsb2NhbGUsCgkgIGNvbnN0IFVDaGFyICAgICAgICp0eklELAoJICBpbnQzMl90ICAgICAgICAgICB0eklETGVuZ3RoLAogICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgKnN0YXR1cyk7CgovKioKKiBPcGVuIGEgbmV3IFVEYXRlRm9ybWF0IGZvciBmb3JtYXR0aW5nIGRhdGVzIGFuZCB0aW1lcy4KKiBBIFVEYXRlRm9ybWF0IG1heSBiZSB1c2VkIHRvIGZvcm1hdCBkYXRlcyBpbiBjYWxscyB0byBcUmVme3VkYXRfZm9ybWF0fSwKKiBhbmQgdG8gcGFyc2UgZGF0ZXMgaW4gY2FsbHMgdG8gXFJlZnt1ZGF0X3BhcnNlfS4KKiBAcGFyYW0gcGF0dGVybiBBIHBhdHRlcm4gc3BlY2lmeWluZyB0aGUgZm9ybWF0IHRvIHVzZS4KKiBAcGFyYW0gcGF0dGVybkxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm4sIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3BlY2lmeWluZyB0aGUgZm9ybWF0dGluZyBjb252ZW50aW9ucwoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBVRGF0ZUZvcm1hdCB0byB1c2UgZm9yIGZvcm1hdHRpbmcgZGF0ZXMgYW5kIHRpbWVzLCBvciAwIGlmCiogYW4gZXJyb3Igb2NjdXJyZWQuCiogQHNlZSB1ZGF0X29wZW4KKi8KVV9DQVBJIFVEYXRlRm9ybWF0Kgp1ZGF0X29wZW5QYXR0ZXJuKCAgICBjb25zdCAgIFVDaGFyICAgICAgICAgICAqcGF0dGVybiwgCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICBwYXR0ZXJuTGVuZ3RoLAogICAgICAgICAgICBjb25zdCAgIGNoYXIgICAgICAgICAqbG9jYWxlLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgKnN0YXR1cyk7CgovKioKKiBDbG9zZSBhIFVEYXRlRm9ybWF0LgoqIE9uY2UgY2xvc2VkLCBhIFVEYXRlRm9ybWF0IG1heSBubyBsb25nZXIgYmUgdXNlZC4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gY2xvc2UuCiovClVfQ0FQSSB2b2lkCnVkYXRfY2xvc2UoVURhdGVGb3JtYXQqIGZvcm1hdCk7CgovKioKICogT3BlbiBhIGNvcHkgb2YgYSBVRGF0ZUZvcm1hdC4KICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRlZXAgY29weS4KICogQHBhcmFtIGZtdCBUaGUgZm9ybWF0IHRvIGNvcHkKICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMuCiAqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgVURhdGVGb3JtYXQgaWRlbnRpY2FsIHRvIGZtdC4KICovClVfQ0FQSSBVRGF0ZUZvcm1hdCoKdWRhdF9jbG9uZShjb25zdCBVRGF0ZUZvcm1hdCAqZm10LAogICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgoqIEZvcm1hdCBhIGRhdGUgdXNpbmcgYW4gVURhdGVGb3JtYXQuCiogVGhlIGRhdGUgd2lsbCBiZSBmb3JtYXR0ZWQgdXNpbmcgdGhlIGNvbnZlbnRpb25zIHNwZWNpZmllZCBpbiBcUmVme3VkYXRfb3Blbn0KKiBvciBcUmVme3VkYXRfb3BlblBhdHRlcm59CiogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0dGVyIHRvIHVzZQoqIEBwYXJhbSBkYXRlVG9Gb3JtYXQgVGhlIGRhdGUgdG8gZm9ybWF0CiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZm9ybWF0dGVkIG51bWJlci4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSBwb3MgSWYgbm90IDAsIGEgVUZpZWxkUG9zaXRpb24gd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBpbmZvcm1hdGlvbiBvbiBhIHNwZWNpZmljIGZpZWxkLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLCB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiogQHNlZSB1ZGF0X3BhcnNlCiovClVfQ0FQSSBpbnQzMl90CnVkYXRfZm9ybWF0KCAgICBjb25zdCAgICBVRGF0ZUZvcm1hdCogICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICBVRGF0ZSAgICAgICAgICAgZGF0ZVRvRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciogICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBVRmllbGRQb3NpdGlvbiogcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOwoKLyoqCiogUGFyc2UgYSBzdHJpbmcgaW50byBhbiBkYXRlL3RpbWUgdXNpbmcgYSBVRGF0ZUZvcm1hdC4KKiBUaGUgZGF0ZSB3aWxsIGJlIHBhcnNlZCB1c2luZyB0aGUgY29udmVudGlvbnMgc3BlY2lmaWVkIGluIFxSZWZ7dWRhdF9vcGVufQoqIG9yIFxSZWZ7dWRhdF9vcGVuUGF0dGVybn0KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gdXNlLgoqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHBhcnNlLgoqIEBwYXJhbSB0ZXh0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGV4dCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgoqIEBwYXJhbSBwYXJzZVBvcyBJZiBub3QgMCwgb24gaW5wdXQgYSBwb2ludGVyIHRvIGFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgb2Zmc2V0IGF0IHdoaWNoCiogdG8gYmVnaW4gcGFyc2luZy4gIElmIG5vdCAwLCBvbiBvdXRwdXQgdGhlIG9mZnNldCBhdCB3aGljaCBwYXJzaW5nIGVuZGVkLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHBhcnNlZCBkYXRlL3RpbWUKKiBAc2VlIHVkYXRfZm9ybWF0CiovClVfQ0FQSSBVRGF0ZQp1ZGF0X3BhcnNlKCAgICBjb25zdCAgICBVRGF0ZUZvcm1hdCogICAgZm9ybWF0LAogICAgICAgICAgICBjb25zdCAgICBVQ2hhciogICAgICAgICAgdGV4dCwKICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgdGV4dExlbmd0aCwKICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgKnBhcnNlUG9zLAogICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAqc3RhdHVzKTsKCi8qKgoqIERldGVybWluZSBpZiBhbiBVRGF0ZUZvcm1hdCB3aWxsIHBlcmZvcm0gbGVuaWVudCBwYXJzaW5nLgoqIFdpdGggbGVuaWVudCBwYXJzaW5nLCB0aGUgcGFyc2VyIG1heSB1c2UgaGV1cmlzdGljcyB0byBpbnRlcnByZXQgaW5wdXRzIHRoYXQgZG8gbm90IAoqIHByZWNpc2VseSBtYXRjaCB0aGUgcGF0dGVybi4gV2l0aCBzdHJpY3QgcGFyc2luZywgaW5wdXRzIG11c3QgbWF0Y2ggdGhlIHBhdHRlcm4uIAoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBxdWVyeQoqIEByZXR1cm4gVFJVRSBpZiBmbXQgaXMgc2V0IHRvIHBlcmZvcm0gbGVuaWVudCBwYXJzaW5nLCBGQUxTRSBvdGhlcndpc2UuCiogQHNlZSB1ZGF0X3NldExlbmllbnQKKi8KVV9DQVBJIGJvb2xfdAp1ZGF0X2lzTGVuaWVudChjb25zdCBVRGF0ZUZvcm1hdCogZm10KTsKCi8qKgoqIFNwZWNpZnkgd2hldGhlciBhbiBVRGF0ZUZvcm1hdCB3aWxsIHBlcmZvcm0gbGVuaWVudCBwYXJzaW5nLgoqIFdpdGggbGVuaWVudCBwYXJzaW5nLCB0aGUgcGFyc2VyIG1heSB1c2UgaGV1cmlzdGljcyB0byBpbnRlcnByZXQgaW5wdXRzIHRoYXQgZG8gbm90IAoqIHByZWNpc2VseSBtYXRjaCB0aGUgcGF0dGVybi4gV2l0aCBzdHJpY3QgcGFyc2luZywgaW5wdXRzIG11c3QgbWF0Y2ggdGhlIHBhdHRlcm4uIAoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQKKiBAcGFyYW0gaXNMZW5pZW50IFRSVUUgaWYgZm10IHNob3VsZCBwZXJmb3JtIGxlbmllbnQgcGFyc2luZywgRkFMU0Ugb3RoZXJ3aXNlLgoqIEBzZWUgZGF0X2lzTGVuaWVudAoqLwpVX0NBUEkgdm9pZAp1ZGF0X3NldExlbmllbnQoICAgIFVEYXRlRm9ybWF0KiAgICBmbXQsCiAgICAgICAgICAgICAgICAgICAgYm9vbF90ICAgICAgICAgIGlzTGVuaWVudCk7CgovKioKKiBHZXQgdGhlIFVDYWxlbmRhciBhc3NvY2lhdGVkIHdpdGggYW4gVURhdGVGb3JtYXQuCiogQSBVRGF0ZUZvcm1hdCB1c2VzIGEgVUNhbGVuZGFyIHRvIGNvbnZlcnQgYSByYXcgdmFsdWUgdG8sIGZvciBleGFtcGxlLAoqIHRoZSBkYXkgb2YgdGhlIHdlZWsuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBVQ2FsZW5kYXIgdXNlZCBieSBmbXQuCiogQHNlZSB1ZGF0X3NldENhbGVuZGFyCiovClVfQ0FQSSBjb25zdCBVQ2FsZW5kYXIqCnVkYXRfZ2V0Q2FsZW5kYXIoY29uc3QgVURhdGVGb3JtYXQqIGZtdCk7CgovKioKKiBTZXQgdGhlIFVDYWxlbmRhciBhc3NvY2lhdGVkIHdpdGggYW4gVURhdGVGb3JtYXQuCiogQSBVRGF0ZUZvcm1hdCB1c2VzIGEgVUNhbGVuZGFyIHRvIGNvbnZlcnQgYSByYXcgdmFsdWUgdG8sIGZvciBleGFtcGxlLAoqIHRoZSBkYXkgb2YgdGhlIHdlZWsuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHNldC4KKiBAcGFyYW0gY2FsZW5kYXJUb1NldCBBIHBvaW50ZXIgdG8gYW4gVUNhbGVuZGFyIHRvIGJlIHVzZWQgYnkgZm10LgoqIEBzZWUgdWRhdF9zZXRDYWxlbmRhcgoqLwpVX0NBUEkgdm9pZAp1ZGF0X3NldENhbGVuZGFyKCAgICAgICAgICAgIFVEYXRlRm9ybWF0KiAgICBmbXQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVQ2FsZW5kYXIqICAgICAgY2FsZW5kYXJUb1NldCk7CgovKioKKiBHZXQgdGhlIFVOdW1iZXJGb3JtYXQgYXNzb2NpYXRlZCB3aXRoIGFuIFVEYXRlRm9ybWF0LgoqIEEgVURhdGVGb3JtYXQgdXNlcyBhIFVOdW1iZXJGb3JtYXQgdG8gZm9ybWF0IG51bWJlcnMgd2l0aGluIGEgZGF0ZSwKKiBmb3IgZXhhbXBsZSB0aGUgZGF5IG51bWJlci4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIFVOdW1iZXJGb3JtYXQgdXNlZCBieSBmbXQgdG8gZm9ybWF0IG51bWJlcnMuCiogQHNlZSB1ZGF0X3NldE51bWJlckZvcm1hdAoqLwpVX0NBUEkgY29uc3QgVU51bWJlckZvcm1hdCoKdWRhdF9nZXROdW1iZXJGb3JtYXQoY29uc3QgVURhdGVGb3JtYXQqIGZtdCk7CgovKioKKiBTZXQgdGhlIFVOdW1iZXJGb3JtYXQgYXNzb2NpYXRlZCB3aXRoIGFuIFVEYXRlRm9ybWF0LgoqIEEgVURhdGVGb3JtYXQgdXNlcyBhIFVOdW1iZXJGb3JtYXQgdG8gZm9ybWF0IG51bWJlcnMgd2l0aGluIGEgZGF0ZSwKKiBmb3IgZXhhbXBsZSB0aGUgZGF5IG51bWJlci4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gc2V0LgoqIEBwYXJhbSBudW1iZXJGb3JtYXRUb1NldCBBIHBvaW50ZXIgdG8gdGhlIFVOdW1iZXJGb3JtYXQgdG8gYmUgdXNlZCBieSBmbXQgdG8gZm9ybWF0IG51bWJlcnMuCiogQHNlZSB1ZGF0X2dldE51bWJlckZvcm1hdAoqLwpVX0NBUEkgdm9pZAp1ZGF0X3NldE51bWJlckZvcm1hdCggICAgICAgICAgICBVRGF0ZUZvcm1hdCogICAgZm10LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIFVOdW1iZXJGb3JtYXQqICBudW1iZXJGb3JtYXRUb1NldCk7CgovKioKKiBHZXQgYSBsb2NhbGUgZm9yIHdoaWNoIGRhdGUvdGltZSBmb3JtYXR0aW5nIHBhdHRlcm5zIGFyZSBhdmFpbGFibGUuCiogQSBVRGF0ZUZvcm1hdCBpbiBhIGxvY2FsZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSB0aGUgY29ycmVjdAoqIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgZm9yIHRoZSBsb2NhbGUuCiogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBsb2NhbGUuCiogQHJldHVybiBBIGxvY2FsZSBmb3Igd2hpY2ggZGF0ZS90aW1lIGZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGF2YWlsYWJsZSwgb3IgMCBpZiBub25lLgoqIEBzZWUgdWRhdF9jb3VudEF2YWlsYWJsZQoqLwpVX0NBUEkgY29uc3QgY2hhcioKdWRhdF9nZXRBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7CgovKioKKiBEZXRlcm1pbmUgaG93IG1hbnkgbG9jYWxlcyBoYXZlIGRhdGUvdGltZSAgZm9ybWF0dGluZyBwYXR0ZXJucyBhdmFpbGFibGUuCiogVGhpcyBmdW5jdGlvbiBpcyBtb3N0IHVzZWZ1bCBhcyBkZXRlcm1pbmluZyB0aGUgbG9vcCBlbmRpbmcgY29uZGl0aW9uIGZvcgoqIGNhbGxzIHRvIFxSZWZ7dWRhdF9nZXRBdmFpbGFibGV9LgoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBsb2NhbGVzIGZvciB3aGljaCBkYXRlL3RpbWUgZm9ybWF0dGluZyBwYXR0ZXJucyBhcmUgYXZhaWxhYmxlLgoqIEBzZWUgdWRhdF9nZXRBdmFpbGFibGUKKi8KVV9DQVBJIGludDMyX3QKdWRhdF9jb3VudEF2YWlsYWJsZSh2b2lkKTsKCi8qKgoqIEdldCB0aGUgeWVhciByZWxhdGl2ZSB0byB3aGljaCBhbGwgMi1kaWdpdCB5ZWFycyBhcmUgaW50ZXJwcmV0ZWQuCiogRm9yIGV4YW1wbGUsIGlmIHRoZSAyLWRpZ2l0IHN0YXJ0IHllYXIgaXMgMjEwMCwgdGhlIHllYXIgOTkgd2lsbCBiZQoqIGludGVycHJldGVkIGFzIDIxOTkuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgeWVhciByZWxhdGl2ZSB0byB3aGljaCBhbGwgMi1kaWdpdCB5ZWFycyBhcmUgaW50ZXJwcmV0ZWQuCiogQHNlZSB1ZGF0X1NldDJEaWdpdFllYXJTdGFydAoqLwpVX0NBUEkgVURhdGUKdWRhdF9nZXQyRGlnaXRZZWFyU3RhcnQoICAgIGNvbnN0ICAgVURhdGVGb3JtYXQgICAgICpmbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAqc3RhdHVzKTsKCi8qKgoqIFNldCB0aGUgeWVhciByZWxhdGl2ZSB0byB3aGljaCBhbGwgMi1kaWdpdCB5ZWFycyB3aWxsIGJlIGludGVycHJldGVkLgoqIEZvciBleGFtcGxlLCBpZiB0aGUgMi1kaWdpdCBzdGFydCB5ZWFyIGlzIDIxMDAsIHRoZSB5ZWFyIDk5IHdpbGwgYmUKKiBpbnRlcnByZXRlZCBhcyAyMTk5LgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGQgVGhlIHllYXIgcmVsYXRpdmUgdG8gd2hpY2ggYWxsIDItZGlnaXQgeWVhcnMgd2lsbCBiZSBpbnRlcnByZXRlZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdWRhdF9TZXQyRGlnaXRZZWFyU3RhcnQKKi8KVV9DQVBJIHZvaWQKdWRhdF9zZXQyRGlnaXRZZWFyU3RhcnQoICAgIFVEYXRlRm9ybWF0ICAgICAqZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVURhdGUgICAgICAgICAgIGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgKnN0YXR1cyk7CgovKioKKiBFeHRyYWN0IHRoZSBwYXR0ZXJuIGZyb20gYSBVRGF0ZUZvcm1hdC4KKiBUaGUgcGF0dGVybiB3aWxsIGZvbGxvdyB0aGUgcGF0dGVybiBzeW50YXggcnVsZXMuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBsb2NhbGl6ZWQgVFJVRSBpZiB0aGUgcGF0dGVybiBzaG91bGQgYmUgbG9jYWxpemVkLCBGQUxTRSBvdGhlcndpc2UuCiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcGF0dGVybi4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLCB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiogQHNlZSB1ZGF0X2FwcGx5UGF0dGVybgoqLwpVX0NBUEkgaW50MzJfdAp1ZGF0X3RvUGF0dGVybiggICAgY29uc3QgICBVRGF0ZUZvcm1hdCAgICAgKmZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbF90ICAgICAgICAgIGxvY2FsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgICAgICAgICAgICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICByZXN1bHRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAqc3RhdHVzKTsKCi8qKgoqIFNldCB0aGUgcGF0dGVybiB1c2VkIGJ5IGFuIFVEYXRlRm9ybWF0LgoqIFRoZSBwYXR0ZXJuIHNob3VsZCBmb2xsb3cgdGhlIHBhdHRlcm4gc3ludGF4IHJ1bGVzLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGxvY2FsaXplZCBUUlVFIGlmIHRoZSBwYXR0ZXJuIGlzIGxvY2FsaXplZCwgRkFMU0Ugb3RoZXJ3aXNlLgoqIEBwYXJhbSBwYXR0ZXJuIFRoZSBuZXcgcGF0dGVybgoqIEBwYXJhbSBwYXR0ZXJuTGVuZ3RoIFRoZSBsZW5ndGggb2YgcGF0dGVybiwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgoqIEBzZWUgdWRhdF90b1BhdHRlcm4KKi8KVV9DQVBJIHZvaWQKdWRhdF9hcHBseVBhdHRlcm4oICAgICAgICAgICAgVURhdGVGb3JtYXQgICAgICpmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sX3QgICAgICAgICAgbG9jYWxpemVkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgVUNoYXIgICAgICAgICAgICpwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHBhdHRlcm5MZW5ndGgpOwoKLyoqIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBkYXRlIGZvcm1hdCBzeW1ib2xzICovCmVudW0gVURhdGVGb3JtYXRTeW1ib2xUeXBlIHsKICAgIC8qKiBUaGUgZXJhIG5hbWVzLCBmb3IgZXhhbXBsZSBBRCAqLwogICAgVURBVF9FUkFTLAogICAgLyoqIFRoZSBtb250aCBuYW1lcywgZm9yIGV4YW1wbGUgRmVicnVhcnkgKi8KICAgIFVEQVRfTU9OVEhTLAogICAgLyoqIFRoZSBzaG9ydCBtb250aCBuYW1lcywgZm9yIGV4YW1wbGUgRmViLiAqLwogICAgVURBVF9TSE9SVF9NT05USFMsCiAgICAvKiogVGhlIHdlZWtkYXkgbmFtZXMsIGZvciBleGFtcGxlIE1vbmRheSAqLwogICAgVURBVF9XRUVLREFZUywKICAgIC8qKiBUaGUgc2hvcnQgd2Vla2RheSBuYW1lcywgZm9yIGV4YW1wbGUgTW9uLiAqLwogICAgVURBVF9TSE9SVF9XRUVLREFZUywKICAgIC8qKiBUaGUgQU0vUE0gbmFtZXMsIGZvciBleGFtcGxlIEFNICovCiAgICBVREFUX0FNX1BNUywKICAgIC8qKiBUaGUgbG9jYWxpemVkIGNoYXJhY3RlcnMgKi8KICAgIFVEQVRfTE9DQUxJWkVEX0NIQVJTCn07CnR5cGVkZWYgZW51bSBVRGF0ZUZvcm1hdFN5bWJvbFR5cGUgVURhdGVGb3JtYXRTeW1ib2xUeXBlOwoKLyoqIERhdGUgZm9ybWF0IHN5bWJvbHMuIAogKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiAqLwpzdHJ1Y3QgVURhdGVGb3JtYXRTeW1ib2xzOwp0eXBlZGVmIHN0cnVjdCBVRGF0ZUZvcm1hdFN5bWJvbHMgVURhdGVGb3JtYXRTeW1ib2xzOwoKLyoqCiogR2V0IHRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBhbiBVRGF0ZUZvcm1hdC4KKiBUaGUgc3ltYm9scyBhcmUgd2hhdCBhIFVEYXRlRm9ybWF0IHVzZXMgdG8gcmVwcmVzZW50IGxvY2FsZS1zcGVjaWZpYyBkYXRhLAoqIGZvciBleGFtcGxlIG1vbnRoIG9yIGRheSBuYW1lcy4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc3ltYm9scyB0byBnZXQuICBPbmUgb2YgVURBVF9FUkFTLCBVREFUX01PTlRIUywgVURBVF9TSE9SVF9NT05USFMsIAoqIFVEQVRfV0VFS0RBWVMsIFVEQVRfU0hPUlRfV0VFS0RBWVMsIFVEQVRfQU1fUE1TLCBvciBVREFUX0xPQ0FMSVpFRF9DSEFSUwoqIEBwYXJhbSBpbmRleCBUaGUgZGVzaXJlZCBzeW1ib2wgb2YgdHlwZSB0eXBlLgoqIEBwYXJhbSByZXN1bHQgQSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHBhdHRlcm4uCiogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEByZXR1cm4gVGhlIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZDsgaWYgZ3JlYXRlciB0aGFuIHJlc3VsdExlbmd0aCwgdGhlIG91dHB1dCB3YXMgdHJ1bmNhdGVkLgoqIEBzZWUgdWRhdF9jb3VudFN5bWJvbHMKKiBAc2VlIHVkYXRfc2V0U3ltYm9scwoqLwpVX0NBUEkgaW50MzJfdAp1ZGF0X2dldFN5bWJvbHMoY29uc3QgICBVRGF0ZUZvcm1hdCAgICAgICAgICAgICAqZm10LAogICAgICAgICAgICAgICAgICAgICAgICBVRGF0ZUZvcm1hdFN5bWJvbFR5cGUgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgICAgICAgICAgICAgICAgICAgKnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICAgICAqc3RhdHVzKTsKCi8qKgoqIENvdW50IHRoZSBudW1iZXIgb2YgcGFydGljdWxhciBzeW1ib2xzIGZvciBhbiBVRGF0ZUZvcm1hdC4KKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIGFzIGZvciBkZXRlbWluaW5nIHRoZSBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbgoqIGZvciBjYWxscyB0byBcUmVme3VkYXRfZ2V0U3ltYm9sc30uCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHN5bWJvbHMgdG8gY291bnQuICBPbmUgb2YgVURBVF9FUkFTLCBVREFUX01PTlRIUywgVURBVF9TSE9SVF9NT05USFMsIAoqIFVEQVRfV0VFS0RBWVMsIFVEQVRfU0hPUlRfV0VFS0RBWVMsIFVEQVRfQU1fUE1TLCBvciBVREFUX0xPQ0FMSVpFRF9DSEFSUwoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBzeW1ib2xzIG9mIHR5cGUgdHlwZS4KKiBAc2VlIHVkYXRfZ2V0U3ltYm9scwoqIEBzZWUgdWRhdF9zZXRTeW1ib2xzCiovClVfQ0FQSSBpbnQzMl90CnVkYXRfY291bnRTeW1ib2xzKCAgICBjb25zdCAgICBVRGF0ZUZvcm1hdCAgICAgICAgICAgICAgICAqZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVURhdGVGb3JtYXRTeW1ib2xUeXBlICAgIHR5cGUpOwoKLyoqCiogU2V0IHRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBhbiBVRGF0ZUZvcm1hdC4KKiBUaGUgc3ltYm9scyBhcmUgd2hhdCBhIFVEYXRlRm9ybWF0IHVzZXMgdG8gcmVwcmVzZW50IGxvY2FsZS1zcGVjaWZpYyBkYXRhLAoqIGZvciBleGFtcGxlIG1vbnRoIG9yIGRheSBuYW1lcy4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gc2V0CiogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc3ltYm9scyB0byBzZXQuICBPbmUgb2YgVURBVF9FUkFTLCBVREFUX01PTlRIUywgVURBVF9TSE9SVF9NT05USFMsIAoqIFVEQVRfV0VFS0RBWVMsIFVEQVRfU0hPUlRfV0VFS0RBWVMsIFVEQVRfQU1fUE1TLCBvciBVREFUX0xPQ0FMSVpFRF9DSEFSUwoqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN5bWJvbCB0byBzZXQgb2YgdHlwZSB0eXBlLgoqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlCiogQHBhcmFtIHZhbHVlTGVuZ3RoIFRoZSBsZW5ndGggb2YgdmFsdWUsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZAoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBBIHBvaW50ZXIgdG8gcmVzdWx0LgoqIEBzZWUgdWRhdF9nZXRTeW1ib2xzCiogQHNlZSB1ZGF0X2NvdW50U3ltYm9scwoqLwpVX0NBUEkgdm9pZAp1ZGF0X3NldFN5bWJvbHMoICAgIFVEYXRlRm9ybWF0ICAgICAgICAgICAgICpmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgVURhdGVGb3JtYXRTeW1ib2xUeXBlICAgdHlwZSwKICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICBVQ2hhciAgICAgICAgICAgICAgICAgICAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgdmFsdWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgICAgICAgKnN0YXR1cyk7CgojZW5kaWYK