LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBVQlJLX0gKI2RlZmluZSBVQlJLX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgovKioKICogQG5hbWUgQnJlYWtJdGVyYXRvciBDIEFQSQogKgogKiBUaGUgQnJlYWtJdGVyYXRvciBDIEFQSSBkZWZpbmVzICBtZXRob2RzIGZvciBmaW5kaW5nIHRoZSBsb2NhdGlvbgogKiBvZiBib3VuZGFyaWVzIGluIHRleHQuIFBvaW50ZXIgdG8gYSBVQnJlYWtJdGVyYXRvciBtYWludGFpbiBhIAogKiBjdXJyZW50IHBvc2l0aW9uIGFuZCBzY2FuIG92ZXIgdGV4dCByZXR1cm5pbmcgdGhlIGluZGV4IG9mIGNoYXJhY3RlcnMgCiAqIHdoZXJlIGJvdW5kYXJpZXMgb2NjdXIuCiAqIDxQPgogKiBMaW5lIGJvdW5kYXJ5IGFuYWx5c2lzIGRldGVybWluZXMgd2hlcmUgYSB0ZXh0IHN0cmluZyBjYW4gYmUgYnJva2VuCiAqIHdoZW4gbGluZS13cmFwcGluZy4gVGhlIG1lY2hhbmlzbSBjb3JyZWN0bHkgaGFuZGxlcyBwdW5jdHVhdGlvbiBhbmQKICogaHlwaGVuYXRlZCB3b3Jkcy4KICogPFA+CiAqIFNlbnRlbmNlIGJvdW5kYXJ5IGFuYWx5c2lzIGFsbG93cyBzZWxlY3Rpb24gd2l0aCBjb3JyZWN0CiAqIGludGVycHJldGF0aW9uIG9mIHBlcmlvZHMgd2l0aGluIG51bWJlcnMgYW5kIGFiYnJldmlhdGlvbnMsIGFuZAogKiB0cmFpbGluZyBwdW5jdHVhdGlvbiBtYXJrcyBzdWNoIGFzIHF1b3RhdGlvbiBtYXJrcyBhbmQgcGFyZW50aGVzZXMuCiAqIDxQPgogKiBXb3JkIGJvdW5kYXJ5IGFuYWx5c2lzIGlzIHVzZWQgYnkgc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9ucywgYXMKICogd2VsbCBhcyB3aXRoaW4gdGV4dCBlZGl0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvCiAqIHNlbGVjdCB3b3JkcyB3aXRoIGEgZG91YmxlIGNsaWNrLiBXb3JkIHNlbGVjdGlvbiBwcm92aWRlcyBjb3JyZWN0CiAqIGludGVycHJldGF0aW9uIG9mIHB1bmN0dWF0aW9uIG1hcmtzIHdpdGhpbiBhbmQgZm9sbG93aW5nCiAqIHdvcmRzLiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGEgd29yZCwgc3VjaCBhcyBzeW1ib2xzIG9yCiAqIHB1bmN0dWF0aW9uIG1hcmtzLCBoYXZlIHdvcmQtYnJlYWtzIG9uIGJvdGggc2lkZXMuCiAqIDxQPgogKiBDaGFyYWN0ZXIgYm91bmRhcnkgYW5hbHlzaXMgYWxsb3dzIHVzZXJzIHRvIGludGVyYWN0IHdpdGgKICogY2hhcmFjdGVycyBhcyB0aGV5IGV4cGVjdCB0bywgZm9yIGV4YW1wbGUsIHdoZW4gbW92aW5nIHRoZSBjdXJzb3IKICogdGhyb3VnaCBhIHRleHQgc3RyaW5nLiBDaGFyYWN0ZXIgYm91bmRhcnkgYW5hbHlzaXMgcHJvdmlkZXMgY29ycmVjdAogKiBuYXZpZ2F0aW9uIG9mIHRocm91Z2ggY2hhcmFjdGVyIHN0cmluZ3MsIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQogKiBjaGFyYWN0ZXIgaXMgc3RvcmVkLiAgRm9yIGV4YW1wbGUsIGFuIGFjY2VudGVkIGNoYXJhY3RlciBtaWdodCBiZQogKiBzdG9yZWQgYXMgYSBiYXNlIGNoYXJhY3RlciBhbmQgYSBkaWFjcml0aWNhbCBtYXJrLiBXaGF0IHVzZXJzCiAqIGNvbnNpZGVyIHRvIGJlIGEgY2hhcmFjdGVyIGNhbiBkaWZmZXIgYmV0d2VlbiBsYW5ndWFnZXMuCiAqIDxQPgogKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGFsbCB0ZXh0IGJvdW5kYXJpZXMuCiAqIDxQPgogKiBFeGFtcGxlczoKICogPFA+CiAqIEhlbHBlciBmdW5jdGlvbiB0byBvdXRwdXQgdGV4dAogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludFRleHRSYW5nZShVQ2hhciogc3RyLCBVVGV4dE9mZnNldCBzdGFydCwgVVRleHRPZmZzZXQgZW5kICkgewogKiAuICAgICAgICBVQ2hhciogcmVzdWx0OwogKiAuICAgICAgICBVQ2hhciogdGVtcDsKICogLiAgICAgICAgY29uc3QgY2hhciogcmVzOwogKiAuICAgICAgICB0ZW1wPShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAoKHVfc3RybGVuKHN0ciktc3RhcnQpKzEpKTsKICogLiAgICAgICAgcmVzdWx0PShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAoKGVuZC1zdGFydCkrMSkpOwogKiAuICAgICAgICB1X3N0cmNweSh0ZW1wLCAmc3RyW3N0YXJ0XSk7CiAqIC4gICAgICAgIHVfc3RybmNweShyZXN1bHQsIHRlbXAsIGVuZC1zdGFydCk7CiAqIC4gICAgICAgIHJlcz0oY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqICh1X3N0cmxlbihyZXN1bHQpKzEpKTsKICogLiAgICAgICAgdV9hdXN0cmNweShyZXMsIHJlc3VsdCk7CiAqIC4gICAgICAgIHByaW50ZigiJXNcbiIsIHJlcyk7IAogKiAuICAgfQogKiA8L3ByZT4KICogUHJpbnQgZWFjaCBlbGVtZW50IGluIG9yZGVyOgogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEVhY2hGb3J3YXJkKCBVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogLiAgICAgIFVUZXh0T2Zmc2V0IGVuZDsKICogLiAgICAgIFVUZXh0T2Zmc2V0IHN0YXJ0ID0gdWJya19maXJzdChib3VuZGFyeSk7CiAqIC4gICAgICBmb3IgKGVuZCA9IHVicmtfbmV4dChib3VuZGFyeSkpOyBlbmQgIT0gVUJSS19ET05FOyBzdGFydCA9IGVuZCwgZW5kID0gdWJya19uZXh0KGJvdW5kYXJ5KSkgewogKiAuICAgICAgICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqIC4gICAgICAgIH0KICogLiAgIH0KICogPC9wcmU+CiAqIFByaW50IGVhY2ggZWxlbWVudCBpbiByZXZlcnNlIG9yZGVyOgogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEVhY2hCYWNrd2FyZCggVUJyZWFrSXRlcmF0b3IqIGJvdW5kYXJ5LCBVQ2hhciogc3RyKSB7CiAqIC4gICAgICBVVGV4dE9mZnNldCBzdGFydDsKICogLiAgICAgIFVUZXh0T2Zmc2V0IGVuZCA9IHVicmtfbGFzdChib3VuZGFyeSk7CiAqIC4gICAgICBmb3IgKHN0YXJ0ID0gdWJya19wcmV2aW91cyhib3VuZGFyeSk7IHN0YXJ0ICE9IFVCUktfRE9ORTsgIGVuZCA9IHN0YXJ0LCBzdGFydCA9dWJya19wcmV2aW91cyhib3VuZGFyeSkpIHsKICogLiAgICAgICAgICAgIHByaW50VGV4dFJhbmdlKCBzdHIsIHN0YXJ0LCBlbmQgKTsKICogLiAgICAgICAgfQogKiAuICAgfQogKiA8L3ByZT4KICogUHJpbnQgZmlyc3QgZWxlbWVudAogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEZpcnN0KFVCcmVha0l0ZXJhdG9yKiBib3VuZGFyeSwgVUNoYXIqIHN0cikgewogKiAuICAgICAgIFVUZXh0T2Zmc2V0IGVuZDsKICogLiAgICAgICBVVGV4dE9mZnNldCBzdGFydCA9IHVicmtfZmlyc3QoYm91bmRhcnkpOwogKiAuICAgICAgIGVuZCA9IHVicmtfbmV4dChib3VuZGFyeSk7CiAqIC4gICAgICAgcHJpbnRUZXh0UmFuZ2UoIHN0ciwgc3RhcnQsIGVuZCApOwogKiAuICAgfQogKiA8L3ByZT4KICogUHJpbnQgbGFzdCBlbGVtZW50CiAqIDxwcmU+CiAqIC4gICB2b2lkIHByaW50TGFzdChVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogLiAgICAgICBVVGV4dE9mZnNldCBzdGFydDsKICogLiAgICAgICBVVGV4dE9mZnNldCBlbmQgPSB1YnJrX2xhc3QoYm91bmRhcnkpOwogKiAuICAgICAgIHN0YXJ0ID0gdWJya19wcmV2aW91cyhib3VuZGFyeSk7CiAqIC4gICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqIC4gICB9CiAqIDwvcHJlPgogKiBQcmludCB0aGUgZWxlbWVudCBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbgogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEF0KFVCcmVha0l0ZXJhdG9yKiBib3VuZGFyeSwgVVRleHRPZmZzZXQgcG9zICwgVUNoYXIqIHN0cikgewogKiAuICAgICAgIFVUZXh0T2Zmc2V0IHN0YXJ0OwogKiAuICAgICAgIFVUZXh0T2Zmc2V0IGVuZCA9IHVicmtfZm9sbG93aW5nKGJvdW5kYXJ5LCBwb3MpOwogKiAuICAgICAgIHN0YXJ0ID0gdWJya19wcmV2aW91cyhib3VuZGFyeSk7CiAqIC4gICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqIC4gICB9CiAqIDwvcHJlPgogKiBDcmVhdGluZyBhbmQgdXNpbmcgdGV4dCBib3VuZGFyaWVzCiAqIDxwcmU+CiAqIC4gICAgICB2b2lkIEJyZWFrSXRlcmF0b3JfRXhhbXBsZSggdm9pZCApIHsKICogLiAgICAgICAgICBVQnJlYWtJdGVyYXRvciogYm91bmRhcnk7CiAqIC4gICAgICAgICAgVUNoYXIgKnN0cmluZ1RvRXhhbWluZTsKICogLiAgICAgICAgICBzdHJpbmdUb0V4YW1pbmU9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChzdHJsZW4oIkFhYSBiYmIgY2NjLiBEZGQgZWVlIGZmZi4iKSsxKSApOwogKiAuICAgICAgICAgIHVfdWFzdHJjcHkoc3RyaW5nVG9FeGFtaW5lLCAiQWFhIGJiYiBjY2MuIERkZCBlZWUgZmZmLiIpOwogKiAuICAgICAgICAgIHByaW50ZigiRXhhbWluaW5nOiAiQWFhIGJiYiBjY2MuIERkZCBlZWUgZmZmLiIpOwogKiAuCiAqIC4gICAgICAgICAgLy9wcmludCBlYWNoIHNlbnRlbmNlIGluIGZvcndhcmQgYW5kIHJldmVyc2Ugb3JkZXIKICogLiAgICAgICAgICBib3VuZGFyeSA9IHVicmtfb3BlbihVQlJLX1NFTlRFTkNFLCAiZW5fdXMiLCBzdHJpbmdUb0V4YW1pbmUsIHVfc3RybGVuKHN0cmluZ1RvRXhhbWluZSksICZzdGF0dXMpOwogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gZm9yd2FyZDogLS0tLS0tLS0tLS1cbiIpOyAKICogLiAgICAgICAgICBwcmludEVhY2hGb3J3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gYmFja3dhcmQ6IC0tLS0tLS0tLS1cbiIpOwogKiAuICAgICAgICAgIHByaW50RWFjaEJhY2t3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAuICAgICAgICAgIHVicmtfY2xvc2UoYm91bmRhcnkpOwogKiAuCiAqIC4gICAgICAgICAgLy9wcmludCBlYWNoIHdvcmQgaW4gb3JkZXIKICogLiAgICAgICAgICBib3VuZGFyeSA9IHVicmtfb3BlbihVQlJLX1dPUkQsICJlbl91cyIsIHN0cmluZ1RvRXhhbWluZSwgdV9zdHJsZW4oc3RyaW5nVG9FeGFtaW5lKSwgJnN0YXR1cyk7CiAqIC4gICAgICAgICAgcHJpbnRmKCItLS0tLSBmb3J3YXJkOiAtLS0tLS0tLS0tLVxuIik7IAogKiAuICAgICAgICAgIHByaW50RWFjaEZvcndhcmQoYm91bmRhcnksIHN0cmluZ1RvRXhhbWluZSk7CiAqIC4gICAgICAgICAgcHJpbnRmKCItLS0tLSBiYWNrd2FyZDogLS0tLS0tLS0tLVxuIik7CiAqIC4gICAgICAgICAgcHJpbnRFYWNoQmFja3dhcmQoYm91bmRhcnksIHN0cmluZ1RvRXhhbWluZSk7CiAqIC4gICAgICAgICAgLy9wcmludCBmaXJzdCBlbGVtZW50CiAqIC4gICAgICAgICAgcHJpbnRmKCItLS0tLSBmaXJzdDogLS0tLS0tLS0tLS0tLVxuIik7CiAqIC4gICAgICAgICAgcHJpbnRGaXJzdChib3VuZGFyeSwgc3RyaW5nVG9FeGFtaW5lKTsKICogLiAgICAgICAgICAvL3ByaW50IGxhc3QgZWxlbWVudAogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gbGFzdDogLS0tLS0tLS0tLS0tLS1cbiIpOwogKiAuICAgICAgICAgIHByaW50TGFzdChib3VuZGFyeSwgc3RyaW5nVG9FeGFtaW5lKTsKICogLiAgICAgICAgICAvL3ByaW50IHdvcmQgYXQgY2hhcnBvcyAxMAogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gYXQgcG9zIDEwOiAtLS0tLS0tLS1cbiIpOwogKiAuICAgICAgICAgIHByaW50QXQoYm91bmRhcnksIDEwICwgc3RyaW5nVG9FeGFtaW5lKTsKICogLgogKiAuICAgICAgICAgIHVicmtfY2xvc2UoYm91bmRhcnkpOwogKiAuICAgICAgfQogKiA8L3ByZT4KICovCgovKiogCiAqIEEgdGV4dC1icmVhayBpdGVyYXRvci4KICogIEZvciB1c2FnZSBpbiBDIHByb2dyYW1zLgogKi8KdHlwZWRlZiB2b2lkKiBVQnJlYWtJdGVyYXRvcjsKCi8qKiBUaGUgcG9zc2libGUgdHlwZXMgb2YgdGV4dCBib3VuZGFyaWVzLiAqLwplbnVtIFVCcmVha0l0ZXJhdG9yVHlwZSB7CiAgLyoqIENoYXJhY3RlciBicmVha3MgKi8KICBVQlJLX0NIQVJBQ1RFUiwKICAvKiogV29yZCBicmVha3MgKi8KICBVQlJLX1dPUkQsCiAgLyoqIExpbmUgYnJlYWtzICovCiAgVUJSS19MSU5FLAogIC8qKiBTZW50ZW5jZSBicmVha3MgKi8KICBVQlJLX1NFTlRFTkNFCn07CnR5cGVkZWYgZW51bSBVQnJlYWtJdGVyYXRvclR5cGUgVUJyZWFrSXRlcmF0b3JUeXBlOwoKLyoqIFZhbHVlIGluZGljYXRpbmcgYWxsIHRleHQgYm91bmRhcmllcyBoYXZlIGJlZW4gcmV0dXJuZWQuIAogKgogKi8KI2RlZmluZSBVQlJLX0RPTkUgKChVVGV4dE9mZnNldCkgLTEpCgovKioKICogT3BlbiBhIG5ldyBVQnJlYWtJdGVyYXRvciBmb3IgbG9jYXRpbmcgdGV4dCBib3VuZGFyaWVzIGZvciBhIHNwZWNpZmllZCBsb2NhbGUuCiAqIEEgVUJyZWFrSXRlcmF0b3IgbWF5IGJlIHVzZWQgZm9yIGRldGVjdGluZyBjaGFyYWN0ZXIsIGxpbmUsIHdvcmQsIAogKiBhbmQgc2VudGVuY2UgYnJlYWtzIGluIHRleHQuCiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIFVCcmVha0l0ZXJhdG9yIHRvIG9wZW46IG9uZSBvZiBVQlJLX0NIQVJBQ1RFUiwgVUJSS19XT1JELAogKiBVQlJLX0xJTkUsIFVCUktfU0VOVEVOQ0UKICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHNwZWNpZnlpbmcgdGhlIHRleHQtYnJlYWtpbmcgY29udmVudGlvbnMuCiAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuCiAqIEBwYXJhbSB0ZXh0TGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0ZXh0LCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBzdGF0dXMgQSBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycy4KICogQHJldHVybiBBIFVCcmVha0l0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICogQHNlZSB1YnJrX29wZW5SdWxlcwogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVUJyZWFrSXRlcmF0b3IqCnVicmtfb3BlbihVQnJlYWtJdGVyYXRvclR5cGUgdHlwZSwKICAgICAgY29uc3QgY2hhciAqbG9jYWxlLAogICAgICBjb25zdCBVQ2hhciAqdGV4dCwKICAgICAgaW50MzJfdCB0ZXh0TGVuZ3RoLAogICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIE9wZW4gYSBuZXcgVUJyZWFrSXRlcmF0b3IgZm9yIGxvY2F0aW5nIHRleHQgYm91bmRhcmllcyB1c2luZyBzcGVjaWZpZWQgYnJlYWtpbmcgcnVsZXMuCiAqIFRoZSBydWxlIHN5bnRheCBpcyAuLi4gKFRCRCkKICogQHBhcmFtIHJ1bGVzIEEgc2V0IG9mIHJ1bGVzIHNwZWNpZnlpbmcgdGhlIHRleHQgYnJlYWtpbmcgY29udmVudGlvbnMuCiAqIEBwYXJhbSBydWxlc0xlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gcnVsZXMsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgaXRlcmF0ZWQgb3Zlci4KICogQHBhcmFtIHRleHRMZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRleHQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHN0YXR1cyBBIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzLgogKiBAcmV0dXJuIEEgVUJyZWFrSXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgcnVsZXMuCiAqIEBzZWUgdWJya19vcGVuCiAqIEBkcmFmdAogKi8KVV9DQVBJIFVCcmVha0l0ZXJhdG9yKgp1YnJrX29wZW5SdWxlcyhjb25zdCBVQ2hhciAqcnVsZXMsCiAgICAgICAgICAgaW50MzJfdCBydWxlc0xlbmd0aCwKICAgICAgICAgICBjb25zdCBVQ2hhciAqdGV4dCwKICAgICAgICAgICBpbnQzMl90IHRleHRMZW5ndGgsCiAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgoqIENsb3NlIGEgVUJyZWFrSXRlcmF0b3IuCiogT25jZSBjbG9zZWQsIGEgVUJyZWFrSXRlcmF0b3IgbWF5IG5vIGxvbmdlciBiZSB1c2VkLgoqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gY2xvc2UuCiAqIEBzdGFibGUKKi8KVV9DQVBJIHZvaWQKdWJya19jbG9zZShVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIFNldHMgYW4gZXhpc3RpbmcgaXRlcmF0b3IgdG8gcG9pbnQgdG8gYSBuZXcgcGllY2Ugb2YgdGV4dAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgdm9pZAp1YnJrX3NldFRleHQoVUJyZWFrSXRlcmF0b3IqIGJpLAogICAgICAgICAgICAgY29uc3QgVUNoYXIqICAgIHRleHQsCiAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgdGV4dExlbmd0aCwKICAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOwoKLyoqCiAqIERldGVybWluZSB0aGUgbW9zdCByZWNlbnRseS1yZXR1cm5lZCB0ZXh0IGJvdW5kYXJ5LgogKiAKICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBpbmRleCBtb3N0IHJlY2VudGx5IHJldHVybmVkIGJ5IFxSZWZ7dWJya19uZXh0fSwgXFJlZnt1YnJrX3ByZXZpb3VzfSwgCiAqIFxSZWZ7dWJya19maXJzdH0sIG9yIFxSZWZ7dWJya19sYXN0fS4KICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfY3VycmVudChjb25zdCBVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIERldGVybWluZSB0aGUgdGV4dCBib3VuZGFyeSBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgdGV4dCBib3VuZGFyeS4KICogCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIG5leHQgdGV4dCBib3VuZGFyeSwgb3IgVUJSS19ET05FCiAqIGlmIGFsbCB0ZXh0IGJvdW5kYXJpZXMgaGF2ZSBiZWVuIHJldHVybmVkLgogKiBAc2VlIHVicmtfcHJldmlvdXMKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfbmV4dChVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIERldGVybWluZSB0aGUgdGV4dCBib3VuZGFyeSBwcmVjZWRpbmcgdGhlIGN1cnJlbnQgdGV4dCBib3VuZGFyeS4KICoKICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgcHJlY2VkaW5nIHRleHQgYm91bmRhcnksIG9yIFVCUktfRE9ORQogKiBpZiBhbGwgdGV4dCBib3VuZGFyaWVzIGhhdmUgYmVlbiByZXR1cm5lZC4KICogQHNlZSB1YnJrX25leHQKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfcHJldmlvdXMoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRleHQgYmVpbmcgc2Nhbm5lZC4KICogVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIGluZGV4IDAgb2YgdGhlIHRleHQuCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdGV4dCBiZWluZyBzY2FubmVkLgogKiBAc2VlIHVicmtfbGFzdAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVVRleHRPZmZzZXQKdWJya19maXJzdChVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIERldGVybWluZSB0aGUgaW5kZXggaW1tZWRpYXRlbHkgPEVNPmJleW9uZDwvRU0+IHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgdGV4dCBiZWluZwogKiBzY2FubmVkLgogKiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIuCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGltbWVkaWF0ZWx5IDxFTT5iZXlvbmQ8L0VNPiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlCiAqIHRleHQgYmVpbmcgc2Nhbm5lZC4KICogQHNlZSB1YnJrX2ZpcnN0CiAqIEBzdGFibGUKICovClVfQ0FQSSBVVGV4dE9mZnNldAp1YnJrX2xhc3QoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIHRleHQgYm91bmRhcnkgcHJlY2VkaW5nIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiBvZmZzZXQsIG9yIFVCUktfRE9ORS4KICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCB0byBiZWdpbiBzY2FubmluZy4KICogQHJldHVybiBUaGUgdGV4dCBib3VuZGFyeSBwcmVjZWRpbmcgb2Zmc2V0LCBvciBVQlJLX0RPTkUuCiAqIEBzZWUgdWJya19mb2xsb3dpbmcKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfcHJlY2VkaW5nKFVCcmVha0l0ZXJhdG9yICpiaSwKICAgICAgICAgICBVVGV4dE9mZnNldCBvZmZzZXQpOwoKLyoqCiAqIERldGVybWluZSB0aGUgdGV4dCBib3VuZGFyeSBmb2xsb3dpbmcgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhbHdheXMgZ3JlYXRlciB0aGFuIG9mZnNldCwgb3IgVUJSS19ET05FLgogKiBAcGFyYW0gYmkgVGhlIGJyZWFrIGl0ZXJhdG9yIHRvIHVzZS4KICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIGJlZ2luIHNjYW5uaW5nLgogKiBAcmV0dXJuIFRoZSB0ZXh0IGJvdW5kYXJ5IGZvbGxvd2luZyBvZmZzZXQsIG9yIFVCUktfRE9ORS4KICogQHNlZSB1YnJrX3ByZWNlZGluZwogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVVRleHRPZmZzZXQKdWJya19mb2xsb3dpbmcoVUJyZWFrSXRlcmF0b3IgKmJpLAogICAgICAgICAgIFVUZXh0T2Zmc2V0IG9mZnNldCk7CgovKioKKiBHZXQgYSBsb2NhbGUgZm9yIHdoaWNoIHRleHQgYnJlYWtpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgoqIEEgVUJyZWFrSXRlcmF0b3IgaW4gYSBsb2NhbGUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIGNvcnJlY3QKKiB0ZXh0IGJyZWFraW5nIGZvciB0aGUgbG9jYWxlLgoqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgbG9jYWxlLgoqIEByZXR1cm4gQSBsb2NhbGUgZm9yIHdoaWNoIG51bWJlciB0ZXh0IGJyZWFraW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgb3IgMCBpZiBub25lLgoqIEBzZWUgdWJya19jb3VudEF2YWlsYWJsZQoqIEBzdGFibGUKKi8KVV9DQVBJIGNvbnN0IGNoYXIqCnVicmtfZ2V0QXZhaWxhYmxlKGludDMyX3QgaW5kZXgpOwoKLyoqCiogRGV0ZXJtaW5lIGhvdyBtYW55IGxvY2FsZXMgaGF2ZSB0ZXh0IGJyZWFraW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIGFzIGRldGVybWluaW5nIHRoZSBsb29wIGVuZGluZyBjb25kaXRpb24gZm9yCiogY2FsbHMgdG8gXFJlZnt1YnJrX2dldEF2YWlsYWJsZX0uCiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGxvY2FsZXMgZm9yIHdoaWNoIHRleHQgYnJlYWtpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgoqIEBzZWUgdWJya19nZXRBdmFpbGFibGUKKiBAc3RhYmxlCiovClVfQ0FQSSBpbnQzMl90CnVicmtfY291bnRBdmFpbGFibGUodm9pZCk7CgojZW5kaWYK